有没有办法在Ruby中覆盖实例变量查找?

时间:2011-10-06 07:47:52

标签: ruby metaprogramming

如果未初始化变量而不是nil,则说我是否要返回其他内容。这可能吗?我想每班只重载一次,而不是全局重载。

(其原因主要是玩疯狂的技巧)。

2 个答案:

答案 0 :(得分:1)

在这种情况下,您可以使用#instance_variable_defined?#instance_variable_get。例如:

class Thing
  def method_missing(method, *args, &block)
    ivar_name = "@#{method}".intern

    if instance_variable_defined? ivar_name
      instance_variable_get ivar_name
    else
      super method, *args, &block
    end
  end
end

会自动为任何set实例变量定义实例变量reader,或者:

class Thing
  IVARS = [:@first, :@second]

  def method_missing(method, *args, &block)
    ivar_name = "@#{method}".intern

    if IVARS.include? ivar_name
      if instance_variable_defined? ivar_name
        instance_variable_get ivar_name
      else
        "your default"
      end
    else
      super method, *args, &block
    end
  end
end
如果在IVARS常量中命名的实例变量默认为默认值,

将定义读者。我相信您可以看到如何将其更改为哈希映射实例变量名称为其默认值或其他。

如果您不需要比此更灵活,您可以简单地使用instance_variable_get来提供默认值:

thing = Thing.new
thing.instance_variable_get :@ivar_name, "your default"

虽然这不会定义读者方法 - 但您每次都必须通过instance_variable_get访问。

答案 1 :(得分:0)

你可以写一个包装器方法

def something
  @var || "your default"
end