Size: a a a

Saint P Ruby Community

2020 November 20

CM

Cucumba Morozov in Saint P Ruby Community
внутри
источник

CM

Cucumba Morozov in Saint P Ruby Community
each_with_object({}) do |line_item, tax_groups|
 tax_groups[key] ||= []
 tax_groups[key] << line_item
end
источник

w

wi11son in Saint P Ruby Community
ну ок, спасибо
источник

PP

Pavel Peganov in Saint P Ruby Community
Vsevolod Avramov
each_with_object(Hash.new([])) do |line_item, tax_groups|
 tax_groups[key] << line_item
end
Кстати, рекомендую этот пример попробовать потестить. Там заложена очень коварная мина.
источник

PP

Pavel Peganov in Saint P Ruby Community
Если я всё правильно помню, то по итогу хэш окажется пустым, а при обращении к нему по любому ключу выдадутся все добавленные элементы.
источник

VA

Vsevolod Avramov in Saint P Ruby Community
Pavel Peganov
Если я всё правильно помню, то по итогу хэш окажется пустым, а при обращении к нему по любому ключу выдадутся все добавленные элементы.
Нет. Ключи создаются (насколько я помню)
источник

PP

Pavel Peganov in Saint P Ruby Community
Только что проверил в pry, не создаются :)
(На 2.5.1, но этот момент вроде не менялся)
источник

PP

Pavel Peganov in Saint P Ruby Community
А всё потому, что Hash.new(default) задаёт единственное значение по умолчанию, которое может быть мутировано.
источник

VA

Vsevolod Avramov in Saint P Ruby Community
Pavel Peganov
Только что проверил в pry, не создаются :)
(На 2.5.1, но этот момент вроде не менялся)
wtf?!
источник

PP

Pavel Peganov in Saint P Ruby Community
Доломаю мозг — сделай после этого h[:other_key]
источник

VA

Vsevolod Avramov in Saint P Ruby Community
хм-м-м.. ща вспомню, как я делал такое. Как-то точно делал
источник

PP

Pavel Peganov in Saint P Ruby Community
Блок надо передавать, чтобы дефолт брался не переданный, а инстанцировался новый
источник

PP

Pavel Peganov in Saint P Ruby Community
Hash.new { |h, k| h[k] = [] }
источник

VA

Vsevolod Avramov in Saint P Ruby Community
источник

w

wi11son in Saint P Ruby Community
наркоманы
источник

PP

Pavel Peganov in Saint P Ruby Community
Ага, вот так.
источник

w

wi11son in Saint P Ruby Community
какая-то черная магия
источник

PP

Pavel Peganov in Saint P Ruby Community
Я помню, с каким треском мне рвало шаблон, когда я документацию читал про это:
https://ruby-doc.org/core-2.7.2/Hash.html#method-c-new
(Она к 2.7, но этот раздел уже долгое время не менялся)
источник

PP

Pavel Peganov in Saint P Ruby Community
Только ради всех святых, не возвращайте хэши с такими приколами в сколько-нибудь публичных API, или как минимум предупреждайте об этом эффекте большими дизайнерскими красными буквами.
источник

PP

Pavel Peganov in Saint P Ruby Community
wi11son
какая-то черная магия
Ну, на уровне method_missing, да
источник