Rust 会自动解引用原始类型引用吗?
Does Rust automatically dereference primitive type references?
我是 Rust 的新手,正在尝试了解引用的工作原理。在下面的代码中,当我想对 a1
(即 i32
)进行计算时,我不必取消引用它。但是对于 b1
这是一个 Box
,我必须取消引用它。
实际上 let a2 = a1 * 2;
和 let a3 = *a1 * 2;
的行为相似。看起来原语中的取消引用是可选的,或者编译器正在隐式地为我们做这件事。
fn main(){
let a = 5;
let b = Box::new(10);
let a1 = &a;
let b1 = &b;
println!("{} {}", a1, b1);
let a2 = a1 * 2;
let b2 = (**b1) * 10;
let a3 = *a1 * 2;
println!("{} {} {}", a2, a3, b2);
}
有人可以解释一下这个功能吗?
Rust 中的所有算术运算符都是针对原始值和对运算符两侧的原始值的引用而实现的。例如,请参阅 std::ops::Mul
的 Implementors
部分,该特征控制 *
运算符的覆盖。
您会看到如下内容:
impl Mul<i32> for i32
impl<'a> Mul<i32> for &'a i32
impl<'a> Mul<&'a i32> for i32
impl<'a, 'b> Mul<&'a i32> for &'b i32
等等等等。
在您的示例中,b1
具有 &Box<i32>
类型(默认整数类型),而 Box
实现了许多特征作为其包含类型的直通(例如 impl<T: Read> Read for Box<T>
), 算术运算符不在其中。这就是您必须取消引用该框的原因。
我是 Rust 的新手,正在尝试了解引用的工作原理。在下面的代码中,当我想对 a1
(即 i32
)进行计算时,我不必取消引用它。但是对于 b1
这是一个 Box
,我必须取消引用它。
实际上 let a2 = a1 * 2;
和 let a3 = *a1 * 2;
的行为相似。看起来原语中的取消引用是可选的,或者编译器正在隐式地为我们做这件事。
fn main(){
let a = 5;
let b = Box::new(10);
let a1 = &a;
let b1 = &b;
println!("{} {}", a1, b1);
let a2 = a1 * 2;
let b2 = (**b1) * 10;
let a3 = *a1 * 2;
println!("{} {} {}", a2, a3, b2);
}
有人可以解释一下这个功能吗?
Rust 中的所有算术运算符都是针对原始值和对运算符两侧的原始值的引用而实现的。例如,请参阅 std::ops::Mul
的 Implementors
部分,该特征控制 *
运算符的覆盖。
您会看到如下内容:
impl Mul<i32> for i32
impl<'a> Mul<i32> for &'a i32
impl<'a> Mul<&'a i32> for i32
impl<'a, 'b> Mul<&'a i32> for &'b i32
等等等等。
在您的示例中,b1
具有 &Box<i32>
类型(默认整数类型),而 Box
实现了许多特征作为其包含类型的直通(例如 impl<T: Read> Read for Box<T>
), 算术运算符不在其中。这就是您必须取消引用该框的原因。