Rubyを使用して配列を初期化する方法は?


105

私はこの方法で配列を初期化します:

array = Array.new
array << '1' << '2' << '3'

それを1つのステップで行うことは可能ですか?もしそうなら、どうですか?


20
斬新な単線繰返し押しだけの+1。:)
Phrogz

1
@Phrogz少し短く: array = Array.new << 1 << 2 << 3 ;)
アレクサンダースラフェル

@AlexanderSuraphelこれは、文字列の配列の代わりにFixnumの配列を作成します。
Phrogz 2017

1
@Phrogz私はそれがさらに短くなる可能性があることを述べたかっただけです。に変更する必要1があり'1'ます。
Alexander Suraphel、2017

回答:


192

配列リテラルを使用できます:

array = [ '1', '2', '3' ]

範囲を使用することもできます。

array = ('1'..'3').to_a  # parentheses are required
# or
array = *('1'..'3')      # parentheses not required, but included for clarity

空白で区切られた文字列の配列の場合、パーセント文字列構文を使用できます

array = %w[ 1 2 3 ]

ブロックを渡して、Array.new各エントリの値を決定することもできます。

array = Array.new(3) { |i| (i+1).to_s }

最後に、上記の他の回答と同じ3つの文字列の配列は生成しませんが、Ruby 1.8.7以降で列挙子を使用して配列を作成できることにも注意してください。例えば:

array = 1.step(17,3).to_a
#=> [1, 4, 7, 10, 13, 16]

4
さらに、私はスプラットよりもto_a[*'1'..'3'])を好んでいますが、詳細な回答には1つ。
マイケルコール、2011

@MichaelKohl同意する。1.8.6では範囲をスプラットできなかった(間違った)印象を受けました。追加します、ありがとう!配列リテラル内でスプラットする必要がないことに注意してください(スプラットと一緒に合成している場合を除きます)。
Phrogz

私が知っているのは、私が主にその目的でsplatを使用しているということだけです(つまり、合成)。
マイケルコール

2
また、クラスメソッドArray :: []を使用できますArray[ "1","2","3"] #=> ["1","2","3"](このメソッドは配列リテラルコンストラクターとは関係ないと思います)。トップレベルのKernel#Arrayを使用することもできます(メソッド名はクラス名のように見えます)Array(1..5) #=> [1,2,3,4,5]
b1_

*は何をしますか?そのためのドキュメントはどこにありますか?
Arnold Roa

22

一発ギャグ:

array = [] << 1 << 2 << 3   #this is for fixnums.

または

 a = %w| 1 2 3 4 5 |

または

 a = [*'1'..'3']

または

 a = Array.new(3, '1')

または

 a = Array[*'1'..'3']

8
私はそれに反対票を投じませんでしたが、これは3つのメソッドを呼び出し、配列を1つずつ[1,2,3]初期化するのではなく、徐々に増やしていくためだと思います。また、あなたはより多くのキャラクターです。また、OPが文字列の配列について尋ねていたのに対して、Fixnumの配列を作成しました。
Phrogz

8

上記の回答に加えて、あなたもこれを行うことができます

    =>  [*'1'.."5"]   #remember *
    => ["1", "2", "3", "4", "5"]

1
1.9では、次のようにすることもできます>> [*?1..?5] #=> ["1", "2", "3", "4", "5"]
Michael Kohl

7

証明するために、複数あります一つの 6つの方法ために行うには:

plus_1 = 1.method(:+)
Array.new(3, &plus_1) # => [1, 2, 3]

1.method(:+)が不可能な場合は、次のようにすることもできます

plus_1 = Proc.new {|n| n + 1}
Array.new(3, &plus_1) # => [1, 2, 3]

確かに、このシナリオではやり過ぎですplus_1が、本当に長い式である場合は、配列の作成とは別の行に配置することをお勧めします。


3

できるよ

array = ['1', '2', '3']

他の人が指摘したように、次のように%w表記で配列を初期化することもできます。

array = %w(1 2 3)

または

array = %w[1 2 3]

どちらの場合も、各要素は整数ではなく文字列であることに注意してください。したがって、要素が整数である配列が必要な場合は、各要素をアポストロフィでラップしないでください。

array_of_integers = [1, 2, 3]

また、要素間にコンマを挿入する必要はありません(これは、この%w表記なしで配列を作成する場合に必要です)。あなたがこれをするなら(私はしばしば間違ってそれをしました)、次のように:

wrong_array = %w(1, 2, 3)

その要素は3つの文字列になります----「1」、「2」、「3」。だからあなたがするなら:

puts wrong_array

出力は次のようになります。

1,
2,
3
=>nil

これは私たちがここで望むものではありません。

これがポイントを明確にするのに役立つことを願っています!



2

文字列の配列がある場合は、次のように初期化することもできます。

array = %w{1 2 3}

各要素を空白で区切るだけです


1

次の[]ように要素を書き込むことで、1つの手順で配列を初期化できます。

array = ['1', '2', '3']

0

%wルビ配列の表記法でこれを簡単に行うことができます。

array = %w(1 2 3)

配列の値1、2、3を配列に追加し、出力を次のように出力します。 ["1", "2", "3"]

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.