[英]Make object method_missing behave like class method_missing
我创建了一个类,该类具有一些恒定的哈希值。 我想输入Myclass.myhash.hashkey
并显示哈希值。 现在,我已经使用method_missing
创建了一个类似的行为,但是我必须初始化该对象,所以我像Myclass.new.myhash.hashkey
一样调用它并且它可以工作。 到目前为止,这是我的代码:
class Myclass
def initialize
@attributes = []
end
def method_missing(name, *args)
@attributes << name
if @attributes.length == 2
eval("#{@attributes.first.upcase}[:#{@attributes.last.downcase}]")
else
self
end
end
MYHASH = {
id: 1,
description: "A nice hash",
hashkey: "hash key"
}
end
我如何在没有初始化和没有new
情况下做到这一点,以便它不会每次都创建MyClass
对象?
更新:第一个问题是由toro2k解释的,但是我不知道是否可以使用第二个问题的行为...
问题2我的类中有很多openstruct,如何动态地将它们定义为类方法,而不必每次都添加如下内容:
def self.myhash
MYHASH
end
您可以使用OpenStruct
对象而不是Hash
:
class MyClass
MYHASH = OpenStruct.new(id: 1,
description: 'A nice Ostruct',
hashkey: 'hash key')
def self.myhash
MYHASH
end
end
MyClass.myhash.id # => 1
MyClass.myhash.description # => "A nice Ostruct"
MyClass.myhash.foo # => nil
更新您可以使用类实例变量替换常量,如下所示:
class MyClass
def self.myhash
@myhash ||= OpenStruct(id: ...)
end
end
MyClass.myhash.id
或者,您可以使用类变量和cattr_reader
:
class MyClass
cattr_reader :myhash
@@myhash = OpenStruct(id: ...)
end
MyClass.myhash.id
或者,您可以摆脱myhash
方法并直接访问常量:
class MyClass
MYHASH = OpenStruct(id: ...)
end
MyClass::MYHASH.id
我终于也找到了第二个问题的解决方案:
class << self
Myclass.constants.each do |constant|
define_method(constant.to_s.downcase) do
eval("#{constant}")
end
end
end
在定义了所有openstruct变量之后,只需在类的末尾添加即可。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.