Size: a a a

Rust — русскоговорящее сообществo

2020 December 07

p

polunin.ai in Rust — русскоговорящее сообществo
Andrey Vlasov
Наделай методов объекту по типу .field() и будет почти то же самое, только две скобочки ещё
Зачем плохому новичков учишь :\
Ну можно возвращать Option<&T> и будет норм, да.
источник

И

Игорь in Rust — русскоговорящее сообществo
ну как обойти такое ограничение я догадываюсь, но просто через точку писать довольно удобно
источник

AV

Andrey Vlasov in Rust — русскоговорящее сообществo
polunin.ai
Зачем плохому новичков учишь :\
Ну можно возвращать Option<&T> и будет норм, да.
Чего плохого-то
источник

a

antuan in Rust — русскоговорящее сообществo
Игорь
уверен, она реально меняется иногда. Это модель описания сети. Host имеет аттрибуты name, hardwareType и тд. В какой-то момент это число атрибутов меняется - могут добавить что-нибудь. Мне нужно сделать либу что-бы с этим было удобно работать
удалятся поля могут?
источник

И

Игорь in Rust — русскоговорящее сообществo
antuan
удалятся поля могут?
теортетически да
источник

(L

(((Mike Lubinets))) in Rust — русскоговорящее сообществo
Игорь
уверен, она реально меняется иногда. Это модель описания сети. Host имеет аттрибуты name, hardwareType и тд. В какой-то момент это число атрибутов меняется - могут добавить что-нибудь. Мне нужно сделать либу что-бы с этим было удобно работать
ИМХО, задать схему статически и обновлять при необходимости удобнее чем жонглировать динамическим Value
источник

a

antuan in Rust — русскоговорящее сообществo
Игорь
теортетически да
а есть набор полей, которые никогда не будут удаляться\изменяться?
источник

p

polunin.ai in Rust — русскоговорящее сообществo
Игорь
теортетически да
Что ты намерен делать если нужное поле удалилось?
источник

AV

Andrey Vlasov in Rust — русскоговорящее сообществo
(((Mike Lubinets)))
ИМХО, задать схему статически и обновлять при необходимости удобнее чем жонглировать динамическим Value
+
источник

И

Игорь in Rust — русскоговорящее сообществo
если в коде есть к нему обращение то получится ошибка "такого поля нет"
источник

AV

Andrey Vlasov in Rust — русскоговорящее сообществo
Игорь
если в коде есть к нему обращение то получится ошибка "такого поля нет"
Динамическая типизация получается
источник

NL

Nick Linker in Rust — русскоговорящее сообществo
Игорь
подскажите плиз, если в rust возможность реализовать что-то типа питоновского getattr ? Есть обьект структура которого создается в рантайме из описания в json и хочется иметь доступ к полям обьекта просто через точку - типа o.field (имя которое после точки во время компиляции неизвестно). С какой стороны заходить?
Возможность есть, через макросы.
Аналогично тому, как это сделано в sqlx
https://github.com/launchbadge/sqlx/blob/master/src/macros.rs
Позволяет писать

async fn list_todos(pool: &MySqlPool) -> anyhow::Result<()> {
   let recs = sqlx::query!(
       r#"
       SELECT id, description, done
       FROM todos
       ORDER BY id
       "#
   )
   .fetch_all(pool)
   .await?;

   // NOTE: Booleans in MySQL are stored as `TINYINT(1)` / `i8`
   //       0 = false, non-0 = true
   for rec in recs {
       println!(
           "- [{}] {}: {}",
           if rec.done != 0 { "x" } else { " " },
           rec.id,
           &rec.description,
       );
   }

   Ok(())
}
вот эти rec.id, rec.description и rec.done определяются из схемы базы данных на этапе билда. Там же проверяется наличие этих полей в рекордсете, который генерирует SQL запрос выше.

Реализация конечно жесть, но теоретически возможность есть.
источник

И

Игорь in Rust — русскоговорящее сообществo
в dlang есть метод opDispatch - если при обращении через точку .field оказывается что у обьекта нет такого поля/метота то вызывается метод opDispatch с агрументом "field". получается тоже довольно динамически
источник

A

Artem in Rust — русскоговорящее сообществo
(((Mike Lubinets)))
ИМХО, задать схему статически и обновлять при необходимости удобнее чем жонглировать динамическим Value
+. В обоих случаях кот менять придётся
источник

И

Игорь in Rust — русскоговорящее сообществo
Artem
+. В обоих случаях кот менять придётся
но не код библиотеки
источник

a

antuan in Rust — русскоговорящее сообществo
antuan
а есть набор полей, которые никогда не будут удаляться\изменяться?
я бы у структуры задал явно те поля, которые никогда не будут удаляться
остальное клал бы в какую-нибудь хешмапу (поле экстра), у которой значения хранить как стринги
источник

MB

Mikail Bagishov in Rust — русскоговорящее сообществo
Игорь
в dlang есть метод opDispatch - если при обращении через точку .field оказывается что у обьекта нет такого поля/метота то вызывается метод opDispatch с агрументом "field". получается тоже довольно динамически
ну короче такой синтаксической возможности, как обработчик всех гетов всех полей нет. В той или иной степени это можно реализовать макросом (который доступы через точку будет заменять на вызов метода)
источник

И

Игорь in Rust — русскоговорящее сообществo
ясно, спасибо!
источник

И

Игорь in Rust — русскоговорящее сообществo
буду думать как поудобнее это сделать
источник

A

Artem in Rust — русскоговорящее сообществo
antuan
я бы у структуры задал явно те поля, которые никогда не будут удаляться
остальное клал бы в какую-нибудь хешмапу (поле экстра), у которой значения хранить как стринги
Я бы Apache avro внедрил бы с обоих сторон)) так, холиварить нельзя в этом чате
источник