rust - 如何访问特征的默认方法定义中的结构字段?
问题描述
我看到了一些相关的问题(比如this和this),但我希望我的默认方法用例足够独特,可以提出一个稍微不同的问题。以下最小示例工作和输出"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
s 需要的情况shoot
,但我正在寻找一种方法来println
跨多种类型应用此行为(现在,只是 ing)。
impl Actor {
fn shoot(&self, other: &Actor) {
println!("\n{:?} shot {:?}!",
self.name,
other.name,
)
}
}
解决方案
您没有尝试在任何结构上实现默认方法;您正在为特征实施它。因此,您无法访问任何结构上的任何字段;您只能访问特征要求的内容。
特征方法的默认实现意味着任何实现特征的非默认方法的类型都可以使用默认方法,无论它看起来如何。但是您希望实现类型name
除了特征要求之外还有一个字段(顺便说一句,它不需要任何内容)。
这根本不是一个有效的假设。
我想知道你为什么在这里使用一个特征。如果你self
同意要求Actor
在shoot
方法中,为什么它是一种特质的方法?为什么它不是Actor
没有任何特征的结构的固有方法?
推荐阅读
- signals - 八度 - 生成方波(信号/脉冲)
- c# - 如何模拟 HttpConfiguration?
- google-drive-api - 如何让用户在驱动器上确认他的 ID 号后下载文件
- javascript - OpenLayers 中特征属性的深度克隆
- html - 如何从科学直接 URL 阅读论文标题
- animation - 为什么动画的最终呈现结果不是预期的?
- python - 如何从函数返回值下方删除“无”?
- html - 响应能力完全被破坏+整个身体的边缘无法识别?
- intellij-idea - Intellij HTML 编辑器:如何转义括号 < 和 >?
- java - spring boot 中的 logback.xml 不打印调试消息