2011-10-06 147 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不會被調用,它只是直接評估爲無,而不被攔截。我錯過了什麼嗎? –

相關問題