4

別の質問からのコメントに応えて、このコードを Scala に入れてみました。

trait Foo

new Foo { self =>
  val self.x = 3
}

もちろん、それはコンパイルされませんが、エラーは私を困惑させています:

recursive value x$1 needs type
    val self.x = 3
             ^

このコードはどのようにしてパーサーを通過したのでしょうか?

これ-Xprint:parseも奇妙です。

    <synthetic> private[this] val x$1 = 3: @scala.unchecked match {
      case self.x => ()
    }

それはmatchの型注釈にあり3ますか? 編集:明らかにそうではありません。それが注釈の構文です

4

1 に答える 1

7

Scala の変数定義は、実際にはパターン マッチングです。つまり、あなたが書くとき

val x = y
println(x)

それは基本的に書くことと同じです

y match {
  case x =>
    println(x)

これは、次のようなもので簡単に確認できます。

val List(a, b, c) = someList
val RegexPattern(year, month, date) = "2013-10-23"

有効なもう 1 つのことは、一定のパターン マッチングです。

object X {
  val One = 1
}

scala> val X.One = 1

scala> val X.One = 2
scala.MatchError: 2 (of class java.lang.Integer)

そして、括弧付きのものはすべてエクストラクタを呼び出します:

object Y {
  val ymd = """(\d\d\d\d)-(\d\d)-(\d\d)""".r
}

scala> val Y.ymd(year, month, day) = "2013-10-23"
year: String = 2013
month: String = 10
day: String = 23    

つまり、あなたが書いたものには構文的に違法なものはなく、詳細だけです。

于 2013-10-23T03:02:41.777 に答える