【问题标题】:How can i use function reference inside enum?我如何在枚举中使用函数引用?
【发布时间】:2020-05-12 05:15:45
【问题描述】:

我有下一个枚举声明:

enum class Foo(val f: (String) -> String)

还有下一个正文:

BAR({obj -> obj.toString()}),
FOO({obj -> obj.toString()})
...

我可以以某种方式定义函数以供参考吗?像这样的:

private val predicate: (String) -> String = {obj -> obj.toString()}

以及下一个用法:

 FOO(::predicate)

此代码根本无法编译 (Unresolved reference: predicate)。

更新:

我刚刚创建了伴生对象:

 companion object Predicate {
    private fun predicate(): (String) -> String {
                return {obj -> obj.toString()}
            }
}

然后我的 IDE 建议我使用另一种类型 KFunction0<(String) -> String>。但是我可以在这里使用函数作为参数吗?

【问题讨论】:

标签: kotlin functional-programming jvm


【解决方案1】:

默认情况下,您的变量是一个 lambda(就像函数的引用),您不需要传递它的引用。

private val predicate: (String) -> String = {obj -> obj.toString()}

enum class Foo(val f: (String) -> String) {
    FOO(predicate),
    BAR(predicate)
}

工作得很好。如果您在类/对象中定义了函数,则必须传递它们各自的引用。

PS:函数的引用会生成 lambda 签名,而 lambda 已经有 lambda 签名

【讨论】:

  • 但是如果我在枚举中需要这个函数呢?有可能吗?
  • @SlandShow 伴随对象是在枚举初始化后设置的,目的是您可以在其中使用枚举。像这样:stackoverflow.com/a/53524017/11377112
  • 如果我将使用带有函数的伴生对象,那么我需要将 lambda 的类型更改为KFunction0<(String) -> String>
  • @SlandShow 为什么它甚至不会注册。 A KFunction0 是一个不带参数的 lambda,并在您的情况下返回一个值:() -> (String) -> String
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多