从mapOf赋值说起
mapOf初始化生成一个key-value的map非常简洁,突然觉得很好奇它是怎么实现的。先来看看一段mapOf赋值代码
val m = mapOf( "a" to 11 , "b" to 22 , "c" to 3)
进入mapOf源码调用了扩展函数,构造一个Pair
public infix fun A.to(that: B): Pair = Pair(this, that)
也就是说 receiver to argument 在kotlin中是一个特殊的函数to的调用语法。实际这也是kotlin DSL的基石。
实现自定义DSL方式函数调用
是否所有扩展函数或对象的函数都支持这样的调用方式呢?答案是不是。只有在函数标识为infix才可以使用这样的调用方式。 比如
public infix fun String.hello( name:String) = println( "$this say:hello $name!")"obaniu" hello "world"
infix的最终行为
如上面可知infix标识完全是编译器的语法糖,infix的函数生成的java函数标识是static的
public static final void hello(@NotNull String $receiver, @NotNull String name){ Intrinsics.checkParameterIsNotNull($receiver, "$receiver");Intrinsics.checkParameterIsNotNull(name, "name");String str = "" + $receiver + " say:hello " + name + '!';System.out.println(str);}
好吧,可以说kotlin这么玩就是想要DSL一样爽一样花哨的。