我喜欢 D 的 10 个特点

这是一篇面向初学者的文章,探讨了 D 编程语言中作者最喜欢的部分,从一些生活质量提升的小细节到更重要的特性都有涉及:

  • 自动构造函数:定义结构体时若未显式提供构造函数,编译器会根据字段的词法顺序自动生成。例如struct Vector2{ int a; int b; this(int a = int.init, int b = int.init) { this.a = a; this.b = b; } },非常适合普通数据类型,且支持命名参数。
  • 契约式设计:D 支持契约编程,函数可定义“in”断言确认参数有效,“out”断言确认返回值状态有效,还可在结构体和类上附加“不变式”,在成员函数前后运行以确保类型始终处于有效状态。如struct PositiveBound{...}的例子展示了“in”和“out”合约的使用。
  • 美元运算符:很多语言没有数组长度的简写语法,D 提供了美元运算符$作为引用某物长度的快捷方式,结构体和类甚至可以重载此运算符,如auto bar = foo[5..$-2];
  • CTFE(编译时函数执行):D 编译器提供语言解释器,可在编译时运行大量 D 代码,无需特殊标记。例如immutable ALL_EVEN_NUMBERS_UNDER_1000 = iota(0, 1000).filter!(n => n % 2 == 0).array;,此特性有很多实际应用,能生成更干净、健壮的代码。
  • 内置单元测试:D 直接支持定义单元测试,代码通常将单元测试和普通代码放在同一个文件中,还可覆盖内置测试运行器,极低的测试编写门槛有助于激励人们编写测试,当然也可使用更复杂的测试框架。
  • 详尽的switch语句:D 提供final switch语句,带有自动生成的default: case,若被命中会立即使程序崩溃,用于检测新值添加或无效值传入。使用final switchenum值时,会触发编译时检查以确保enum类型的每个值都已声明。
  • 括号省略语法:D 在多种上下文中调用函数时允许省略括号,如调用无参数函数、一个参数的函数、单个模板参数等,能提升代码的可读性,如writeln(person.name);person.name = "Brad";auto number = "20".to!int;
  • UFCS(统一函数调用语法):UFCS 允许将调用链“反转”,使独立函数可像成员函数一样使用,如foo.bar().baz(),可使代码更简洁,例如两段等价的代码展示了 UFCS 的使用。
  • 作用域和选择性导入:D 支持将导入限制在特定范围,如单个if语句、整个函数、整个结构体/类等,还可选择性导入其他模块的符号,避免污染查找范围,有助于提高代码的可理解性和可移植性,如import std.algorithm : joiner;在不同范围的导入示例。
  • 内置文档生成器:D 有内置的文档生成器,格式相对标准且易读,还有一些独立的文档工具。如作者个人项目中的函数文档示例和标准库中的函数文档示例,展示了函数参数、返回值、抛出异常等方面的详细说明。
    结论:文章重点关注了较简单的日常特性,希望能为 D 语言的奇特而精彩的特性集提供一些见解。
阅读 13
0 条评论