kotlin和 scala
这是斯卡拉与Kotlin重点series.Other职位包括第三职位:
- 斯卡拉vsKotlin:皮条客我的图书馆
- Scala vs Kotlin:运算符重载
- Scala vs Kotlin:内联和中缀 (本文)
- 斯卡拉vsKotlin:多重继承与钻石问题
本周,我想介绍两个功能:内联和infix-不是因为它们相关,而是因为它们都不足以填补帖子。
内联来自C(然后来自C ++)。 在这些语言中,可以通过inline
关键字向编译器提供提示。 这样,它可以用函数主体本身替换内联函数调用,以跳过函数调用的开销。
前缀表示法应与前缀和后缀保持一致,与2个操作数相比,它是相对于运算符的位置而言的。 希望下面的例子很清楚:
- 前缀 : + 2 2
- 后缀 :2 2 +
- 中缀 :2 + 2
斯卡拉
Scala通过函数的@inline
注释提供内联。 对于C / C ++,这是对编译器的提示。 根据ScalaDocs :
方法的注释,要求编译器特别努力内联被注释的方法。
编译器对是否将内联函数拥有最终决定权。 在相对的站点上,可以使用@noinline
注释函数,以防止完全内联:
关于方法的注释,无论内联看起来多么安全,它都禁止编译器内联该方法。
关于infix注释,有趣的是,它与上面的定义完全不同。 在这种情况下,这意味着在调用具有单个参数的函数时可以省略点和括号。 还有一些其他限制:
- 该函数必须没有副作用-是纯函数
- 否则参数必须是一个函数
valisLess1=1.<(2)
valisLess2=1<2
第1行和第2行是等效的。 显然,第2行更具可读性。 多亏了infix注释,Scala不需要运算符,因为每个函数不仅可以看起来而且可以像运算符一样被调用。
Kotlin
在Kotlin中,使用inline
关键字设置inline
。 但是,这不仅仅是编译器提示:这是一项要求。 无论何时使用inline
,编译器都会内联该函数,无论如何。
因此,仅在小函数上使用内联非常重要。 其他限制可能包括保持其在我们控制下的代码使用, 例如仅将其用于应用程序代码或不属于图书馆公共API的代码。
请注意,内联会影响函数本身以及作为lambda的参数。 要使lambda参数不内联,请使用noinline
关键字。
前缀表示法在Kotlin中不是自动的,因为它需要使用infix
关键字标记该功能。 另外,该函数需要附加到一个类上,因为它是成员或扩展。 当然,单个参数仍然适用。
// Defined in Kotlin's runtime
infixfunand(other:kotlin.Int):kotlin.Int{/* compiled code */}
valbool1=1.and(2)
valbool2=1and2
请注意,中缀表示法看起来仅类似于运算符,它仍然是其下的常规方法调用。
// This is valid
valbool3=1<2
// This is not valid, because < is an operator
valbool4=1.<(2)
kotlin和 scala