3

有没有办法将元素推送到范围的末尾而不将其转换为数组然后返回范围?

r = 1..10
=> 1..10

r << 11
NoMethodError: undefined method `<<' for 1..10:Range

r.push 11
NoMethodError: undefined method `push' for 1..10:Range
4

3 回答 3

5

范围只是一个区间。一个开始和一个结束。您不只是将值推送到 Range 的末尾。您可以将 Range 转换为数组

items = range.to_a
items << 11

或者你创建一个新的范围..

Range.new(range.begin, 11)

编辑:我们在范围上使用#begin 而不是#first 的原因是因为firstlast范围构建一个新数组,我们不想要那个.. 我们只想要beginorend值。

于 2012-10-30T13:39:31.027 回答
3

你不能。Range 根本不是 Array、Set 或集合。它只是一个上限和下限的表示。您可以迭代一个,因为可以在上限和下限之间步进。您还可以将一个转换为一个数组(使用Range#to_a),它只是迭代并将值收集到一个数组中。

如果要扩大或缩小范围,请根据其#begin和创建一个新范围#end

new_range = Range(old_range.begin, old_range.end + 1)
于 2012-10-30T13:40:08.343 回答
0

您不能通过将下一个元素推送到范围来扩展范围。但是,您可以扩展 Range 类以支持以您需要的任何方式修改范围。

class Range
  def end_at(x)
    Range.new(self.begin, x)
  end

  def start_at(x)
    Range.new(x, self.end)
  end
end

# Initial Range
range = 1..10

# New end
p range.end_at(100)
# => 1..100

# New start
p range.start_at(5)
# => 1..5
于 2012-10-30T13:48:50.760 回答