rubyの範囲オブジェクトについて質問です。

1..5は、ほぼ[1,2,3,4,5]と同じというように理解していますが、
5..1などと、終端の数値の方が小さい場合はどのような扱いになるのか教えてください。

回答の条件
  • URL必須
  • 1人2回まで
  • 登録:2008/03/06 12:39:57
  • 終了:2008/03/06 15:17:52

ベストアンサー

id:i_kumagoro No.1

i_kumagoro回答回数170ベストアンサー獲得回数582008/03/06 15:12:48

ポイント60pt

仕様としては明記されていないようですが、eachメソッドを使うと要素数0になりました(Ruby 1.8.6)。

ターミナル(またはコンソール)上から

echo "(1..5).each {|v| p v}" |ruby

echo "(5..1).each {|v| p v}" |ruby

で比較してみてください。

id:willnet

よくわかりました!ありがとうございます。

2008/03/06 15:17:33
  • id:Bookmarker
    # 回答しようとしたら締め切られてしまった…

    オペランドに指定したオブジェクトの <=>, succ メソッド次第です。

    [http://www.ruby-lang.org/ja/man/html/Range.html:title=Range - Rubyリファレンスマニュアル]:
    >>
    範囲演算子のオペランドは互いに <=> で比較できる必要があります。
    さらに Range#each を実行するためには succ メソッドを実行できるものでなければいけません。
    <<

    Integer クラスの <=>, succ メソッドの仕様は以下の通りです。
    [http://www.ruby-lang.org/ja/man/html/Integer.html:title=Integer - Rubyリファレンスマニュアル]:
    >>
    :self <=> other:self と other を比較して、self が大きい時に正、等しい時に 0、小さい時に負の整数を返します。
    :succ:次の整数を返します。
    <<

    以下のようなスクリプトを実行してみると理解できると思います。
    >|ruby|
    #!ruby

    class RSuccInt
    def initialize(val = 0, reverse = true)
    @val = val
    @reverse = reverse
    end
    attr_reader :val
    def succ
    puts "in succ"
    val = @reverse ? @val - 1 : @val.succ
    self.class.new(val, @reverse)
    end
    def <=>(other)
    puts "in <=>"
    if @reverse
    other.val <=> @val
    else
    @val <=> other.val
    end
    end
    end

    if false
    first = 1
    last = 5
    reverse = false
    else
    first = 5
    last = 1
    reverse = true
    end
    (RSuccInt.new(first,reverse)..RSuccInt.new(last,reverse)).each do |v|
    puts v.val
    end
    ||<

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません