🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
### [二元操作符](http://www.kotlincn.net/docs/reference/operator-overloading.html#二元操作) [TOC] #### 算术运算符 | 表达式 | 翻译为 | | --- | --- | | `a + b` | `a.plus(b)` | | `a - b` | `a.minus(b)` | | `a * b` | `a.times(b)` | | `a / b` | `a.div(b)` | | `a % b` | `a.rem(b)`、`a.mod(b)`(已弃用) | | `a..b` | `a.rangeTo(b)` | 对于此表中的操作,编译器只是解析成*翻译为*列中的表达式。 >[info]【注意】,自 Kotlin 1.1 起支持`rem`运算符。Kotlin 1.0 使用`mod`运算符,它在 Kotlin 1.1 中被弃用。 PS:关于字符串的 + 运算符重载,以及数值类型的 + 运算符重载,可以查看源码,也可以查看本系列的数值类型章节和字符串章节 #### 示例 下面是一个从给定值起始的 Counter 类的示例,它可以使用重载的`+`运算符来增加计数: ``` data class Counter(val dayIndex: Int) { operator fun plus(increment: Int): Counter { return Counter(dayIndex + increment) } } ``` #### [“In”操作符](http://www.kotlincn.net/docs/reference/operator-overloading.html#in) | 表达式 | 翻译为 | | --- | --- | | `a in b` | `b.contains(a)` | | `a !in b` | `!b.contains(a)` | 对于`in`和`!in`,过程是相同的,但是参数的顺序是相反的。 #### [索引访问操作符](http://www.kotlincn.net/docs/reference/operator-overloading.html#indexed) | 表达式 | 翻译为 | | --- | --- | | `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)` | 方括号转换为调用带有适当数量参数的`get`和`set`。 #### [调用操作符](http://www.kotlincn.net/docs/reference/operator-overloading.html#invoke) | 表达式 | 翻译为 | | --- | --- | | `a()` | `a.invoke()` | | `a(i)` | `a.invoke(i)` | | `a(i, j)` | `a.invoke(i, j)` | | `a(i_1, ……, i_n)` | `a.invoke(i_1, ……, i_n)` | 圆括号转换为调用带有适当数量参数的`invoke`。 #### [广义赋值](http://www.kotlincn.net/docs/reference/operator-overloading.html#assignments) | 表达式 | 翻译为 | | --- | --- | | `a += b` | `a.plusAssign(b)` | | `a -= b` | `a.minusAssign(b)` | | `a *= b` | `a.timesAssign(b)` | | `a /= b` | `a.divAssign(b)` | | `a %= b` | `a.remAssign(b)`,`a.modAssign(b)`(已弃用) | 对于赋值操作,例如`a += b`,编译器执行以下步骤: * 如果右列的函数可用 * 如果相应的二元函数(即`plusAssign()`对应于`plus()`)也可用,那么报告错误(模糊), * 确保其返回类型是`Unit`,否则报告错误, * 生成`a.plusAssign(b)`的代码; * 否则试着生成`a = a + b`的代码(这里包含类型检查:`a + b`的类型必须是`a`的子类型)。 >[info]【注意】:赋值在 Kotlin 中*不是*表达式。 #### [相等与不等操作符](http://www.kotlincn.net/docs/reference/operator-overloading.html#equals) Kotlin 中有两种类型的相等性: * 引用相等`===``!==`(两个引用指向同一对象) * 结构相等`==``!=`( 使用`equals()`判断) | 表达式 | 翻译为 | | --- | --- | | `a == b` | `a?.equals(b) ?: (b === null)` | | `a != b` | `!(a?.equals(b) ?: (b === null))` | 这些操作符只使用函数[`equals(other: Any?): Boolean`](https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/-any/equals.html),可以覆盖它来提供自定义的相等性检测实现。不会调用任何其他同名函数(如`equals(other: Foo)`)。 >[info]【注意】:`===`和`!==`(同一性检查)不可重载,因此不存在对他们的约定。 这个`==`操作符有些特殊:它被翻译成一个复杂的表达式,用于筛选`null`值。null == null总是 true,对于非空的`x`,`x == null`总是 false 而不会调用`x.equals()`。 意思是:如果 a 不是 null 则调用`equals(Any?)`函数并返回其值;否则(即`a === null`)就计算`b === null`的值并返回。 当与 null 显式比较时,`a == null`会被自动转换为`a=== null` #### [比较操作符](http://www.kotlincn.net/docs/reference/operator-overloading.html#comparison) | 表达式 | 翻译为 | | --- | --- | | `a > b` | `a.compareTo(b) > 0` | | `a < b` | `a.compareTo(b) < 0` | | `a >= b` | `a.compareTo(b) >= 0` | | `a <= b` | `a.compareTo(b) <= 0` | 所有的比较都转换为对`compareTo`的调用,这个函数需要返回`Int`值 #### [属性委托操作符](http://www.kotlincn.net/docs/reference/operator-overloading.html#属性委托操作符) `provideDelegate`、`getValue`以及`setValue`操作符函数已在[委托属性](http://www.kotlincn.net/docs/reference/delegated-properties.html)中描述。