什么"。()"在Kotlin意味着什么?

时间:2017-06-08 05:35:08

标签: android function kotlin android-navigation-drawer

我看过一个函数有一个由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 {
    ...
}

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

有没有关于此的文件?

4 个答案:

答案 0 :(得分:6)

在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

答案 1 :(得分:4)

有一个误解,即T.()-> Y是(T.())-> Y,但实际上是T。(()-> Y)。 我们知道(X)-> Y是一个lambda,所以T.(X)-> Y是T的扩展。

如果没有参数,则格式为 T.()-> Y

有趣的是,我们可以通过两种方式来称呼它。

import kotlinx.coroutines.*


open class MyClass(var name: String){
    open fun something(){println("myclass something")}
}


fun main() = runBlocking{
    val me = MyClass("Boll")
    val someMethod: MyClass.(Int) -> String = { n ->
        List(n){"X"}.joinToString(separator="", postfix=":${this.name}")
    }
    val some = me.someMethod(10)
    //val some = someMethod(me, 10)
    println(some)

    val anotherMehtod: MyClass.() -> String = { 
        "Y:"+this.name
    }
    //val another = me.anotherMehtod()
    val another = anotherMehtod(me) 
    println(another)
}

答案 2 :(得分:2)

@Kris Roofe的答案清楚了。让我添加更多。

  

乐趣Activity.drawer 意味着我们在drawer类中建立了扩展功能名称Activity。那就是我们可以打电话的原因   直接来自Activity类或Activity的子级的抽屉方法   课。

有关扩展功能here的更多信息。

  

(设置:DrawerBuilderKt。()-> Unit = {})在此语句中,我们可以看到kotlin高阶函数的功能。高等入门   订单功能:-It is a function that takes functions as parameters, or returns a function.因此,设置参数是   返回Nothing或 Unit 的函数(与Java中的Void相同)。    DrawerBuilderKt。()意味着可以使用DrawerBuilderKt类的对象来调用该函数。 = {} 表示设置参数是   可选的。因此该函数不带参数,也不返回任何值。

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

  

私有val View.viewFinder:View。(Int)-> View?,它将功能存储在属性中。 Here关于相同的更多信息。其余内容与上述相同。

希望这会有所帮助。

答案 3 :(得分:1)

这是一个好问题。因此,当您有这种说法时: public class CharController : MonoBehaviour { [SerializeField] float moveSpeed = 4f; public float aimSpeed; Vector3 mousePos; Vector3 forward, right; public GameObject bulletSpawnPoint; public GameObject bullet; public float bullet_Speed; public float fireRate; void Start () { forward = Camera.main.transform.forward; forward.y = 0; forward = Vector3.Normalize(forward); right = Quaternion.Euler(new Vector3(0, 90, 0)) * forward; } void Update () { if (Input.GetMouseButton(0)) { transform.position += (-transform.position + mousePos).normalized * aimSpeed * Time.deltaTime; transform.position = new Vector3(transform.position.x, 2.5f, transform.position.z); Shoot(); } } void Shoot() { GameObject temp_Bullet_Handler; temp_Bullet_Handler = Instantiate(bullet, bulletSpawnPoint.transform.position, bulletSpawnPoint.transform.rotation) as GameObject; //temp_Bullet_Handler.transform.Rotate(Vector3.left * 90); Rigidbody temp_Rigidbody; temp_Rigidbody = temp_Bullet_Handler.GetComponent<Rigidbody>(); temp_Rigidbody.AddForce(Vector3.forward * Time.deltaTime * 10f); Destroy(temp_Bullet_Handler, 10.0f); } }

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

让我们说我们有一个带有名为myFun的函数的类,该类接受这样定义的lambda:

T.()

要调用此函数,我会这样做:

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

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

了解如何知道将MyObject()引用用作“ this”。这实际上是在调用this.doAnotherThing(),这是刚刚创建的Myobject()实例。

也可以这样做:

MyObject().myFun { doAnotherThing() }