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


Scala - dynamický jazyk 📷

publikováno 3. 1. 2011 od k47

Scala je velice flexibilní jazyk (to už víme) a dá se v něm udělat téměř nemožné. A hranice nemožného se pořád posouvají.


Takže pokud vám z nějakého důvodu (neodvážím se domýšlet proč) v jazyce chybí vyhodnocování pravdivosti známé z dynamických jazyků jako třeba PHP, Python nebo Perl, kdy se jako true vyhodnotí všechna nenulová čísla, neprázdné řetězce a kolekce, stačí čtyři řádky kódu a Scala se bude chovat přesně takhle.

Je to děsivý hack a nikomu ho nedoporučuji použít, protože jím velice oslabíte statickou typovou kontrolu a věci se mohou začít chovat velice divně. Implicitní konverze se totiž nebudou používat jenom v podmínkách nebo ve while cyklu, ale všude, kde nebudou sedět typy, což může vést ke katastrofě biblických rozměrů.

Takže ještě jednou: bůh s tím, kdo tohle použije, ale jako demonstrace 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

vstoupit do diskuze    sdílet na facebooku, twitteru, google+

příbuzné články:
Scala - Zřetězené porovnávání 📷
Scala - klasický for cyklus 📷
Scala - operátor mocniny 📷
Scala - kratší implicitní konverze 📷
Scala - postfixový if 📷
Scala - metody ála Smalltalk 📷

sem odkazují:
Scala - scalable language

píše k47 & hosté, kontakt: ascii@k47.cz