📜  Kotlin 中缀函数表示法

📅  最后修改于: 2022-05-13 01:55:06.123000             🧑  作者: Mango

Kotlin 中缀函数表示法

在本文中,我们将学习 Kotlin 函数中使用的中缀表示法。在 Kotlin 中,用中关键字标记的函数也可以使用中缀表示法调用,即不使用括号和点进行调用。
Kotlin 中有两种类型的中缀函数表示法——

  1. 标准库中缀函数表示法
  2. 用户定义的中缀函数符号

标准库中缀函数符号 –

当我们调用像 and、or、shr、shl 等运算符时,编译器会查找函数并调用所需的函数。有许多标准库中缀符号函数,但我们将在这里讨论其中的一些。
让我们一一讨论一些中缀符号。
1. 使用位和运算符的 Kotlin 程序 –

Kotlin
fun main(args: Array) {
    var a = 15
    var b = 12
    var c = 11
    // call using dot and parenthesis
    var result1 =(a > b).and(a > c)          
    println("Boolean result1 = $result1")
    // call using infix notation
    var result2 =(a > b) and (a > c)         
    println("Boolean result1 = $result2")
}


Kotlin
fun main(args: Array) {
    var a = 8
 
    // // call using infix notation
    var result1 = a shr 2
    println("Signed shift right by 2 bit: $result1")
    // call using dot and parenthesis
    var result2 = a.shr(1)
    println("Signed shift right by 1 bit: $result2")
}


Kotlin
fun main(args: Array) {
    var a = 8
    var b = 4
    
    println(++a)      // call using infix notation
    println(a.inc())  // call using dot and parenthesis
    println(--b)      // call using infix notation
    println(b.dec())  // call using dot and parenthesis
}


Kotlin
class math {
    // user defined infix member function
    infix fun square(n : Int): Int{
        val num = n * n
        return num
    }
}
fun main(args: Array) {
   val m = math()
    // call using infix notation
    val result = m square 3
    print("The square of a number is: "+result)
}


Kotlin
class check{
    // user defined infix member function
    infix fun dataType(x: Any):Any{
    var i = when(x){
            is String -> "String"
            is Int -> "Integer"
            is Double -> "Double"
            else -> "invalid"
        }
        return i
    }
}
fun main(args: Array){
    var chk = check()
    // call using infix notation
    var result = chk dataType 3.3
    println(result)
}


输出:

Boolean result1 = true
Boolean result1 = true

解释:
在这里,我们使用中缀( a 和 b )调用了a.and(b)函数。
两者都在标准输出中产生相同的结果。
2. Kotlin 程序使用带符号的右移(shr)运算符–

科特林

fun main(args: Array) {
    var a = 8
 
    // // call using infix notation
    var result1 = a shr 2
    println("Signed shift right by 2 bit: $result1")
    // call using dot and parenthesis
    var result2 = a.shr(1)
    println("Signed shift right by 1 bit: $result2")
}

输出:

Signed shift right by 2 bit: 2
Signed shift right by 1 bit: 4

解释:
在上面的程序中,我们使用了带符号的移位运算符。首先,使用中缀符号执行操作,然后使用点和括号执行操作。
如果我们用符号将值移位 2 位,则2 3 =8变为2 (3-2=1) =2
3. Kotlin 程序使用递增和递减运算符——

科特林

fun main(args: Array) {
    var a = 8
    var b = 4
    
    println(++a)      // call using infix notation
    println(a.inc())  // call using dot and parenthesis
    println(--b)      // call using infix notation
    println(b.dec())  // call using dot and parenthesis
}

输出:

9
10
3
2

解释:
在这里,我们使用了使用中缀符号的递增和递减运算符。
++a 代表 a(8) + 1 所以它打印 9
a.inc() 也代表 a(9) + 1 所以它打印 10
–b 代表 b(4) – 1 = 3
b.dec() 也代表 b(3)- 1 = 2

用户定义的中缀函数符号 –

如果函数满足以下要求,我们可以使用中缀表示法创建自己的函数:

  • 必须是成员函数或扩展函数
  • 它必须接受单个参数
  • 参数不能接受可变数量的参数并且不能有默认值
  • 必须用中关键字标记

使用中缀符号创建平方函数的 Kotlin 程序 -

科特林

class math {
    // user defined infix member function
    infix fun square(n : Int): Int{
        val num = n * n
        return num
    }
}
fun main(args: Array) {
   val m = math()
    // call using infix notation
    val result = m square 3
    print("The square of a number is: "+result)
}

输出:

The square of a number is: 9

解释:
在上面的程序中,我们创建了自己的中缀符号函数( m square 3 )。
1.首先,我们在数学类中定义了中缀中缀符号函数,因为它必须是成员函数。
2.中关键字用于标记函数。
3.它只包含一个参数,没有默认值,函数返回类型也是Integer。

square(n : Int):Int

然后,我们为类math()创建一个对象
并使用中缀表示法调用该函数-

m square 3

它计算数字的平方并返回值 9
Kotlin 程序用中缀符号检查变量的数据类型 -

科特林

class check{
    // user defined infix member function
    infix fun dataType(x: Any):Any{
    var i = when(x){
            is String -> "String"
            is Int -> "Integer"
            is Double -> "Double"
            else -> "invalid"
        }
        return i
    }
}
fun main(args: Array){
    var chk = check()
    // call using infix notation
    var result = chk dataType 3.3
    println(result)
}

输出:

Double

解释:
我们创建了一个中缀符号函数来查找变量的数据类型。
数据类型已作为中缀调用中的参数传递-

chk dataType 3.3

when 检查传递参数的数据类型并返回所需的值。
在这里,它将Double返回到标准输出。

中缀函数与运算符的优先级 -

执行指令时优先级很重要。中缀函数调用的优先级低于算术运算运算符、类型转换和 rangeTo运算符。
以下表达式是等价的:

2 shr 1 + 2 and 2 shr (1 + 2)
1 until n * 2 and 0 until (n * 2)
xs union ys as Set<*> and xs union (ys as Set<*>)

另一方面,中缀函数调用的优先级高于布尔运算符&& 和 ||、is- 和 in-checks 以及其他一些运算符。
以下表达式也是等价的:

a xor b || c and a xor (b || c)
a in b xor c and a in (b xor c)