Traits用于对一些要从结构中实现的函数进行分组,但是可以从特征中访问struct字段吗?
我可以想象在特征中声明字段,以便字段也被抽象化。我还没有找到这样的语法;还有其他解决方案吗?否则,使用特征的非静态方法是不可能的,不是吗?
我知道来自C#的面向对象编程,我正在玩Rust,试图调整我已经从C#中知道的OOP功能。
答案 0 :(得分:11)
这听起来像是你误解了特质是如何运作的。特征不能有字段。如果要提供对特征字段的访问权限,则需要在该特征中定义一个方法(例如,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
}
}
如果您正在编写特征的默认实现(即在特征中定义方法体),那么不,您不能访问字段。默认实现只能使用在特征或超特征中定义的方法。
答案 1 :(得分:4)
在特征的默认实现中定义字段会很有用,因此实现特征的结构总是具有相同的字段。
显然,Rust团队认为相同,但根据this RFC,它仍然是一项正在进行中的工作。这是一个很大的改变而且已被推迟,所以我认为简短的回答是:你还没有做到,但你可能会在将来做到这一点。
现在,你必须处理不那么强大的特征。
答案 2 :(得分:0)
您可以在默认特征实现中创建访问器函数,该函数必须在子实现中返回字段值/ ref,并返回默认值。在默认实现中的其他fn中使用它,并在子实现中重新定义访问器。默认实现fn将使用重新定义的访问器作为虚拟fn。