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没有。我没有任何其他修复,除了我上面写的那些,它们根本没有修复。