为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

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

3 回答

  • 3 回答
  • 0 关注
  • 398 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信