Rechts-assoziative Methoden

Rechts-assoziative Methoden dürften allgemein bekannt sein. Darunter fallen alle Methoden, die mit einem Doppelpunkt enden und in Infix- bzw. Operator-Position stehen:

scala> val xs = Seq(1, 2, 3)
xs: Seq[Int] = List(1, 2, 3)

scala> 4 +: xs
res98: Seq[Int] = List(4, 1, 2, 3)

So weit so gut. Was allgemein weniger bekannt sein dürfte ist, dass das nur für Methoden mit einem Parameter funktioniert:

scala> class X { def -: (i: Int, s: String) {} }
defined class X

scala> new X
res20: X = X@6a2a9a0e

scala> (0, "") -: res20
<console>:11: error: not enough arguments for method -:: (i: Int, s: String)Unit.
Unspecified value parameter s.
              (0, "") -: res20
                      ^

Der Grund warum dies nicht funktioniert finden wir in der specin Section 6.12.3:

A left-associative binary operation e1 op e2 is interpreted as e 1.op(e2). If op is right-associative, the same operation is interpreted as { val x =e1; e2.op(x) }, where x is a fresh name.

Dies bedeutet, dass unser Code in etwa zu diesem transformiert wird:

{
  val x = (0, "")
  res99.-:(x)
}

Wie zu erkennen haben wir plötzlich keine zwei Parameter mehr, sondern einen Tuple2. Das passt nicht mehr. Anders herum ist es aber kein Problem:

scala> println(1, "hello")
(1,hello)

Wir können einen Tuple erstellen, ohne dass wir ihn in extra Klammern schreiben müssen, stattdessen reicht das Klammerpaar der Parameterliste aus.

Advertisements

No comments yet

Kommentar verfassen

Trage deine Daten unten ein oder klicke ein Icon um dich einzuloggen:

WordPress.com-Logo

Du kommentierst mit Deinem WordPress.com-Konto. Abmelden / Ändern )

Twitter-Bild

Du kommentierst mit Deinem Twitter-Konto. Abmelden / Ändern )

Facebook-Foto

Du kommentierst mit Deinem Facebook-Konto. Abmelden / Ändern )

Google+ Foto

Du kommentierst mit Deinem Google+-Konto. Abmelden / Ändern )

Verbinde mit %s

%d Bloggern gefällt das: