なぜそれがあることである:ブロックが1回だけ実行されるのはなぜですか?
array = (1..20).to_a
array.index.each_slice(5) do |slice|
puts slice.inspect
end
リターン:
[1, 2, 3, 4, 5]
[6, 7, 8, 9, 10]
[11, 12, 13, 14, 15]
[16, 17, 18, 19, 20]
中:のみ
other_array = []
array = (1..20).to_a
array.index.each_slice(5) do |slice|
puts slice.inspect
other_array.push(1)
end
リターン:
other_array.push(1)
休憩EXをどのよう
[1, 2, 3, 4, 5]
ブロックのエコーション?明らかな結論は、私はブロックの範囲にない変数にアクセスすることができないだろうが、それはなぜですか?
実際には、ここで 'index'を呼び出す点は表示されません(原因はアレイプッシュではありません) – Vasfed
文書には' '' 'index''' "ブロックも引数も与えられていないときは列挙子を返します"という理由で、私は '' '' index''を呼び出しました。 each_sliceを呼び出すためには列挙子が必要でした。今は、ArrayにModule Enumerableが含まれていることがわかり、each_sliceというメソッド自体があります。 –
これを見る一つの方法は、 'enum1 = array.index#=>#<列挙子:[1、.. 20]:インデックス>; enum2 = enum1.each_slice(5)#=>#<列挙子:#<列挙子:[1、.. 20]:インデックス>:each_slice(5)> 'この戻り値を注意深く調べます。あなたは 'enum2'を"複合 "列挙子と考えることができます。 'enum2'で生成された要素は' enum2.to_a#=> [[1、... 5]、... [16、... 20]] 'のような配列に変換されています。次に、 'enum2.each {| slice | slice.inspect}#=> [1、... 5] ... [16、... 20] 'を入れます。あなたが気づいたように、 '.index'が省略されても同じ結果が得られます。 –