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

时间:2015-01-29 16:29:56

标签: oop rust traits

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

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

我知道来自C#的面向对象编程,我正在玩Rust,试图调整我已经从C#中知道的OOP功能。

3 个答案:

答案 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。