我正在执行此匿名功能,我需要它来调用自身。有什么办法吗?我尝试了下面的代码,但没有用...
val example:Char = fun () : Char {
//Some code
if(condition) {
return this();
}
}
我应将'this()'替换为什么? 对Kotlin来说,我还很陌生,因此对回复很有帮助
答案 0 :(得分:1)
您无法在Kotlin中命名匿名函数(使用此语法或lambda),因此也不能使它们递归,因为您知道引用自身的方法。
如果需要递归,则必须创建一个常规函数,然后调用该函数:
fun helper() : Char {
if (condition) {
return helper();
}
...
}
val example = helper()
好消息是,您基本上可以在any scope中创建一个常规的命名函数。它们可以是类之外的顶级类,类成员,也可以是嵌套在其他函数中的局部函数。只要您可以写下val example = ...
,就可以创建一个函数。
答案 1 :(得分:1)
调用匿名函数听起来很复杂,因为没有名称可以用:)来调用它 当我目前正在自己学习Kotlin时,我尝试了一些方法并提出了这一建议,希望对您有所帮助:
import kotlin.test.Test
import kotlin.test.assertEquals
class StackOverflow51233329 {
@Test
fun test() {
var letter = 'A'
lateinit var example: () -> Char
example = {
letter++
if (letter >= 'C') letter else example()
}
assertEquals('C', example())
}
}
答案 2 :(得分:0)
如果要避免使用lateinit
,则可以使用Y combinator,它可以在无法直接进行递归的情况下启用递归。在全球范围内声明:
class RecursiveFunc<T, R>(val f: (RecursiveFunc<T, R>) -> (T) -> R)
fun <T, R> y(f: ((T) -> R) -> (T) -> R): (T) -> R {
val rec = RecursiveFunc<T, R> { r -> f { r.f(r)(it) } }
return rec.f(rec)
}
此代码取自Rosetta Code。您可以这样使用它:
val fac = y { f: ((Int) -> Int) ->
{ n: Int ->
if (n <= 1) 1 else n * f(n - 1)
}
}
println(fac(10))
f
是此处的递归函数,其签名为(Int) -> Int
。该函数的其余部分与往常几乎相同,只是形式为lambda。您甚至可以使用更常用的函数语法:
val fac = y { f: (Int) -> Int ->
fun(n: Int): Int {
return if (n <= 1) 1 else n * f(n - 1)
}
}