Ruby从哈希创建方法

Jer*_* B. 2 ruby dynamic-method

我有以下代码用于将哈希集合转换为我的类上的方法(有点像活动记录).我遇到的问题是我的二传手不能正常工作.我对Ruby仍然很陌生,并且相信我已经让自己扭转了一下.

class TheClass
  def initialize
    @properties = {"my hash"}
    self.extend @properties.to_methods
  end
end

class Hash
  def to_methods
    hash = self
    Module.new do
      hash.each_pair do |key, value|
        define_method key do
          value
        end
        define_method("#{key}=") do |val|
          instance_variable_set("@#{key}", val)
        end
      end
    end
  end
end
Run Code Online (Sandbox Code Playgroud)

这些方法已创建,我可以在课堂上阅读它们,但设置它们不起作用.

myClass = TheClass.new
item = myClass.property # will work.
myClass.property = item # this is what is currently not working.
Run Code Online (Sandbox Code Playgroud)

Jon*_*röm 6

如果您的目标是设置动态属性,那么您可以使用OpenStruct.

require 'ostruct'

person = OpenStruct.new
person.name = "Jennifer Tilly"
person.age = 52

puts person.name     
# => "Jennifer Tilly"
puts person.phone_number 
# => nil
Run Code Online (Sandbox Code Playgroud)

它甚至内置支持从哈希创建它们

hash = { :name => "Earth", :population => 6_902_312_042 }
planet = OpenStruct.new(hash)
Run Code Online (Sandbox Code Playgroud)