「这是我参与2022首次更文挑战的第6天,活动详情查看:2022首次更文挑战」。
变量声明和可变性(跟js不同)
- 声明变量使用let关键字
- 默认情况下变量是不可变的 - 第一次赋值以后,就不能再赋值
- 声明变量时,在变量前添加mut,可以使变量可变
fn main() {
let x = 5;
println!("value is {}", x) //直接输出value is 5,不会有任何报错
}
再给x 再赋值一次
fn main() {
let x = 5;
x = 10;
println!("value is {}", x)
}
不能给不可变的变量赋值两次,跟常见的语言很不一样,需要在前面添加关键字mut
fn main() {
let mut x = 5;
x = 10;
println!("value is {}", x)
}
变量于常量
- 声明常量使用const 关键字,类型必须标注, 变量在编辑器能推倒出的情况下可以不标注,类似上面的代码
- 不可使用mut,常量永远不可变化
- 常量在任何作用域声明(包含全局作用域)
- 只可以绑定常量表达式
- 在其声明的作用域内一直有效
- 规范 单词大写,_分割.例如 const MAX_SIZE:u32 = 10000;其实小写也能编译过去只是不推荐
const MAX_SIZE: i32 = 100; 全局作用域
fn main() {
println!("{}", MAX_SIZE)
}
shadowing(跟js 很不一样)
- 可使用相同的名字声明新的变量,新的变量就会shadow之前的的同名的变量 shadow相当于隐藏,屏蔽
rust例子
fn main() {
let x = 10;
let x = 11;
println!("{}", x) //输出11
}
```js
let x =1
let x =2 // SyntaxError: Identifier 'x' has already been declared,重复声明
console.log(x)
跟let mut声明变量的不同点
- 不使用mut 关键字,重新给变量赋值会报错
- 使用let 声明的新变量,也是不可变的
- let 声明的同名新变量,他的类型可以与之前不一样
fn main() {
let mut x = 10; // 编译器推到类型为i32,
let x = "hello".to_string(); //编译器推到类型为String
println!("{}", x)
}