generics - 如何确保泛型类型具有某个字段

标签 generics rust

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 中那样进行某种结构解构?

最佳答案

目前您无法在特征中拥有关联字段,请参阅this RFC .

但是,您可以向特征添加函数,就像您链接的示例一样。但是,您可以忽略生命周期:

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

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

关于generics - 如何确保泛型类型具有某个字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61581929/

相关文章:

java - java如何处理使用原始类型列表的泛型性和多态性

multithreading - 如何在不克隆的情况下对只读数据进行多线程函数调用?

arrays - Swift 通用数组 'not identical' 错误

vb.net - 如何确定泛型类 VB.NET 中的类型

java - 反序列化通用(但可序列化)类型

rust - 使用引用匹配结构

generics - Rust:通用参数是否可以具有引用其他参数的范围?

generics - 通过迁移到androidx意外覆盖

regex - 用正则表达式过滤字符串

rust - 有没有办法防止 Weak::new() 过度分配?