我正在学习/试验Rust,在我用这种语言找到的所有优雅中,有一个让我感到困惑并且看起来完全不合适的特点.
在进行方法调用时,Rust会自动取消引用指针.我做了一些测试来确定确切的行为:
struct X { val: i32 }
impl std::ops::Deref for X {
type Target = i32;
fn deref(&self) -> &i32 { &self.val }
}
trait M { fn m(self); }
impl M for i32 { fn m(self) { println!("i32::m()"); } }
impl M for X { fn m(self) { println!("X::m()"); } }
impl M for &X { fn m(self) { println!("&X::m()"); } }
impl M for &&X { fn m(self) { println!("&&X::m()"); } }
impl M for &&&X { …Run Code Online (Sandbox Code Playgroud) 我必须实现一个将两个数字相加的函数:
fn add(x: &i32, y: &i32) -> i32 {
println!("x is: {}, y is {}", x, y);
println!("*x is: {}, *y is {}", *x, *y);
x + y
}
fn double(x: i32) -> i32 {
add(&x, &x)
}
fn main() {
assert_eq!(double(5), 10);
println!("Success!");
}
Run Code Online (Sandbox Code Playgroud)
输出是:
x is: 5, y is 5
*x is: 5, *y is 5
Success!
Run Code Online (Sandbox Code Playgroud)
根据我的理解,该add函数不应该能够执行,x+y因为它们都是地址。仅*x + *y当它取消引用地址并提供存储在那里的值时才应该起作用。然而,这两个语句产生相同的结果。这是为什么?