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()

  • 相关阅读:
    5.对象的简化属性
    7.函数参数默认值
    python中argparse
    VC 6.0 打开文件出错
    【UNIX程序设计教程】 阅读初体验(1)
    引以为鉴ARM开发板连线注意事项
    windows xp宿主机 + Linux 虚拟机 网络配置
    Gcc编译选项分析
    ADS下调试出现的警告信息
    S3C2440串口通讯实现
  • 原文地址:https://www.cnblogs.com/figozhg/p/6618636.html
Copyright © 2011-2022 走看看