infix关键字标识

原创
2018/05/23 16:43
阅读数 622

从mapOf赋值说起

mapOf初始化生成一个key-value的map非常简洁,突然觉得很好奇它是怎么实现的。先来看看一段mapOf赋值代码

val m = mapOf(
	"a" to 11
	, "b" to 22
	, "c" to 3
)

进入mapOf源码调用了扩展函数,构造一个Pair

public infix fun <A, B> A.to(that: B): Pair<A, B> = 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一样爽一样花哨的。

展开阅读全文
加载中
点击引领话题📣 发布并加入讨论🔥
打赏
0 评论
0 收藏
0
分享
返回顶部
顶部