Ruby 阵列溢出
检查以下代码:Ruby 阵列溢出,ruby,arrays,Ruby,Arrays,检查以下代码: arr = Array.new(3) for i in 1..5 arr << i end arr=Array.new(3) 因为我在1..5 arr就这么简单,Ruby数组会自动扩展,当继续扩展时,它总是从数组的末尾开始并附加到该数组 arr = Array.new 更新 创建一个执行此操作的方法 def replace_in_array(array, element) array.replace([array.take(array.length -
arr = Array.new(3)
for i in 1..5
arr << i
end
arr=Array.new(3)
因为我在1..5
arr就这么简单,Ruby数组会自动扩展,当继续扩展时,它总是从数组的末尾开始并附加到该数组
arr = Array.new
更新
创建一个执行此操作的方法
def replace_in_array(array, element)
array.replace([array.take(array.length - 1), element]).flatten
end
>> array = [1,2,3]
>> replace_in_array(array, 12)
>> [1,2,12]
通过这种方式,您的数组可以扩展,但它将始终采用最后一个索引并替换它。就这么简单,Ruby数组会自动扩展,当继续扩展时,它总是从数组的末尾开始并附加到该末尾
arr = Array.new
更新
创建一个执行此操作的方法
def replace_in_array(array, element)
array.replace([array.take(array.length - 1), element]).flatten
end
>> array = [1,2,3]
>> replace_in_array(array, 12)
>> [1,2,12]
通过这种方式,您的阵列可以扩展,但它将始终采用最后一个索引并替换它。使用:
更新
arr = Array.new(3) # => [nil, nil, nil]
(1..5).each_with_index { |x, i|
arr[[i, arr.size - 1].min] = x
}
arr # => [1, 2, 5]
更新2
class FixArray < Array
def initialize(max_size)
@idx, @max_size = 0, max_size
super(max_size)
end
def << (v)
self[@idx] = v
@idx = [@idx + 1, @max_size - 1].min
self
end
end
arr = FixArray.new(3)
(1..5).each do |i|
arr << i
p arr
end
使用:
更新
arr = Array.new(3) # => [nil, nil, nil]
(1..5).each_with_index { |x, i|
arr[[i, arr.size - 1].min] = x
}
arr # => [1, 2, 5]
更新2
class FixArray < Array
def initialize(max_size)
@idx, @max_size = 0, max_size
super(max_size)
end
def << (v)
self[@idx] = v
@idx = [@idx + 1, @max_size - 1].min
self
end
end
arr = FixArray.new(3)
(1..5).each do |i|
arr << i
p arr
end
创建一个数组,其中三个元素设置为nil
。推送到它的任何数据都将在三个零之后添加
如果希望数组的大小为最小值,则在添加所有数据后,将其推入
arr = Array.new
for i in 1..5
arr << i
end
arr << nil while arr.size < 3
创建一个数组,其中三个元素设置为nil
。推送到它的任何数据都将在三个零之后添加
如果希望数组的大小为最小值,则在添加所有数据后,将其推入
arr = Array.new
for i in 1..5
arr << i
end
arr << nil while arr.size < 3
啊,我明白你的意思了
您需要子类化数组
。像这样的事情应该可以。您可能需要编写更详细的内容,以便其他Array
方法可以正常工作,例如push
class FixArray < Array
def initialize(max_size)
@max_size = max_size
super()
end
def << (v)
if self.size >= @max_size
self.pop(self.size - @max_size)
self[-1] = v
else
super(v)
end
self
end
end
farr = FixArray.new(3)
(1..5).each do |i|
farr << i
p farr
end
啊,我明白你的意思了
您需要子类化数组
。像这样的事情应该可以。您可能需要编写更详细的内容,以便其他Array
方法可以正常工作,例如push
class FixArray < Array
def initialize(max_size)
@max_size = max_size
super()
end
def << (v)
if self.size >= @max_size
self.pop(self.size - @max_size)
self[-1] = v
else
super(v)
end
self
end
end
farr = FixArray.new(3)
(1..5).each do |i|
farr << i
p farr
end
你也可以这样做:
max_size = 3
arr = []
(1..5).each do |x|
arr.pop if arr.size >= max_size
arr.push x
end
阿里斯
=>[1,2,5]
您不必为此行为创建新类。您还可以执行以下操作:
max_size = 3
arr = []
(1..5).each do |x|
arr.pop if arr.size >= max_size
arr.push x
end
阿里斯
=>[1,2,5]
您不必为此行为创建新类。我在哪里设置大小?嗯。有没有办法覆盖此行为?没有,为什么?你看到的“三条空线”是,你定义了一个有3个零槽的数组,然后在最后一个零槽之后把我的范围推到上面。是的,我也这么认为。当然,这不是期望的结果。但是,我能让它表现得像它需要的那样吗?这是我的程序的基础。@EdenLandau我更新了我的答案我在这里设置大小在哪里?嗯。有什么方法可以改变这种行为吗?没有,你为什么要这样做?你看到的“三条空线”是,你定义了一个有3个零槽的数组,然后在最后一个零槽之后把我的范围推到上面。是的,我也这么认为。当然,这不是期望的结果。但是,我能让它表现得像它需要的那样吗?这是我的计划的基础。@EdenLandau我更新了我的答案,但没有完全回答我的问题。为了清晰起见,我进行了编辑。@EdenLandau,我更新了代码。确实如此,但如何将其调整到其他数组大小?@EdenLandau,我更新了代码。硬编码2
->arr.size-1
.Downvoter:我如何改进答案?这还不能完全回答我的问题。为了清晰起见,我进行了编辑。@EdenLandau,我更新了代码。确实如此,但如何将其调整到其他数组大小?@EdenLandau,我更新了代码。硬编码2
->arr.size-1
.Downvoter:如何改进答案?1。该代码不应输出任何空行。2.什么是“设置大小数组”?现在还不清楚。3.你的问题不清楚。我编辑了一些。它输出“nil”,因为Array.new就是这样初始化新数组的。您还有其他编辑建议吗?@EdenLandau IMO您应该将该行为封装在自定义类中,Array
就是不能以这种方式工作。@EdenLandau没有。我没有任何其他修复,除了我上面写的那些,它们根本没有修复。1。该代码不应输出任何空行。2.什么是“设置大小数组”?现在还不清楚。3.你的问题不清楚。我编辑了一些。它输出“nil”,因为Array.new就是这样初始化新数组的。您还有其他编辑建议吗?@EdenLandau IMO您应该将该行为封装在自定义类中,Array
就是不能以这种方式工作。@EdenLandau没有。我没有任何其他修复,除了我上面写的那些,它们根本没有修复。