是否可以从特征中访问结构字段?

Is it possible to access struct fields from within a trait?

Traits 用于对一些要从结构中实现的函数进行分组,但是是否可以从 trait 中访问结构字段?

我可以想象在特征中声明字段,以便字段也被抽象化。我还没有找到这样的语法;还有其他解决办法吗?否则,就不可能有使用特征的非静态方法,对吗?

我了解 C# 的面向对象编程,并且正在研究 Rust,尝试调整我已经从 C# 了解的 OOP 功能。

这听起来像是您误解了特征的工作原理。特征不能有字段。如果你想提供对一个特征的字段的访问,你需要在那个特征中定义一个方法(比如,get_blah)。

如果您询问是否可以从该结构的 实现 特征中访问该结构的字段,那么是的。该结构知道它自己的类型,所以没有问题。

trait Pet {
    fn is_smelly(&self) -> bool;
}

struct Dog {
    washed_recently: bool,
}

impl Pet for Dog {
    fn is_smelly(&self) -> bool {
        !self.washed_recently
    }
}

如果您正在编写特征的 默认 实现( 在特征中定义方法体),则不,您无法访问字段。默认实现只能使用在 trait 或 super trait 中定义的方法。

在特征的默认实现中定义字段会很有用,因此实现特征的结构将始终具有相同的字段。

显然,Rust 团队也有同样的想法,但根据 this RFC,它仍在进行中。这是一个很大的变化,而且已经被推迟了,所以我认为简短的回答是:你现在还做不到,但你将来可能会做到。

现在,您将不得不使用不太强大的特性。

您可以在默认特征实现中创建访问器函数,在子实现中必须 return 字段 value/ref,returning 默认值。在默认实现中的其他 fn 中使用它,并在子实现中重新定义访问器。默认实现 fn's 将使用重新定义的访问器,因为它是虚拟 fn's。