【问题标题】:Why calling method on self doesn't cause recursion in Rust?为什么在 self 上调用方法不会导致 Rust 中的递归?
【发布时间】:2022-11-13 21:51:41
【问题描述】:

为什么下面的代码不会导致无休止的递归? 我希望 FFFimplis_empty 调用 self.is_empty() 将导致无限递归而不调用 Fooimpl

struct Foo{}

impl Foo{
    pub fn is_empty(&self) -> Option<bool>{
        Some(true)
    }
}

trait FFF {
    fn is_empty(&self) -> Option<bool>;
}

impl FFF for Foo {
    fn is_empty(&self) -> Option<bool>{
        println!("calling FFF");
        self.is_empty()    
    }
}

fn pr<F:FFF>(a:F){
  println!("{:?}", a.is_empty());
}

fn main() {
    pr(Foo{});
    
}

输出:

calling FFF
Some(true)

【问题讨论】:

    标签: rust


    【解决方案1】:

    方法解析总是更喜欢固有方法。另见the reference

    【讨论】:

    • (不是 OP,但对此感兴趣):如果是这种情况,我希望 OP 的代码不会打印任何内容,因为它会在执行 a.is_empty() 时调用“固有”is_empty。相反,它清楚地调用了 trait 方法,但在里面 self.is_empty() 调用了固有方法。这对我来说似乎很奇怪。
    • @RobinZigmond 这是因为第一个 .is_empty() 是在其类型为泛型类型的值上调用的,只有一个特征绑定,这意味着所有方法都将是与特征相关的方法。
    • 我明白了,谢谢@BlackBeans
    • @RobinZigmond 另一种解释方式是从pr() 的角度来看(在其宇宙) 固有的is_empty() 不存在;它只知道来自特征的方法。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-13
    • 2022-11-10
    • 2016-10-25
    • 1970-01-01
    • 1970-01-01
    • 2012-09-04
    相关资源
    最近更新 更多