zoukankan      html  css  js  c++  java
  • Kotlin操作符重载:把标准操作加入到任何类中(KAD 17)

    作者:Antonio Leiva

    时间:Mar 21, 2017

    原文链接:https://antonioleiva.com/operator-overload-kotlin/

    就像其他每种语言一样,在Kotlin中,已经预定义了一些操作符执行一定的操作。

    最典型的是加(+),减(-),乘(*),除(/),而且还有很多。

    类似Java这样的一些语言,这些操作符被限制在一些特定的数量类型上,且没有方法让其他类型数据使用这些操作符。

    还有在像Scala这样的其他语言中,由于函数名称可接受任何符号,我们就可创造能用于任何数据类型操作符。

    Kotlin的这种方案:有一些预定义的操作符,而我们能够为任意数据类型重载它们

    Kotlin的操作符重载

    如我们讨论的,Kotlin能够重载一些操作符,在我们的类中实现其相应的函数。这些函数前必须加上保留字operator

    这些基本操作符如下:

    一元操作符

    +a

    a.unaryPlus()

    -a

    a.unaryMinus()

    !a

    a.not()

    a++

    a.inc()

    a–

    a.dec()

    二元操作符

    a + b

    a.plus(b)

    a – b

    a.minus(b)

    a * b

    a.times(b)

    a / b

    a.div(b)

    a % b

    a.mod(b)

    a..b

    a.rangeTo(b)

    a in b

    b.contains(a)

    a !in b

    !b.contains(a)

    a += b

    a.plusAssign(b)

    a -= b

    a.minusAssign(b)

    a *= b

    a.timesAssign(b)

    a /= b

    a.divAssign(b)

    a %= b

    a.modAssign(b)

    数组类型操作符

    a[i]

    a.get(i)

    a[i, j]

    a.get(i, j)

    a[i_1, …, i_n]

    a.get(i_1, …, i_n)

    a[i] = b

    a.set(i, b)

    a[i, j] = b

    a.set(i, j, b)

    a[i_1, …, i_n] = b

    a.set(i_1, …, i_n, b)

    等式(equals)操作符

    a == b

    a?.equals(b) ?: b === null

    a != b

    !(a?.equals(b) ?: b === null)

    由于equals操作使用更复杂地转换做正确性检查,并且期望函数准确说明而不仅仅是为它的一个特殊名称,而稍有一点不同略有不同。

    1 fun equals(other: Any?): Boolean

    激活(invoking)函数

    a(i)

    a.invoke(i)

    a(i, j)

    a.invoke(i, j)

    a(i_1, …, i_n)

    a.invoke(i_1, …, i_n)

    例子

    假设你有公司数据模型,每位雇员的列表。

    你可以使用get操作符访问方括号中位置。这种实现非常容易:

    1 class Employee(val id: Long, val name: String)
    2  
    3 class Company(private val employees: List) {
    4     operator fun get(pos: Int) = employees[pos]
    5 }

    这样你就可以使用它:

    1 val company = Company(listOf(Employee(1235, "John"), Employee(2584, "Mike")))
    2 val mike = company[1]

    而你也是能够超于它,并用ID来恢复值,实现这样的功能:

    1 operator fun get(id: Long) = employees.first { it.id == id }
    2  
    3 val mike = company[2584]

    结论

    操作符能够帮助我们为使用通用符号表达已知操作提升可读性。

    小心不要在会导致读者混淆的情况下使用它们,它们能够成为一个非常有趣的工具

    如果您还不知道怎样做,我建议你获取免费指南,学习怎样创建您的第一个项目,或是直接获取这本,学习怎样从零开始创建一个完整的应用程序。

    a.unaryMinus()

  • 相关阅读:
    算法----(1)冒泡排序
    淘宝爬虫
    爬虫_豆瓣电影top250 (正则表达式)
    爬虫_猫眼电影top100(正则表达式)
    Android 简单调用摄像头
    Android 简单天气预报
    思维模型
    This view is not constrained, it only has designtime positions, so it will jump to (0,0) unless you
    Android studio preview界面无法预览,报错render problem
    Android studio 3.1.2报错,no target device found
  • 原文地址:https://www.cnblogs.com/figozhg/p/6618636.html
Copyright © 2011-2022 走看看