Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/powerbi/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
Rust 如何在trait默认方法中使用借用mut supertrait访问结构字段?_Rust - Fatal编程技术网

Rust 如何在trait默认方法中使用借用mut supertrait访问结构字段?

Rust 如何在trait默认方法中使用借用mut supertrait访问结构字段?,rust,Rust,考虑以下防锈代码 trait Trait { fn show_name(&self) {} } struct Foo { name: String, things_and_stuff: usize, } impl Trait for Foo { fn show_name(&self) { println!("{}", self.name); } } struct Bar { name: String,

考虑以下防锈代码

trait Trait {
    fn show_name(&self) {}
}

struct Foo {
    name: String,
    things_and_stuff: usize,
}

impl Trait for Foo {
    fn show_name(&self) {
        println!("{}", self.name);
    }
}

struct Bar {
    name: String,
    other_field: i32,
}

impl Trait for Bar {
    fn show_name(&self) {
        println!("{}", self.name);
    }
}
两个
show_name
函数的代码完全相同。如果我可以将该方法作为默认方法放在
Trait
上,那会很方便,但这是不可能的,因为Trait无法访问结构字段

我们可以在
Trait
上声明一个
get\u name(&self)->&str
方法,并在
Foo
Bar
上实现它,但这并不能解决代码重复的问题,因为
get\u name
的两个实现都是相同的

最好避免代码重复。他已经问过在traits中是否可以进行实地考察,答案基本上是“不”。 然而,我在rust internals论坛上发现,这已经是可能的了。代码如下:

struct Fields {
    name: String,
}

trait Trait: BorrowMut<Fields> {
    // methods go here
}

impl<T> Trait for T where T: BorrowMut<Fields> {}
struct字段{
名称:String,
}
特征:借用mut{
//方法在这里
}
T的impl-Trait,其中T:breawmut{}
大概有一种方法可以使一个类型
T
成为
BorrowMut
,并使用它来允许
Trait
访问
字段
的字段,但到目前为止,我不确定这是如何工作的

上面显示的代码片段如何解决traits中的字段访问问题


我知道有关于在traits中添加字段访问的讨论(,),但我想知道现在有什么可能

答案基本上是“不”

答案实际上是(强调我的):

默认实现只能使用trait或super-trait中定义的方法

您的代码片段就是这样做的:

trait Trait: BorrowMut<Fields>
我几乎可以肯定你不会喜欢这个解决方案,因为它

不会修复代码重复的问题,因为两个实现[…]将是相同的

如果您的目标是减少代码中重复字符的数量,则可能更喜欢编写宏

另见:


@Shepmaster我想指出的是,编辑后的标题中包含的单词可能对那些从本文获益的人来说并不熟悉。哪些单词?虽然有宽泛的问题标题有助于搜索,但接下来的逻辑结果是“代码不起作用,为什么”式标题。当前标题中的单词与原始标题中的单词完全相同,但现在已清楚地将其与现有问题区分开来。如果人们搜索“在trait默认方法中访问结构域”,但没有用额外的词单击结果,那么我们似乎无法给他们提供很多帮助。@Shepmaster我没有说新标题更糟糕。
use std::borrow::Borrow;

struct Fields {
    name: String,
}

trait Trait: Borrow<Fields> {
    fn show_name(&self) {
        let fields: &Fields = self.borrow();
        println!("{}", fields.name);
    }
}

struct Foo {
    fields: Fields,
    things_and_stuff: usize,
}

impl Borrow<Fields> for Foo {
    fn borrow(&self) -> &Fields {
        &self.fields
    }
}

struct Bar {
    fields: Fields,
    other_field: i32,
}

impl Borrow<Fields> for Bar {
    fn borrow(&self) -> &Fields {
        &self.fields
    }
}

impl<T> Trait for T where T: Borrow<Fields> {}