2009-11-10 20 views
1

我正在編寫一個小的Heap實現,並且在創建我的Node類時,我注意到了一些奇怪的行爲。我想調用defined?(x)以確保已定義x,然後在將其存儲到Node的值類變量中之前,檢查x是否爲Integer。在IRB中,我可以撥打 defined?(x),結果爲零。定義?在Ruby中工作在irb中但不在我的類文件中

然而,在班上,我試試這個:

def change_value value 
    @value = value if defined?(value) 
end 

,當我打電話change_value用隨機字母的結果,讓我們說「E」,是標準定義的局部變量或方法的錯誤。同樣,在IRB中,它似乎工作正常,我想知道我是否有某種環境問題,或者如果這不是檢查價值是否真的存在的「最佳」方法。

謝謝。

回答

-1

是否需要從類實例調用方法而不是對象實例?

1

這不是檢查它是否真的存在的最佳方法。如果change_value被稱爲沒有提供任何參數,你會得到:

ArgumentError: wrong number of arguments (0 for 1) 

相反,你可能要檢查,以確保valuenil。當然,您可以通過多種方式做到這一點:

if !value.nil? 
    #... 
end 

if value 
    # this will be exeuted if value is either not `nil` or not `false` 
end 

祝您好運!

7

編輯:。DigitalRoss具有自清潔了問題的格式,等等格式和初始的重寫可能不再適用的評論我會離開他們,直到我從OP一些反饋)

這是一種幾乎不可讀的寫方法,它甚至不會在我的機器上解析(Ruby 1.8.7)。

我假設你的意思如下:

def change_value(value) 
    @value = value if defined?(value) 
end 

,當我把它也能正常工作,但它是不正確。在Ruby中,nil和undefined是兩個不同的野獸; value始終在該上下文中定義,因爲它是一個聲明的方法參數。我懷疑你是真正後:

def change_value(value) 
    @value = value unless value.nil? 
end 

注意,有些人只會寫爲:

def change_value(value) 
    @value = value if value 
end 

因爲nil是「falsy」。但是,這種形式會混淆nilfalse,所以這不是一個好習慣。

+0

+1最後一個例子。 – 2009-11-10 08:11:38

相關問題