我关注a tutorial。
arr = [["cow", "moo"], ["duck", "quack"]]
bucket = arr[0]
bucket.each_with_index do |kv, i|
k, v = kv
puts k
puts v
end
我理解,当它通过arr[0]
时,它首先是kv = cow
和i = 0
,然后是kv = moo
和i = 1
。 k, v = kv
如何理解?对我来说,似乎是k = kv
和v = kv
,但事实并非如此。我不明白这个目的。
答案 0 :(得分:1)
基本上,行k, v = kv
表示您要将kv
分配给k
或k= kv
逗号分隔赋值只是在一行中分配多个变量的另一种方式,它只是语法糖。
尝试搞乱代码并执行类似的操作,例如:
arr = [["cow", "moo"], ["duck", "quack"]]
bucket = arr[0]
bucket.each_with_index do |kv, i|
k, v = kv, i
puts "k is #{k} and v is #{v}"
end
# k is cow and v is 0
# k is moo and v is 1
答案 1 :(得分:0)
这里发生的事情是它将键/值对变量kv
分解为两个单独的变量k
和v
。您需要将代码调整为如下所示:
arr = [["cow", "moo"], ["duck", "quack"]]
arr.each_with_index do |kv, i|
k, v = kv
puts k
puts v
end
这里发生了什么:
kv = [ :key, :value ]
# Assign k to the first value, v to the second in kv
k, v = kv
k
# => :key
v
# => :value
这种突破的一种不那么混乱的方式是:
arr.each_with_index do |(k, v), i|
# ... Use k and v normally
end
该表示法允许您在使用它们之前将数组扩展为单独的变量。这是处理这类价值对时派上用场的伎俩。
值得注意的是,如果您不使用each_with_index
,则不必执行此操作,因为each
就足够了,因为从不使用该索引值:
each do |k, v|
# ...
end