我有一个类和一个哈希.如何使用键作为方法名称,使哈希的成员动态地成为类的方法?
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的条目,它将返回该条目的值.否则它将照常进行.
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)
这会提前生成所有方法......
| 归档时间: |
|
| 查看次数: |
11995 次 |
| 最近记录: |