如何使用Ruby一步初始化数组?

如何使用Ruby一步初始化数组?,ruby,arrays,initialization,Ruby,Arrays,Initialization,我通过以下方式初始化数组: array = Array.new array << '1' << '2' << '3' array=array.new 数组要创建这样的数组,可以执行以下操作: array = ['1', '2', '3'] 通过在[]中写入以下元素,可以一步初始化数组: array = ['1', '2', '3'] 如果您有一个字符串数组,也可以按如下方式初始化它: array = ['1', '2', '3'] array=%w{1

我通过以下方式初始化数组:

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

数组要创建这样的数组,可以执行以下操作:

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

通过在
[]
中写入以下元素,可以一步初始化数组:

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

如果您有一个字符串数组,也可以按如下方式初始化它:

array = ['1', '2', '3']
array=%w{1 2 3}


只需用任何空格分隔每个元素即可

您可以使用数组文字:

array = [ '1', '2', '3' ]
您还可以使用以下范围:

array = ('1'..'3').to_a  # parentheses are required
# or
array = *('1'..'3')      # parentheses not required, but included for clarity
对于以空格分隔的字符串数组,可以使用:

您还可以将块传递给
数组。新建
以确定每个条目的值:

array = Array.new(3) { |i| (i+1).to_s }
最后,虽然它不会产生与上面其他答案相同的三个字符串数组,但也请注意,您可以使用Ruby 1.8.7+中的枚举器来创建数组;例如:

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

除了上面的答案,你也可以这样做

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

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


要证明有六种以上的方法可以做到这一点:

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
是一个非常长的表达式,那么您可能需要将它放在数组创建的另一行。

您只需在ruby数组中使用
%w
符号即可

array = %w(1 2 3)
它会将数组值1、2、3添加到数组中,并将输出打印为
[“1”、“2”、“3”]
您可以执行的操作

array = ['1', '2', '3']
正如其他人所指出的,您还可以使用%w符号初始化数组,如下所示:

array = %w(1 2 3)

请注意,在这两种情况下,每个元素都是字符串,而不是整数。 因此,如果需要元素为整数的数组,则不应使用撇号将每个元素括起来:

array_of_integers = [1, 2, 3]
此外,您不需要在元素之间加逗号(这在创建没有此%w符号的数组时是必要的)。如果您这样做(我经常出错),如:

它的元素将是三个字符串--“1”,“2”,“3”。因此,如果你这样做:

puts wrong_array
输出将是:

1,
2,
3
=>nil
这不是我们想要的


希望这有助于澄清这一点

+1仅适用于新颖的单线重复推送。:)@Phrogz稍微短一点:
array=array.new@AlexanderSuraphel,它创建一个Fixnums数组而不是字符串数组。@Phrogz我只想说它甚至可以更短。你只需要把
1
改成
'1'
。再加上一个详细的答案,尽管我更喜欢splat而不是
[*'1'..'3']
)。@MichaelKohl我同意;我(错误地)认为你不能在1.8.6中显示范围。我再补充一句,谢谢!请注意,您不需要在数组文本中使用splat(除非您与splat一起进行合成)。我知道,只是我主要使用splat来实现这一目的(即合成),我也喜欢它显示您最终得到的结果。此外,类方法数组::[]可以使用:
array[“1”、“2”、“3”]#=>[“1”、“2”、“3”]
(我不认为这个方法与数组文本构造函数有任何关系)。你也可以使用顶级内核数组(方法名看起来确实像类名)
array(1..5)
[1,2,3,4,5]
这个*是做什么的?我可以在哪里找到相关文档?在1.9中,你也可以这样做:
>[*?1..5]。=>[“1”、“2”、“3”、“4”、“5”]
。我没有投反对票,但我猜这是因为它调用了三个方法并递增地增长了数组,而不是执行单个初始化的
[1,2,3]
。此外,您还有更多的字符。此外,您创建了一个Fixnums数组,而OP询问的是字符串数组。
array = %w(1 2 3)
array = %w[1 2 3]
array_of_integers = [1, 2, 3]
wrong_array = %w(1, 2, 3)
puts wrong_array
1,
2,
3
=>nil