我正在尝试实现一个控制流结构,它可以接受可变数量的名字参数。
请参阅CalculateGroup方法及其用法。
我试图关注this post,但仍有一些问题
从错误中可以看出,我怀疑我需要在CalculateGroup函数中定义类型注释谓词吗?
这是当前代码:
def compare[T : Numeric](x: T)(y: T) : Boolean = implicitly[Numeric[T]].gt( x, y )
val items = compare[Double](10) _
val assertionsEnabled = true
def Calculate( predicate: => Boolean ) =
if (assertionsEnabled && !predicate)
throw new AssertionError
Calculate{
items(5)
}
def CalculateGroup( list: (predicate: => Boolean) *) =
{
list.foreach( (p : (predicate: => Boolean) ) => {
if (assertionsEnabled && !predicate)
throw new AssertionError
})
}
CalculateGroup{
items(5),
items(3),
items(8)
}
错误详情:
scala ControlFlow.scala /Users/pavel/Documents/ControlFlow/ControlFlow.scala:36:错误:')'预期但是':'找到了。 def CalculateGroup(list:(predicate:=> Boolean)*)= ^ /Users/pavel/Documents/ControlFlow/ControlFlow.scala:68:错误:')'预计但找到'}'。 } ^ 找到两个错误
答案 0 :(得分:1)
您遇到语法问题...您在方法predicate
的签名和CalculateGroup
的签名中放置了一个冒号foreach
。只需删除它们即可编译。
删除它并知道单词predicate
不是变量的别名,但它应该是类的名称。如果你把它大写的话会更好。与您的方法的情况相反,这些方法不应该大写。
<强>更新强>
要拥有多个名字参数,请执行以下操作:
def CalculateGroup( list: (=> Boolean) *) =
{
list.foreach( (p : (=> Boolean) ) => {
if (assertionsEnabled && !p)
throw new AssertionError
})
}
答案 1 :(得分:1)
你不能使用by-name var args,你可以使用像Iterator
或Stream
这样的惰性集合:
def compare[T : Numeric](x: T)(y: T) : Boolean = implicitly[Numeric[T]].gt( x, y )
val items = compare[Double](10) _
val assertionsEnabled = true
def Calculate(predicate: => Boolean) =
if (assertionsEnabled && !predicate)
throw new AssertionError
Calculate{
items(5)
}
def CalculateGroup(list: Iterator[Boolean]) =
{
list.foreach { (p : Boolean ) =>
if (assertionsEnabled && !p) {
throw new AssertionError
}
}
}
CalculateGroup{Iterator(
items(5),
items(3),
items(8)
)}