3

(1...4).to_aisに似たルビーの標準的な方法はあり[1,2,3,4]ます(4...1).to_a[4,3,2,1]?

これは経由で簡単に定義できること(1...4).to_a.reverseはわかっていますが、まだ定義されていないことは奇妙に思えます.1)何か不足していますか?2)そうでない場合、まだ機能していない機能的/実用的な理由はありますか?

4

3 に答える 3

9

最も簡単なのはおそらくこれです:

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]
于 2012-04-06T07:12:03.603 に答える
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 コアを台無しにするという理由で嫌う開発者もいます。)

于 2012-04-06T07:08:45.060 に答える