在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。所有相关代码都在同一个文件中,以防万一。
答案 0 :(得分:1)
正如克里斯提到的旧讨论文章中提到的那样:合格的私人[foo]和普通私人正在不同层面上行动。
Scala编译器检查限定的私有[foo],只要您属于同一个包,它就可以访问该资源。这就是为什么它会在你问这里的情况下进行编译。
因此,普通私有是一个Java常规私有指令,它将资源密封为仅由资源本身使用。
它们都不比另一个好,当然,这取决于你想要强制执行的保护范围。
答案 1 :(得分:1)
没有区别。在这两种情况下都必须导致编译错误,因为在这两种情况下" trait Service escapes its defining scope
",但合格的私有编译器忘记执行此检查。
看来您遇到了这个错误:SI-4323