练习题来自:https://practice-zh.course.rs/basic-types/functions.html
1
fn main() {
// 不要修改下面两行代码!
let (x, y) = (1, 2);
let s = sum(x, y);
assert_eq!(s, 3);
}
fn sum(x, y: i32) {
x + y;
}
函数的返回值应该是一个表达式,这里返回的其实是()
,去掉x+y
末尾的分号即可。另外,x
的类型并没有被标注。函数的返回值也没有写,都补上即可。
fn main() {
// 不要修改下面两行代码!
let (x, y) = (1, 2);
let s = sum(x, y);
assert_eq!(s, 3);
}
fn sum(x: i32, y: i32) -> i32 {
x + y
}
2
fn main() {
print();
}
// 使用另一个类型来替代 i32
fn print() -> i32 {
println!("hello,world");
}
此处的返回值应该是()
,甚至可以不写返回值,把i32
去掉即可。
fn main() {
print();
}
// 使用另一个类型来替代 i32
fn print() {
println!("hello,world");
}
3
// 用两种方法求解
fn main() {
never_return();
}
fn never_return() -> ! {
// 实现这个函数,不要修改函数签名!
}
说实话我没想到第二种方法是什么,还不能修改函数签名。这里,函数是没有返回值的(和返回()
不一样),但是里面是空的的话,返回的正是()
,所以加一个panic
宏即可。
// 用两种方法求解
fn main() {
never_return();
}
fn never_return() -> ! {
// 实现这个函数,不要修改函数签名!
panic!("PANIC!");
}
4
fn main() {
println!("Success!");
}
fn get_option(tp: u8) -> Option<i32> {
match tp {
1 => {
// TODO
}
_ => {
// TODO
}
};
// 这里与其返回一个 None,不如使用发散函数替代
never_return_fn()
}
// 使用三种方法实现以下发散函数
fn never_return_fn() -> ! {
}
有几个常用的函数是发散的,比如panic!
,todo!
等,这里举一个例子。
fn main() {
println!("Success!");
}
fn get_option(tp: u8) -> Option<i32> {
match tp {
1 => {
// TODO
}
_ => {
// TODO
}
};
// 这里与其返回一个 None,不如使用发散函数替代
never_return_fn()
}
// 使用三种方法实现以下发散函数
fn never_return_fn() -> ! {
panic!();
}
5
fn main() {
// 填空
let b = __;
let _v = match b {
true => 1,
// 发散函数也可以用于 `match` 表达式,用于替代任何类型的值
false => {
println!("Success!");
panic!("we have no value for `false`, but we can panic")
}
};
println!("Exercise Failed if printing out this line!");
}
b赋值为false即可。
fn main() {
// 填空
let b = false;
let _v = match b {
true => 1,
// 发散函数也可以用于 `match` 表达式,用于替代任何类型的值
false => {
println!("Success!");
panic!("we have no value for `false`, but we can panic")
}
};
println!("Exercise Failed if printing out this line!");
}