函数
defined
fn main() {
print_sum(5, 6);
}
fn print_sum(x: i32, y: i32) {
println!("sum is: {}", x + y);
}
函数定义时必须声明变量的类型,变量之间用逗号分隔。
返回值
fn add_one(x: i32) -> i32 {
x + 1 // 不可以加分号
}
表达式与语句 (expression VS statement)
(Rust is primarily an expression-based language. There are only two kinds of statements, and everything else is an expression.)
Rust 是以表达式为主的语言。在Rust中只有两种语句,其他的全是表达式。
语句和表达式的区别:表达式有返回值,而语句没有。语句: x+1; 没有返回值。并不是所有的分支都有返回值。 在Rust中有两种语句:声明式语句和表达式语句。其他的一切都是表达式。
在其他一些语言中可以连续声明相同的变量并赋值。如下:
x = y = 5
然而在Rust中,使用let声明变量并不是表达式。
let x = (let y =5); //compile-time error
Rust不想其他的语言可以连续赋值,在Rust中会被赋值为一个空的元组(),因为一个被“赋”的值只能有一个 owner
let mut y = 5;
let x = (y = 6); // x has the value `()`, not `6`
Rust 中另一种语句就是表达式语句。它被如此设计的目的是可以将表达式变为语句。在实际的环境,有人喜欢在一行写多个语句,那么就需要分号间隔开两个语句了。这与大部分语言都相似。
fn add_one(x: i32) -> i32 {
x + 1
}
但是这个例子就不可以用分号结束语句,否则 会返回 () ,但是编译器认为这样是不正确的,所以会在编译时期给出错误提示。
Rust也可以像其他语言 return返回。
fn foo(x: i32) -> i32 {
return x + 1;
}
这种比较直观,但是明显 表达式 的写法更加有 逼格
diverging functions
原谅我的英语烂,实在不知道如何翻译!
这是Rust中的特殊语法,并不会有返回值!像java中的void
fn diverges() -> ! {
panic!("This function never returns!");
}
panic! 是个宏指令!用于打印 程序运行时导致程序crash的信息。
这种函数可被用作任何类型
let x: i32 = diverges();
let x: String = diverges();
函数指针
看到这四个字不要慌,Rust不是c++!!!
let f: fn(i32) -> i32;
意思很明显,将f声明为一个函数类型,许多脚本语言中都有这种用法。
fn plus_one(i: i32) -> i32 {
i + 1
}
// without type inference
let f: fn(i32) -> i32 = plus_one;
// with type inference
let f = plus_one;
let six = f(5);
只是 其用法要比许多脚本语言麻烦多了!