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

範囲は単なる間隔です。始まりと終わり。範囲の最後に値をプッシュするだけではありません。範囲を配列に変換する

items = range.to_a
items << 11

または、新しい範囲を作成します。

Range.new(range.begin, 11)

編集:範囲で#beginを使用し、#firstではない理由は、範囲から新しい配列firstlast作成するためです。これは必要ありません。代わりに、beginまたは値が必要です。end

于 2012-10-30T13:39:31.027 に答える
3

できません。Range は、実際には配列でも、セットでも、コレクションでもありません。これは、上限と下限の単なる表現です。上限と下限の間を移動できるため、反復できます。また、( を使用して) 1 つを配列に変換することもできます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 に答える