Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Oop 可以从trait中访问struct字段吗?_Oop_Rust_Traits - Fatal编程技术网

Oop 可以从trait中访问struct字段吗?

Oop 可以从trait中访问struct字段吗?,oop,rust,traits,Oop,Rust,Traits,trait用于对一些要从结构实现的函数进行分组,但是可以从trait中访问结构字段吗 我可以想象在trait中声明字段,以便字段也被抽象。我还没有找到这样的语法;还有其他解决办法吗?否则,就不可能有使用trait的非静态方法,是吗 我从C#中了解面向对象编程,我一直在玩弄Rust,试图适应我已经从C#中了解到的OOP功能 这听起来好像你误解了特质是如何发挥作用的。特质不能有字段。如果您想提供从trait访问字段的权限,您需要在该trait中定义一个方法(比如,get_blah) 如果您询问是否可

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

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


我从C#中了解面向对象编程,我一直在玩弄Rust,试图适应我已经从C#中了解到的OOP功能

这听起来好像你误解了特质是如何发挥作用的。特质不能有字段。如果您想提供从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中定义一个方法体),那么不,您不能访问字段。默认实现只能使用在trait或超级trait中定义的方法。

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

显然,Rust团队的想法是一样的,但根据调查,这项工作仍在进行中。这是一个很大的变化,已经被推迟了,所以我认为简单的答案是:你还不能做到,但你将来可能会做到


现在,你必须适应那些不那么强大的特质

您可以在默认trait实现中使用accessor函数,该函数在子实现中必须返回字段值/ref,并返回默认值。在默认实现中的其他fn中使用它,并在子实现中重新定义访问器。默认实现fn将使用重新定义的访问器作为虚拟fn

虽然为结构成员编写访问器方法非常繁琐,但需要注意的是,优化器可能会删除函数调用,从而使其同样高效。您的编辑基本上就是我所说的。但当我不能在默认实现中使用字段时,Rust真的不允许使用经典继承模式,是吗?比如,这里有一个例子:C#有一个类FileStream,它继承自Stream。当您无法访问结构的字段时,如何使用rust执行类似操作?没错,rust没有经典继承。有非常好的组合能力,因为结构在其他结构中,没有额外的开销。那么这看起来是什么样子呢?只是拥有另一个结构的字段,或者是否有某种语法糖,就像我们在Go(虚拟字段)中直接访问字段的成员一样?@Reigbeaux遗憾的是,没有一种很好的方法可以直接访问嵌套的结构字段,假装嵌套不存在。您必须说
foo.nested.field
。这似乎是一个很好的解决方法。traits的默认实现不能直接访问结构字段(因为traits不能像Java和许多其他OOP语言那样拥有成员变量),但是如果您将getter/setter声明放在trait本身中,它们可以访问getter/setter,并且它提供了与访问结构字段IMO相同的功能。现在是2021年,我们在生锈的情况下仍然做不到这一点。