(1...4).to_a
isに似たルビーの標準的な方法はあり[1,2,3,4]
ます(4...1).to_a
か[4,3,2,1]
?
これは経由で簡単に定義できること(1...4).to_a.reverse
はわかっていますが、まだ定義されていないことは奇妙に思えます.1)何か不足していますか?2)そうでない場合、まだ機能していない機能的/実用的な理由はありますか?
(1...4).to_a
isに似たルビーの標準的な方法はあり[1,2,3,4]
ます(4...1).to_a
か[4,3,2,1]
?
これは経由で簡単に定義できること(1...4).to_a.reverse
はわかっていますが、まだ定義されていないことは奇妙に思えます.1)何か不足していますか?2)そうでない場合、まだ機能していない機能的/実用的な理由はありますか?
最も簡単なのはおそらくこれです:
4.downto(1).to_a #=> [4, 3, 2, 1]
または、次を使用できますstep
。
4.step(1,-1).to_a #=> [4, 3, 2, 1]
最後に、楽しみのためのかなりあいまいなソリューション:
(-4..-1).map(&:abs) #=> [4, 3, 2, 1]
Range#to_a にパッチを適用して、次のように自動的に逆に動作させることができます。
class Range
alias :to_a_original :to_a
def reverse
Range.new(last, first)
end
def to_a
(first < last) ? to_a_original : reverse.to_a_original.reverse
end
end
結果:
(4..1).to_a
=> [4, 3, 2, 1]
このアプローチは、クラスの「再開」、別名「モンキー パッチ」と呼ばれます。便利な機能が追加されているという理由でこのアプローチを好む開発者もいれば、Ruby コアを台無しにするという理由で嫌う開発者もいます。)