近10年D语言在社区驱动下得到巨大发展,语言核心去芜存菁,广泛吸收;标准库不断扩充;语法越来越“对人类友好”;betterC和importC使得D语言与C语言越来越成为一家人,为底层开发在做坚实的奠基;以vibe-d和hunt frame work为首的众多跨平台网络库,使得开发web框架和应用几乎与控制台和桌面程序一样的容易、简
Technorati Tags: D语言,D2,DMD,UFCS,OLW,Open Live Writer,WLW,Windows Live WriterUFCS,Uniform Function Call Syntax.统一函数调用语法,或者,我按自己的理解,称为函数一致性调用语法,使得语言更贴近人类表达习惯,同时使得函数链调用变得非常可行,并且简单、简便。
对于一个模块级(module)自由函数,如果满足以下两个条件,即可像一个对象的成员方法一样去调用:
- 这个对象没有(或不能有)一个这样的成员方法;
- 这个自由函数的第一个参数与该类型匹配(该类,super类,可安全地类型转换成为该类型等)
到此,这个对象可以是任何类型,都可有如调用自己的成员方法一样去调用这个自由成员。
听起来还是有些别扭,看示例会更容易明白究竟是怎么一回事:
1 /+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 2 这个小程序演示D语言UFCS,函数一致性调用语法。 3 一般地,如果有一个模块级自由函数void print(string msg), 4 我们理所当然地这样去调用: 5 print("早上好!"); 6 7 当以下两件条件满足时: 8 1.string类型没有print()这样一个方法; 9 2.自由函数的参数类型为string,正好是string类型 10 11 string.print() 即可通过编译器允许,即与 12 print("早上好”); 13 一样。 14 事实上由于UFCS这个特性,编译器首先查看string类型有没有 15 print()这个方法,如果有,就调用;如果没有,则在模块级 16 查看有没有print(stirng)这样一个自由函数,如果有,就调 17 用它。 18 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++/ 19 20 module ufcstest; 21 import std.stdio; 22 23 void print(string msg) 24 { 25 writeln(msg); 26 } 27 28 void main() 29 { 30 "Hello UFCS".print(); 31 "早上好".print; 32 33 readln; 34 }
既然UFCS可以这样玩,那试试语言标准库标准输出函数writeln:
1 module ufcstest; 2 import std.stdio; 3 4 /* 5 void print(string msg) 6 { 7 writeln(msg); 8 } 9 */ 10 void main() 11 { 12 writeln("标准库writeln标准调用方法:"); 13 writeln("晚上好"); 14 writeln("我爱世界杯"); 15 16 writeln("=============================="); 17 writeln("UFCS调用:"); 18 19 "晚上好".writeln(); 20 "我爱世界杯".writeln; 21 22 readln; 23 }
下面示例一个非常简单的函数链调用:
1 module ufcstest; 2 import std.stdio; 3 4 /* 5 void print(string msg) 6 { 7 writeln("标准库writeln标准调用方法:"); 8 writeln("晚上好"); 9 writeln("我爱世界杯"); 10 11 writeln("=============================="); 12 writeln("UFCS调用:"); 13 14 "晚上好".writeln(); 15 "我爱世界杯".writeln; 16 } 17 */ 18 19 double add(double a,double b) 20 { 21 return a+b ; 22 } 23 24 void main() 25 { 26 writeln("比起嵌套调用:writeln(add(10,20));"); 27 writeln("add(10,20).writeln更符合连贯性思维。"); 28 add(10,20).writeln; 29 30 readln; 31 }
可以初步稍稍想象一下,类成员函数有一些是返回类对象本身,再结合自由函数的UFCS,加之标准库,泛型,mixin等语言核心特性在一起,这个组合将是非常强大的。
标签:调用,string,Writer,UFCS,writeln,Live,print,Open,函数 From: https://www.cnblogs.com/godspeedsam/p/17330949.html