2016-03-26 20 views
7

これはRubyで何を意味していますか?このコードで

arr.select.each_with_index { |_, i| i.even? } 

パイプアンダースコアは何を意味するのでしょうか?

+1

'|'の後に '_'という名前の_variable_(ルビが許す) –

+4

ルビーでは、もし望むならば、変数に' '名前をつけることができます。 –

+0

'| .. |'はブロックパラメータを宣言します* - "ruby block parameter"を検索します。 '_'は有効な変数名であり、慣習的に、 'このパラメータは意味のあるものではありません'を表現するために使用されます。 – user2864740

答えて

6

_は、他のすべての変数名(たとえば、i)のような変数名です。 Rubyでは、後でその変数を使用する予定がない場合は、変数名として_を使用するのが一般的です。機能で

+0

ありがとう:ありがとう! –

+0

これは他の言語にも当てはまります!いくつかの言語は、GolangやRust langのような標準的な規則としてそれを使用しています – sircapsalot

+0

'_'(実際には' _'で始まる変数)の使用は規約以上のものです。変数。 –

1

、引数は括弧で囲まれています:ブロックで

def my_function(arg1, arg2) 
    .. 
end 

、あなたは引数を囲むためのパイプを使用します。この場合、

arr.each_with_index{ |item, index| .. } 

、変数名を選びだしブロックの最初の引数として_でした。

0

メソッドeach_with_indexを呼び出して、匿名関数(または「ブロック」)を渡しています。このブロックには2つのパラメータがあります。最初の要素は配列(または列挙可能なオブジェクト)内の項目を表し、2番目の要素はそのインデックス(最初の要素は0、2番目は1、3番目は2など)を表します。

Ruby(および他の言語)に_という名前を割り当てることは、「私はこれを使用するつもりはありません」と言う従来の方法です。だからeach_with_index { |_, i| ... }は "このブロックではiがインデックスを表しているので、要素自体は気にしないので、名前を付けていません。"

+1

ブロックを_anonymous関数と呼ぶと、潜在的に誤解を招く可能性があります。それをブロックと呼び、それがRubyにあるものの参照を提供するかもしれません。 – Oka

+0

詳しいアドバイスありがとう! –

+2

それは慣例以上のものです。同じパラメータ名を複数回使用すると、エラーが発生します(例えば 'def foo(bar、bar)end'や' [] .each {| foo、foo |} ' ( '_bar、_bar)end'と' [] .each {| _foo、_foo |} 'の両方が問題ありません。また、Rubyは未使用のローカル変数について警告しますが、変数名が '_'で始まる場合や' _'である場合は警告しません。 –

関連する問題