我在项目中使用Struct而不是简单的Hash来为一组键值对提供语义名称。但是,一旦我构建了结构,我就需要输出一个哈希值。我在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(通常,通过monkeypatching,或通过模块或继承)。
答案 0 :(得分: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 }
答案 1 :(得分:2)
或者这个:
class Struct
def to_hash
self.class.members.inject({}) {|h,m| h[m] = self[m]}
end
end
(注意要获得会员的额外课程)
答案 2 :(得分: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}
答案 3 :(得分: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