铁锈的自动解除规则是什么?

铁锈的自动解除规则是什么?

我正在学习/试验锈蚀,在我在这门语言中发现的所有优雅中,有一个独特之处让我感到困惑,似乎完全不合适。


在进行方法调用时,铁锈自动取消指针。我做了一些测试来确定确切的行为:


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<'a>         M for &'a X         { fn m(self) { println!("&X::m()"); } }

impl<'a, 'b>     M for &'a &'b X     { fn m(self) { println!("&&X::m()"); } }

impl<'a, 'b, 'c> M for &'a &'b &'c X { fn m(self) { println!("&&&X::m()"); } }


trait            RefM                   { fn refm(&self); }

impl             RefM for i32           { fn refm(&self) { println!("i32::refm()"); } }

impl             RefM for X             { fn refm(&self) { println!("X::refm()"); } }

impl<'a>         RefM for &'a X         { fn refm(&self) { println!("&X::refm()"); } }

impl<'a, 'b>     RefM for &'a &'b X     { fn refm(&self) { println!("&&X::refm()"); } }

impl<'a, 'b, 'c> RefM for &'a &'b &'c X { fn refm(&self) { println!("&&&X::refm()"); } }


struct Y { val: i32 }

impl std::ops::Deref for Y {

    type Target = i32;

    fn deref(&self) -> &i32 { &self.val }

}


struct Z { val: Y }

impl std::ops::Deref for Z {

    type Target = Y;

    fn deref(&self) -> &Y { &self.val }

}


struct A;

impl std::marker::Copy for A {}

impl             M for             A { fn m(self) { println!("A::m()"); } }

impl<'a, 'b, 'c> M for &'a &'b &'c A { fn m(self) { println!("&&&A::m()"); } }

impl             RefM for             A { fn refm(&self) { println!("A::refm()"); } }

impl<'a, 'b, 'c> RefM for &'a &'b &'c A { fn refm(&self) { println!("&&&A::refm()"); } }



因此,似乎,或多或少:

  • 编译器将插入调用方法所需的尽可能多的取消引用操作符。
  • 当解析使用

    &self

    (参照电话):
    • 第一次尝试要求取消对

      self

    • 然后尝试调用确切类型的

      self

    • 然后,尝试插入匹配所需的尽可能多的取消引用操作符。
  • 方法声明使用

    self

    (按值调用)类型

    T

    表现得好像他们是用

    &self

    (按引用调用)类型

    &T

    并调用对点运算符左侧的任何内容的引用。
  • 上面的规则首先尝试使用原始内置的反引用,如果没有匹配,则使用

    Deref

    特质被利用了。

确切的自动取消引用规则是什么?有人能给出这样一个设计决策的正式理由吗?



扬帆大鱼
浏览 400回答 3
3回答
打开App,查看更多内容
随时随地看视频慕课网APP