kotlin语法问题


#1

在kotlin的ContractBuilder中有这样一个函数, public inline fun contract(builder: ContractBuilder.() -> Unit) { }
ContractBuilder.()这种用法以前没见过,一个类后边点括号,麻烦大佬们解答下


#2

相当于这个Lambda的接受者是ContractBuilder

类似扩展函数,Lambda中的this为ContractBuilder,
可以在Lambda内直接调用ContractBuilder的方法而不需要显式指定变量名


#3

这个特性应该还没有正式,别太计较了,主要是为了给编译器提供类型和执行信息用的。


#4

你可以这么理解contract函数是个高阶函数 接收一个函数,函数名字为builder 参数为ContractBuilder 返回值为Unit的函数 可以写成public inline fun contract(builder:(ContractBuilder) ->; Unit) { } 类似这样,这样就好理解了一些了,把ContractBuilder 对象传递到lambda中这样就可以直接用ContractBuilder对象(隐士参数it)的方法了。原本写法ContractBuilder.() 这样只是一个扩展函数,这样写,在lambda中就可以直接使用this,或者可以去省去this直接调用ContractBuilder对象的方法了。一个语法糖,其实编译之后的字节码是一样的
如下图 String代表ContractBuilder,三种写法都可以,但是第一种写法,调用的时候更烦方便


京ICP备16022265号-2 Kotlin China 2017 - 2018