scala变量编号按名称参数

时间:2016-04-08 18:41:56

标签: scala

我正在尝试实现一个控制流结构,它可以接受可变数量的名字参数。

请参阅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:错误:')'预计但找到'}'。     }     ^   找到两个错误

2 个答案:

答案 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,你可以使用像IteratorStream这样的惰性集合:

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)
  )}