我正在学习铁 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

}


推荐答案

Rust区分在impl块上定义的方法和与 struct 相关联的字段.S struct 中的f与全名为S::f的方法之间有no个关系,而该方法恰好带有一个&self参数.

s.f(); // Prints 1

这是语法Suite for

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

它确实会像Python一样查看对象的字段.当您有一个后跟方法调用语法(即点、名称和左括号)的表达式时,这始终是方法调用.方法调用是静态解析的,运行库将其视为普通函数调用.s.f()也可以指在某个特性上定义的方法,如果它没有在您的固有impl中定义的话.

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

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

这是not次方法调用.这是一个字段访问,然后调用结果字段,在本例中恰好是一个函数.

Rust相关问答推荐

如何装箱生命周期相关联的两个对象?

常量泛型和类型枚举箱有重叠的用途吗?

在UdpSocket上使用sendto时的隐式套接字绑定

如何为 struct 字段设置新值并在Ruust中的可变方法中返回旧值

铁 rust 中的泛型:不能将`<;T作为添加>;::Output`除以`{Float}`

完全匹配包含大小写的整数范围(&Q;)

Rust函数的返回值不能引用局部变量或临时变量

为什么Deref类特征不构成?

用于实现获取 struct 体 id 的特征规范

当我编译 Rust 代码时,我是否缺少 AVX512 的目标功能?

要求类型参数有特定的大小?

如何从borrow 的异步代码运行阻塞代码?

unwrap 选项类型出现错误:无法移出共享引用后面的*foo

由特征键控的不同 struct 的集合

如何展平以下嵌套的 if let 和 if 语句?

TcpStream::connect - 匹配武器具有不兼容的类型

我可以在不调用 .clone() 的情况下在类型转换期间重用 struct 字段吗?

为什么我可以从读取的可变自引用中移出?

Rust 中的运行时插件

令人困惑的错误消息? (解包运算符)