铁锈的自动解除规则是什么?我正在学习/试验锈蚀,在我在这门语言中发现的所有优雅中,有一个独特之处让我感到困惑,似乎完全不合适。在进行方法调用时,铁锈自动取消指针。我做了一些测试来确定确切的行为: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特质被利用了。确切的自动取消引用规则是什么?有人能给出这样一个设计决策的正式理由吗?
添加回答
举报
0/150
提交
取消