美文网首页
关键字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

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