【问题标题】:scala variable number by name parameters [duplicate]scala变量编号按名称参数[重复]
【发布时间】:2016-04-08 18:41:55
【问题描述】:

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

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

【问题讨论】:

    标签: scala


    【解决方案1】:

    您不能使用按名称的 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)
      )}
    

    【讨论】:

    【解决方案2】:

    您有语法问题...您在方法CalculateGroupforeach 的签名中的单词predicate 前面放置了一个冒号。只需删除它们,它应该可以编译。

    只需删除它并知道单词predicate 不是变量的别名,而应该是类的名称。所以最好把它大写。与您的方法的情况相反,不应大写。

    更新

    要拥有多个按名称参数,只需这样做:

    def CalculateGroup( list: (=> Boolean) *) =
    {
    list.foreach( (p : (=> Boolean) ) => {
      if (assertionsEnabled && !p)
        throw new AssertionError
    })
    }
    

    【讨论】:

    • 他试图拥有可变数量的别名参数,这是不可能的
    猜你喜欢
    • 1970-01-01
    • 2011-02-12
    • 2012-04-05
    • 2010-12-14
    • 2013-01-06
    • 2011-10-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多