我正在尝试实现Filter类。我的第一个版本是关于这个问题的版本:Kotlin vararg of A to vararg of B
到那时,我还没有注意到使用谓词进行构造时的递归性,因此我正在寻找另一种实现方式。
我已将其更改为此类声明:class Filter<in T>(vararg val predicates: (T) -> Boolean)
我正在尝试让其他构造函数起作用:
constructor(vararg filters: Filter<T>) : this(/* do something */)
我不知道如何将过滤器的变量(包含谓词的变量)映射到在每个过滤器中具有所有谓词的谓词的变量,尤其是考虑到我无法调用过滤器类中的任何函数,因为当时尚未初始化。
还有,是否有更好的方法来实现我想要的目标(可以使用谓词数组或类本身的实例数组创建的类)?
答案 0 :(得分:1)
也许是这样的:
typealias Predicate<T> = (T) -> Boolean
class Filter<T> {
private val pred: MutableList<Predicate<T>> = mutableListOf()
constructor(vararg val predicates: Predicate<T>) {
predicates.forEach { pred.add(it) }
}
constructor(vararg filters: Filter<T>) {
filters.forEach { pred.addAll(it.pred) }
}
}
fun main(args: Array<String>) {
val f1 = Filter<String>({true}, {true})
val f2 = Filter<String>(f1, f1)
}