3

scala リスト クラスでは、次のことが示されています。

List(1, 2) ::: List(3, 4) = List(3, 4).:::(List(1, 2)) = List(1, 2, 3, 4). してはいけないこと:

List(1,2) ::: List(3,4) = List(1,2).:::(List(3,4)) = List(3,4,1,2)

( method:::はリストのプレフィックス)

4

2 に答える 2

1

ドキュメントから:

def :::(prefix: List[A]): List[A]

[使用例] このリストの前に、指定されたリストの要素を追加します。

例:

List(1, 2) ::: List(3, 4) = List(3, 4).:::(List(1, 2)) = List(1, 2, 3, 4)

Scala では、で終わる演算子:は右結合であり、呼び出し元のオブジェクトは演算子の右側に表示されます。これは右結合であるため、このprefixメソッドは「右側」のオブジェクトで呼び出されますList(3, 4)

次に、その名前が示すことを実行し、接頭辞List(3, 4)を付けます。これList(1, 2)が、 を取得する理由ですList(1, 2, 3 ,4)。世界で最も直感的なものではありませんが、次のようになります。

a ::: b
// ending in :, so flip the argument order, call the method on b.
b .:: a // :: = prefix b with a
result = a(concatenated) with b

次に、右側を見てみましょう。

List(3, 4).:::(List(1, 2))

.ドットは:::プレフィックス付きの呼び出しの反転を実行しているため、プレフィックス操作を実行する前に 2 つのオブジェクトを単純に反転しますList:::

List(3, 4).:::(List(1,2)) = List(1, 2) ::: List(3, 4) // exactly as the above.
// and now you it's the same story.

ドットは、.結合演算子を反転する簡単な方法です。a ::: b is the same as b .::: a

于 2013-05-08T17:07:16.653 に答える
1

List(1,2).:::(List(3,4)) でやっていることは、物事の順序を変えていると思います。

: で終わると、scala は右側のオブジェクトのメソッドを呼び出したくなる。そう

a :: b

本当に

b.::(a)

ドットと括弧で明示する場合は、順序を変更します。

この例がそれをより明確にするかどうかはわかりません:

scala> class X() {
     def `a:`(s: String): Unit = {
     println(s)
  }}

scala> var x = new X()
scala> x.`a:`("X")
X
scala> x `a:` "X"
<console>:10: error: value a: is not a member of java.lang.String
          x `a:` "X"
            ^

a:scala が右側の文字列オブジェクトのメソッドを呼び出したいことがわかります 。

于 2013-05-08T14:36:46.923 に答える