相关疑难解决方法(0)

什么是Rust的确切自动解除引用规则?

我正在学习/试验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)

reference dereference formal-semantics rust

152
推荐指数
2
解决办法
2万
查看次数

当 x 和 y 是引用时,为什么 `x + y` 和 `*x + *y` 给出相同的结果?

我必须实现一个将两个数字相加的函数:

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当它取消引用地址并提供存储在那里的值时才应该起作用。然而,这两个语句产生相同的结果。这是为什么?

rust

3
推荐指数
1
解决办法
164
查看次数

标签 统计

rust ×2

dereference ×1

formal-semantics ×1

reference ×1