首页 > 解决方案 > 如何访问特征的默认方法定义中的结构字段?

问题描述

我看到了一些相关的问题(比如thisthis),但我希望我的默认方法用例足够独特,可以提出一个稍微不同的问题。以下最小示例工作和输出"Sheriff Ted" shot "Billy the Kid"!

#[derive(Debug)]
struct Actor {
    name: String,
}

fn main() {
    let cop = Actor {
        name: String::from("Sheriff Ted"),
    };

    let robber = Actor {
        name: String::from("Billy the Kid")
    };

    println!("{:?} shot {:?}!", cop.name, robber.name); // without the trait. with:
    // cop.shoot(&robber);
}

//pub trait Shoot {
//    fn shoot(&self, other: &Actor) {
//        println!("\n{:?} shot {:?}!",
//                 &self.name,
//                 &other.name,
//        )
//    }
//}
//
//impl Shoot for Actor {}

如您所见,我想在结构上传递Shoot实现及其shoot包含的方法Actor。当我取消注释Shoot特征,它的实现Actor和调用cop.shoot(&robber)时,我也收到了与问题相关的错误消息error[E0609]: no field 'name' on type '&Self'

我的第一个想法是&self: Actor在默认方法的签名中指定,但这会产生分隔符错误,因此在语法上无效。

我认为这个问题是独一无二的,因为其他问题似乎误解了他们指定的泛型如何影响他们的预期类型,就我而言,我不明白为什么我不能访问我试图实现的结构中的字段默认方法。

这适用于仅Actors 需要的情况shoot,但我正在寻找一种方法来println跨多种类型应用此行为(现在,只是 ing)。

impl Actor {
    fn shoot(&self, other: &Actor) {
        println!("\n{:?} shot {:?}!",
                 self.name,
                 other.name,
        )
    }
}

标签: rusttraits

解决方案


您没有尝试在任何结构上实现默认方法;您正在为特征实施它。因此,您无法访问任何结构上的任何字段;您只能访问特征要求的内容。

特征方法的默认实现意味着任何实现特征的非默认方法的类型都可以使用默认方法,无论它看起来如何。但是您希望实现类型name除了特征要求之外还有一个字段(顺便说一句,它不需要任何内容​​)。

这根本不是一个有效的假设。

我想知道你为什么在这里使用一个特征。如果你self同意要求Actorshoot方法中,为什么它是一种特质的方法?为什么它不是Actor没有任何特征的结构的固有方法?


推荐阅读