如果未初始化变量而不是nil
,则说我是否要返回其他内容。这可能吗?我想每班只重载一次,而不是全局重载。
(其原因主要是玩疯狂的技巧)。
答案 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