Scala中的链式包装子句用法指南

2021年3月24日14:45:39 发表评论 55 次浏览

链式包装

解决包成员的可见性的方法。如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

为什么引入package子句的链接?

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

让我们仅以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
}

因此, 在上面的文件中, 而不是像下面那样编写整个package子句。

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

我们写了与当前导入目录相同的目录名称

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

这3个文件在同一范围内, 因此我们看到人力资源经理or技术经理or雇员在范围内, 因此我们使用了它们, 并且在范围内看不到其他任何东西。因此, 要导入多个文件, 我们可以在点末添加" _"以导入所有成员, 而无需指定所有成员。在第一个示例中, 对象a和对象b处于同一范围内, 因此我们可以看到并使用它们。


木子山

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: