聊聊 rust 语言中的函数与 js/ts 函数区别

作为一个小前端,聊聊在学习 rust 发现的与 js/ts 相同和不同之处。

抛开 rust 的泛型和生命周期,其实 rust 和 js/ts 还真差别不大。

相同点

  1. 函数体的定义格式都一样

rust 语言

rust函数
1
fn demo() {}

js 语言

js函数
1
function demo() {}
  1. 函数返回值都使用 return 关键字

rust 语言

rust函数
1
2
3
fn demo() {
return 123;
}

js 语言

js函数
1
2
3
function demo() {
return 123;
}
  1. 函数参数类型限制与 ts 语法极其相似

rust 语言

rust函数
1
2
3
fn demo(x: i32) -> i32 {
return x + 1;
}

ts 语言

ts函数
1
2
3
function demo(x: number):number {
return x + 1;
}
  1. 函数泛型与 ts 语法极其相似

rust 语言

rust函数
1
2
3
4
5
fn demo<T>(x: T) -> T {
return x;
}
// rust 涡轮鱼 写法
let _res = demo::<i32>(123);

ts 语言

ts函数
1
2
3
4
function demo<T>(x: T):T {
return x;
}
let _res = demo<number>(123);

不同点

  1. 函数返回值,注意上面所有例子 rust 函数 return 语句后面都有 ; 结尾!其实 rust 函数的返回值写法除了使用 return 关键字之外,还允许不使用 return 返回值!!

rust 语言

rust函数
1
2
3
4
5
fn demo<T>(x: T) -> T {
return x;
}
// rust 涡轮鱼 写法
let _res = demo::<i32>(123);

等价于

rust函数
1
2
3
4
5
fn demo<T>(x: T) -> T {
x
}
// rust 涡轮鱼 写法
let _res = demo::<i32>(123);

注意后一种写法 x 后面没有 return 也没有 ; ,这种写法在 rust 里面是允许的,其表示这是一个 表达式,如果有 ; 则表示是一个 语句。如果给后一种写法加上 ; 则会编译报错!!!

如果习惯 js 的写法,也可以都使用 return 关键字。

js 语言里面这种写法返回 undefined

js函数
1
2
3
function demo() {
123
}

ts 里面这种写法会直接编译报错

ts函数
1
2
3
4
function demo<T>(x: T):T {
x
}
let _res = demo<number>(123);
  1. 部分场景下 rust 语言中需要指定参数生命周期

具体可参考 Rust 程序设计语言 https://kaisery.github.io/trpl-zh-cn/ch10-03-lifetime-syntax.html

  1. 匿名函数写法不同

rust 匿名函数,不能使用泛型,匿名函数在第一次使用时编译器固定参数类型,后续不允许再变动参数类型!

rust函数
1
2
3
4
5
let demo = |x| {
return x;
};
let _res = demo(123);
// let _res2 = demo("123"); 再次传入字符串切片会报错

js 匿名函数

js函数
1
2
3
4
let demo = (x) => {
return x;
};
let _res = demo(123);

ts 匿名函数,可以使用泛型

ts函数
1
2
3
4
5
let demo = <T>(x: T):T => {
return x
}
let _res = demo<number>(123);
let _res2 = demo<string>("123");

本文由 linx(544819896@qq.com) 创作,采用 CC BY 4.0 CN协议 进行许可。 可自由转载、引用,但需署名作者且注明文章出处。本文链接为: https://blog.jijian.link/2023-11-13/rust-fn/

如果您觉得文章不错,可以点击文章中的广告支持一下!