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 console は私に同意しているようです:

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 を教えてくれます。コメントアウトされたバージョンは、2 つのパラメーターを取り、 のインスタンスを返すメソッドですCity。2 番目のバージョンはパラメーターをとらず、 type の関数を返します(Int,Int) => City。2つは完全に異なります。

于 2013-06-12T20:38:42.663 に答える