在Scala中,将顶级特征声明为私有或私有包之间的区别是什么?

时间:2015-08-04 16:54:27

标签: scala

在Scala中,将非嵌套特征声明为私有或包私有之间的区别是什么。即,

之间有什么区别
public static bool IsSameFile(string path1, string path2)
{
  using (SafeFileHandle sfh1 = NativeMethods.CreateFile(path1, FileAccess.Read, FileShare.ReadWrite, 
      IntPtr.Zero, FileMode.Open, 0, IntPtr.Zero))
  {
    if (sfh1.IsInvalid)
      Marshal.ThrowExceptionForHR(Marshal.GetHRForLastWin32Error());

    using (SafeFileHandle sfh2 = NativeMethods.CreateFile(path2, FileAccess.Read, FileShare.ReadWrite,
      IntPtr.Zero, FileMode.Open, 0, IntPtr.Zero))
    {
      if (sfh2.IsInvalid)
        Marshal.ThrowExceptionForHR(Marshal.GetHRForLastWin32Error());

      NativeMethods.BY_HANDLE_FILE_INFORMATION fileInfo1;
      bool result1 = NativeMethods.GetFileInformationByHandle(sfh1, out fileInfo1);
      if (!result1)
        throw new IOException(string.Format("GetFileInformationByHandle has failed on {0}", path1));

      NativeMethods.BY_HANDLE_FILE_INFORMATION fileInfo2;
      bool result2 = NativeMethods.GetFileInformationByHandle(sfh2, out fileInfo2);
      if (!result2)
        throw new IOException(string.Format("GetFileInformationByHandle has failed on {0}", path2));

      return fileInfo1.VolumeSerialNumber == fileInfo2.VolumeSerialNumber
        && fileInfo1.FileIndexHigh == fileInfo2.FileIndexHigh
        && fileInfo1.FileIndexLow == fileInfo2.FileIndexLow;
    }
  }
}

private MyTrait { ... }

我知道 是一个区别,因为如果添加包限定符,我可以获得某些编译错误。例如,如果我将包限定符添加到private[enclosingpackage] MyTrait { ... } 特征的定义中,这两个编译错误就会消失:

Service

其中一条错误消息中抱怨的[error] /Users/dalan/s/local/eclipse/jeep/runcible/src/main/scala/ org/gaffa/gpp/runcible/httpserver/HttpServer.scala:146: private trait Service escapes its defining scope as part of type org.gaffa.gpp.runcible.httpserver.Service [error] object HttpServer extends App with Service { [error] ^ [error] /Users/dalan/s/local/eclipse/jeep/runcible/src/main/scala/org/ gaffa/gpp/runcible/httpserver/HttpServer.scala:156: not found: value routes [error] Http().bindAndHandle(routes, config.getString("http.interface"), config.getInt("http.port")) [error] ^ [error] two errors found val位于routes特征中,Service单例HttpServer正在“扩展”该特征

感谢您的帮助!

P.S。所有相关代码都在同一个文件中,以防万一。

2 个答案:

答案 0 :(得分:1)

正如克里斯提到的旧讨论文章中提到的那样:合格的私人[foo]和普通私人正在不同层面上行动。

Scala编译器检查限定的私有[foo],只要您属于同一个包,它就可以访问该资源。这就是为什么它会在你问这里的情况下进行编译。

因此,普通私有是一个Java常规私有指令,它将资源密封为仅由资源本身使用。

它们都不比另一个好,当然,这取决于你想要强制执行的保护范围。

答案 1 :(得分:1)

没有区别。在这两种情况下都必须导致编译错误,因为在这两种情况下" trait Service escapes its defining scope",但合格的私有编译器忘记执行此检查。

看来您遇到了这个错误:SI-4323