Rust的println怎么样!宏执行解除引用?

时间:2017-07-15 03:27:24

标签: macros rust dereference

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!
  1. 打印来自let v = vec![0, 2, 3, -4];

    的参考文献
    vec.iter
  2. for x in v.iter() { println!("x: {}", x); }

    打印取消引用的元素
    vec.iter
  3. for x in v.iter() { println!("x: {}", *x); }

    打印值
    vec
  4. 案例1中的内部解除引用是如何完成的?

    我知道内部for x in v { println!("x: {}", x); } 进行了另一次宏调用,但链println!中的最后一个宏是在编译器级别实现的,我没有查看它。

    format_args!

    Source code Reference

1 个答案:

答案 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特征的实现。