我的任务是编写一个可以像这样使用的自定义repeat
控件结构:
var i = 0
repeat {
i = i + 1
}(i > 5)
我目前有以下代码:
def repeat(f: => Unit): ((=> Boolean) => Unit) = {
(x) => {
while (x) f
}
}
运行时,似乎永远不会执行f(i = i + 1
)。
我必须诚实,我不完全确定当前x
的类型。这显然不正确,但我没有足够的知识知道从这里去哪里。
我以前有这个:
def repeat(f: => Unit): ((=> Boolean) => Void) = {
(x: (=> Boolean)) => {
while (x) f
}
}
虽然Scala显然不正确,但我认为它更好地证明了我的意图。
我很抱歉,如果我的问题有点宽泛/表现出轻松,但是名字参数的概念对我来说是非常新的,并且在我的书(Scala编程)中没有解释基础知识。
答案 0 :(得分:2)
您还应该知道Scala支持多个参数列表。所以你可以
def compare(a: Int, b: Int)(p: (Int,Int) => Boolean) = p(a,b)
然后写
compare(5,2)(_ > _)
这种策略将简化您的逻辑。
另外,你的向后比较。 i
从0
开始,您的循环条件为i > 5
,而不是=> X
。
一些额外的注释:((=> Boolean) => Unit)
表示“每次需要时计算一个X”,因此Boolean
需要根据需要计算i > 5
的内容((=> Boolean) => Unit
如果每次都进行检查,那就可以做到这一点。 Boolean
表示一个函数,它将产生Unit
s的输入作为输入,并且不提供输出。 (严格来说,()
类型是一个输出,即void
,这是为了保持一致性。但它与{{1}}具有相同的作用。)