我最喜歡的D語(yǔ)言功能
UFCS 能讓你能夠編寫自然的可重用代碼而不會(huì)犧牲便利性。
早在 2017 年,我就寫過為什么 D 語(yǔ)言是開發(fā)的絕佳選擇的文章。但是 D 語(yǔ)言中有一個(gè)出色的功能我沒有充分的展開介紹:通用函數(shù)調(diào)用語(yǔ)法(UFCS)。UFCS 是 D 語(yǔ)言中的一種語(yǔ)法糖,它可以在類型(字符串、數(shù)字、布爾值等)上鏈接任何常規(guī)函數(shù),就像該類型的成員函數(shù)一樣。
如果你尚未安裝 D 語(yǔ)言,請(qǐng)安裝 D 語(yǔ)言編譯器,以便你可以自己運(yùn)行 D 代碼。
看一下以下示例代碼:
// file: ufcs_demo.d
module ufcs_demo;
import std.stdio : writeln;
int[] evenNumbers(int[] numbers)
{
import std.array : array;
import std.algorithm : filter;
return numbers.filter!(n => n % 2 == 0).array;
}
void main()
{
writeln(evenNumbers([1, 2, 3, 4]));
}
使用你喜歡的 D 語(yǔ)言編譯器進(jìn)行編譯,查看這個(gè)簡(jiǎn)單示例應(yīng)用做了什么:
$ dmd ufcs_demo.d
$ ./ufcs_demo
[2, 4]
但是,使用作為 D 語(yǔ)言的內(nèi)置功能的 UFCS ,你還可以自然方式編寫代碼:
...
writeln([1, 2, 3, 4].evenNumbers());
...
或完全刪除現(xiàn)在多余的括號(hào),使 evenNumbers
看起來(lái)像是一個(gè)屬性:
...
writeln([1, 2, 3, 4].evenNumbers); // prints 2, 4
...
因此,完整的代碼現(xiàn)在變?yōu)椋?/p>
// file: ufcs_demo.d
module ufcs_demo;
import std.stdio : writeln;
int[] evenNumbers(int[] numbers)
{
import std.array : array;
import std.algorithm : filter;
return numbers.filter!(n => n % 2 == 0).array;
}
void main()
{
writeln([1, 2, 3, 4].evenNumbers);
}
使用你最喜歡的 D 語(yǔ)言編譯器進(jìn)行編譯,然后嘗試一下。 如預(yù)期的那樣,它產(chǎn)生相同的輸出:
$ dmd ufcs_demo.d
$ ./ufcs_demo
[2, 4]
在編譯過程中,編譯器自動(dòng)地將數(shù)組作為函數(shù)的第一個(gè)參數(shù)。這是一個(gè)常規(guī)模式,使得使用 D 語(yǔ)言成為一種樂趣,因此,它與你自然而然考慮代碼的感覺非常相似。結(jié)果就是函數(shù)式編程。
你可能會(huì)猜出這打印的是什么:
//file: cool.d
import std.stdio : writeln;
import std.uni : asLowerCase, asCapitalized;
void main()
{
string mySentence = "D IS COOL";
writeln(mySentence.asLowerCase.asCapitalized);
}
確認(rèn)一下:
$ dmd cool.d
$ ./cool
D is cool
結(jié)合其他 D 語(yǔ)言的功能,UFCS 使你能夠編寫可重用的代碼,并在不犧牲便利性的情況下自然地進(jìn)行編寫。
是時(shí)候嘗試 D 語(yǔ)言了
就像我之前寫的那樣,D 語(yǔ)言是一種很棒的開發(fā)語(yǔ)言。從 D 語(yǔ)言的下載頁(yè)面可以很容易地進(jìn)行安裝,因此請(qǐng)下載編譯器,查看示例,并親自體驗(yàn) D 語(yǔ)言。