【问题标题】:How to ensure that a generic type has a certain field如何确保泛型类型具有某个字段
【发布时间】:2020-05-04 05:50:38
【问题描述】:
pub struct Entity {
    name: String,
}

fn walk<T>(entity: T) {
    eprintln!("{} walked", entity.name);
}

目前以下代码无法编译,因为类型 T 没有name 字段。
我知道 rust 有特征界限,是否有一些“字段界限”?

我真的必须:

trait HasName {}
impl HasName for Entity {}
fn walk<T: HasName>(entity: T) {
    eprintln!("{}", entity.name);
}

哦等等,那也不会编译!
Here's a working example

我的意思是,肯定有比那个更简单的东西。
也许某种结构解构,比如在 javascript 中?

【问题讨论】:

  • @joelb 我必须通知您,我已经将当前答案标记为已解决,我不再需要答案,但谢谢
  • 好的,保罗。当我的评论开始出现时,这是因为我建议堆栈溢出这个问题是重复的。根据审查,它可能会关闭

标签: generics rust


【解决方案1】:

目前您不能在特征中拥有关联字段,请参阅this RFC

但是,您可以向特征添加功能,就像您链接的示例中一样。但是,您可以省略生命周期:

pub trait HasName {
    fn name(&self) -> &str;
}

impl HasName for Entity {
    fn name(&self) -> &str {
        &self.name
    }
}

【讨论】:

  • 我已经阅读了那个 RFC,它仍然需要一个 trait impl,我只需要像 this 这样的东西。看不懂的话抱歉,我发誓这次要21:00睡觉,现在看我(我没有,现在我困了)
  • 使用宏。或者更好的是,不要那样做。特征是 Rust 用于泛型的东西,它们不是结构性的,并且作为父级注释,它们不支持关联字段。
猜你喜欢
  • 2019-11-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-01-11
相关资源
最近更新 更多