📜  Scala 中的链式包子句

📅  最后修改于: 2022-05-13 01:55:24.452000             🧑  作者: Mango

Scala 中的链式包子句


链式包是解决包成员的成员可见性的方法。如 Martin Odersky 所述,这是在 Scala 2.8 中引入的假设我们有如下代码。

让我们破解代码并了解这里发生了什么。

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

或者我们可以编写上面的代码如下

// 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{
      }
  }
}

这里对象 a 和 b 定义在目录 x 中的目录 z 中。包 z 的可见性是成员 a 和 b,而不是成员 x。我们也可以将这些对象写在不同的 scala 文件中,如下所示。

// 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

为什么要引入包子句的链接?

在导入文件时更改包子句的含义并缩短包子句,以便在处理包含多个不同嵌套子包的较大项目时不必编写整个包名。

让我们用一个 eg 来理解它,它的目录结构是这样的:-

+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
}

所以在上面的文件中而不是像下面这样写整个包子句。

我们写的目录名称与正在导入的文件在当前/相同的基础中

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

这 3 个文件在同一个范围内,因此我们在范围内看到hrManagertechManager员工,因此我们使用了它们,在范围内看不到其他文件。因此,对于导入多个文件,我们可以在点的末尾包含一个“_”来导入所有成员,而无需指定所有成员。从第一个示例中,对象 a 和对象 b 处于同一范围内,因此我们可以看到并使用它们。