【问题标题】:Is it possible to delegate methods implementations是否可以委托方法实现
【发布时间】:2020-01-17 12:44:27
【问题描述】:

给定一个创建 lambdas 的函数。是否可以将声明函数的实现委托给返回的 lambda(类似于 by-delegated 属性)。如果函数存在by,它可能看起来像这样:

fun printFunCreator(message: String): () -> Unit  = { println(message) }
fun printHelloWorld() by printFunCreator("Hello world")

我不想要的东西:

我确实想创建一个额外的 lambda 属性来委托调用,如下所示:

fun printFunCreator(message: String): () -> Unit  = { println(message) }
val printFun = printFunCreator("Hello world")
fun printHelloWorld() = printFun.invoke()

我确实想像这样为每个执行创建一个新的 lambda 实例:

fun printFunCreator(message: String): () -> Unit  = { println(message) }
fun printHelloWorld() = printFunCreator("Hello world").invoke()

【问题讨论】:

标签: function kotlin lambda reflection delegates


【解决方案1】:

你想要的描述听起来很简单:

fun printFunCreator(message: String) { println(message) }
fun printHelloWorld() = printFunCreator("Hello world")

除非出于某种原因printFunCreator() 必须返回一个 lambda...?

【讨论】:

  • 属性不是我的解决方案。我也需要输入参数:fun countFunCreator(start: Int): () -> Unit { var count = start; return { println("count ${count++}") } }
  • @user1185087 我错过了那个细节。更新了答案。也许我需要更多地说明你想要什么和限制。
【解决方案2】:
fun printFunCreator(message: String): () -> Unit  = { println(message) }
val printHelloWorld = printFunCreator("Hello World")

然后你可以在你的代码中使用类似于函数调用的语法:

printHelloWorld()

您既不会将函数调用委托给属性(因为这种方式没有函数,只有可以像函数一样调用的属性),也不会为每次执行创建 lambda。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-04-02
    • 2019-08-17
    • 1970-01-01
    • 2021-12-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-28
    相关资源
    最近更新 更多