Идиоматично ли реализовывать `Deref` как возвращение поля сложной структуры? - PullRequest
0 голосов
/ 12 октября 2018

У меня есть:

struct Id;
struct Url;
struct IdAndUrl {
    id: Id,
    url: Url,
}

Я хотел бы иметь возможность использовать IdAndUrl в местах, где мне нужно просто Id.Чтобы устранить шум, я мог бы использовать impl Deref<Id> for IdAndUrl.

Это хорошая практика / идиоматическая?

Ответы [ 2 ]

0 голосов
/ 12 октября 2018

Действительно, существуют официальные рекомендации, связанные с 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 }
}
0 голосов
/ 12 октября 2018

Цель Deref - реализовать типы указателей.Предполагается преобразовать указатель в T в T, поэтому разыменование указателя кажется «естественным».Использование его для преобразования между несвязанными типами кажется запутанным.

Я предлагаю вам добавить вместо этого метод получения id().

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...