プロが教える店舗&オフィスのセキュリティ対策術

ハッシュを拡張し、値をキーで指定した範囲内から取得したいと思っているのですが、ハッシュと同じように作成できないのでしょうか?
試行錯誤してみたのですが、記述が分かりません・・・。


class Range_List < Hash
 #
 # 範囲に対応する、値を取得(速度が気になりますが・・・)
 #
 def [](other)
  @list.each { |range, value|
   return value if range === other
  }
  nil
 end
end


# 角度 (0..1) に対応する、十キーのリストを作成
angle_to_direction = Range_List{  # => エラー。このような記述で呼び出したい
 0.0625..0.1875 => 3,
 0.1875..0.3125 => 2,
 0.3125..0.4375 => 1,
 0.4375..0.5625 => 4,
 0.5625..0.6875 => 7,
 0.6875..0.8125 => 8,
 0.8125..0.9375 => 9,
 0.9375..1    => 6,
 0..0.0625    => 6
}


# 角度対応の十キーを求める
p angle_to_direction[0.1]  # => 3


どうかご回答お願いいたします。

A 回答 (2件)

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の深い部分を知らず、記述がイマイチ分かりません・・・。
どうか引き続きご回答の程お願い致します。

補足日時:2013/05/06 22:02
    • good
    • 0

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, ~~)
    • good
    • 0
この回答へのお礼

引き続きご回答ありがとうございます。

上記の通りにやってみたところ、出来ました!!
やはり、Kernelに定義するのですね。
引数が、自動的にHashに格納されるとは・・・意外でした。
お陰様でまた一歩前進できそうです。

毎回ご回答下さり、本当にありがとうございます。

お礼日時:2013/05/09 11:47

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!