特质(Traits)用于将一些函数从结构体中分组实现,但是否可以从特质中访问结构体字段?
我可以想象在特质中声明字段,以便将字段也抽象化。我没有找到这样的语法;是否有其他解决方案?否则,无法使用特质具有非静态方法,对吗?
我熟悉C#的面向对象编程,并正在尝试适应Rust中我已经熟悉的C# OOP功能。
这听起来好像您误解了traits的工作原理。traits不能有字段。如果您想从trait中提供对字段的访问权限,则需要在该trait中定义一个方法(比如说,get_blah
)。
如果您正在询问是否可以从该结构体的trait实现中访问该结构体的字段,则是的。该结构体知道它自己的类型,因此没有问题。
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的默认实现中的字段是很有用的,这样实现trait的结构体就总是具有相同的字段。
显然,Rust团队也认为如此,但根据这个RFC,它仍在不断改进中。这是一项重大改变,已被推迟,因此我的看法是:目前还不能做到,但将来可能可以做到。
目前,您必须使用功能较弱的traits。
你可以在默认 trait 实现中使用访问器函数,使其在子实现中返回字段的值/引用并返回默认值。在默认实现的其他 fn 中使用它,并在子实现中重新定义访问器。默认实现的 fn 将使用重新定义的访问器作为其虚拟 fn。
foo.nested.field
。 - Shepmaster