块变量如何随嵌套数组而变化?

时间:2016-06-08 20:26:38

标签: ruby

我关注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 = cowi = 0,然后是kv = mooi = 1k, v = kv如何理解?对我来说,似乎是k = kvv = kv,但事实并非如此。我不明白这个目的。

2 个答案:

答案 0 :(得分:1)

基本上,行k, v = kv表示您要将kv分配给kk= 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分解为两个单独的变量kv。您需要将代码调整为如下所示:

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