我希望在单个对象中有一个var
,我想从任何地方读取它,但只能从另一个单例对象(这是一个伴随对象,但我不认为这里重要)写入它。因此,我将两个对象放入一个文件MyClass
并将var
设为私有,但使用private[MyClass]
将其打开到文件的范围。
作为一个玩具示例:所有内容都在同一个文件“MyClass.scala”中:
object OtherObject {
private[MyClass] var myvar = 0.0
def variable = myvar
}
object MyClass{
def setmyvar(myvar: Double): Unit = {
OtherObject.myvar = 2.0
}
}
class MyClass { ... }
然而,这不起作用。我收到错误“MyClass不是一个封闭的类”。我怎么能做我想做的事?
答案 0 :(得分:2)
这不是伴侣对象。您可以companion of class and object,两者共享相同的名称。因此错误。
把它放在一边,你可以实现你所要求的,通过将两个对象放在同一个包中并限制对该包的私有访问,或者用另一个包装这些对象,并设置适当的私有修饰符,如下所示:
object MyWrapper {
object OtherObject {
private[MyWrapper] var myvar = 0.0
def variable = myvar
}
object MyClass{
def setmyvar(myvar: Double): Unit = {
OtherObject.myvar = myvar
}
}
}
然后它起作用:
scala> MyWrapper.OtherObject.variable
res3: Double = 0.0
scala> MyWrapper.MyClass.setmyvar(3)
scala> MyWrapper.OtherObject.variable
res5: Double = 3.0
虽然它不是特别优雅的代码
答案 1 :(得分:1)
但将其打开到文件范围
文件在Scala,period中没有定义范围。所以你不能只在同一个文件中写一些东西。
(实际上有三种情况,我认为文件与范围相关:
顶级包语句将整个文件的其余部分作为其范围。
如果一个类和一个具有相同名称的对象只是在同一个文件中,则它们只是伴侣。
sealed
特征或类只能在同一文件中扩展。
它们都不适合您的问题。)
答案 2 :(得分:0)
必须在与该类相同的源文件中定义伴随对象。 两者都应该有相同的名称。一个应该是类,另一个应该是对象类型。然后我们才能将其称为伴侣。
object MyClass {
private[MyClass] var myvar = 0.0
def variable = myvar
}
class MyClass{
def setmyvar(myvar: Double): Unit = {
// your logic
}
}
http://daily-scala.blogspot.in/2009/09/companion-object.html