美文网首页我爱编程
kotlin中缀调用和析构声明

kotlin中缀调用和析构声明

作者: 哈哈_defb | 来源:发表于2018-06-08 10:56 被阅读0次

中缀调用

实现中缀调用必须满足下面三个条件:

该函数必须为成员函数或者扩展函数
必须只有一个参数
使用infix关键字修饰

fun main(args: Array<String>) {
    val map = mapOf(1 to "one", 2 to "two")
    map.map(::println)
}
//result:
1=one
2=two

这val map = mapOf(1 to "one", 2 to "two")里的to就是一个infix function。其源码实现:

public infix fun <A, B> A.to(that: B): Pair<A, B> = Pair(this, that) 

调用方式有两种:
  1.to("one"):常规调用方式
  1 to "one:中缀表示法调用
自己定义中缀调用

infix fun Int.add(x: Int): Int {
    return this + x
}

fun main(args: Array<String>) {
    // 中缀操作符可以这样调用
    println(1 add 2)
    // 等价于
    println(1.add(2))
}

析构声明

在Kotlin语言中,可以通过析构声明单独提取某个对象中的某些字段。看一个例子:

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

fun main(args: Array<String>) {
    val person = Person(1, 28, "Scott Smith")
    val (id, age, name) = person
    println(name)
}

析构声明从一定程度上减少了一些样板代码的编写,更令人惊喜的是,它还可以用在循环和map,甚至lambda表达式中:

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

fun func(init: (id: Int, name: String) -> Unit) {
    init(1, "Scott Smith")
}

fun main(args: Array<String>) {
    val person = Person(1, 28, "Scott Smith")
    val list = arrayListOf<Person>(person)
    for ((id, _, name) in list) {
        println("$id : $name")
    }


    val map = mapOf("k1" to "v1", "k2" to "v2")
    for ((key, value) in map) {
        println("$key : $value")
    }

    func { a, b ->
        println("$a : $b")
    }
}

注意:如果要对非数据类进行析构处理,你需要手动实现componentN系列函数。这里,我们依然以Person类为例。如果Person是一个非数据类,为了正确析构,你必须这样做:

class Person(var id: Int, var age: Int, var name: String) {
    operator fun component1(): Int {
        return id
    }

    operator fun component2(): Int {
        return age
    }

    operator fun component3(): String {
        return name
    }
}

相关文章

  • kotlin中缀调用和析构声明

    中缀调用 实现中缀调用必须满足下面三个条件: 该函数必须为成员函数或者扩展函数必须只有一个参数使用infix关键字...

  • C++中,构造函数不能设为虚函数,基类析构函数应该设为虚函数

    构造函数不能声明为虚函数,析构函数可以声明为虚函数,而且有时是必须声明为虚函数。不建议在构造函数和析构函数里面调用...

  • swift3语法(十二)

    析构过程 析构器析构器只适用于类类型,当一个类的实例被释放之前,析构器会被立即调用。析构器用关键字deinit来标...

  • Day1:C++虚机制的实现

    1. 虚析构函数 话不多说,贴代码: 可以看到执行的结果是先调用了 的析构函数,再调用了 的析构函数; 如果将vi...

  • C++之析构函数

    析构函数的概述 析构函数 完成对象的清理工作,先清理,再释放对象空间。析构函数也是编译器自动调用。 析构函数 不能...

  • 虚函数

    如果父类的析构函数没有声明为虚函数的话在父类的指针上调用析构函数会有什么后果? 屏蔽多态,子类申请的资源将不会被释...

  • 父类析构函数和普通函数声明为纯虚或虚函数时调用子类方法

    [TOC] 父类析构函数和普通函数声明为纯虚或虚函数时调用子类方法 例子如代码所示 B 是 A 子类 A *a =...

  • c++基础(析构函数)

    也可以直接调用析构函数

  • Swift - 析构过程

    析构过程 析构器只适用于类类型,当一个类的实例被释放之前,析构器会被立即调用。析构器用关键字 deinit 来标示...

  • 《Effective C++》学习笔记(3)

    2 构造/析构/赋值运算(续) 条款09:绝不在构造和析构过程中调用 virtual 函数 如果执行BuyTran...

网友评论

    本文标题:kotlin中缀调用和析构声明

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