2011-08-07 40 views
3

測試在d以下特性及d REF返回值

import std.stdio; 

struct S 
{ 
    int _val; 
    @property ref int val() { return _val; } 
    @property void val(int v) { _val = v; writeln("Setter called!"); } 
} 

void main() 
{ 
    auto s = S(); 
    s.val = 5; 
} 

產生"Settter called!"作爲輸出。

編譯器使用什麼規則來確定是調用第一個還是第二個實現?

回答

5

這裏您提供了兩個@property方法,一個接受參數,另一個不接受參數。在做s.val = 5;時,你實際做的是s.val(5),但是val@property,你可以把它寫成屬性而不是方法調用(見http://d-programming-language.org/function.html#property-functions)。從s.val(5)開始,編譯器可以執行標準的重載分辨率 - 請參閱http://d-programming-language.org/function.html#function-overloading

+0

確實如此,但是他的第一個@property方法返回了一個'ref int',所以編譯器也可以做類似'auto a = val(); a = 5'。它實際上**不會**用** dmd v2.054 ** **與原始代碼 - 第一個實現被調用。如果你用源文件中的實現切換這些行,那麼調用者被調用......因此,目前dmd似乎簡單地調用了源文件中的第一個實現。 – jpf