2011-12-28 5 views
4

Rubyでカスタムオブジェクトから範囲を作成する方法を見つけようとしていました。私はRubyにはとても新しく、Rangeのドキュメントは参考にならないことがわかりました。Rubyカスタムオブジェクトのドキュメントから範囲を作成するには?

私のオブジェクトからRangeを作成しようとしたときに受け取ったエラーは、単に「範囲の値が不正です」でした。

私は最終的に私のオブジェクトから範囲を作成するために、 "succ"と "< =>"関数を定義しなければなりません。

私の質問はこれです。範囲内のオブジェクトを使用するために上記の2つの関数を定義する必要があると私に言った良いリソースがありますか?これからのような問題は避けたい。

大変申し訳ございませんが、あなたの時間をありがとう。

答えて

3

ザ・つるはしブック(AKA "プログラミングルビー")has this to say about Range

は、これまでのところ、私たちは、数値と文字列の範囲を示してきました。しかし、オブジェクト指向言語から期待されるように、Rubyは定義したオブジェクトに基づいて範囲を作成することができます。 唯一の制約は、オブジェクトが次のオブジェクトを順番に返すことによってオブジェクトがsuccに応答しなければならず、オブジェクトが汎用比較演算子<=>を使用して比較可能でなければならないことです。

強調鉱山。あなたは注意する必要があります。オンラインで見つかるPickaxeはかなり古く、時にはRubyの現在の状態に同意しない場合もあります。 updated version for Ruby 1.9がありますが、私はオンラインで自由に利用できるとは思わないので、コピーを購入する必要があります。

私は通常、これらのことをたくさん把握するためにRubyソースを掘り下げます。それはRailsに二重に当てはまります。

+0

https://.rb#L156はあなたの発言をサポートします。 – Reactormonk

+0

@タス:Rubiniusのように、MRIがC実装で持っているFixnumの最適化もあります。リンクありがとう。 –

+0

実際には '#succ'は' Range#each 'だけで使用されると思いますので、範囲全体を反復しないで(明らかに 'Enumerable'メソッドは使用しないでください)、' <=> '。私はそれを試したことはありませんが、あなたがFloatの範囲を構築できるという事実は、それを示唆しているようです。 –

関連する問題