115

I initialize an array this way:

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

Is it possible to do that in one step? If so, how?

5
  • 22
    +1 just for novel single-line repeated pushing. :) Commented Feb 5, 2011 at 17:45
  • 1
    @Phrogz slightly shorter: array = Array.new << 1 << 2 << 3 ;) Commented Feb 6, 2017 at 14:48
  • @AlexanderSuraphel That creates an array of Fixnums instead of an array of strings. Commented Feb 6, 2017 at 15:31
  • 1
    @Phrogz i just wanted to mention that it can even be shorter. You just have to change 1 to '1'. Commented Feb 7, 2017 at 7:13
  • For creating an array with multiple copies of the SAME value: stackoverflow.com/questions/5324654/… Commented Mar 4, 2023 at 16:46

9 Answers 9

208

You can use an array literal:

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

You can also use a range:

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

For arrays of whitespace-delimited strings, you can use Percent String syntax:

array = %w[ 1 2 3 ]

You can also pass a block to Array.new to determine what the value for each entry will be:

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

Finally, although it doesn't produce the same array of three strings as the other answers above, note also that you can use enumerators in Ruby 1.8.7+ to create arrays; for example:

array = 1.step(17,3).to_a
#=> [1, 4, 7, 10, 13, 16]
Sign up to request clarification or add additional context in comments.

6 Comments

Plus one for the detailed answer, even though I prefer splat over to_a ([*'1'..'3']).
@MichaelKohl I agree; I was under the (mistaken) impression that you couldn't splat ranges in 1.8.6. I'll add that, thanks! Note that you don't need to splat within an array literal (unless you're compositing along with the splat).
I know, it's just that I mostly use splat for that purpose (compositing that is) and I also like that it shows off what you end up with.
Also, the class method Array::[] can be used: Array[ "1","2","3"] #=> ["1","2","3"] (I don't think this method has anything to do with the array literal constructor). You can also use the top-level Kernel#Array (method name does look like a class name) Array(1..5) #=> [1,2,3,4,5]
what the * does? where I can find documentation for that?
|
25

Oneliner:

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

or

 a = %w| 1 2 3 4 5 |

or

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

or

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

or

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

1 Comment

I didn't down vote it, but I'm guessing because this invoked three methods and incrementally grows the array, as opposed to [1,2,3] which does a single initialization. Also, yours is more characters. Also, you have created an array of Fixnums whereas the OP was asking about an array of strings.
8

Along with the above answers , you can do this too

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

1 Comment

In 1.9 you can also do it this way: >> [*?1..?5] #=> ["1", "2", "3", "4", "5"].
7

To prove There's More Than One Six Ways To Do It:

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

If 1.method(:+) wasn't possible, you could also do

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

Sure, it's overkill in this scenario, but if plus_1 was a really long expression, you might want to put it on a separate line from the array creation.

Comments

3

You can do

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

As others have noted, you can also initialize an array with %w notation like so:

array = %w(1 2 3)

or

array = %w[1 2 3]

Please note that in both cases each element is a string, rather than an integer. So if you want an array whose elements are integers, you should not wrap each element with apostrophes:

array_of_integers = [1, 2, 3]

Also, you don't need to put comma in between the elements (which is necessary when creating an array without this %w notation). If you do this (which I often did by mistake), as in:

wrong_array = %w(1, 2, 3)

its elements will be three strings ---- "1,", "2,", "3". So if you do:

puts wrong_array

the output will be:

1,
2,
3
=>nil

which is not what we want here.

Hope this helps to clarify the point!

Comments

2

To create such an array you could do:

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

Comments

2

If you have an Array of strings, you can also initialize it like this:

array = %w{1 2 3}

just separate each element with any whitespace

Comments

1

You can initialize an array in one step by writing the elements in [] like this:

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

Comments

0

You can simply do this with %w notation in ruby arrays.

array = %w(1 2 3)

It will add the array values 1,2,3 to the arrayand print out the output as ["1", "2", "3"]

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.