5

プロジェクトで単純なハッシュではなく構造体を使用して、キーと値のペアのコレクションにセマンティック名を提供しています。ただし、構造を構築したら、ハッシュ値を出力する必要があります。私はRuby 1.9.3です。例:

MyMeaninfulName = Struct.new(:alpha, :beta, :gamma) do
  def to_hash
    self.members.inject({}) {|h,m| h[m] = self[m]; h}
  end
end

my_var = MyMeaningfulName.new
my_var.to_hash # -> { :alpha=>nil, :beta=>nil, :gamma=>nil } 

Struct に to_hash メソッドが含まれていない理由はありますか? 当然のように思えますが、含まれていないのには何か根本的な理由があるのか​​もしれません。

第二に、一般的な to_hash メソッドを Struct に構築するよりエレガントな方法はありますか (一般的には、モンキーパッチを介して、またはモジュールまたは継承を介して)。

4

4 に答える 4

3

質問は ruby​​ 1.9.3 に関するものですが、ruby 2.0.0 からは、その仕事をStructするメソッドがあります。to_h

MyMeaningfulName = Struct.new(:alpha, :beta, :gamma)

my_var = MyMeaningfulName.new
my_var.to_h # -> { :alpha=>nil, :beta=>nil, :gamma=>nil } 
于 2015-02-05T09:51:28.697 に答える
2

またはこれ:

class Struct
  def to_hash
    self.class.members.inject({}) {|h,m| h[m] = self[m]}
  end
end

(メンバーに到達するための追加のクラスに注意してください)

于 2012-09-06T13:32:17.280 に答える
2

理由はわかりませんが、明らかなようです。幸いなことに、ブラケット演算子を実装しているため、多くの場所でハッシュとして使用できます。

とにかく、これはかなりエレガントです:

MyMeaningfulName = Struct.new :alpha, :beta, :gamma do
  def to_hash
    Hash[members.zip values]
  end
end

my_var = MyMeaningfulName.new 1, 2, 3
my_var.to_hash # => {:alpha=>1, :beta=>2, :gamma=>3}
于 2012-09-06T14:50:20.393 に答える
0

これを試して:

class Struct
  old_new = self.method(:new)
  def self.new(*args) 
    obj = old_new.call(*args)
    obj.class_exec do
      def to_hash
        self.members.inject({}) {|h,m| h[m] = self[m]; h}
      end
    end
    return obj
  end
end
于 2012-09-06T13:24:50.647 に答える