Martin Odersky del post reciente sobre los niveles de programador de capacidad en la Scala, en el de Expertos de la biblioteca diseñador sección, se incluye el término «principios de inicializadores de».

Estos no son mencionados en Programación en Scala. ¿Qué son?

  • Están descritos en la sección 20.5 de la Programación en la Scala, pero se llama «pre-inicialización de los campos».
InformationsquelleAutor oxbow_lakes | 2011-01-17

3 Comentarios

  1. 100

    Principios de inicializadores son parte del constructor de una subclase que se van a ejecutar antes de su superclase. Por ejemplo:

    abstract class X {
        val name: String
        val size = name.size
    }
    
    class Y extends {
        val name = "class Y"
    } with X

    Si el código fue escrito en lugar de como

    class Z extends X {
        val name = "class Z"
    }

    a continuación, una excepción de puntero nulo se produciría cuando Z consiguió inicializado, porque size se inicializa antes de name en el normal orden de inicialización (superclase antes de la clase).

    • En qué manera es preferible el mal llamado def nameInit: String; val name = nameInit, reemplazado por def nameInit = "foo"?
    • Un def será anulado por el método de la tabla de la clase, lo que garantiza el más específico de la versión va a ser ejecutado, mientras que no hay tal cosa para val inicializaciones — lo que se reemplaza es el getter, no la initalization.
  2. 2

    Medida de lo que puedo decir, la motivación (como se da en el enlace de arriba) es:

    «Naturalmente, cuando una val es reemplazado, no se ha inicializado más de una vez. Así, a pesar de x2 en el ejemplo de arriba es aparentemente definidas en cada punto, este no es el caso: una reemplazado val aparecerá a ser nulo durante la construcción de las superclases, como un resumen de val.»

    No veo por qué esto es natural en todos. Es completamente posible que el r.h.s. de una asignación podría tener un efecto secundario. Nótese que la estructura del código es completamente imposible, ya sea en C++ o Java (y voy a adivinar Smalltalk, aunque no puedo hablar de ese idioma). De hecho, usted tiene que hacer esta doble asignaciones implícitas…ticilpmi…Explícito en los idiomas a través de constructores. A la luz de la r.h.s. efectos secundarios de la incertidumbre, lo que realmente no parece mucho de una motivación a todos: la capacidad para eludir la superclase efectos secundarios (anulando de esta manera la superclase invariantes) a través de la ASIGNACIÓN? Ick!

    Hay otros «asesino» motivaciones para permitir estas inseguro estructura de código? Los lenguajes orientados a objetos han hecho sin este mecanismo de alrededor de 40 años (30 y pico de años, si se cuenta desde la creación del lenguaje), por qué incluir ahora?

    Es…simplemente…parece…peligroso.

    • Esto no tiene sentido para mí también, y yo diría que una vez que he empezado a reemplazar vals ya estoy en territorio peligroso. Reemplazar un def que se asigna a un val tiene mucho más sentido para mí. Estilo sugerencia para patadas: «implícito…ticilpmi…Explícito» –> «impli^H^H^H^H^HExplícita»
    • Alguien tiene, obviamente, nunca se utiliza una base de papel de terminal…sí, los niños…tenían aquellos una vez 🙂
  3. 1

    En el segundo pensamiento, un año capa…

    Esto es sólo torta. Literalmente.

    No una temprana NADA. Sólo torta (mixins).

    Pastel es un término/patrón, acuñado por El Gran Pooh-bah sí mismo, uno que emplea Scala rasgo del sistema, que está a medio camino entre una clase y una interfaz. Es mucho mejor que en Java el patrón de decoración.

    La denominada «interfaz» es meramente una sin nombre de la clase base, y lo que solía ser la clase base está actuando como un rasgo (que francamente no sé podría hacer). No está claro si se trata de un con «d» de la clase puede tomar argumentos (rasgos no se puede), lo intente y el informe de nuevo.

    Esta pregunta y su respuesta ha entrado en uno de Scala mejores características. Leer sobre ella y estar en el temor.

    • De EBNF de Scala: ClassTemplate ::= [EarlyDefs] ClassParents [TemplateBody], ClassParents ::= Constr {'with' AnnotType} y Constr ::= AnnotType {'(' [Exprs] ')'}, yo diría que con «d» de la clase puede tomar argumentos.

Dejar respuesta

Please enter your comment!
Please enter your name here