1

と のような 2 つの変数があるaとしhます。

a = [「猫」、「犬」、「マット」]
h = {cat: 'gatto', dog: 'cane', mat: 'stuoia'} # (イタリア語訳)

.eachそして、それらが指しているオブジェクトの種類がわからない場合、それらのメソッドを呼び出します。渡されたブロックが1つのパラメーターをa.each取り、渡されたブロックが2つを取ることができることをどのように知ることができますか?b.each

つまり、ブロックをメソッドに渡すとき、メソッドが設定するブロック パラメーターの数をどのように知ることができますか?

some_methodブロックが取るべきパラメータの数を返すものはありますか? ブロックに渡されるobj.general_method_that_takes_a_block.some_methodパラメータの数を返すのでしょうか?general_method_that_takes_a_block

4

2 に答える 2

4

簡単な方法は次のとおりです。

a.each{|e| p [*e].length}
# => 1 1 1
h.each{|e| p [*e].length}
# => 2 2 2
于 2012-09-30T19:31:36.893 に答える
1

eachブロックは常に 1 つのパラメーターを取得し、2 つ取得することはありません。ハッシュの場合、これを行うと:

h.each { |k, v| ... }

Ruby は、多かれ少なかれ、あなたの背後でこれを行っています。

h.each { |a| k, v = a; ... }

したがって、ブロックの引数が配列であるかどうかを確認できます。

e.each do |x|
    if x.kind_of? Array
        # e might be a Hash
    else
        # e might be an Array
    end
end

問題は、誤って Hashブランチに入るeようなものである可能性があることです。この種のチェックもだまされます。[ [1,2], [3,4] ]e[*e].length

ブロックの内側から何を繰り返しているかを知るためのクリーンで簡単な方法はないと思います。

于 2012-09-30T19:38:40.950 に答える