rust - 如何访问特征的默认方法定义中的结构字段?

标签 rust traits

<分区>

我看到了一些相关问题(例如 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,但这会产生定界符错误,因此在语法上是无效的。

我认为这个问题很独特,因为其他问题似乎误解了它们指定的泛型如何影响它们的预期类型,在我的例子中,我不明白为什么我不能访问我所在的结构中的字段尝试实现默认方法。

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

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

最佳答案

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

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

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

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

关于rust - 如何访问特征的默认方法定义中的结构字段?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55677485/

相关文章:

generics - 为什么在关联类型上不识别除第一个之外的 super 特征边界?

rust - 如何在实现特征时避免函数名冲突?

rust - 为什么我会得到 "closure implements ` FnMut`,因此对捕获变量的引用无法逃脱闭包”?

cryptography - 使用 PBKDF2 key 派生通过 rust-crypto 正确创建用户可读的盐

unit-testing - 测试 future 和流,我如何创建一个假的上下文?

groovy - Groovy 特征的菱形继承(钻石问题)

scala - 强制 Scala trait 实现某个方法

mysql - 如何在 Rust 中从 MySQL 获取二进制列?

asynchronous - 有没有办法在 Rust 异步函数体内延迟执行一段时间?

rust - 如何指定结构字段必须实现特征?