我正在学习 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
}
Run Code Online (Sandbox Code Playgroud)
Sil*_*olo 14
Rust 区分块上定义的方法impl和与结构关联的字段。结构体中的和全名恰好带有参数的方法之间没有任何关系。fSS::f&self
s.f(); // Prints 1
Run Code Online (Sandbox Code Playgroud)
这是语法糖
S::f(&s); // Prints 1
Run Code Online (Sandbox Code Playgroud)
它不像Python 那样查看对象的字段。当表达式后跟方法调用语法(即点、名称和左括号)时,这始终是方法调用。方法调用静态解析,并被运行时视为普通函数调用。s.f()还可以引用在某处的特征上定义的方法,如果它没有在您固有的impl.
要调用恰好存储在实例变量中的函数,请使用额外的括号。
(s.f)(); // Prints 2
Run Code Online (Sandbox Code Playgroud)
这不是方法调用。这是一个字段访问,然后调用结果字段,在本例中恰好是一个函数。