8

注: GitHubの mischa のsplat には、動作中の * のクールでインタラクティブな例がたくさんあります。

グーグルで調べたところ、Ruby で数値の範囲を反復処理する 1 つの方法 (古典的な C スタイルの for ループ) が見つかりました。

for (i = first; i <= last; i++) {
  whatever(i);
}

このようなことをすることです

[*first..last].each do |i|
  whatever i
end

[*first..last]しかし、その構文で正確に何が起こっているのでしょうか? 私は遊んでirb、これを見ました:

ruby-1.9.2-p180 :001 > 0..5
 => 0..5 
ruby-1.9.2-p180 :002 > [0..5]
 => [0..5] 
ruby-1.9.2-p180 :003 > [*0..5]
 => [0, 1, 2, 3, 4, 5] 
ruby-1.9.2-p180 :004 > *0..5
SyntaxError: (irb):4: syntax error, unexpected tDOT2, expecting tCOLON2 or '[' or '.'
*0..5
    ^

私がオンラインで読んだものはすべて、単項アスタリスクが、メソッドに渡された引数を展開および折りたたむのに役立ち、可変長の引数リストに役立つと説明しています

def foo(*bar)
  bar 
end

foo 'tater' # => ["tater"]
foo 'tater', 'tot' # => ["tater", "tot"]

それはわかりますが、上記のブロックの例で行われている拡張にどのように適用されるかわかりません。

明確にするために言うと、Ruby Way は配列またはコレクションを反復処理することであり、配列の長さを使用して整数インデックスを反復処理することではありません。ただし、この例では、実際には整数のリストを扱っています。:)

4

3 に答える 3

13
[*1..10]

と同じことです

(1..10).to_a # call the "to array" method

ループが機能するように、Array作成したクラスのインスタンスを実装します。メソッドEnumerableを定義するクラスでは、括弧付きのスプラット演算子構文を使用できます。ただし、 Splat は電話をかけるだけでなく、Google で検索する価値があります。to_a#to_a

さて、あなたの場合、Rangeクラス自体はすでにであるEnumerableため、次のようにすることができます。

(first..last).each do |v| 
  ...
end
于 2011-05-12T17:21:34.027 に答える
3

[first..last]範囲オブジェクトを 1 つだけ含む配列です。[*first..last]引数リストとして送信されたその範囲の要素を含む配列です。*引数リストのコンテキストで機能します。

于 2011-05-12T17:24:03.923 に答える
3

スプラット演算子と呼ばれます。引数の位置や配列などの特定の位置で使用すると、その要素に展開されます。

a = [1]
[*a, 3] # => [1, 3]
b = [1, 2]
[*b, 3] # => [1, 2, 3]

そのまままたは範囲内で使用することはできません。

*a..3 # => error.
(*a..3) # => error.

配列ではないものがある場合、それ自体を返します。

a = 1
[*a, 3] # => [1, 3]
于 2011-05-12T17:20:44.627 に答える