ruby – 向struct添加to_hash(或to_h)方法的优雅方法?

我在项目中使用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,或通过模块或继承).

解决方法

试试这个:

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

相关文章

validates:conclusion,:presence=>true,:inclusion=>{...
一、redis集群搭建redis3.0以前,提供了Sentinel工具来监控各...
分享一下我老师大神的人工智能教程。零基础!通俗易懂!风趣...
上一篇博文 ruby传参之引用类型 里边定义了一个方法名 mo...
一编程与编程语言 什么是编程语言? 能够被计算机所识别的表...
Ruby类和对象Ruby是一种完美的面向对象编程语言。面向对象编...