2013-07-20 63 views
0

有時候,我看到這樣的代碼Ruby - 爲什麼要將參數分配給實例變量?

class Thing 
    def self.add_em(a,b) 
    a+b 
    end 
end 

,有時我看到

class Thing 
    def self.add_em(a,b) 
    @a=a 
    @b=b 
    @[email protected] 
    end 
end 

當/我爲什麼要使用@實例變量,而不是僅僅使用參數傳遞的?

我相信一個原因是,如果你想在任何其他方法中使用這些變量,那麼實例變量將是可用的,本地,基於參數的變量不會。不過,我經常看到@變量被使用,即使變量沒有被其他方法使用。

所以我看到的 @一個模式=一個 @ B = 在中傳遞的所有參數方法開始被使用了很多,但我不清楚到底爲什麼,如果他們在那些剛剛使用方法。如果它們用於其他方法,它只是一個約定嗎?

+0

你知道你寫的答案是正確的。但這取決於你如何在你的代碼庫中使用OOP設計。 –

+0

我遇到了這個問題,因爲我回答了另一個關於你的問題,關閉,刪除,未刪除。這一個也是完全合理的,而且「幾乎完全基於意見」。無論如何,我同意你收到的答案。我只補充說,我大多在'initialize'方法中看到了@ a = a @ b = b模式,你幾乎總是想保存參數供以後使用。 –

回答

2

正如您已經正確認識到的那樣,除非在另一種方法中使用它們,否則定義實例變量沒有任何意義。如果使用實例變量,但沒有用其他方法調用,那麼該代碼可能不是由好程序員編寫的。

但請注意,有時,方法定義一開始並不明顯。例如,如果有

class Thing 
    attr_reader :a 
end 

那麼實際上有一種方法使用@a

1

我想說他們這樣做是因爲他們有計劃將參數作爲實例變量引用。如果不是,他們失敗YAGNI(你不會需要它的原則)。如果他們在一半的時間內改變了主意(已經知道發生了......),他們忘記了整理。

+0

這聽起來像你有特定的代碼。你做? – sawa

+0

Moi?把一些代碼我變成不需要? 「忘記」整理。你怎麼敢先生? :) –

相關問題