Size: a a a

Сrystal Lang — русскоговорящее сообщество

2021 May 22

AK

Andrey Konovalov in Сrystal Lang — русскоговорящее сообщество
Ну хренс с ним пустой хеш, но с какого почему если я хочу получить значение int по ключу, которого там попросту нет - он мне говорит "0"? Это же просто безумие какое-то, даже в perl с его автовивификацией ммне вернут хотя бы undef, аналог nil
источник

AK

Andrey Konovalov in Сrystal Lang — русскоговорящее сообщество
Но вообще в Crystal сделано правильно и почему так не сделали в Go - я просто теряюсь в догадках
источник

YS

Yura Sokolov in Сrystal Lang — русскоговорящее сообщество
Потому что тип результата int, а не int|nil и не Option[int]

Используй v, ok := hash[k] . Чем проверка if ok отличается от if v != nil ?
источник

AK

Andrey Konovalov in Сrystal Lang — русскоговорящее сообщество
Да оно понятно... Но тут ещё отсутствие исключений не способствует
источник

AK

Andrey Konovalov in Сrystal Lang — русскоговорящее сообщество
Косяк в том, что человек может не проверить ни ok, ни что бы то ни было ещё..
источник

YS

Yura Sokolov in Сrystal Lang — русскоговорящее сообщество
К этому привыкаешь.
Собственно, я то говорю с точки зрения любителя C (помимо Ruby). Так что я спокойно отношусь к отсутствию исключений.
Джависты, вынужденные прогать на Go, так и продолжают плеваться.
источник

YS

Yura Sokolov in Сrystal Lang — русскоговорящее сообщество
Человек и исключение проглотить может. И позвать (в руби) get. Да, это особенность языка, но к ней быстро привыкаешь.
источник

AK

Andrey Konovalov in Сrystal Lang — русскоговорящее сообщество
А так редко кто в Crystal уже испольует if v != nil, чаще v || other, либо rescue
источник

AK

Andrey Konovalov in Сrystal Lang — русскоговорящее сообщество
Ну или если всё-таки if, то просто if v
источник

YS

Yura Sokolov in Сrystal Lang — русскоговорящее сообщество
Основное достоинство Go - это спецификация языка на сайте. Ее можно «проглотить» за 4 часа, и в ней описаны 95% типичных gotchas. Ещё 5% связанны с жесткой конкурентностью, и нарабатываются в первый месяц.
Т.е. потратив 4 часа на чтение и запоминание спецификации языка и пару дней на адаптацию в существующей кодобазе можно писать код без тупых ошибок.

Правда, не все тратят эти четыре часа. Наступают на описанные в спеке грабли, пишут в чате «говно ваш Go”. Спрашиваешь у них: ты спеку прочитал? Нет? Потрать 4 часа, и больше не тупи.
источник

YS

Yura Sokolov in Сrystal Lang — русскоговорящее сообщество
Самые большие gotchas именно языка, на которые наступают периодически и опытные, это переопределение переменной в блоке при :=, и типизированные nil.
источник

YS

Yura Sokolov in Сrystal Lang — русскоговорящее сообщество
Ок, ещё можно наткнуться на мутацию слайса. Но современем все привыкают копировать слайсы при любом сомнении. Я не помню проблем за последние пару лет связанных именно с этим.
источник

AK

Andrey Konovalov in Сrystal Lang — русскоговорящее сообщество
Вопрос с теми же хешами в том, зачем это так было сделано. Изучить можно всё , тот же распорядок дня в Заксенхаузене можно было изучить и приспособиться
источник

AK

Andrey Konovalov in Сrystal Lang — русскоговорящее сообщество
Вернее, даже нужно
источник

YS

Yura Sokolov in Сrystal Lang — русскоговорящее сообщество
С хэшами - микрооптимизация. Пустой хэш - это очень частый случай. А ключа и в непустом хэше может не быть. И тогда у тебя варианты:
- либо каждый раз писать

var val ValType
var ok bool
if hash != nil {
   val, ok = hash[key]
   if !ok {
       val = default
   }
}

- либо

val, ok := hash[key]
if !ok {
   val = default
}

Небольшая экономия LoC.
А учитывая, что идеология языка проповедует, zero is valid default, часто и проверка на ok не нужна
источник

YS

Yura Sokolov in Сrystal Lang — русскоговорящее сообщество
Т.е. чаще всего тебе не важно: ключа в мапе не было потому что ключа не было, или потому, что мапа не инициализирована. А памяти на создание этих пустых мапок экономится куча
источник

DS

Damir Sharipov in Сrystal Lang — русскоговорящее сообщество
Можно конечно научится использовать клинопись, но алфавит всё же гораздо удобнее.
Инструмент которым я пользуюсь, должен быть удобным, это позволяет сосредоточиться на задаче.
источник

YS

Yura Sokolov in Сrystal Lang — русскоговорящее сообщество
Вот этот момент с хэшами ни как на удобство не влияет. Вообще ни как. Он просто не привычен на первый взгляд, но это искажение опытом: «везде было по другому, потому так - не удобно». Не нужно смешивать «не удобно» и «не привычно».
источник

YS

Yura Sokolov in Сrystal Lang — русскоговорящее сообщество
Ну ок, это я говорил про неинициализированную мапку. То, что и в инициализированной мапке наличие ключа проверять нужно через ok, иногда доставляет. Но не часто.
источник

DS

Damir Sharipov in Сrystal Lang — русскоговорящее сообщество
Я вообще не про это, а про то, что пользоваться нужно удобным инструментом, если Go для вас удобнее пользуетесь им.
Мне удобен кристалл, я как старые тапки надел))
источник