resueltos probabilidad para mendenhall learning introducción introduccion ingenieros estadística estadistica ejercicios editorail edicion descargar cengage beaver ala 13th scala enums

scala - para - mendenhall probabilidad y estadistica pdf



Scala: ¿cómo no es segura la enumeración? (1)

He visto una serie de afirmaciones de que Scala Enumeration no es de tipo seguro. ¿Cómo no es seguro? Parece seguro de la forma obvia en que no puede pasar un valor de una enumeración a una enumeración diferente.

¿Cuáles son las trampas o las cosas que se deben evitar con la enumeración?


Es semi-seguro. Que sea de tipo seguro es una compilación de ficción, por lo que es fácil de romper. Por ejemplo,

trait Parent class Boy extends Parent { override def toString = "boy" } class Girl extends Parent { override def toString = "girl" } def f(g: Girl) = g.toString scala> f((new Boy).asInstanceOf[Girl]) java.lang.ClassCastException: Boy cannot be cast to Girl at .<init>(<console>:15) ...

Bien, los chicos no son chicas.

Ahora probemos con enumeraciones:

object Test extends Enumeration { val One, Two = Value } object Probar extends Enumeration { val Uno, Dos = Value } def h(tv: Test.Value) = tv.toString scala> h((Probar.Uno).asInstanceOf[Test.Value]) res0: java.lang.String = Uno

¿Esperar lo?

Esta ficción conduce a otros comportamientos extraños:

def h(pv: Probar.Value) = pv.toString // Add this to the other h in a :paste method h:(pv: Probar.Value)java.lang.String and method h:(tv: Test.Value)java.lang.String at line 9 have same type after erasure: (pv: Enumeration#Value)java.lang.String def h(pv: Probar.Value) = pv.toString

Uh, vale, gracias?

Y luego, dado que el compilador no entiende realmente la Enumeration como su propia construcción, no puede ayudarlo de la manera que podría esperar:

scala> def oops(tv: Test.Value) = tv match { case Test.One => "okay" } oops: (tv: Test.Value)java.lang.String // No incomplete match warning? Okay.... scala> oops(Test.Two) scala.MatchError: Two (of class scala.Enumeration$Val) at .oops(<console>:8) ...

Por lo tanto, si lo usa en formas relativamente limitadas exactamente según lo previsto, proporciona seguridad de tipo. Pero no tiene el poder y la robustez de otros patrones, como este:

// In REPL, :paste the next three lines sealed trait Foo object Bar extends Foo object Baz extends Foo scala> def safe(f: Foo) = f match { case Bar => "okay" } <console>:9: warning: match is not exhaustive! missing combination Baz def safe(f: Foo) = f match { case Bar => "okay" } ^

Gracias, compilador!