当用作模式匹配时(闭包和函数参数也是模式匹配),& 绑定到一个引用,使变量成为 dereferenced 值.
fn main() {
let an_int: u8 = 42;
// Note that the `&` is on the right side of the `:`
let ref_to_int: &u8 = &an_int;
// Note that the `&` is on the left side of the `:`
let &another_int = ref_to_int;
let () = another_int;
}
有错误:
error: mismatched types:
expected `u8`,
found `()`
如果您查看您的案例的错误消息,则表明您无法取消引用它,因为它不是参考:
error: type `_` cannot be dereferenced
我不必使用 *x 取消引用 x 指针。
那是因为您在模式匹配中隐式取消引用它。
我了解使用参考 |&x|效率更高
如果这是真的,那么除了引用之外就没有理由使用任何东西了!也就是说,引用需要额外的间接来获取真实数据。有一些可衡量的分界点,按值传递项目比传递对它们的引用更有效。
如果是这样,为什么使用|x| 不会引发错误?根据我使用 C 的经验,我希望在这里收到一个指针。
你确实做到了,以 reference 的形式。 x 是对(在此示例中)i32 的引用。但是,% 运算符是由 trait Rem 提供的,它是为所有引用/值对实现的:
impl Rem<i32> for i32
impl<'a> Rem<i32> for &'a i32
impl<'a> Rem<&'a i32> for i32
impl<'a, 'b> Rem<&'a i32> for &'b i32
这使您无需显式取消引用它。
或者Rust是否在这里隐式地在堆栈上分配原始x的值的副本?
它强调不这样做。事实上,这样做是不安全的,除非迭代的项目实现了Copy(或者可能是Clone,在这种情况下它也可能很昂贵)。这就是为什么引用被用作闭包参数的原因。