当用“下划线速记”书写时,apply()的魔力无法识别

时间:2013-06-12 20:33:39

标签: scala

获取这段代码。这曾经是一个案例类,但我拆分了类和对象,为对象提供了更多的方法:

package graphs

class City(val x: Int, val y: Int) {
  def dist(other: City): Double = {
    val xdist  = x - other.x
    val ydist  = y - other.y
    floor(sqrt(xdist * xdist + ydist * ydist) + 0.5)
  }
}

object City {
//  def apply ( x: Int,  y: Int) = new City(x, y)
  def apply = new City(_, _)
}

我总是理解的方式是,用速记编写的apply方法完全等同于注释掉的那个,scala控制台似乎与我同意:

scala> graphs.City.apply
res1: (Int, Int) => graphs.City = <function2>

使用该方法时存在问题:

scala> graphs.City.apply(1,2)
res4: graphs.City = graphs.City@400ff745

scala> graphs.City(1,2)
<console>:8: error: graphs.City.type does not take parameters
              graphs.City(1,2)

当我在Eclipse中编写错误时,错误完全相同。如果我将方法定义切换到注释掉的那个(较长的那个),就没有这样的问题。

是否有一些我不了解的行为或应报告的错误?我使用的是Scala 2.10.1。

1 个答案:

答案 0 :(得分:3)

它不一样,所以告诉你REPL。注释掉的版本是一个方法,它接受两个参数并返回City的实例。第二个版本不使用参数并返回类型为(Int,Int) => City的函数。两者完全不同。