何时可以在Scala中安全地省略括号?

时间:2015-09-20 21:46:46

标签: scala syntax

这是一个玩具示例:

object Example {

  import collection.mutable
  import collection.immutable.TreeSet

  val x = TreeSet(1, 5, 8, 12)
  val y = mutable.Set.empty ++= x
  val z = TreeSet.empty ++ y
  // This gives an error: unspecified parameter
  //  val z = TreeSet.empty() ++ y

}

显然TreeSet.emptyTreeSet.empty()不是一回事。引擎盖下发生了什么?我什么时候可以安全地省略(或在这种情况下不省略)括号?

更新

我已经将一些代码发送到控制台,然后在eval上面的代码中将其删除,然后再执行以下代码:

  implicit object StringOrdering extends Ordering[String] {
    def compare(o1: String, o2: String) = {
      o1.length - o2.length
    }
  }
  object StringOrdering1 extends Ordering[String] {
    def compare(o1: String, o2: String) = {
      o2.length - o1.length
    }
  }

1 个答案:

答案 0 :(得分:5)

这是一个特殊情况,并且与您何时可以且不能省略括号非常相关。

这是TreeSet.empty的签名:

def empty[A](implicit ordering: Ordering[A]): TreeSet[A]

它有一个隐式参数列表,对于包含的类型Ordering,需要A。当您调用TreeSet.empty时,编译器将尝试隐式找到正确的Ordering[A]

但是当你调用TreeSet.empty()时,编译器认为你试图显式提供隐式参数。除了你在列表中省略了参数,这是一个编译错误(错误的参数数量)。唯一可行的方法是,如果您明确传递了一些OrderingTreeSet.empty(Ordering.Int)

旁注:您的上述代码实际上并未使用TreeSet.empty进行编译,因为它会导致Ordering的模糊隐式错误。您的范围中可能存在一些隐含的Ordering[Int],您不在问题中。最好使类型明确并使用TreeSet.empty[Int]