13.5. Flagi funkcjonalności
W przypadku niektórych funkcjonalności języka Scala, próba ich użycia może skutkować błędem albo ostrzeżeniem kompilacji (w przyszłych wersjach języka te ostrzeżenia mogą zostać zamienione na błędy kompilacji). Generowanie przez kompilator takich błędów lub ostrzeżeń może być wyłączone za pomocą określonych flag, które będziemy nazywali flagami funkcjonalności. Jednym ze sposobów aktywacji flagi funkcjonalności jest zaimportowanie z obiektu scala.language wartości o nazwie takiej jak nazwa flagi. Następująca lista przedstawia flagi wraz z funkcjonalnościami, których dotyczą.
- dynamics — umożliwia stosowanie cechy Dynamic (patrz punkt 7.17),
- existentials — umożliwia stosowanie zwykłej (nieskróconej) notacji typów egzystencjalnych (patrz punkt 9.8),
- experimental.macros — umożliwia stosowanie makr (makra są funkcjonalnością określoną jako eksperymentalna i nie są omówione w tej książce),
- higherKinds — umożliwia stosowanie typów wyższego rzędu (patrz punkt 9.11),
- implicitConversions — umożliwia definiowanie niejawnych konwersji za pomocą metod (patrz punkt 20.4),
- postfixOps — umożliwia stosowanie operacji postfiksowych (patrz punkt 7.14),
- reflectiveCalls — umożliwia wymagające użycia mechanizmu refleksji odwołania do składników typów strukturalnych (patrz punkt 6.2),
Zobaczmy dla przykładu jak za pomocą zaimportowania odpowiedniej wartości umożliwić stosowanie operatorów postfiksowych. Plik Language1.scala zawiera prosty program, w którym zastosowane jest wywołanie metody toString za pomocą operacji postfiksowej.
Plik Language1.scala: object PostfixOpsTest extends App { println(123 toString) }
Próba kompilacji tego pliku skutkuje pojawieniem się ostrzeżenia.
$ scalac Language1.scala warning: there was one feature warning; re-run with -feature for details one warning found $
Kompilator sugeruje ponowną kompilację z użyciem opcji -feature. Jej zastosowanie pokazuje dodatkowe informacje.
$ scalac -feature Language1.scala
Language1.scala:2: warning: postfix operator toString should be enabled
by making the implicit value scala.language.postfixOps visible.
This can be achieved by adding the import clause 'import scala.language.postfixOps'
or by setting the compiler option -language:postfixOps.
See the Scala docs for value scala.language.postfixOps for a discussion
why the feature should be explicitly enabled.
println(123 toString)
^
one warning found
Kompilator informuje nas w swoim komunikacie, że powinniśmy umożliwić stosowanie operatora postfiksowego toString. Informuje również, że można tego dokonać dodając odpowiednią klauzulę importu albo używając opcji kompilatora.
Plik Language2.scala: object PostfixOpsTest extends App { import language.postfixOps println(123 toString) }
Plik Language1.scala zawiera poprawioną definicję klasy PosfixOpsTest. Definicja została uzupełniona o klauzulę importu. Kompilacja tego pliku nie pokazuje żadnego ostrzeżenia.
$ scalac Language2.scala $
Innym — obok klauzul importu — sposobem umożliwiania używania opisanych wyżej funkcjonalności jest zastosowanie opcji -language kompilatora, którą uzupełnia się dwukropkiem i nazwą flagi. Zamiast nazwy flagi można również użyć znaku podkreślenia, co jest odpowiednikiem użycia klauzuli import language._. Następujący przykład pokazuje kompilację pliku Language1.scala z użyciem odpowiedniej opcji kompilatora zapobiegającej pojawieniu się ostrzeżenia kompilacji.
$ scalac -language:postfixOps Language1.scala $
Plik Language1.scala:
object PostfixOpsTest extends App {
println(123 toString)
}
