Kotlin 扩展函数、中缀表示法

扩展函数

参考链接 Kotlin 语言中文站

声明一个扩展函数,我们需要用一个 接收者类型 也就是被扩展的类型来作为他的前缀。

package foo.bar;

infix fun Int.ride(num: Int): Int{
    println("num= $num")
    return 2 * num
}

open class A{
    open fun testSwap(mutableList: MutableList<Int>){
        mutableList.swap(0, 2)
    }

    open fun MutableList<Int>.swap(index1: Int, index2: Int){
        var temp = this[index1]
        this[index1] = this[index2]
        this[index2] = temp
        println(this)
    }
}
package foo.bar;

object MyTest {
    @JvmStatic
    fun main(arg: Array<String>) {
        println("test_kotlin")      
        A().testSwap(mutableListOf(1, 2, 3))
    }
}

输出结果:

[3, 2, 1]

扩展函数接收者类型可以为 null

fun Any?.toString(): String {
    if (this == null) return "null"
    // 空检测之后,“this”会自动转换为非空类型,所以下面的 toString()
    // 解析为 Any 类的成员函数
    return toString()
}

扩展的作用域

大多数时候我们在顶层定义扩展,即直接在包里:

package foo.bar; //将扩展方法放到包内,作用域将是整个包

infix fun Int.ride(num: Int): Int{
    println("num= $num")
    return 2 * num
}

import foo.bar.* //使用时需要导包

object MyTest {
    @JvmStatic
    fun main(arg: Array<String>) {
        println(3.ride(2))
    }
}

打印结果:

6

中缀表示法

标有 infix 关键字的函数也可以使用中缀表示法(忽略该调用的点与圆括号)调用。中缀函数必须满足以下要求:

上面代码可简写为:println(3 ride 2)

package foo.bar; //将扩展方法放到包内,作用域将是整个包

infix fun Int.ride(num: Int): Int{
    println("num= $num")
    return 2 * num
}

import foo.bar.* //使用时需要导包

object MyTest {
    @JvmStatic
    fun main(arg: Array<String>) {
        println(3 ride 2)
    }
}

打印结果:

6

注意:

中缀函数调用的优先级低于算术操作符、类型转换以及 rangeTo 操作符。 以下表达式是等价的:

  • 3 ride 2 + 3 与 3 ride (2 + 3)

另一方面,中缀函数调用的优先级高于布尔操作符 && 与 ||is- 与 in- 检测以及其他一些操作符。这些表达式也是等价的:

  • a && 1 ride 2 与 a && (1 ride 2)
  • 1 ride 2 in a 与 (1 xor 2) in a

完整的优先级层次结构请参见其语法参考

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值