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
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)
}
}
