亲宝软件园·资讯

展开

普通人学习rust——从零到放弃 变量、不可变量、常量

我想嘿嘿 人气:5
# 普通人学习rust——从零到放弃 变量、不可变量、常量 ## 环境 本文章内容基于如下环境,如若出入请参考当前环境。 ``` rustc 1.42.0 (b8cedc004 2020-03-09) ``` ``` cargo 1.42.0 (86334295e 2020-01-31) ``` ## 前言 可变变量、不可变量、常量 是rust语言的一个特性。本篇文章主要讲rust的三个关键字:`let`、`mut`、`const` ## 不可变量 `let` 是创建变量的关键字,rust默认创建的变量为不可变量。吐槽:大多数情况下,程序都是使用可变变量,而rust却默认创建的不可变的变量,纯粹为了特别而特别吧! ``` //设置不可变量 let x = 5; println!("let x={}",x); ``` **不可变量不可对变量进行修改**,错误示例 ``` //设置不可变量 let x = 5; println!("let x={}",x); //不可以对不可变量进行修改 x = 6; println!("let x={}",x); ``` 编译错误 ``` error[E0384]: cannot assign twice to immutable variable `x` --> main.rs:6:2 | 3 | let x = 5; | - | | | first assignment to `x` | help: make this binding mutable: `mut x` ... 6 | x = 6; | ^^^^^ cannot assign twice to immutable variable error: aborting due to previous error For more information about this error, try `rustc --explain E0384`. ``` **不可变量可以重新定义**,重新定义包括改变类型 正确示例 ``` //设置不可变量 let x = 5; println!("let x={}",x); //重新定义 let x = 6; println!("let x={}",x); //重新定义,并改变类型 let x = "字符串"; println!("let x={}",x); ``` 运行结果 ``` let x=5 let x=6 let x=字符串 ``` ## 可变变量 绝大多数情况下,程序都是定义为可以修改的变量,变量本来就是要变的,只是rust加了一层不可变而已。rust下需要加上`mut`才能使变量可以修改。 正确示例 ``` //设置可变量 let mut x = 5; println!("let x={}",x); //修改值 x = 6; println!("let x={}",x); ``` 运行结果 ``` let x=5 let x=6 ``` **修改值需要保持类型一致**,错误示例 ``` //设置不可变量 let mut x = 5; println!("let x={}",x); //修改值 x = "字符串"; println!("let x={}",x); ``` 编译错误 ``` error[E0308]: mismatched types --> main.rs:6:6 | 6 | x = "字符串"; | ^^^^^^^^ expected integer, found `&str` error: aborting due to previous error For more information about this error, try `rustc --explain E0308`. ``` ## 常量 定义常量使用`const`作为关键字。 ``` //设置常量 const PI:f32 = 3.14; println!("const PI={}",PI); ``` 运行结果 ``` const PI=3.14 ``` 常量不可修改,这跟不可变量是一样的 **常量不可重新定义**,错误示例1 ``` fn main(){ //设置常量 const PI:f32 = 3.14; println!("const PI={}",PI); const PI:f32 = 3.1415; println!("const PI={}",PI); } ``` 编译错误 ``` error[E0428]: the name `PI` is defined multiple times --> main.rs:5:2 | 3 | const PI:f32 = 3.14; | -------------------- previous definition of the value `PI` here 4 | println!("const PI={}",PI); 5 | const PI:f32 = 3.1415; | ^^^^^^^^^^^^^^^^^^^^^^ `PI` redefined here | = note: `PI` must be defined only once in the value namespace of this block error: aborting due to previous error For more information about this error, try `rustc --explain E0428`. ``` 错误示例2 ``` //设置常量 const PI:f32 = 3.14; println!("const PI={}",PI); let PI:f32 = 3.1415; println!("let PI={}",PI); ``` 编译错误 ``` warning: floating-point types cannot be used in patterns --> main.rs:5:6 | 5 | let PI:f32 = 3.1415; | ^^ | = note: `#[warn(illegal_floating_point_literal_pattern)]` on by default = warning: this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release! = note: for more information, see issue #41620 error[E0005]: refutable pattern in local binding: `_` not covered --> main.rs:5:6 | 3 | const PI:f32 = 3.14; | -------------------- constant defined here 4 | println!("const PI={}",PI); 5 | let PI:f32 = 3.1415; | ^^ | | | interpreted as a constant pattern, not a new variable | help: introduce a variable instead: `pi_var` warning: floating-point types cannot be used in patterns --> main.rs:5:6 | 5 | let PI:f32 = 3.1415; | ^^ | = warning: this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release! = note: for more information, see issue #41620 error: aborting due to previous error For more information about this error, try `rustc --explain E0005`. ``` **常量不能推导类型需要确定类型**,必须明确类型。吐槽:推导类型应该不难吧,纯粹就是为了瘸一班的感觉! 错误示例 ``` //设置常量 const PI = 3.14; println!("const PI={}",PI); ``` 编译错误 ``` error: missing type for `const` item --> main.rs:3:11 | 3 | const PI = 3.14; | ^^ help: provide a type for the item: `PI: f64` error: aborting due to previous error ``` **常量可以在函数外部定义**,而可变量和不可变量不可以。 正确示例 ``` //设置常量 const PI:f32 = 3.14; fn main(){ println!("const PI={}",PI); } ``` 运行结果 ``` const PI=3.14 ``` 错误示例 ``` //设置 let PI:f32 = 3.14; fn main(){ println!("const PI={}",PI); } ``` 编译错误 ``` error: expected item, found keyword `let` --> main.rs:2:1 | 2 | let PI:f32 = 3.14; | ^^^ expected item error: aborting due to previous error ``` ## 总结 rust分为可变变量、不可变变量、常量,默认创建的变量为不可变量。

加载全部内容

相关教程
猜你喜欢
用户评论