2

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

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。

4

1 回答 1

3

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

于 2013-06-12T20:38:42.663 回答