7

他の誰かのソース コード (Scala) を見て:+=いると、型IndexedSeqの変数で演算子が呼び出されていることがわかります。そのクラスのscaladocsページ全体を調べて、その演算子が何をするかを調べていますが、表示されません。の継承階層の外側のクラスで定義されているIndexedSeqか、scaladocs ページの JavaScript が見えない場所に隠していると考えています。(実際にはどちらでもありません。以下の回答を参照してください。)

scaladocs ページのすべてのボタンを押して、すべてを再表示しようとしました。Web ページの HTML コードを調べました。適用可能なクラスのドキュメントから演算子を検索する方法が必要です。ありませんか?

(: symbolhoundを使用してその演算子を調べたので、その演算子の意味がわかりました。この質問は一般的な scala ドキュメントに関するものであり、その特定の演算子ではありません。)

4

2 に答える 2

9

Scala のすべての演算子は通常のメソッドです。

再代入のコンパイラマジックであり、演算子ではないため、見つけることができません。別の言い方をすれば、それ自体が演算子のように見えますが、実際には「演算子の後に=文字が続く」のです。

演算子 (ここでは:+) が適切な型を返し、元の値がvar明らかに a だった場合、コンパイラはそれを魔法のように代入に変換します。

暗黙的または明示的なメソッドによって提供されないためSeq[T]、生成された scaladoc のどこにも表示されません。

したがって、一般的な質問に答えるには:

  • これは言語構造であるため、ドキュメント化されている唯一の場所は仕様です。悲しいことに、
  • しかし、未知の演算子をどこかに見つけた場合は"<?>="、 の定義を探してください。その定義は"<?>"文書化されているはずです。

編集:これがSLSで定義されている場所を最終的に見つけました:

§6.12.4:

代入演算子は、次の条件のいずれかが保持される演算子を除いて、等号文字「=」で終わる演算子記号 ((§1.1) の構文カテゴリ op) です。

(1) 演算子も等号で始まる、または

(2) 演算子は (<=)、(>=)、(!=) のいずれかです。

また、他のすべてのオプションが試行された場合にのみ発生することも後で述べています(潜在的な暗黙を含む)。

于 2013-07-31T19:51:04.087 に答える
1

この値は変数に割り当てられていますか? もしそうなら、私はこの構文シュガーだと思います:

scala> var x = IndexedSeq(1,2,3)
x: IndexedSeq[Int] = Vector(1, 2, 3)

scala> x :+= 10

scala> x
res59: IndexedSeq[Int] = Vector(1, 2, 3, 10)

scala> val y = IndexedSeq(1,2,3)
y: IndexedSeq[Int] = Vector(1, 2, 3)

scala> y :+= 10
<console>:16: error: value :+= is not a member of IndexedSeq[Int]
          y :+= 10
            ^

次のような「操作と代入」の構文シュガーです+=

scala> var x = 10
x: Int = 10

scala> x += 1

scala> x
res63: Int = 11

脱糖するものx = x + 1

于 2013-07-31T19:49:58.233 に答える