- ベストアンサー
Rubyハッシュ継承クラスの作成方法について
- ハッシュを拡張し、キーで範囲指定した値を取得したい場合、Rubyでは継承クラスを作成することができます。
- 値を取得するための速度には注意が必要ですが、範囲指定した値の取得を行う場合に便利です。
- 具体的な例として、角度に対応する十キーのリストを作成する際に、継承クラスを使用することでスマートに実装することができます。
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
No1です。テストはしていませんが、 class Range_List < Hash def initialize(hash) @list=hash end def [](other) @list.each { |range, value| return value if range === other } nil end end def Range_List(hash) Range_List.new(hash) end で、 angle_to_direction = Range_List( a..b=>c, d..e=>f, g..h=>i, ~~)
その他の回答 (1)
- notnot
- ベストアンサー率47% (4900/10358)
Range_List { xxx..yyy => zzz, ~~~ } のような呼び出し方はできないです。 Range_List( { xxx..yyy => zzz, ~~~ } ) か Range_List ( xxx..yyy => zzz, ~~~ ) か。 Range_Listメソッドはどのように定義していますか? あと、Range_List#initialize はどのように定義していますか?
補足
早速のご回答ありがとうございます。 >> Range_List { xxx..yyy => zzz, ~~~ } のような呼び出し方はできないです。 >> Range_List( { xxx..yyy => zzz, ~~~ } ) か Range_List ( xxx..yyy => zzz, ~~~ ) か。 やはりできませんでしたか・・・。 僕としては、Range_List({})と二回括弧を書くよりは、Range_List()で呼び出せればと思っています。 >> あと、Range_List#initialize はどのように定義していますか? 当初はHashを継承しなくても、下記のように呼び出せると思っており、エラーが出てそう甘くないと痛感していたところです。 Hashを継承するにあたり、現在はメソッドが被らないように全てコメントにしています。 class Range_List # # オブジェクト作成 # def self.{}(list) # エラーが出た為、Hashを継承させる方法を模索・・・ new(list) end # # オブジェクト初期化 # def initialize(list) @list = list end end まだまだRubyの深い部分を知らず、記述がイマイチ分かりません・・・。 どうか引き続きご回答の程お願い致します。
お礼
引き続きご回答ありがとうございます。 上記の通りにやってみたところ、出来ました!! やはり、Kernelに定義するのですね。 引数が、自動的にHashに格納されるとは・・・意外でした。 お陰様でまた一歩前進できそうです。 毎回ご回答下さり、本当にありがとうございます。