Символ ключа :a
и локальная переменная a
не имеют ничего общего. Имена только совпадают. Вместо этого рассмотрите этот код:
{
var1: "value1",
var2: "value2"
}.map do |key, value|
"#{key}=#{value}"
end.join('&')
# => "var1=value1&var2=value2"
Здесь переменные разные. То, что map
делает, как each
, перебирает каждую ключ-значение пара в хэш. Это означает, что вы можете делать вещи, как это, тоже, чтобы упростить:
{
var1: "value1",
var2: "value2"
}.map do |pair|
pair.join('=')
end.join('&')
# => "var1=value1&var2=value2"
Обычно при переборе над Hash вы должны использовать имена, как k,v
или key,value
быть ясно, что вы работаете на.
Если вы когда-нибудь запутался, что происходит внутри в итерации цикла, вы можете отлаживать, как это:
{
var1: "value1",
var2: "value2"
}.map do |pair|
puts pair.inspect
pair.join('=')
end.join('&')
Это дает вам этот вывод:
[:var1, "value1"]
[:var2, "value2"]
Этот метод очень помогает , Есть даже короткое обозначение для этого:
p pair
Почему вы так думаете? – sawa
Hi Sawa. Потому что в строковой интерполяции я не вижу, где 'b' будет равно' bar'. Это похоже на то, что на самом деле это будет 'afoo = & bbar' – mxmxx