使变量全局可读,但仅限于可写文件

时间:2016-10-13 20:15:26

标签: scala

我希望在单个对象中有一个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不是一个封闭的类”。我怎么能做我想做的事?

3 个答案:

答案 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中没有定义范围。所以你不能只在同一个文件中写一些东西。

(实际上有三种情况,我认为文件与范围相关:

  1. 顶级包语句将整个文件的其余部分作为其范围。

  2. 如果一个类和一个具有相同名称的对象只是在同一个文件中,则它们只是伴侣。

  3. sealed特征或类只能在同一文件中扩展。

  4. 它们都不适合您的问题。)

答案 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