Перебор списка хэшей через параллельное присваивание - PullRequest
0 голосов
/ 14 апреля 2020

Я только что видел этот код (упрощенно):

def something
  yield(key1: 1, key2: 2)
end

something { |key1: key1, key2: key2|  puts "key1:#{key1}, key2:#{key2}" }
# (irb):351: warning: circular argument reference - key1
# (irb):351: warning: circular argument reference - key2
# key1:1, key2:2

Как и ожидалось, есть круговая ссылка ... но подождите секунду! key1 и key2 определены правильно!

Хорошо, значит, они были определены ранее, это означает, что я могу полностью избавиться от ха sh, верно?

something { |key1, key2|  puts "key1:#{key1}, key2:#{key2}" }
# key1:{:key1=>1, :key2=>2}, key2:

Нет, круговая ссылка великолепна! но ... параллельное присваивание не работает, первая переменная получает целое га sh.

Итак, я попытался очистить вещи немного больше:

something { |key1: nil, key2: nil|  puts "key1:#{key1}, key2:#{key2}" }
# key1:1, key2:2

Теперь это работает , Но зачем вообще нужны эти значения по умолчанию?

Что именно здесь происходит? Есть ли лучший способ перебора списка хешей, расширяющих их? Также приветствуются указатели на документацию.

1 Ответ

2 голосов
/ 14 апреля 2020

Теперь все работает. Но зачем вообще нужны эти значения по умолчанию?

Это не так, вы можете просто опустить значения по умолчанию:

something { |key1:, key2:| puts "key1:#{key1}, key2:#{key2}" }
# key1:1, key2:2
...