- 不允许对常量使用 mut。
- 常量使用 const 关键字,并且需要注明类型。
- 常量只能被设置为常量表达式,不能是函数调用的结果,或者是任何其它只能在运行时计算出的值。
- 在声明它的作用域中,常量在整个程序生命周期都有效。
① mut 修饰变量,表示这个变量可以被重新绑定, 或者再次被 mut 或 &mut 修饰。 ② &mut 修饰引用,表示它指向的对象可以被修改。
fn main() {
let mut var = 0_i32;
// 修饰引用
{
let p1 = &mut var;
*p1 = 1;
}
// 修饰变量
{
let mut p2 = &var;
let temp = 2_i32;
p2 = &temp;
}
// 左边修饰变量,右边修饰引用
{
let mut p3 = &mut var;
let mut temp = 3_i32;
*p3 = 3;
p3 = &mut temp;
}
}
一、实现 Display
与 Debug
#[derive(Debug)]
struct A {
name: String,
}
impl Display for A {
fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result {
write!(f, "{}", self.name)
}
}
fn main() {
println!("Hello, world!");
let a = A {
name: String::from("hello")
};
println!("{:?}", a);
}
注:
- 泛型容器(如
Vec<T>
)不会实现Display
,而是去实现Debug
。因为无法得知 T 是什么类型,所以无法实现一个通用的 Display。 - 实现
Display
trait,则自动实现ToString
这个 trait。
二、为一个集合类型实现 Display
struct List(Vec<i32>);
impl fmt::Display for List {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
// Extract the value using tuple indexing,
// and create a reference to `vec`.
let vec = &self.0;
write!(f, "[")?;
// Iterate over `v` in `vec` while enumerating the iteration
// count in `count`.
for (count, v) in vec.iter().enumerate() {
// For every element except the first, add a comma.
// Use the ? operator to return on errors.
if count != 0 { write!(f, ", ")?; }
write!(f, "{}", v)?;
}
// Close the opened bracket and return a fmt::Result value.
write!(f, "]")
}
}
fn main() {
let v = List(vec![1, 2, 3]);
println!("{}", v);
}
注:
tuple struct 与 type 别名两者区别?
struct List(Vec<i32>);
type List = Vec<i32>;
前者是一个新类型;后者只是一个语法糖,可以随时用 Vec<i32>
将其替换,故而在此无法用它实现 Display
trait,因为 rust 的限制。