我目前正在学习Kotlin-运算符重载
我正在尝试通过一个示例来理解如何为函数的invoke()
函数进行运算符重载。
预测试
-
fun exampleOfExtensionFunction() { fun Int.randomize(): Int { return Random(this.toLong()).nextInt() } val randomizedFive = 5.randomize() println("$randomizedFive") }
Prints :
-1157408321
In Kotlin, functions can be declared as variables with types
fun exampleOfFunctionType() { val printNumber: (number: Int) -> Unit printNumber = { number -> println("[$number = ${number.toString(16).toUpperCase()} = ${number.toString(2)}]") } printNumber(1023) }
Prints :
[1023 = 3FF = 1111111111]
Kotlin allows operator overloading with both extension and member functions
fun exampleOfOperatorOverloadingUsingExtensionFunction() { class MyType() { val strings: ArrayList<String> = ArrayList<String>() override fun toString(): String { val joiner: StringJoiner = StringJoiner(" , ", "{ ", " }") for (string in strings) { joiner.add("\"$string\"") } return joiner.toString() } } operator fun MyType.contains(stringToCheck: String): Boolean { for (stringElement in strings) { if (stringElement == stringToCheck) return true } return false } val myType = MyType() myType.strings.add("one") myType.strings.add("two") myType.strings.add("three") println("$myType") println("(myType.contains(\"four\")) = ${myType.contains("four")} , (\"three\" in myType) = ${"three" in myType}") }
Prints :
{ "one" , "two" , "three" }
(myType.contains("four")) = false , ("three" in myType) = true
测试尝试
根据上述内容,我尝试使用类型(Boolean, Boolean, Boolean) -> Boolean
作为扩展函数invoke(flag1: Boolean, flag2: Boolean, flag3: Boolean)
的接收器类型,创建一个函数的invoke()
运算符重载的示例。然而,这并没有按预期工作。
fun attemptFunctionInvokeOperatorOverloading() {
operator fun ((Boolean, Boolean, Boolean) -> Boolean).invoke(flag1: Boolean, flag2: Boolean, flag3: Boolean): Boolean {
println("Overloaded invoke operator")
return flag1 && flag2 && flag3
}
var func1: ((Boolean, Boolean, Boolean) -> Boolean) = { flag1, flag2, flag3 ->
println("func1 body")
flag1 && flag2 && flag3
}
fun func2(flag1: Boolean, flag2: Boolean, flag3: Boolean): Boolean {
println("func2 body")
return flag1 && flag2 && flag3
}
func1(true, true, false)
func2(true, true, true)
}
打印:
函数1体
函数2体
预期结果:
重载调用运算符
重载调用运算符
另一个问题:
这到底是什么?(如果不是运算符重载)
operator fun ((Boolean, Boolean, Boolean) -> Boolean).invoke(flag1: Boolean, flag2: Boolean, flag3: Boolean): Boolean {
println("Overloaded invoke operator")
return flag1 && flag2 && flag3
}