Arrays 如何设置数组的长度?

Arrays 如何设置数组的长度?,arrays,ruby,Arrays,Ruby,问题是我不知道我是否可以在Ruby中设置数组的长度,我想用10的长度设置数组的长度,而不在其中写入10个变量,这是否可能,如果可能,我该怎么做?创建一个给定大小的新数组,元素设置为零: 设置为给定值的元素: Array.new(size, "string") 请参见有多种方法可以做到这一点 如果只需要长度大小为零的数组,则: 如果需要非nil的数组,则: 将起作用,但请注意,如果默认值是可变的,这些可能会导致问题。所有元素都共享一个引用,如果您不知道引用共享,那么奇怪的事情可能会发生;例如:

问题是我不知道我是否可以在Ruby中设置数组的长度,我想用10的长度设置数组的长度,而不在其中写入10个变量,这是否可能,如果可能,我该怎么做?

创建一个给定大小的新数组,元素设置为零:

设置为给定值的元素:

Array.new(size, "string")

请参见

有多种方法可以做到这一点

如果只需要长度大小为零的数组,则:

如果需要非nil的数组,则:

将起作用,但请注意,如果默认值是可变的,这些可能会导致问题。所有元素都共享一个引用,如果您不知道引用共享,那么奇怪的事情可能会发生;例如:

a = Array.new(6, 'pointer')
# ["pointer", "pointer", "pointer", "pointer", "pointer", "pointer"] 
a[0].upcase!
# "POINTER" 
a
# ["POINTER", "POINTER", "POINTER", "POINTER", "POINTER", "POINTER"] 
Ruby中的很多东西都是可变的,所以Array.newsize中的默认值很少是您想要的。如果您使用布尔、零、数字、冻结字符串、符号等,那么这很好,因为您无法更改它们,引用共享也不会影响您

您还可以向Array.new提供块:

该块将针对每个条目执行,因此您希望获得任何意外的引用共享:

a = Array.new(6) { 'unique' }
# ["unique", "unique", "unique", "unique", "unique", "unique"] 
a[0].upcase!
# "UNIQUE" 
a
# ["UNIQUE", "unique", "unique", "unique", "unique", "unique"] 

这通常是你想要的。当然,它会消耗更多内存并花费更多时间来创建数组,但如果其中任何一个都很重要,那么您可能在Ruby中采用了错误的方法。

请始终查看语言API:它将为您节省数小时的试错时间。设置10的长度而不在其中写入10个变量究竟是什么意思?什么算作变量?数组的“长度”定义为数组中的元素数。你会把一个零算作一个变量吗?一根绳子?一切都有意义。你想要一个10个零的数组吗?除了array.new10=>[nil,nil,nil,nil,nil,nil,nil,nil],你可以写[nil]*10或arr=[];arr[9]=nil,两者都返回一个包含10个nil对象的数组。但是字符串是可变的,所以array.newsize{string}会受到更少的意外影响。但至少它是正确的,并且没有意外的副作用。这里我们只讨论十个元素。使用这种形式的数组构造函数是错误的,当默认值是可变的时,会导致令人惊讶的行为。考虑A==ARay.NeXSead,字符串;a[0]。upcase!。对于大型数据集来说,这是没有效率的。构造函数按设计方式工作。@jspcal或Array.new2{{key::value},但不管怎样。
a = Array.new(size, default_value)
a = [default_value] * size
a = Array.new(6, 'pointer')
# ["pointer", "pointer", "pointer", "pointer", "pointer", "pointer"] 
a[0].upcase!
# "POINTER" 
a
# ["POINTER", "POINTER", "POINTER", "POINTER", "POINTER", "POINTER"] 
a = Array.new(6) { 'unique' }
a = Array.new(6) { 'unique' }
# ["unique", "unique", "unique", "unique", "unique", "unique"] 
a[0].upcase!
# "UNIQUE" 
a
# ["UNIQUE", "unique", "unique", "unique", "unique", "unique"]