测试Open Live Writer

发布时间 2023-04-18 20:19:12作者: 高斯山

 

近10年D语言在社区驱动下得到巨大发展,语言核心去芜存菁,广泛吸收;标准库不断扩充;语法越来越“对人类友好”;betterC和importC使得D语言与C语言越来越成为一家人,为底层开发在做坚实的奠基;以vibe-d和hunt frame work为首的众多跨平台网络库,使得开发web框架和应用几乎与控制台和桌面程序一样的容易、简

UFCS,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 }

ufcstest

 

既然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 }

ufcstest1

下面示例一个非常简单的函数链调用:

  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 }

ufcstest2

可以初步稍稍想象一下,类成员函数有一些是返回类对象本身,再结合自由函数的UFCS,加之标准库,泛型,mixin等语言核心特性在一起,这个组合将是非常强大的。