我见过一个函数有一个由ClassName给出的参数的例子。()这似乎不是一个扩展函数,它是ClassName.Function()
一个例子是Kotterknife:
private val View.viewFinder: View.(Int) -> View?
get() = { findViewById(it) }
其中我不太了解其功能,
fun Activity.drawer(setup: DrawerBuilderKt.() -> Unit = {}): Drawer {
val builder = DrawerBuilderKt(this)
builder.setup()
return builder.build()
}
代码允许您直接调用的地方
drawer {
...
}
而不是给括号括起来的参数。
在任何地方都有这方面的文件吗?
在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”类型的对象上调用之外什么也没有。
@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参数是可选的。因此该函数不带参数,也不返回任何内容。
更多关于高阶函数here和here。有关可选参数here的更多信息。
私有val View.viewFinder:查看。(Int) - >查看?它将一个函数存储在一个属性中。 Here更多相关信息。其余的事情与上面解释的相同。
希望这会有所帮助。
这是一个很好的问题。所以,当你有这样的声明: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() }}