覆盖函数参数的 Rust

5
我正在学习Rust,并研究一些例子。为什么这段代码输出1呢? 我的代码:
struct S {
    f: fn(),
}

impl S {
    fn f(&self) {
        print!("1");
    }
}


fn main() {
    let f2 = || print!("2");
    let s = S{f: f2};
    s.f(); // prints 1, but I expected 2

}


1个回答

14
Rust在方法定义上区分了impl块和与结构体相关联的字段。你的S结构体中的f与其完整名称为S::f的方法之间没有关系,该方法恰好接受一个&self参数。
s.f(); // Prints 1

这是语法糖的一种形式

S::f(&s); // Prints 1

它不像Python那样查看对象的字段。当您有一个表达式后面跟着方法调用语法(即点、名称和开括号),那总是一个方法调用。方法调用在静态解析时会被解释为普通函数调用。如果s.f()没有在您的固有impl中定义,在某个地方也可以引用Trait上定义的方法。

要调用存储在实例变量中的函数,请使用额外的括号。

(s.f)(); // Prints 2

这不是一个方法调用。这是一个字段访问,然后调用结果字段,这在这种情况下恰好是一个函数。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接