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 という 2 つの変数は、kv の内容に設定されます。しかし、kv が一度に 1 つの値しか含まない場合、これはどのように機能するのでしょうか?

これを別のファイルに書きました:

    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 番目の例では機能しないのはなぜですか?

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、最初に「キー」に作用し、次に「値」に作用します

ネストされた配列を試すことができるため、この例では、配列の各メンバーは 2 つの項目を持つ配列です。

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 に答える