其他现代特性及语法糖
仓颉编程视频→KCKCJY
函数重载
仓颉允许在同一作用域内定义多个同名函数。编译器根据参数的个数和类型,来决定函数调用实际执行的是哪个函数。例如,下面的绝对值函数,为每种数值类型都提供了对应的实现,但这些实现都具有相同的函数名abs,从而让函数调用更加简单。
func abs(x: Int64): Int64 { ... } func abs(x: Int32): Int32 { ... } func abs(x: Int16): Int16 { ... } ... |
命名参数
命名参数是指在调用函数时,提供实参表达式的同时,还需要同时提供对应形参的名字。使用命名参数可以提升程序的可读性,减少参数的顺序依赖性,让程序更加易于扩展和维护。
在仓颉中,函数定义时通过在形参名后添加 ! 来定义命名参数。当形参被定义为命名参数后,调用这个函数时就必须在实参值前指定参数名,如下面的例子所示:
func dateOf(year!: Int, month!: Int, dayOfMonth!: Int) {...} dateOf(year: 2024, month: 6, dayOfMonth: 21) |
参数默认值
仓颉的函数定义中,可以为特定形参提供默认值。函数调用时,如果选择使用该默认值做实参,则可以省略该参数。
这个特性可以减少很多函数重载或者引入建造者模式的需求,降低代码复杂度。
func dateOf(year!: Int64, month!: Int64, dayOfMonth!: Int64, timeZone!: TimeZone = TimeZone.Local) { ... } dateOf(year: 2024, month: 6, dayOfMonth: 21) // ok dateOf(year: 2024, month: 6, dayOfMonth: 21, timeZone: TimeZone.UTC) // ok |
尾随 lambda(trailing lambda)
仓颉支持尾随 lambda 语法糖,从而更易于 DSL 中实现特定语法。具体来说,很多语言中都内置提供了如下经典的条件判断或者循环代码块:
if (x > 0) { x = -x } while (x > 0) { |