我看过一个函数有一个由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 {
...
}
而不是给括号括起来的参数。
有没有关于此的文件?
答案 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
类的对象来调用该函数。 = {} 表示设置参数是 可选的。因此该函数不带参数,也不返回任何值。
有关高阶函数here和here的更多信息。有关可选参数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() }