在 Scala 中更改不可变变量

Changing immutable variable in Scala

我有一个特征 Usertest,其中我有一个不可变变量 name 和一个可变变量 age。在声明我已使用空字符串初始化 name 时,我使用具有变量 nameStudent class 的构造函数创建了 class Student extends Usertest.

现在我想在创建 Student 实例时更改名称的值,但我不知道该怎么做。

我试过这样的:

trait Usertest {
  val name: String = ""
  var age: Int= 12

  def setage(setage: Int) = {
    age = setage
  }

   def getAge :Int = age
   def getName : String = name

}

class Student(name : String) extends Usertest

object Main extends App {
  val st = new Student("ahsen")
  var age = st.setage(23)
  println("name  : " st.name)
  println("age : "+ st.getAge)

}

它在控制台上给出了这个输出:

name :

age :23

您没有覆盖 name 成员,只定义了一个同名的 class 构造函数参数。您应该将 val 添加到参数中:

class Student(override val name : String)

一个case class会默默地为你做这件事。

注意:您的代码还包括其他在 Scala 中不惯用的结构,例如定义 getter 和 setter - 统一访问原则使它变得多余。

您的代码正在运行,只是 setage 没有 return 任何东西(或者更好的是,它 returns Unit,表示为 ())。

您可以用更简单和惯用的方式完成整个事情:

case class Student(name: String, var age: Int = 12)

object main extends App {
  val student = Student("ahsen")
  student.age = 23
  println(s"name: ${student.name}, age: ${student.age}") // "name: ahsen, age: 12"
}

更好的是,您应该完全避免可变变量,并在需要更改对象的 属性 时使用 copy 构造函数简单地创建一个新实例。像这样

case class Student(name: String, age: Int = 12)

object main extends App {
  val student = Student("ahsen")
  val newStudent = student.copy(age = 23)
  println(s"name: ${student.name}, age: ${student.age}") // "name: ahsen, age: 12"
  println(s"name: ${newStudent.name}, age: ${newStudent.age}") // "name: ahsen, age: 23"
}