Действительно, существуют официальные рекомендации, связанные с Deref
и DerefMut
.В соответствии с C-DEREF из руководств Rust API, "Только интеллектуальные указатели реализуют Deref
и DerefMut
." Ваше предложение использовать Deref
приведет к многочисленным проблемам,и поэтому он строго не учитывается.
Deref
не имеет параметра типа, но имеет связанный тип.Его реализация должна быть выполнена в виде кода ниже, но никогда не может быть реализована для дополнительных атрибутов.
// don't try this at home!
impl Deref for IdAndUrl {
type Target = Id;
fn deref(&self) -> &Self::Target { &self.id }
}
Более того, реализация Deref
предоставляет методы из целевого типа посредством принудительного приведения, загрязняяstruct с интерфейсом, который вы, возможно, не захотите иметь здесь.
Можно посмотреть на другие черты преобразования (а именно From
, AsRef
и Borrow
) и посмотреть, имеют ли они смысл ( С-CONV-ПРИЗНАКИ * 1 025 *).Но из моей интерпретации ничего из этого не будет иметь смысла.Как уже предлагалось в другом ответе, простой геттер идеален здесь:
impl IdAndUrl {
fn id(&self) -> &Id { &self.id }
}