繁体   English   中英

使对象method_missing的行为类似于类method_missing

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM