4

オブジェクトのプレフィックスメソッドを作成するために、メソッド名の最後に使用できるという考えに至った:ので、次のように書きました。

def aaa: {
}

そしてそれはうまくコンパイルされます!しかし、これではだめなので、メソッドに何かを返させたいので、不確かなので、次のように書きます。

def aaa: = {
}

エラー!

- identifier expected but '=' found.
- not found: type <error>

わかりました。コンパイラが で壊れることを理解しました: =

def aaa: {
  println("wow")
}

またエラー!

illegal start of declaration (possible cause: missing `=' in front of current method body)

次に、これを試します:

val a = aaa

そして、(上にカーソルを合わせるとaaaaaa署名がdef aaa: AnyRefであると表示されるので、次を試します。

def aaa: {
  Global
}

はどこGlobalですかobject。それでもエラー。だから、私の質問は: なぜこの構文が許可されているのですか? プレフィックスメソッドのように機能させることはできません。このメソッドを副作用に使用することも、何かを返すようにすることもできません。そもそもなぜこのように書くことができるのでしょうか。

アップデート:

今私はこれを試します:

def aaa: {} = {
  Global
}

そしてそれは動作します。{}を示しているように見えますAnyRef。JavaScript のワンダーランドにいるような気分になります。

4

1 に答える 1

9

メソッド名の末尾のコロンはリターンタイプを指定することを意味するため、これらのエラーが発生します。それからあなたがそれを与えないならば、コンパイラは文句を言います。型、この{}場合は空の構造型を指定するため、これは機能します。これは基本的に。と同じAnyRefです。メソッド名の最後にコロンを追加することが実際に許可されている場合、メソッドは英数字以外の文字のみで構成できるという規則があります。だからdef +:(x:Int)大丈夫ですdef foo:(x:Int)、エラーにつながります。しかし、私はそれについて静かではありません。また、コロンで終わるメソッドは右結合です。

于 2012-09-11T10:35:37.143 に答える