要素を配列に変換せずに範囲の最後にプッシュしてから範囲に戻す方法はありますか?
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
要素を配列に変換せずに範囲の最後にプッシュしてから範囲に戻す方法はありますか?
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
範囲は単なる間隔です。始まりと終わり。範囲の最後に値をプッシュするだけではありません。範囲を配列に変換する
items = range.to_a
items << 11
または、新しい範囲を作成します。
Range.new(range.begin, 11)
編集:範囲で#beginを使用し、#firstではない理由は、範囲から新しい配列first
をlast
作成するためです。これは必要ありません。代わりに、begin
または値が必要です。end
できません。Range は、実際には配列でも、セットでも、コレクションでもありません。これは、上限と下限の単なる表現です。上限と下限の間を移動できるため、反復できます。また、( を使用して) 1 つを配列に変換することもできますRange#to_a
。これは、反復して値を配列に収集するだけです。
#begin
範囲を拡大または縮小する場合は、そのとに基づいて新しい範囲を作成します#end
。
new_range = Range(old_range.begin, old_range.end + 1)
次の要素をプッシュして範囲を拡張することはできません。ただし、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