4

私はRubyは初めてですが、groovyなどのラムダを許可する言語は初めてです。だから私はこの例を見ました:

myArray.product(otherArray).reject{|i,j| i > j}

ルビーコードブロックで、このブロックが2つの引数を取るのを見たことがありませんでしたが、ドキュメントを見ると、1つの引数を取るというドキュメントしか見えません。クラスについても同じことを調べましたenumerableが、そのドキュメントには1つの引数しか表示されていません。

私はそれが機能することを理解しています。推測とテストの方法以外に、必要な引数の数を決定する簡単な方法があることを望んでいたと思います。Rubyでブロックが取る引数の数をどのように知ることができますか?

4

3 に答える 3

9

これが機能するのは、Ruby がデストラクチャリングをサポートしているためです。

構造化を解除すると、通常は単一の変数に値をバインドできる場所ならどこでも、変数のセットを対応する値のセットにバインドできます。

これにより、次のことが成り立ちます。

arr = [1, 2]
x = arr
x == [1, 2] # true

y, z = arr
y == 1 # true
z == 2 # true

次のコードから、ブロックへの引数の分解は、ブロックを受け取る組み込みメソッドに固有のものではないことがわかります。

def my_method(arr)
  yield arr
end

my_method([1, 2, 3]) {|x| puts x.inspect }
# => [1, 2, 3]
my_method([1, 2, 3]) {|x, y, z| puts x.inspect }
# => 1

詳細については、Rubyによる Destructuring を参照してください。

于 2012-12-18T05:50:26.837 に答える
3

配列の構造に応じて、ブロック パラメーターでいくつかの興味深い再構築を行うことができます。

[[1, 2], [3, 4], [5, 6], [7, 8]].reject {|x,y| y == 8 }
#=> [[1, 2], [3, 4], [5, 6]]

それらを括弧でグループ化できます。

[ [[1,2],3], [[1,3],6] ].select {|(x,y),z| x == 1 && z == 3 }
#=> [ [[1,2],3] ]

可変長部分配列の処理など、さまざまなことに splat 演算子を使用することもできます。

[[:a,:b,2,3,4,5,6], [:c,:d,7,8,9]].each {|x,y,*numbers| puts numbers.inspect }
#=> [2,3,4,5,6]
#=> [7,8,9]
于 2012-12-18T05:38:03.280 に答える
1

Ruby は引数の解釈方法に柔軟性があります。以下は同様の例で、1 つと 2 つの引数があります。

[1, 3].product([2, 4]).reject {|a| a.first > a.last }
=> [[1, 2], [1, 4], [3, 4]] 
[1, 3].product([2, 4]).reject {|a,b| a > b }
=> [[1, 2], [1, 4], [3, 4]] 

ここでの経験則は、引数を複合オブジェクトとして、またはコレクション内の個々の要素として扱うことができるということです。例えば、

[1, 2, 3].tap {|a,b,c| puts [a,b,c].inspect }
[1, 2, 3]
... 
[1, 2, 3].tap {|a,b| puts [a,b].inspect }
[1, 2]
... 
[1, 2, 3].tap {|a| puts a.inspect }
[1, 2, 3]
于 2012-12-18T05:34:23.073 に答える