表达式
let y = {
let x = 3;
x + 1
};
永不返回函数
fn dead_end() -> ! {
panic!("你已经到了穷途末路,崩溃吧!");
}
或者
fn forever() -> ! {
loop {
//...
};
}
可变引用 &mut T 是不可以 Copy的。
&String可以转&str,但是&str不可以转String,toString可以。
元组可以解构
let tup = (500, 6.4, 1);
let (x, y, z) = tup;
结构体也可以解构
struct Point {
x: i32,
y: i32,
}
fn main() {
let p = Point { x: 0, y: 7 };
let Point { x, y } = p;
assert_eq!(0, x);
assert_eq!(7, y);
}
if let与while let产生的变量遮蔽。
可以为枚举定义方法:
#![allow(unused)]
enum Message {
Quit,
Move { x: i32, y: i32 },
Write(String),
ChangeColor(i32, i32, i32),
}
impl Message {
fn call(&self) {
// 在这里定义方法体
}
}
fn main() {
let m = Message::Write(String::from("hello"));
m.call();
}
一段很奇怪的代码:
fn main() {
let i = vec![32,44,55,1];
println!("{}", largest_1(&i));
}
pub fn largest<T: PartialOrd + Copy>(list: &[T]) -> T{
let mut largest = list[0];
for item in list.iter() {
if *item > largest {
largest = *item;
}
}
largest
}
pub fn largest_1<T: PartialOrd + Copy>(list: &[T]) -> T{
let mut largest = list[0];
for item in list.iter() {
if *item > largest {
largest = *item;
}
}
largest
}
下面的方式都可以:
pub fn print(item: impl Summary){
item.draw();
}
fn draw2(x: &dyn Summary) {
x.draw();
}
fn draw3(x: Box<dyn Summary>) {
x.draw();
}