Многократное присвоение переменной с each_with_index
У меня есть этот фрагмент кода, ведро в данном случае это просто массив в большем массиве:
def Dict.get_slot(aDict, key, default=nil)
# Returns the index, key, and value of a slot found in a bucket.
bucket = Dict.get_bucket(aDict, key)
bucket.each_with_index do |kv, i|
k, v = kv
if key == k
return i, k, v
end
end
return -1, key, default
end
Две переменные с именами k и v устанавливаются равными содержанию kv. Но как это может работать, когда kv содержит только одно значение за раз?
Я написал это в другой файл:
bucket = ['key', 'value']
key = 'key'
bucket.each_with_index do |kv, i|
k, v = kv
if key == k
puts k, v, i
end
end
И тогда переменная v была пустой:
key
0
Мой вопрос: почему множественное назначение работает в первом примере, но не во втором?
2 ответа
bucket
это словарь, проще говоря: список пар значений, а не просто список значений. Рассматривать:
bucket.each do |kv|
# kv is an array: [some_k, some_v]
k, v = kv
# k is some_k
# v is some_v
end
bucket.each_with_index do |kv, i|
# kv is again an array: [some_k, some_v]
k, v = kv
# k is some_k
# v is some_v
end
В качестве примечания, этот вид "сопоставления с образцом" может также использоваться непосредственно во вложенной форме для параметров блока:
bucket.each_with_index do |(k, v), i|
# k is some_k
# v is some_v
end
Когда ты звонишь bucket.each_with_index
сначала он действует на "ключ", затем "значение"
Вы можете попробовать вложенные массивы, поэтому в этом примере каждый член массива является массивом с двумя элементами.
irb(main):012:0> [['a','b'],['c','d']].each_with_index{|x,i|puts "#{i}: #{x}"}
0: ["a", "b"]
1: ["c", "d"]
Затем вы можете идентифицировать их по индексу
irb(main):019:0> [['a','b'],['c','d']].each_with_index{|x,i|puts "#{i}: #{x[0]} - #{x[1]}"}
0: a - b
1: c - d
Или установите их как значения с использованием синтаксиса, который вы использовали:
irb(main):020:0> [['a','b'],['c','d']].each_with_index{|x,i| a,b = x ; puts "#{i}: #{a} - #{b}"}
0: a - b
1: c - d
Без одних вкладышей:
bucket = [
['a','b'],
['c','d']
]
bucket.each_with_index do |x, index|
k, v = x
puts index
puts "#{k} = #{v}"
end