k47.cz  — každý den dokud se vám to nezačne líbit
foto Praha výběr povídky kultura
twitter FB RSS

Scala - dynamický jazyk

3. 1. 2011 — k47 (CC by) (♪)

Scala je velice fle­xi­bilní jazyk (to už víme) a dá se v něm udělat téměř ne­možné. A hra­nice ne­mož­ného se pořád po­sou­vají.


Takže pokud vám z ně­ja­kého důvodu (ne­od­vá­žím se do­mýš­let proč) v jazyce chybí vy­hod­no­co­vání prav­di­vosti známé z dy­na­mic­kých jazyků jako třeba PHP, Python nebo Perl, kdy se jako true vy­hod­notí všechna ne­nu­lová čísla, ne­prázdné ře­tězce a ko­lekce, stačí čtyři řádky kódu a Scala se bude chovat přesně takhle.

Je to děsivý hack a nikomu ho ne­do­po­ru­čuji použít, pro­tože jím velice osla­bíte sta­tic­kou ty­po­vou kon­t­rolu a věci se mohou začít chovat velice divně. Im­pli­citní kon­verze se totiž ne­bu­dou po­u­ží­vat jenom v pod­mín­kách nebo ve while cyklu, ale všude, kde ne­bu­dou sedět typy, což může vést ke ka­ta­strofě bib­lic­kých roz­měrů.

Takže ještě jednou: bůh s tím, kdo tohle po­u­žije, ale jako de­mon­strace mož­ností Scaly je to docela pěkné, ne?

implicit def longToBool(l: Long) = l != 0.toLong
implicit def doubleToBool(d: Double) = d != 0.0
implicit def traversableToBool[T <% scala.collection.Traversable[_]](t: T) = t != null && t.nonEmpty
implicit def optionToBool(o: Option[_]) = (o != null) && (o match { case _: Some[_] => true; case None => false })

// test
if (1)               println("true") else println("false")   // true
if (0)               println("true") else println("false")   // false
if (1.0)             println("true") else println("false")   // true
if (0.0)             println("true") else println("false")   // false
if (1.toLong)        println("true") else println("false")   // true
if (0.toLong)        println("true") else println("false")   // false
if ("asdf")          println("true") else println("false")   // true
if ("")              println("true") else println("false")   // false
if (List(1, 2, 3))   println("true") else println("false")   // true
if (List())          println("true") else println("false")   // false
if (Nil)             println("true") else println("false")   // false
if (Array("asdf"))   println("true") else println("false")   // true
if (Array[String]) println("true") else println("false")   // false
if (Some(1))         println("true") else println("false")   // true
if (None)            println("true") else println("false")   // false
if (null)            println("true") else println("false")   // false
píše k47 & hosté, ascii@k47.cz