1

我有这个代码片段,在这种情况下,一个存储桶只是一个更大数组中的一个数组:

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

我的问题是,为什么在第一个示例中多重分配有效,而在第二个示例中无效?

4

2 回答 2

6

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
于 2014-09-23T12:14:57.457 回答
1

当您调用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
于 2014-09-23T13:15:28.163 回答