4

だから私はPrologとRubyの両方が初めてです。大学でProlog、独学でRubyを学ぶ。そして、Prolog にあるように、Ruby にも「don't care」または「trow away」変数があるかどうかを考えていました。

irbを開いてこれを実行しました(アンダースコアが「気にしない」記号であると仮定します)

1.9.2-p290 :003 > _, b, c = [1,2,3]
 => [1, 2, 3] 
1.9.2-p290 :004 > b
 => 2 
1.9.2-p290 :005 > c
 => 3 

結果は実際に私が期待したものです。しかし、その後、アンダースコアの値がどこにあり、それがどのクラスであるかに興味がありました

1.9.2-p290 :006 > _
 => 3 
1.9.2-p290 :008 > _.class
 => Fixnum 

まあ、それは奇妙です。価値を捨てるべきではありませんか?なぜ他の値が保存されているのですか?

次に、アンダースコアを使用してさらにテストを行い、実際に何が起こっているかを確認しました。最後に評価された値があります。

1.9.2-p290 :017 > 1
 => 1 
1.9.2-p290 :018 > _
 => 1 
1.9.2-p290 :019 > "string"
 => "string" 
1.9.2-p290 :020 > _
 => "string" 
1.9.2-p290 :021 > Hash
 => Hash 
1.9.2-p290 :022 > _
 => Hash 

だから私の質問は次のとおりです。実際にアンダースコアは何のためにあるのですか? それは本当に気にしない変数ですか、それとも何か他のものですか?それの本当の名前は何ですか?(Googleで「don't care ruby​​ variable」というものをあまり見つけられないので)

4

3 に答える 3

10

あなたが投げているのは、アンダースコアの2つの異なる用途を見ているということです.

  1. 引数リストでは、Prolog のように「ドント ケア変数」のように機能します。

  2. 引数リストの外では、それは単なる通常の識別子です。IRB では、前の結果にバインドされます。最後の入力が だったのでc = 3、_ は 3 です。ただし、これは IRB でのみ発生します — 通常の Ruby プログラムでは発生しません。

于 2012-05-05T17:36:48.007 に答える
9
  1. Rubyコミュニティでは、 _「気にしない」という意味です。
  2. Ruby言語では、_は何の意味も持たず、他の識別子と同じです。
  3. YARV Rubyインタープリターでは、「未使用のローカル変数」の警告が抑制されているため_、#1 の規則をエンコードします。
  4. IRbでは、_最後の式の値にバインドされます。
于 2012-05-06T13:03:22.090 に答える
5

Ruby のアンダースコアは、通常の変数と同じように機能しますが、それより少し特殊です。まさに「I don't care」です。

たとえば、要素が 3 要素の配列である配列をループしているとします。

array = [[1,2,3],[4,5,6],[7,8,9],...]

中間値のみに関心があるとしましょう。あなたはこれ_を行うことができます:

array.each do |_, number, _|
  # do something
end

別の変数でこれを行おうとすると、変数を複製したという (予想される) エラーが発生します。

array.each do |v, number, v|
  # do something
end

=> SyntaxError: (eval):2: duplicated argument name
于 2012-11-29T16:54:44.580 に答える