7.13. Operacje prefiksowe

Scala udostępnia specjalne sposoby wywoływania metod, z użyciem tak zwanych operatorów. Istnieją trzy rodzaje operatorów, które omówione zostaną po kolei: prefiksowe, postfiksowe i infiksowe.

Operacja prefiksowa polega na umieszczeniu operatora przed wyrażeniem, którego dotyczy. Ta możliwość dotyczy tylko czterech operatorów: +, -, ~ oraz !. Taka operacja jest tłumaczona na wywołanie, na wyniku wyrażenia, metody unary_, gdzie jest jednym z czterech wymienionych operatorów. Na przykład poniższe dwa wyrażenia są swoimi odpowiednikami.

scala> -12
res0: Int = -12

scala> 12.unary_-
res1: Int = -12

Jeśli w klasie jest zdefiniowana jedna z metod unary_-, unary_+, unary_! lub unary_~ oraz jeśli ta metoda ma pustą listę parametrów lub nie ma jej wcale, to może być wywoływana za pomocą operacji prefiksowej.

Plik UnaryGreeting.scala:
class UnaryGreeting(name: String) {
  def unary_! :String = "Hello "+name+"!" 
  def unary_+():String = "Welcome "+name 
}

Instancje klasy UnaryGreeting, zdefiniowanej w pliku UnaryGreeting.scala, mogą wywoływać metody unary_! i unary_+ za pomocą operacji prefiksowej. Zwróćmy uwagę na spację w wierszu , znajdującą się przed dwukropkiem. Zapobiega ona zinterpretowaniu dwukropka jako kolejnego znaku nazwy metody. W wierszu analogiczna spacja nie jest potrzebna, gdyż między nazwą metody, a dwukropkiem znajdują się jeszcze nawiasy.

scala> val peter = new UnaryGreeting("Peter")
peter: UnaryGreeting = UnaryGreeting@1f0a5a1

scala> !peter
res2: String = Hello Peter!

scala> +peter
res3: String = Welcome Peter

Poniższa próba nie udaje się, gdyż metoda unary_- nie jest zdefiniowana.

scala> -peter
<console>:12: error: value unary_- is not a member of UnaryGreeting
       -peter
       ^

Specyfikacja języka Scala opisuje operacje prefiksowe w punkcie 6.12.1.

Język programowania Scala Wydanie 2. Copyright © Grzegorz Balcerek 2016

Licencja Creative Commons

Ten utwór jest dostępny na licencji Creative Commons Uznanie autorstwa-Na tych samych warunkach 4.0 Międzynarodowe.

Oracle and Java are registered trademarks of Oracle and/or its affiliates. Other names may be trademarks of their respective owners.