Рассмотрим следующий код Rust
trait Trait {
fn show_name(&self) {}
}
struct Foo {
name: String,
things_and_stuff: usize,
}
impl Trait for Foo {
fn show_name(&self) {
println!("{}", self.name);
}
}
struct Bar {
name: String,
other_field: i32,
}
impl Trait for Bar {
fn show_name(&self) {
println!("{}", self.name);
}
}
Две функции show_name
имеют одинаковый код.Было бы удобно, если бы я мог поместить этот метод в качестве метода по умолчанию в Trait
, но это невозможно, потому что черты не могут получить доступ к полям структуры.
Мы могли бы объявить метод get_name(&self) -> &str
в Trait
и реализоватьэто на Foo
и Bar
, но это не решает проблему дублирования кода, потому что обе реализации get_name
будут одинаковыми.
Было бы неплохо избежать дублирования кода. Еще один вопрос уже задавал вопрос о том, возможен ли полевой доступ по признакам, и ответ был в основном "нет".Тем не менее, я нашел комментарий на форуме ржавчины-внутренности, который предполагает, что уже возможно.Вот код:
struct Fields {
name: String,
}
trait Trait: BorrowMut<Fields> {
// methods go here
}
impl<T> Trait for T where T: BorrowMut<Fields> {}
Предположительно, есть способ сделать тип T
be BorrowMut<Fields>
и использовать его, чтобы позволить Trait
получить доступ к полям Fields
, но пока яЯ не уверен, как это будет работать.
Каким образом приведенный выше фрагмент кода должен решить проблему получения доступа к полю в чертах?
Я знаю, что обсуждаются вопросы добавления поля.доступ к чертам языка ( rust-internals , RFC , еще один RFC ), но я хотел бы знать, что возможно сейчас.