Cláusulas de paquetes enstringdos en Scala

Los paquetes enstringdos resuelven la visibilidad de los miembros de un paquete. Esto se introdujo en Scala 2.8 como lo describe Martin Odersky. Supongamos que tenemos un código como el siguiente.

Desciframos el código y entendamos qué sucede aquí.

package x.z
object a {
  b  //object b
}
object b{
  a  //object a
}

o podríamos escribir el código anterior como se muestra a continuación

// but this is not a good and short way of writing package clauses
// let's just stick to the first style.
package x{
   package z{
      object a {
      }
      object b{
      }
  }
}

Aquí los objetos a y b están definidos en un directorio z que está en un directorio x. La visibilidad para el paquete z son los miembros a y b, y no de los miembros x. Y también podemos escribir estos objetos como en diferentes archivos Scala como se muestra a continuación.

// a.scala
package x.z
object a {
  b //object b still visible
}
// b.scala
package x.z
object b{
  a // object a still visible
}
// files would created like this
+x
  +z
    +a.scala
    +b.scala
¿Por qué se introdujo el enstringmiento de cláusulas de paquete?

Para cambiar el significado de la cláusula del paquete y acortar la cláusula del paquete al importar archivos, de modo que no tengamos que escribir el nombre completo del paquete cuando trabajemos en proyectos más grandes que contendrían múltiples subpaquetes anidados diferentes.

Entendámoslo con un ejemplo cuya estructura de directorio es algo como esto: –

+company
      +ceo
         +Ceo.scala
         +directors
               +Director.scala
               +managers
                     +hrManager.scala
                     +techManager.scala
                     +employees
                             +employee.scala
// employee.scala
package company.ceo.directors.managers

package employees{
    object employee extends Enumeration{
      val employee1= Value
      val employee2= Value
      val employee3= Value
    }
}
// hrManager.scala
package company.ceo.directors.managers

//short form to import employee3
import employees.employee.employee3  
object hrManager extends Enumeration{
  val hR1, hR2 = Value
  val hrAssociate= employee3
}
// techManager.scala
package company.ceo.directors.managers

// short form to import employee1
import employees.employee.employee1  
object techManager extends Enumeration{
val tmanager= Value
val techAssociate=employee1

// directly specifying employee2
val Assistant= employees.employee.employee2  
val x=Director
}

Entonces, en los archivos anteriores, en lugar de escribir la cláusula del paquete completo como se muestra a continuación.

import company.ceo.directors.managers.employees.employee.employee1 //techManager.scala
import company.ceo.directors.managers.employees.employee.employee2 //techManager.scala
import company.ceo.directors.managers.employees.employee .employee3 //hrManager.scala

escribimos el nombre del directorio que está en la base actual/misma que con el archivo en el que estamos importando

+hrManager.scala        //file
+techManager.scala      //file
+employees              //directory

Estos 3 archivos están en el mismo alcance, por lo tanto, vemos hrManager o techManager o empleados en el alcance y, por lo tanto, los usamos y ninguno de los otros puede verse en el alcance. por lo tanto, para importar varios archivos, podemos incluir un ‘_’ al final del punto para importar todos los miembros sin especificarlos todos. Desde el primer ejemplo, el objeto a y el objeto b están en el mismo nivel de alcance, por lo tanto, podemos verlos y usarlos.

Publicación traducida automáticamente

Artículo escrito por Patabhu y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *