kotlin 三元运算符
考虑两种类型X
和Y
,以及定义为的函数f
:
classX
classY
valf={_:X->Y()} (1)
- 使用Kotlin 1.3,可以命名未使用的参数
_
,以明确告诉它被忽略
以下代码段声明了一个类似于f
的函数。 然后,使用invoke()
函数使用类型为X
的参数执行该命令:
funf(x:X)=Y()
valy:Y=f.invoke(X())
Java等效项为Function.apply()
:
interfaceFunction<T,R>{
Rapply(Tt);
}
在Kotlin中,也可以使用等效语法来调用该函数:
valy:Y=f(X())
这种替代语法是可能的,因为invoke()
是operator 。 运算符是提供特定替代语法的功能有限的一组。
诸如C和Scala之类的语言允许对函数进行命名, 例如 +
!
, ::=
甚至是🤔。 使用此类语言的经验表明,这种自由的另一面是符号函数的繁荣,通常会导致(非常)难以阅读的代码。 相反,Java完全禁止在方法名称中使用特殊字符,以避免出现此问题。 尽管有时是开玩笑的目标,但长方法名使陌生的读者了解该方法的用途。 其他语言选择了一条中间路径,例如Groovy:
Groovy允许您重载各种运算符,以便它们可以与您自己的类一起使用。
所有(非比较器)Groovy运算符都有一个对应的方法,可以在自己的类中实现。
http://groovy-lang.org/operators.html#Operator-Overloading
Kotlin遵循相同的方法:提供有限语法的操作符函数数量有限。 invoke()
就是其中之一。 这是此类可用替代品的列表:
表达 | 翻译成 |
---|---|
| |
| |
| |
| |
这允许编写有趣的结构:
data classPoint(varx:Int,vary:Int)
classTranslate(valx:Int,valy:Int){
operatorfuninvoke(point:Point)=Point(point.x+x,point.y+y) (1)
}
valpoint=Point(1,1)
valtranslate=Translate(5,10) (2)
valtranslated=translate(point) (3)
- 声明一个新的运算符函数
invoke()
- 创建
Translate
的新实例 - 这等效于
translate.invoke(point)
,尽管它看起来像一个顶级函数调用
操作员可以大大提高其代码的可读性。 或者,这绝对可以是炫耀的一种练习,但效果恰恰相反。 强大的力量带来巨大的责任!
kotlin 三元运算符