Rubyで配列に範囲を設定する正しい方法


201

私は、「to_a」メソッドを使用して同等の配列に変換される範囲の例を示す本を作成しています

irbでコードを実行すると、次の警告が表示されます

 warning: default `to_a' will be obsolete

to_aを使用する代わりの正しい方法は何ですか?

配列に範囲を設定する別の方法はありますか?


7
範囲を配列に変換する際の大きな注意は、配列を構築すると大きな範囲が大量のメモリを消費する可能性があるため、注意して使用してください。配列を作成する代わりに、メモリの消費を抑えるために配列と同じように範囲を反復処理する方がよい場合があります。「必要に応じて適用する」ことの1つです。
ブリキ男

回答:


357

splatを使用して、範囲を持つ配列を作成できます。

>> a=*(1..10)
=> [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

Kernel Arrayメソッドを使用して、

Array (1..10)
=> [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

またはto_aを使用する

(1..10).to_a
=> [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

1
どのような場合、配列はすでに作成されている、あなたはそれに範囲を追加したい:私は持っていますorder = 1。その後order << (2.25).to_a。しかし、これにより、配列内に別の配列が作成されます。範囲は2〜25にしたいだけです。ただしorder << (2.25)、エラーが発生した場合、範囲を整数に変換できません。
kakubei

1
@kakubeiのconcat代わりに使用します<<。また、整数でない限りorder、「範囲を整数に変換できない」ことはありません。その場合、配列の追加ではなく、ビットシフトになります。
ケルビン

3
SplatオプションはRuby 1.8.7では機能しません。(1..10).to_a下位互換性のために使用することをお勧めします
kylewelsby

5
splatの使用は厄介です。より見栄えの良いオプションです[*1..10]
Hauleth 2013年

2
最速の方法は何ですか?
Andrey Yasinishyn 2013

79

これは私にとってirbで動作します:

irb> (1..4).to_a
=> [1, 2, 3, 4]

私はそれに気づきます:

irb> 1..4.to_a
(irb):1: warning: default `to_a' will be obsolete
ArgumentError: bad value for range
        from (irb):1

だから、おそらく括弧が欠けていますか?

(Ruby 1.8.6パッチレベル114を実行しています)


7
説明:括弧がない場合、to_aメソッドは、範囲1..4ではなく、Fixnumクラス(この場合は4)のインスタンスから呼び出しています。Fixnum.methods.include?(to_a)ruby 1.9.2で実行すると、to_aメソッドが定義されなくなったことがわかります。そのため、08
ピエール

@ピエール私はあなたが意味したと思いますFixnum.instance_methods.include?(:to_a)
ケルビン

@ケルビン-実際にmethods.include?は、より有益です:$ irb irb(main):001:0> Fixnum.methods.include?(to_a) (irb):1: warning: default to_a 'は廃止されます=> false irb(main):002:0> Fixnum.instance_methods.include?(:to_a) => false
Richard Turner

1
@RichardTurner ruby​​ 1.8を使用していると思います。to_a最初のフォームで警告をトリガーしているものを誤解していると思います。それはあなたが呼び出しto_aているからですself-あなたは実際to_aにFixnumのメソッドであるかどうかをチェックしていません。to_a単独で呼び出してみてください。同じ警告が表示されます。
ケルビン、

@ケルビン-ドゥー!ペニーが下がる。ありがとう。
リチャードターナー

34

あなたはこれをやっているように聞こえます:

0..10.to_a

警告は、Fixnum#to_aからではなく、Range#to_aからのものです。代わりにこれを試してください:

(0..10).to_a



4

大きい範囲から小さい範囲までの範囲を使用しようとしたところ、予想外の結果が得られました。

irb(main):007:0> Array(1..5)
=> [1, 2, 3, 4, 5]
irb(main):008:0> Array(5..1)
=> []

これは、範囲の実装が原因です。
したがって、次のオプションを使用する必要がありました。

(1..5).to_a.reverse

4
今日私は、5.downto(1).to_aどちらが減少する範囲を表す別の方法であるかを発見しましたstackoverflow.com/a/8927009/703903
odlp
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.