【问题标题】:Scala: How to modify some variable in class by method? [duplicate]Scala:如何通过方法修改类中的某些变量? [复制]
【发布时间】:2012-10-22 12:33:49
【问题描述】:

可能重复:
Use of def, val, and var in scala

我现在正在学习 Scala,我无法在课堂上修改变量。

class Person(name: String, var variable: Int) {
  def change() {
    variable = 42
  }
}
def person = new Person("name", 0)
println(person.variable)
person.change()
println(person.variable)

输出是:

0
0

为什么输出包含 2 乘以 0?

如何修改此代码中的变量?

我有 Scala 版本 2.9.1。

【问题讨论】:

标签: class scala var


【解决方案1】:

我也花了一段时间才意识到 :)

您不是在定义valvar“人”,而是在创建一个新的方法person。因此,每次调用person 时,它都会创建一个Person 的新实例,它的variable 将始终设置为0。这是在 Scala 中您不需要 () 来调用无参数方法这一事实的副作用。

def person = new Person("foo", 1)

大致相当于(在Java代码中)

public Person person() {
    return new Person("foo", 1);
}

val person 是你想要的,即

Person person = new Person("foo", 1)

(当然这不是真正的val,因为 Scala 不支持这些 :))

然后当您使用person 时,Scala 理解的是person()

只需将用于定义方法的def 更改为valvar 即可:)

【讨论】:

    【解决方案2】:

    不容易被发现!这里:

    def person = new Person("name", 0)
    

    您定义了一个名为person 的方法。为了更清楚,您可以执行以下操作:

    def person(): Person = {
      return new Person("name", 0)
    }
    

    这意味着每次你说person 时,你指的不是变量,而是调用方法并一遍又一遍地创建新实例。

    只要说val person =...就可以了。

    信不信由你,这实际上是语言的一个特点。例如。你可以在你的类中创建一个字段 (val),然后改变你的想法并通过简单地更改为 def 将它变成一个吸气剂。从客户端代码的角度来看,没有任何变化。

    【讨论】:

      【解决方案3】:

      让我们逐段分析您的代码。 首先,您声明了一个名为 person 的类。 class Person(name: String, var variable: Int) 有2个参数,名称和变量。 在这个类下,你有一个方法叫做:def change()

      它有一个变量,其值为 42。 然后你通过person.change()调用了def change()方法

      这个person.change() 实际上并没有改变var variable 的值,而是实际上调用了它自己的方法。 试试println(person.change()),你会看到它会打印“42”。

      我猜,你还是不明白 class 和 def 的区别。 如果你想改变class Person的值,你需要一个新的def来调用改变。

       class Person(name: String, var variable: Int) {
        println(variable)
      }
      def changePerson = Person("new value of name here", "new value of variable here");
      

      现在调用defChangePerson,它将打印您传递给它的值。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-05-06
        • 2014-05-19
        • 2019-04-01
        • 1970-01-01
        • 1970-01-01
        • 2016-04-17
        • 2015-06-01
        • 1970-01-01
        相关资源
        最近更新 更多