代码之家  ›  专栏  ›  技术社区  ›  retronym

Scala 2.8中的嵌套/非嵌套包是什么?

  •  22
  • retronym  · 技术社区  · 15 年前

    package com.acme.bar
    
    class Bar
    

    .

    package com.acme.foo
    
    class Foo {
      new bar.Bar
    }
    

    这在Scala 2.8中不编译--但是:

    package com.acme 
    package bar
    
    class Bar
    

    .

    package com.acme
    package foo
    
    class Foo {
      new bar.Bar
    }
    
    1. 这其中的动机是什么?
    2. 关于范围和可见性的确切含义是什么?
    3. 我什么时候应该用一种形式而不是另一种形式?
    3 回复  |  直到 15 年前
        1
  •  20
  •   Martin Odersky    15 年前

    关于这件事,邮件列表上有好几次长时间的讨论。 看到了吗 this thread for the problem this thread for the solution .

    至于意义,只有

    package A
    package B
    

    A ,使 A

    package A.B.C
    

    C 并且不打算访问包的其他成员 B 直接。一个典型的例子是

    package net.myorg.myproject
    

    在这里,你不想比别人定义的可能性更脆弱 net.java包,它将隐藏根级别的java。在Scala2.7中,可以通过使用 _root_ 进口。但那太难看了,为了安全起见,你几乎在任何地方都要这样做。因此,目前的解决方案要好得多。

        2
  •  13
  •   retronym    14 年前

    谢谢你的回答!让我加上两点,我们就完了!

    能见度

    嵌套包和未嵌套包之间的区别仅适用于作用域。 始终基于嵌套包。

    package A
    
    private[A] trait Secret
    

    package A
    package B
    
    trait AB extends Secret
    

    这也是:

    package A.B
    
    trait AB extends A.Secret
    

    在这两种情况下,结构都被解释为:

    package A {
      trait Secret
      package B {
         //...
      }
    }
    

    范围界定

    范围界定

    package A {
      private [A] trait Secret
    }
    
    package `A.B` {
       trait AB extends A.Secret
    
    }
    

    混搭

    package com.acme.project
    package util.shazam
    package blerg
    
        3
  •  9
  •   oxbow_lakes    15 年前

    它不让你对进口的东西有更多的控制权吗?例如,如果有包:

    package com.acme.foo.client
    package com.acme.client
    

    Foo ,是不是有一个恼人的含糊不清,关于哪个 client 有人提到他吗?例如,如果你想做一个 通配符 从内部导入 :

    class Foo {
      import client._ //what is being imported?
    }
    

    客户 ,我们有一个包裹 com.acme.java

    class Foo {
        val jul = new java.util.LinkedList //compile error; cannot find util
    }