0

次のように動作するようにハッシュにパッチを適用したモンキーの影響は何でしょうか。

class Hash
  def method_missing(method,*args, &block)
    if self.has_key?(method)
      return self[method]
    elsif self.has_key?(method.to_s)
      return self[method.to_s]
    else
      return nil
    end
  end
end

私の正当化は次のとおりです。

基本的に、オブジェクトをハッシュに追加するときは、それらの keys.to_s が一意であることを確認します。

私は心配する必要があります、私は何かが欠けていますか?

h = { :foo => "bar", "hello" => "bar" }

h.foo => "bar"
h.hello => "bar"
4

2 に答える 2

6

このためのネイティブ Ruby オブジェクトがあります: OpenStruct

OpenStructをハッシュでインスタンス化できます。

o = OpenStruct.new(hello: 'world')

初期化すると、すべてのキーをメソッドとして使用できます。

o.hello #=> "world"

したがって、ハッシュにモンキー パッチを適用する必要はありません (実際に奇妙な動作につながる可能性があります)。

また、OpenStruct は、文字列エントリとシンボル エントリ間の重複を内部的に管理します。

OpenStruct.new(:hello => 'world', 'hello' => 'world2') #=> #<OpenStruct hello="world2">
于 2013-07-29T15:10:06.400 に答える
1

悪いアイデア!!

ハッシュの有効なメソッドのスペルを間違えると、実際のメソッドが見つからない代わりに nil が返されます。例: {}.count => 0、{}.counts => NoMethodError の代わりに nil: {}:Hash のメソッド「counts」が未定義です。

于 2013-07-29T15:12:42.927 に答える