Size: a a a

2020 March 09

EG

Emmanuel Goldstein in rust_offtopic
Там есть функции, let/in и паттерн-матчинг
источник

G

Gymmasssorla in rust_offtopic
Emmanuel Goldstein
То есть чтобы переложить пару полей из апишки мне теперь нужно не только создать десяток классов, но и написать к ним методы
Я думаю, это решается макросами для перечислений
источник

EG

Emmanuel Goldstein in rust_offtopic
Gymmasssorla
Я думаю, это решается макросами для перечислений
Гляди, у меня задача переложить пару джсонов, а на сцену уже вышли макросы
источник

G

Gymmasssorla in rust_offtopic
Emmanuel Goldstein
Гляди, у меня задача переложить пару джсонов, а на сцену уже вышли макросы
Если мне нужно тяп-хуяп, я выберу serde_json::Value. Если мне нужно строить долгоживущее приложение, я обмажусь #[derive(Serialize, Deserialize)] и прочими аттрибутами, чтобы обеспечить типобезопасность и интеграцию с IDE. ЯЗыки со статической типизацией позволяют перемещаться по "уровням типизации": от Any до serde_json::Value до моих тайп-чекед структур.
источник

EG

Emmanuel Goldstein in rust_offtopic
Решение на динамическом питоне всё ещё выглядит так:
try:
   field1 = data['with']['long']['path'][0]['five']
   field2 = data['with']['parameters']
   if field2['type'] == 'param1':
       field3 = data['for']['param1']
  else:
       field3 = data['for']['param2']
   return [
       checked_cast(str, field1),
       checked_cast(int, field2),
       checked_cast(bool, field3)
   ]
except (LookupError, CastingError):
   log.error("Bad answer from API: %s", data)
   return None
источник

G

Gymmasssorla in rust_offtopic
Emmanuel Goldstein
Решение на динамическом питоне всё ещё выглядит так:
try:
   field1 = data['with']['long']['path'][0]['five']
   field2 = data['with']['parameters']
   if field2['type'] == 'param1':
       field3 = data['for']['param1']
  else:
       field3 = data['for']['param2']
   return [
       checked_cast(str, field1),
       checked_cast(int, field2),
       checked_cast(bool, field3)
   ]
except (LookupError, CastingError):
   log.error("Bad answer from API: %s", data)
   return None
На serde_json::Value примерно также
источник

EG

Emmanuel Goldstein in rust_offtopic
Gymmasssorla
На serde_json::Value примерно также
Нет, тебе придётся разворачивать Option на каждый .get()
источник

G

Gymmasssorla in rust_offtopic
Emmanuel Goldstein
Нет, тебе придётся разворачивать Option на каждый .get()
Разве нетотальных методов нет в serde_json::Value?
источник

EG

Emmanuel Goldstein in rust_offtopic
Gymmasssorla
Разве нетотальных методов нет в serde_json::Value?
«Нетотальные методы» в serde_json::Value не будут паниковать?
источник

EG

Emmanuel Goldstein in rust_offtopic
Есть некая разница между обработкой эскепшнов и паник
источник

G

Gymmasssorla in rust_offtopic
Emmanuel Goldstein
«Нетотальные методы» в serde_json::Value не будут паниковать?
Нетотальные наоборот будут паниковать. Вот, например, индексация по квадратным кавычкам будет паниковать
источник

G

Gymmasssorla in rust_offtopic
источник

EG

Emmanuel Goldstein in rust_offtopic
В этом и проблема. Я же хочу, чтобы у меня программа при плохом ответе не упала кишками наружу, а залогировала некий плохой результат и вернула 500 юзеру.
источник

EG

Emmanuel Goldstein in rust_offtopic
Я, конечно, могу делать catch_unwind, но это уже как-то ну такое
источник

EG

Emmanuel Goldstein in rust_offtopic
Лол, нет, они не паникуют, они возвращают нулл
источник

EG

Emmanuel Goldstein in rust_offtopic
Ну окей, да, конкретная библиотека смогла сэмулировать динамический язык поверх статического.
источник

G

Gymmasssorla in rust_offtopic
Emmanuel Goldstein
В этом и проблема. Я же хочу, чтобы у меня программа при плохом ответе не упала кишками наружу, а залогировала некий плохой результат и вернула 500 юзеру.
.get().ok_or(())?
источник

EG

Emmanuel Goldstein in rust_offtopic
Плохой динамический язык: попытка сделать 1[1] должна бросать эксепшн.
источник

EG

Emmanuel Goldstein in rust_offtopic
Gymmasssorla
.get().ok_or(())?
А это уже чертовски вербозно, да. Поэтому для некоторых задач удобней нафигачить на динамике и не задумываться, чем использовать ту же самую динамику, но эмулированную поверх статики
источник

λ

λоλторт in rust_offtopic
Emmanuel Goldstein
Простой пример: я дёргаю апишку, которая отдаёт джсон сложной структуры. Мне из него нужно одно поле. В динамическом языке я его паршу в нетипизированную хешмапу, ['пишу']['такое']['выражение'] и получаю.
let val = json ^? at 'пишу' . at 'такое' . at 'выражение'
источник