Size: a a a

2020 November 25

Д

Дмитрий in Rust Beginners
источник

Д

Дмитрий in Rust Beginners
мне нужно в хеш-таблице хранить в качестве ключей структуры, если поля у структуры одинаковы - значит они должны попадать в один ключ (для этого реализован PartialEq + Eq).

Вопрос: в доке сказано что derive(Eq) должен работать, если все поля Eq (мой случай). Почему оно просит имплементировать PartialEq?
Вопрос №2: откуда переполнение стека взялось?
источник

MB

Mikail Bagishov in Rust Beginners
PartialEq тоже надо дерайвить
источник

Д

Дмитрий in Rust Beginners
Mikail Bagishov
PartialEq тоже надо дерайвить
вы правы. кстати, после дерайва PartialEq и ошибка ушла. видимо структуры нельзя сравнивать вот так self == other?
источник

С

Саша in Rust Beginners
Подскажите, пожалуйста
макросы serde генерируют такой кусок кода

_serde::Deserializer::deserialize_map(
               __deserializer,
               __Visitor {
                   marker: _serde::export::PhantomData::<Service>,
                   lifetime: _serde::export::PhantomData,
               },
           )


где искать реализацию deserialize_map? В самом serde я не вижу реализации Deserializer с таким методом, может не там смотрю
источник

EG

Emmanuel Goldstein in Rust Beginners
Дмитрий
мне нужно в хеш-таблице хранить в качестве ключей структуры, если поля у структуры одинаковы - значит они должны попадать в один ключ (для этого реализован PartialEq + Eq).

Вопрос: в доке сказано что derive(Eq) должен работать, если все поля Eq (мой случай). Почему оно просит имплементировать PartialEq?
Вопрос №2: откуда переполнение стека взялось?
1. Потому что Eq: PartialEq
источник

MB

Mikail Bagishov in Rust Beginners
Дмитрий
вы правы. кстати, после дерайва PartialEq и ошибка ушла. видимо структуры нельзя сравнивать вот так self == other?
Можно, но за это именно PartialEq отвечает
источник

r

red75prime in Rust Beginners
Саша
Подскажите, пожалуйста
макросы serde генерируют такой кусок кода

_serde::Deserializer::deserialize_map(
               __deserializer,
               __Visitor {
                   marker: _serde::export::PhantomData::<Service>,
                   lifetime: _serde::export::PhantomData,
               },
           )


где искать реализацию deserialize_map? В самом serde я не вижу реализации Deserializer с таким методом, может не там смотрю
источник

А⚙

Антон ⚙️ in Rust Beginners
Дмитрий
мне нужно в хеш-таблице хранить в качестве ключей структуры, если поля у структуры одинаковы - значит они должны попадать в один ключ (для этого реализован PartialEq + Eq).

Вопрос: в доке сказано что derive(Eq) должен работать, если все поля Eq (мой случай). Почему оно просит имплементировать PartialEq?
Вопрос №2: откуда переполнение стека взялось?
Не знаю насчёт переполнения, но у Eq объявлен так:

trait Eq: PartialEq {}

То есть тип, реализующий Eq, также должен реализовывать PartialEq
источник

EG

Emmanuel Goldstein in Rust Beginners
Дмитрий
мне нужно в хеш-таблице хранить в качестве ключей структуры, если поля у структуры одинаковы - значит они должны попадать в один ключ (для этого реализован PartialEq + Eq).

Вопрос: в доке сказано что derive(Eq) должен работать, если все поля Eq (мой случай). Почему оно просит имплементировать PartialEq?
Вопрос №2: откуда переполнение стека взялось?
2. Потому что внутри PartialEq используется ==, а == вызывает PartialEq
источник

EG

Emmanuel Goldstein in Rust Beginners
Eq это маркер-трейт
Оператор == всегда вызывает PartialEq
источник

EG

Emmanuel Goldstein in Rust Beginners
То, что ты хочешь, записывается как #[derive(PartialEq, Eq)]
источник

EG

Emmanuel Goldstein in Rust Beginners
источник

С

Саша in Rust Beginners
но это все же реализации нет, просто объявление сигнатур
источник

Д

Дмитрий in Rust Beginners
Emmanuel Goldstein
То, что ты хочешь, записывается как #[derive(PartialEq, Eq)]
ага, это уже понял, что дерайвить нужно два трейта. а как можно глянуть как дерайв реализовал код? интересно просто если имплементировать PartialEq, то как его описывать
источник

EG

Emmanuel Goldstein in Rust Beginners
Дмитрий
ага, это уже понял, что дерайвить нужно два трейта. а как можно глянуть как дерайв реализовал код? интересно просто если имплементировать PartialEq, то как его описывать
Дерайв генерирует тривиальные сравнения по каждому полю
источник

EG

Emmanuel Goldstein in Rust Beginners
Найти его код может быть не так просто, потому что это не настоящий дерайв-макрос, а встроенный.
источник

Д

Дмитрий in Rust Beginners
Emmanuel Goldstein
Дерайв генерирует тривиальные сравнения по каждому полю
т.е. на примере моего кода, если реализовывать самому такой трейт, то надо делать как-то так:
impl PartialEq for Request {
   fn eq(&self, other: &Request) -> bool {
       self.request_number == other.request_number &&
       self.field == other.field
   }
}

?
источник

EG

Emmanuel Goldstein in Rust Beginners
Дмитрий
т.е. на примере моего кода, если реализовывать самому такой трейт, то надо делать как-то так:
impl PartialEq for Request {
   fn eq(&self, other: &Request) -> bool {
       self.request_number == other.request_number &&
       self.field == other.field
   }
}

?
Вроде того, да
источник

MB

Mikail Bagishov in Rust Beginners
Дмитрий
ага, это уже понял, что дерайвить нужно два трейта. а как можно глянуть как дерайв реализовал код? интересно просто если имплементировать PartialEq, то как его описывать
Tools -> Expand в плейграунде
источник