用元素填充数组N次

AME*_*AME 41 ruby

我想用1个元素填充一个数组但是5次.到目前为止我得到了什么.

str = 1234
a = []

5.times { a << str }
puts a # => 1234, 1234, 1234, 1234, 1234
Run Code Online (Sandbox Code Playgroud)

它有效,但这不是红宝石的方式.有人能指出我正确的方向来初始化一个具有5倍相同值的数组吗?

saw*_*awa 64

Array.new(5, str)
# => [1234, 1234, 1234, 1234, 1234]
Run Code Online (Sandbox Code Playgroud)

顺便说一句,这是一个不好的做法来命名一个变量str分配值1234.这令人困惑.

  • 这是不可变对象(Fixnums,Symbols等)的正确解决方案,但对于可变对象(字符串,数组等),您将获得一个带有指向_same对象的5个指针的数组,这可能不是您想要的.在这种情况下,使用块形式`Array.new(5){"foo"}`. (15认同)

Mar*_*pka 25

这应该工作:

[1234] * 5
# => [1234, 1234, 1234, 1234, 1234]
Run Code Online (Sandbox Code Playgroud)

  • 这会创建一个立即丢弃的不必要的中间数组. (3认同)

hji*_*ing 13

虽然在字符串和其他不可变对象的情况下接受的答案很好,但我认为值得扩展Max对可变对象的评论.

以下将使用3个单独实例化的哈希填充元素数组:

different_hashes = Array.new(3) { {} } # => [{}, {}, {}]
Run Code Online (Sandbox Code Playgroud)

以下内容将填充一个元素数组,并引用相同的哈希3次:

same_hash = Array.new(3, {}) # => [{}, {}, {}]
Run Code Online (Sandbox Code Playgroud)

如果修改different_hashes的第一个元素:

different_hashes.first[:hello] = "world"
Run Code Online (Sandbox Code Playgroud)

只会修改第一个元素.

different_hashes # => [{ hello: "world" }, {}, {}]
Run Code Online (Sandbox Code Playgroud)

另一方面,如果修改same_hash的第一个元素,则将修改所有三个元素:

same_hash.first[:hello] = "world"
same_hash # => [{ hello: "world" }, { hello: "world" }, { hello: "world" }]
Run Code Online (Sandbox Code Playgroud)

这可能不是预期的结果.