3

私はロックダウンされたPCで仕事に閉じ込められています。しかし、私は自分のScalaを練習しようとしています。インストールすらできないのでIdeone.comを使用していscalacます...

とにかくこれはコンパイルされていません:

class DPt(var name: String, var x: Double, var y: Double){

        def print = println("DPt; name: " + name + " x: " + x + " y: " + y)
}


object Main {
  def main(args: Array[String]) {
        val pt0 = new DPt("Joe", 1.0, 1.0)
        println("checking generated accessor: " + pt0.x)
        pt0 print
        pt0.x_=(3.0)
        pt0 print
  }
}

Ideone.comのscalaコンパイラから次のメッセージが返されます。

Main.scala:12: error: Unit does not take parameters
    pt0 print
            ^
one error found
spoj: The program compiled successfully, but Main.class was not found.
      Class Main should contain method: def main(args: Array[String]).

ただし、ステートメントの最後にセミコロンを追加すると、次のようになります。

class DPt(var name: String, var x: Double, var y: Double){

        def print = println("DPt; name: " + name + " x: " + x + " y: " + y)
}


object Main {
  def main(args: Array[String]) {
        val pt0 = new DPt("Joe", 1.0, 1.0);
        println("checking generated accessor: " + pt0.x);
        pt0 print;
        pt0.x_=(3.0);
        pt0 print;
  }
}

Scalaのインフィックスとポストフィックスの表記は素晴らしいと思いますが、何かが足りないに違いありません。なぜScalaは行の終わりをステートメントの終わりと見なさないのですか?


このブログの2番目のポスターに答えがあるようです。スカラの人々はこれに乗るべきです。そのような迷惑....これは私がこの他の点では美しい言語で遭遇し​​た最初の迷惑についてですが。 http://www.scala-lang.org/node/4143

ドキュメントから直接の別の説明:http: //docs.scala-lang.org/style/method-invocation.html

4

1 に答える 1

8

ドットをドロップすると、Scalaはarg0 operator arg1構文を使用していると見なします。これは次のようなものでも同じです1 + 2:Scalaは、引数が演算子の後に続くと想定しています。

したがって、それprintは引数を取るメソッドであると想定し、次の行に移動して引数を探します。それは実際には機能しないため、エラーが発生しprintます。引数を取りません。

セミコロンを追加することで、メソッドへの引数が絶対にないことをコンパイラーに伝えているので、引数の検索を停止します。printこれは、コンパイラが引数を必要としないことを理解するのに役立つため、すべて問題ありません。

問題を解決するには、言うだけpt0.printで大丈夫です。

于 2012-05-18T17:05:05.690 に答える