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