美文网首页
关键字as/let/operator

关键字as/let/operator

作者: 主音King | 来源:发表于2020-08-11 09:27 被阅读0次

关键子as

避免命名冲突

import android.util.Log as MyLog
MyLog.d(TAG, "test: ")

let

let函数一般结构

object.let{
  it.todo // 在函数体内使用it替代object对象去访问其共有的属性和方法
  ...
}

// 判断object为null的操作
object?.let{ // object不为null条件下,才会执行let函数体
it.todo
}

let函数底层的inline扩展函数+lambda结构

@kotlin.internal.InlineOnly
public inline fun <T, R> T.let(block: (T) -> R): R {
    contract {
        callsInPlace(block, InvocationKind.EXACTLY_ONCE)
    }
    return block(this)
}

let函数inline结构分析:一个lambda函数快block参数的函数,T类型的let函数,对象为函数参数。函数快内可以通过it指代该对象。返回值为函数块的最后一行或指定return表达式。

        fun test() {
            val result = "testLet".let {
                Log.d(TAG, "test-length ${it.length}")
                1000
            }
            Log.d(TAG, "test-result $result")
        }

let使用场景:
let函数处理null对象统一做判空处理;明确一个变量所处特定作用范围内可以使用。

运算符重载 operator

对已有的运算符赋予他们新的含义。
+ 号对应的 plus

data class Person(var name: String, var age: Int)

operator fun Int.plus(b: Person): Int {
    return this + b.age
}
//  测试:实现Int和Person相加(其实是Int对象和person的age相加)
        fun test() {
            val person1 = Person("A", 3)
            val testInt = 5
            Log.d(TAG, "${testInt + person1}")
        }

原理:运算符重载是函数重载,是对运算符函数的调用,运算符-->对应函数的映射过程由编译器完成。
给我们提供一些自定义的操作运算符。
比如我们实现:两个person向加

data class Person(var name: String, var age: Int) {
    operator fun plus(other: Person): Person {
        return Person(this.name + "+" + other.name, this.age + other.age)
    }
}

// 测试
        fun test() {
            val person1 = Person("A", 3)
            val person2 = Person("B", 4)
            var person3 = person1 + person2
            Log.d(TAG, "person3:$person3")
        }

一元运算符:

表达式 函数名
+a unaryPlus
-a unaryMinus
!a not
++a,a++ inc
--a,a-- dec

二元运算符

表达式 函数名
a+b a.plus(b)
a-b a.minus(b)
a*b a.tiems(b)
a/b a.div(b)
a%b a.rem(b)或a.mod(b)
a..b a.rangTo(b)

比较运算符

表达式 函数名
a==b a?.equals(b)?:(b===null)
a!=b !(a?.equals(b)?:(b===null))
a>b a.compareTo(b)>0
a<b a.compareTo(b)<0
a>=b a.compareTo(b)>=0
a<=b a.compareTo(b)<=0

注意:
kotlin中&&、||、?:、===、!==是不能被重载的
但是还可以重载get、set等方法

相关文章

  • 关键字as/let/operator

    关键子as 避免命名冲突 let let函数一般结构 let函数底层的inline扩展函数+lambda结构 le...

  • Kotlin运算符重载:

    1. 使用operator关键字: operator fun plus(){} 相当于实现, a+b , "+"...

  • ES6新增特性(一)

    const(声明常量), let(声明变量)关键字; let关键字就是用来声明变量的使用let关键字声明的变量具有...

  • [Flutter]flutter基础之Dart语言基础(四)

    一、运算符重载 Dart 支持运算符重载,使用 operator 关键字,语法格式为:operator 运算符 ,...

  • 05JavaScript-ES6(1)

    let关键字就是用来声明变量的 使用let关键字声明的变量具有块级作用域 在一个大括号中 使用let关键字声明的变...

  • JavaScriptEs6学习

    一、let 关键字 let 关键字用来声明变量,使用 let 声明的变量有几个特点: 不允许重复声明,不允许声明多...

  • ES6学习笔记

    1.let关键字 let 关键字用来声明变量,使用 let 声明的变量有几个特点: 不允许重复声明; 块儿级作用域...

  • vue.js 关键字let

    (一)什么是let关键字1.let 是声明变量的关键字在相同的作用域内,let不能重复声明一个变量2.let声明的...

  • sorted 对 tuple 集合 使用关键字排序

    1. lamda关键字设置排序 2. operator 函数 加快排序

  • ES6学习笔记

    VSCode调试ES6:配置方法 一、let & const 关键字 1.1 let & var 对比 let 声...

网友评论

      本文标题:关键字as/let/operator

      本文链接:https://www.haomeiwen.com/subject/fubsrktx.html