kotlin和 scala_Scala vs Kotlin:内联和中缀

kotlin和 scala

这是斯卡拉与Kotlin重点series.Other职位包括第三职位:

  1. 斯卡拉vsKotlin:皮条客我的图书馆
  2. Scala vs Kotlin:运算符重载
  3. Scala vs Kotlin:内联和中缀 (本文)
  4. 斯卡拉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)

翻译自: https://blog.frankel.ch/scala-vs-kotlin/3/

kotlin和 scala

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值