Как убедиться, что тип generi c имеет определенное поле - PullRequest
1 голос
/ 04 мая 2020
pub struct Entity {
    name: String,
}

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

В настоящее время следующий код не компилируется, потому что тип T не имеет поля * 1002. *
Я знаю, что есть признаки черты в ржавчине, есть ли некоторые "границы поля"?

Мне действительно нужно:

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

Ой, подождите, это тоже не скомпилируется!
Вот рабочий пример

I значит, должно быть что-то более простое, чем , что .
Может быть, какая-то структурная деструкция, как в javascript?

1 Ответ

3 голосов
/ 04 мая 2020

В настоящее время вы не можете иметь связанные поля в чертах, см. this RF C.

Однако вы можете добавить функцию в черту, как в примере, который вы связали. Тем не менее, вы можете исключить время жизни:

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

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