24.4. Język służący do tworzenia dat

W pliku Roman.scala znajduje się definicja obiektu Roman, który umożliwia tworzenie obiektów typu java.util.Date używając notacji, w której numer miesiąca jest zapisany liczbą romańską.

Plik Roman.scala:
import java.util._
import scala.language.implicitConversions
object Roman {
  implicit class Roman(val d: Int) extends AnyVal {
    def mkDate(y: Int, m: Int) =
      new GregorianCalendar(y, m-1, d).getTime
    def I   (y: Int) = mkDate(y, 1)
    def II  (y: Int) = mkDate(y, 2)
    def III (y: Int) = mkDate(y, 3)
    def IV  (y: Int) = mkDate(y, 4)
    def V   (y: Int) = mkDate(y, 5)
    def VI  (y: Int) = mkDate(y, 6)
    def VII (y: Int) = mkDate(y, 7)
    def VIII(y: Int) = mkDate(y, 8)
    def IX  (y: Int) = mkDate(y, 9)
    def X   (y: Int) = mkDate(y, 10)
    def XI  (y: Int) = mkDate(y, 11)
    def XII (y: Int) = mkDate(y, 12)
  }
}

Poniższe przykłady pokazują, jak można korzystać z tego obiektu.

scala> import Roman._ 
import Roman._

scala> 1 I 2010
res0: java.util.Date = Fri Jan 01 00:00:00 CET 2010

scala> 1 IX 1939
res1: java.util.Date = Fri Sep 01 00:00:00 CET 1939

scala> 11 IX 2001
res2: java.util.Date = Tue Sep 11 00:00:00 CEST 2001

scala> 20 VII 1969 
res3: java.util.Date = Sun Jul 20 00:00:00 CET 1969

Korzystanie z notacji jest możliwe po zaimportowaniu klasy Roman, definiującej niejawną konwersję z obiektów typu Int. W przedstawionym przykładzie służyło do tego polecenie z wiersza . Przeanalizujmy działanie ostatniego z pokazanych przykładów — z wiersza . Wyrażenie 20 VII 1969 jest zapisanym za pomocą operacji infiksowej wywołaniem metody o nazwie VII, na obiekcie 20, z parametrem równym 1969. Wobec tego, to wyrażenie odpowiada następującemu wyrażeniu.

scala> 20.VII(1969)
res4: java.util.Date = Sun Jul 20 00:00:00 CET 1969

Literał 20 oznacza liczbę całkowitą typu Int. Klasa Int nie definiuje metody o nazwie VII. Ponieważ jednak w wierszu zaimportowane zostały składowe obiektu Roman, dostępna jest klasa Roman zdefiniowana z modyfikatorem implicit, w której jest zdefiniowana taka metoda. Powyższe wyrażenie odpowiada zatem następującemu wyrażeniu.

scala> new Roman(20).VII(1969)
res5: java.util.Date = Sun Jul 20 00:00:00 CET 1969

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.