如何在类上使用哈希键作为方法?

Mic*_*ael 15 ruby

我有一个类和一个哈希.如何使用键作为方法名称,使哈希的成员动态地成为类的方法?

class User
  def initialize
    @attributes = {"sn" => "Doe", "givenName" => "John"}
  end
end
Run Code Online (Sandbox Code Playgroud)

例如,我希望能够得到以下输出Doe:

u = User.new
puts u.sn
Run Code Online (Sandbox Code Playgroud)

Ale*_*xey 30

只需使用OpenStruct:

require 'ostruct'
class User < OpenStruct
end

u = User.new :sn => 222
u.sn
Run Code Online (Sandbox Code Playgroud)


sep*_*p2k 15

def method_missing(name, *args, &blk)
  if args.empty? && blk.nil? && @attributes.has_key?(name)
    @attributes[name]
  else
    super
  end
end
Run Code Online (Sandbox Code Playgroud)

说明:如果调用一个不存在的方法,则调用method_missing,并将方法的名称作为第一个参数,然后是给定方法的参数和块(如果给出的话).

在上面我们说如果一个没有定义的方法被调用而没有参数并且没有一个块,并且哈希有一个方法名为key的条目,它将返回该条目的值.否则它将照常进行.


sev*_*rin 5

sepp2k 的解决方案是要走的路。但是,如果您的 @attributes 在初始化后永远不会改变并且您需要速度,那么您可以这样做:

class User
  def initialize
    @attributes = {"sn" => "Doe", "givenName" => "John"}
    @attributes.each do |k,v|
      self.class.send :define_method, k do v end
    end
  end
end

User.new.givenName # => "John"
Run Code Online (Sandbox Code Playgroud)

这会提前生成所有方法......