什么“。()”在Kotlin中意味着什么?

问题描述 投票:7回答:3

我见过一个函数有一个由ClassName给出的参数的例子。()这似乎不是一个扩展函数,它是ClassName.Function()

一个例子是Kotterknife

private val View.viewFinder: View.(Int) -> View?
    get() = { findViewById(it) }

其中我不太了解其功能,

MaterialDrawerKt

fun Activity.drawer(setup: DrawerBuilderKt.() -> Unit = {}): Drawer {
    val builder = DrawerBuilderKt(this)
    builder.setup()
    return builder.build()
}

代码允许您直接调用的地方

drawer {
    ...
}

而不是给括号括起来的参数。

在任何地方都有这方面的文件吗?

android function kotlin android-navigation-drawer
3个回答
7
投票

在Kotlin中没有任何东西并且什么都不返回的函数看起来像:

var function : () -> Unit

虽然不同之处在于代码中的函数不返回任何内容,但只会在对象上调用它。

例如,

class Builder (val multiplier: Int) {

    fun invokeStuff(action: (Builder.() -> Unit)) {
        this.action()
    }

    fun multiply(value: Int) : Int {
        return value * multiplier
    }
}

这里重要的是我们宣布“行动”类型的方式

action: (Builder.() -> Unit)

这是一个什么都不返回的函数,除了在“Builder”类型的对象上调用之外什么也没有。

Refer more here


2
投票

@Kris Roofe的回答让事情变得清晰。让我添加更多内容。

fun.drawer意味着我们在drawer类中创建了一个扩展函数名Activity。这就是我们可以直接从Activity类或Activity类的子类调用抽屉方法的原因。

更多关于扩展函数here

(设置:DrawerBuilderKt。() - > Unit = {})在这个语句中,我们可以看到kotlin高阶函数的强大功能。高阶函数的小介绍: - It is a function that takes functions as parameters, or returns a function.所以这里setup param是一个返回Nothing或Unit的函数(与java中的Void相同)。 DrawerBuilderKt。()表示可以使用DrawerBuilderKt类的对象调用该函数。 = {}表示setup参数是可选的。因此该函数不带参数,也不返回任何内容。

更多关于高阶函数herehere。有关可选参数here的更多信息。

私有val View.viewFinder:查看。(Int) - >查看?它将一个函数存储在一个属性中。 Here更多相关信息。其余的事情与上面解释的相同。

希望这会有所帮助。


1
投票

这是一个很好的问题。所以,当你有这样的声明:T.()

这意味着在lamda中你将传入,“this”(这是当前的对象)将是T类型。让我们看看它的理解是多么容易:

假设我们有一个带有一个名为myFun的函数的类,它接受一个如下定义的lambda:

 class MyObject {
        fun myFun(doSomething: MyObject.()->Unit) {
            doSomething()
        }

        fun doAnotherThing() {
            Timber.d("myapp", "doing another thing")
        }
    }

调用此函数我会这样做:

MyObject().myFun { doAnotherThing() }

看看它如何知道使用MyObject()引用作为“this”。这实际上是调用this.doAnotherThing(),这是刚刚创建的Myobject()实例。

也可以这样做:

MyObject().apply{myFun { doAnotherThing() }}  
© www.soinside.com 2019 - 2024. All rights reserved.