Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/kotlin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Kotlin 带参数的传递函数_Kotlin_Functional Programming - Fatal编程技术网

Kotlin 带参数的传递函数

Kotlin 带参数的传递函数,kotlin,functional-programming,Kotlin,Functional Programming,我有一个方法: fun method(number: Int, name: String){ //TODO } 我想用参数将这个方法传递给类 class Test( val method: KFunction2<@ParamererName(name = "number") Int, @ParameterName(name="name") String, Unit>) fun function(number: Int, name: Stri

我有一个方法:

fun method(number: Int, name: String){
//TODO
}
我想用参数将这个方法传递给类

class Test(
val method: KFunction2<@ParamererName(name = "number") Int,
@ParameterName(name="name") String, Unit>)
fun function(number: Int, name: String) {
    // function body
}

class Test(
    val action: (Int, String) -> Unit,
    val firstParam: Int,
    val secondParam: String
) {
    
    fun call() {
        action(firstParam, secondParam)
    }
}

// Usage
val test = Test(::function, 2, "John")

test.call() // invokes function(2, "John")
但我想和你这样的女人一起过关

测试(::方法(2,“John”)
-但它不起作用


可以用params传递方法引用吗?如何做到这一点?

我可以想出三种方法来实现它

如果您参加了打印最终字符串的
打印机
课程

类打印机(val lazyValue:()->字符串){
趣味印刷品(){
println(this.lazyValue())
}
}
您可以将惰性硬编码到函数中(meh…)

fun lazyNumberName(数字:Int,名称:String):()->String={->
“$number$name”
}
val打印机=打印机(lazyNumberName(2,“john”))
printer.print()
您可以将函数调用包装在调用站点上的lambda中(我更喜欢这个)

fun numberName(编号:Int,名称:String):String=
“$number$name”
val printer=打印机({->numberName(2,“john”)})
printer.print()
或者,您可以定义一个使任何函数都变为惰性的
lazy
函数。我对科特林不太了解,打不出来。以下是Typescript中的外观:

const lazy = <Args extends any[], R>(
   f: (...args: Args) => R) =>
       (...args:Args) => ():R =>
           f(...args);

const add = (a:number, b:number) => a + b;

const lazyAdd = lazy(add);

const lazyAdd_1_2 = lazyAdd(1, 2);

const three = lazyAdd_1_2();// 3
const lazy=(
f:(…args:args)=>R)=>
(…args:args)=>():R=>
f(…args);
常量add=(a:number,b:number)=>a+b;
const lazyAdd=懒惰(add);
常数lazyAdd_1_2=lazyAdd(1,2);
常数三=懒散添加(1)和(2);//3.

以您最初的示例函数为例,类
Test
可以如下所示进行实例化,使用一个函数
call()
调用在构造函数中传递的带有两个参数的函数

class Test(
val method: KFunction2<@ParamererName(name = "number") Int,
@ParameterName(name="name") String, Unit>)
fun function(number: Int, name: String) {
    // function body
}

class Test(
    val action: (Int, String) -> Unit,
    val firstParam: Int,
    val secondParam: String
) {
    
    fun call() {
        action(firstParam, secondParam)
    }
}

// Usage
val test = Test(::function, 2, "John")

test.call() // invokes function(2, "John")

不可能。你为什么要这么做?传递函数引用及其参数是没有意义的。只需使用这些参数调用函数,为什么要传递它?传递函数引用的全部目的是能够传递任何参数给它。我只是想知道是否可能,就像listener/Callback已经告诉过你的那样,除非你将它们定义为测试的参数,否则这是不可能的。同样,为什么要将参数传递给侦听器/回调引用?如果您已经知道这些参数,只需直接使用这些参数调用函数即可。你想干什么?解释您的上下文。好的,然后您可以使用
测试(::方法,2,“John”)
。不可能,这是唯一的方法。但是,如果需要,您可以编写自己的类并实现此功能。