0

私はRubyが初めてで、他の多くの質問で指摘されているように、ハッシュ値にオブジェクト(myHash.key)としてアクセスできないことに少しがっかりしています(例:ハッシュキーをメソッドとして使用するにはどうすればよいですかクラス?)。openstruct ソリューションが再帰的ではないため気に入らず、Hash クラスを変更したくありません。

したがって、次のソリューションを開発しました。最初に次のモジュールを定義します。

module NiceHash
  def method_missing(name, *args, &blk)
    if args.empty? && blk.nil? && self.has_key?(name.to_s)
      result=self[name.to_s]
      if result.is_a? Hash
        result.extend(Nice_Hash)
      end
      return result
   else
     super
   end
  end
  def respond_to?(sym, include_private = false)
    super(sym, include_private) || (self.has_key?(sym.to_s))
  end
end

そして、それを使用します

a={"a"=>"a"}
a.extend(NiceHash)
a.a

解決策は機能します。

私の質問は次のとおりです。これは、ラッパー クラスでも実行できます。どちらが良いでしょうか?私は、与えられた解決策で(隠された)問題を見つけました。

4

1 に答える 1

0

あなたのソリューションの隠れた問題についての質問に答えると、主なものが 2 つあります。

  1. 他の人がコメントで述べたように、キーが有効な ruby​​ メソッド名でない場合に壊れます。
  2. あなたのソリューションは、OpenStruct と同じように、method_missing に基づいています。したがって、同じ欠点があります。OpenStruct docsに記載されているように:

OpenStruct は、Ruby のメソッド ルックアップ構造を利用して、プロパティに必要なメソッドを見つけて定義します。これは、メソッド method_missing および define_method によって実現されます。

ハッシュまたは構造体を使用する場合と比較して、これらのプロパティの設定にははるかに多くのオーバーヘッドがあるため、作成されるオブジェクトのパフォーマンスに懸念がある場合は、これを考慮する必要があります。

于 2013-05-08T13:14:57.827 に答える