首页 文章

Scala:如何通过方法修改类中的某些变量? [重复]

提问于
浏览
4

可能重复:在scala中使用def,val和var

我现在正在学习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 .

3 回答

  • 11

    不容易发现!这里:

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

    您定义名为 person 的方法 . 为了更清楚,你做这样的事情:

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

    这意味着每次你说 person 你都没有引用变量,而是调用方法并反复创建新实例 .

    只要说 val person = ......你就没事了 .

    信不信由你,这实际上是语言的一个特征 . 例如 . 您可以在 class 中创建一个字段( val ),然后通过简单地更改为 def 来改变主意并将其转换为吸气剂 . 从客户端代码的角度来看,没有什

  • 0

    让我们一块一块地分析你的代码 . 首先,你宣布了一个名为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 ,它现在将打印您传递给它的值 .

  • 5

    这花了我一点时间才意识到:)

    您没有定义 valvar "person",而是创建新方法 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 ,你就可以了:)

相关问题