Scala 为外部对象键入别名作为私有范围参数
我有这种情况Scala 为外部对象键入别名作为私有范围参数,scala,self-type,type-alias,Scala,Self Type,Type Alias,我有这种情况 object SuperHorribleLongName { trait X { private[SuperHorribleLongName] def internalGaga() : Unit } } 我正试图让这样的东西起作用: object SuperHorribleLongName { private type Sup = SuperHorribleLongName.type trait X { private[Sup]
object SuperHorribleLongName {
trait X {
private[SuperHorribleLongName] def internalGaga() : Unit
}
}
我正试图让这样的东西起作用:
object SuperHorribleLongName {
private type Sup = SuperHorribleLongName.type
trait X {
private[Sup] def internalGaga() : Unit
}
}
但这只是给了我一个“错误:Sup不是一个封闭类”。。。我还尝试了typesup=this.type
,但仍然不起作用
作为私有作用域参数使用时,如何为外部对象实现一个好的快捷方式?我确实想保留对象的长名称,而且我有很多私有方法,这就是为什么它真的妨碍了我。我知道它适合您的层次结构,但是将所有私有方法放在
private trait Y {
否则,您可以始终模拟命名空间:
object SuperHorribleLongName {
object SHLN { //Dummy alias
trait X {
private[SHLN] def internalGaga() : Unit
}
}
type X = SHLN.X //Lift into main object
}
这并不令人满意,因为SHLN是可见的,并且将其private
旋转会阻止提升X。而且它很凌乱。因此,让我们把问题从内到外:
private object SHLN {
trait X {
private[SHLN] def internalGaga() : Unit
}
}
//Expose the instance under wanted name
val SuperHorribleLongName = SHLN
我不相信在成员范围中使用类型别名是可能的。我猜也是这样。您是否尝试将类型别名放在X中?可能没有
.type
@mpartel——我试过你的建议。同样的结果,不起作用。我还尝试将import
与导入别名一起使用,但仍然没有成功。当然,愚蠢的解决方案是首先不使用SuperHorribleLongName
。@我们将实际使用DeterministicSkipOctree
,它的字符计数甚至高于SuperHorribleLongName
,我真的很想保留这个名字,但我想在里面用一个缩写,因为private[DeterministicSkipOctree]
确实会损害可读性。我不明白为什么键入别名或导入别名不起作用。不幸的是,不起作用,因为X
应该是可见的,因此在用户端我们有superOrribleLongName#X
。这是名称空间的缺点,但您可以取消要公开的符号。无论如何,我已经用另一种方法更新了我的答案。