2011-10-06 92 views
1

说,如果我想如果一个变量没有被初始化,而不是nil返回别的东西。这可能吗?我只希望每个班都重载,而不是全局。有没有办法在Ruby中覆盖实例变量查找?

(这样做的原因主要是与疯狂的把戏玩)。

+1

可能重复:确实有红宝石一method_missing的等效未定义的实例变量?](http://stackoverflow.com/questions/7651213/does-ruby-have-a-method-missing-equivalent-for-undefined-实例变量) – rdvdijk

+0

我没有任何计划在生产 –

回答

0

你可以写一个包装方法

def something 
    @var || "your default" 
end 
+0

使用这个如果这是可能的,我想这对任何实例变量查找自动发生的(只是查找,分配不重要) –

+0

,它必须被使用@不是setter –

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 

会自动定义实例变量读者的任何一组实例变量,或:

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访问时间。

+0

我看到的行为是,当我尝试访问未定义的属性的method_missing不会被调用,它只是直接评估为无,而不被拦截。我错过了什么吗? –

相关问题