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


105

我用这种方式初始化数组:

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

一步就能做到吗?如果是这样,怎么办?


20
+1仅用于新颖的单行重复推送。:)
Phrogz'2

1
@Phrogz稍短一些: array = Array.new << 1 << 2 << 3 ;)
亚历山大·苏拉菲尔

@AlexanderSuraphel创建一个Fixnums数组,而不是一个字符串数组。
Phrogz

1
@Phrogz我只是想提一下,它甚至可以更短。您只需更改1'1'
亚历山大·苏拉菲尔

Answers:


192

您可以使用数组文字:

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

您还可以使用范围:

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

对于以空格分隔的字符串数组,可以使用Percent String语法

array = %w[ 1 2 3 ]

您还可以传递一个块以Array.new确定每个条目的值是:

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]

4
即使我更喜欢使用to_a[*'1'..'3']),也要加上一个详细答案。
Michael Kohl

@MichaelKohl我同意;我的印象是(错误)您无法在1.8.6中创建范围。我会补充,谢谢!请注意,您不需要在数组文字中进行splat操作(除非您与splat一起进行合成)。
Phrogz

我知道,这只是我主要出于此目的使用splat(即合成),而且我也喜欢它显示最终的结果。
Michael Kohl

2
另外,可以使用类方法Array :: [] :(Array[ "1","2","3"] #=> ["1","2","3"]我认为该方法与数组文字构造函数无关)。您还可以使用顶级Kernel#Array(方法名的确看起来像类名)Array(1..5) #=> [1,2,3,4,5]
b1_ 2012年

*是什么?在哪里可以找到相关文档?
阿诺德·罗阿2015年

22

Oneliner:

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
我没有否决它,但是我猜是因为它调用了三个方法并递增地增长了数组,而不是进行[1,2,3]单个初始化。另外,您的角色更多。另外,您创建了一个Fixnums数组,而OP正在询问一个字符串数组。
Phrogz

8

除了上述答案外,您也可以执行此操作

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

1
在1.9中,您还可以这样操作:>> [*?1..?5] #=> ["1", "2", "3", "4", "5"]
Michael Kohl

7

为了证明有不止一个六法做到这一点:

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)

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

puts wrong_array

输出将是:

1,
2,
3
=>nil

这不是我们想要的。

希望这有助于澄清这一点!


2

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

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

2

如果您有字符串数组,也可以像这样初始化它:

array = %w{1 2 3}

只需将每个元素与任何空格分开


1

您可以通过以下步骤一步一步地初始化数组[]

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

0

您可以使用%wruby数组中的符号简单地执行此操作。

array = %w(1 2 3)

它将数组值1,2,3添加到数组中,并将输出打印为 ["1", "2", "3"]

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.