2011-01-21 40 views
2

嘿夥計,我試圖讓語法的這些位是有意義的我:D中的擴展方法?

S[] split(S)(S s) if (isSomeString!S) 
{ 
    ... 
} 

string join(in string[] words, string sep) 
{ 
    ... 
} 

據(如phobos/src/std/string.d所示)

我可以說,這是一段代碼,可以讓我們做這樣的事情:

string[] parts = "/foo/bar/baz".split("/"); // string[] {"foo", "bar", "baz"} 
string part = parts.join("-"); // string "foo-bar-baz" 

這基本上讓我相信像我從CSharp獲知的擴展方法在d中是可能的。我的問題是:

  1. 那我不是100%肯定,我期待在這裏
  2. 正確的函數聲明,我沒有看到什麼使他們相似。
+2

來自文檔:http://www.digitalmars.com/d/2.0/arrays.html#func-as-property。 – 2011-01-21 22:18:15

回答

7

它們本身不是擴展方法,只是一些變成整潔功能的bug。

這兩種方法之間的相似之處在於它們都有一個字符串作爲第一個參數。所以這是在這裏的工作招,則該給定的陣列T [] ARR,和一個功能

U foo (T[] t, other params) 

可以通過執行

arr.foo(some arguments matching other params) 
+1

D2被推定爲將這種情況概括爲所有類型,但我不知道Walter是否曾經接近過它。 – FeepingCreature 2011-01-21 13:46:11

3

在d被調用,這需要一個陣列的任何功能因爲它的第一個參數可以被調用,就好像它是該數組的成員函數一樣。由於字符串是數組,所以會包含字符串。所以,像

T[] replace(in T[] array, in T[] from, in T[] to) 

可以稱得上兩種不同的方式:

auto replacedStr1 = replace("hello world", "hello", "goodbye"); 
auto replacedStr2 = "hello world".replace("hello", "goodbye"); 

此功能目前僅適用於陣列(IIRC,它來到約因,允許存在一個bug,並決定它實際上是很好的,所以它實際上是語言的一部分),但據說在某種程度上,它將適用於所有類型。讓它適用於所有類型稱爲統一函數調用語法。與實施,你可以做的東西一樣

auto bigger = 2.max(5); 

但作爲統一的函數調用語法尚未實現,你只能做那種事有數組。人們通常用字符串編程,而不是將它們作爲第一個參數傳遞給函數。