2017-09-15 32 views
0

所以,我相信我理解純函數。類似於abs或sqrt的地方,輸出依賴於輸入並且沒有副作用。不過,我很困惑這種方法如何工作。C++/c#類中的純方法

如果我們將一個方法作爲一個帶有隱式參數的函數來看,那麼我會假定像下面那樣的方法確實是純的。

class Foo 
{ 
    int x; 

    [Pure] public int Bar() { return x * 2; } 
} 

這是一個正確的假設,該函數是純粹的嗎?如果read變量是readonly/const,它會有所作爲嗎?

+0

如果調用者不能準確預測結果,那麼它不是純粹的。所以這不是純粹的。那麼爲什麼呼叫者會使用它?因爲它可能是一個複雜的操作,調用者不想實現它。換句話說,結果只能從輸入中推導出來,而沒有別的。 – CodingYoshi

+0

爲什麼標記爲C++? –

+0

@passerby因爲它是語言不可知的。所以它可以被標記任何東西。但是,爲什麼是這樣的:pehaps用戶想要這些語言的示例 – CodingYoshi

回答

1

的功能被認爲是純粹的時:

功能始終計算給定相同的參數值(一個或多個)相同的結果的值。函數的結果值可以不依賴於任何 隱藏的信息或狀態,其可以同時執行程序 前進或程序的不同執行之間改變...

Wikipedia

Bar不是純,因爲它取決於變量x。所以如果x的值發生變化,Bar()的結果在不同的場合會有所不同。

想象這樣的事情:

var obj = new Foo(); 
obj.x = 1; 
obj.Bar(); // Returns 2. 
obj.x = 5; 
obj.Bar(); // Returns 10. 

然而,如果x是一個常數/只讀的,它仍然是純粹的,因爲的Bar()結果永遠不會改變。

+0

我想補充一點,如果你不能,爲了理解的目的,用它應該返回的值替換你的方法調用,並讓你的程序運行相同,那麼這個方法也不是純粹的。 – Kilazur