function stormCategoryFrom($windSpeed)
{
$categories = [
157 => 5,
130 => 4,
111 => 3,
96 => 2,
74 => 1,
39 => 'TS',
];
foreach ($categories as $minimumSpeed => $category) {
if ($windSpeed >= $minimumSpeed) {
return $category;
}
}
return 'TD';
}
宏处理值和引用,无需显式解除引用。
首先,创建一个向量
println!
打印来自let v = vec![0, 2, 3, -4];
vec.iter
从for x in v.iter() {
println!("x: {}", x);
}
vec.iter
从for x in v.iter() {
println!("x: {}", *x);
}
vec
案例1中的内部解除引用是如何完成的?
我知道内部for x in v {
println!("x: {}", x);
}
进行了另一次宏调用,但链println!
中的最后一个宏是在编译器级别实现的,我没有查看它。
format_args!
答案 0 :(得分:1)
这里重要的是在格式字符串中使用{}
会调用传递值的Display
特征。
正如预期的那样,the i32 type实现了Display
,这使得您的案例#2和案例#3能够正常运行。因为它们获得的是标准i32
值,而不是参考值,所以它都有效。
对于您的案例#1,x
将是&i32
,这似乎是您问题的核心。答案出现在the Display
trait。显示包含以下内容:
impl<'a, T> Display for &'a T
where
T: Display + ?Sized
表示“对于T
的引用类型,如果Display
实现T
”,请实施Display
。这意味着因为i32
实现了Display
,所以引用类型也会自动实现它。
此处编译器没有进行特殊的类型处理。编译器实现的代码将该责任传递给Display
特征的实现。