在Scala中更改不可变变量

时间:2015-05-25 10:09:41

标签: scala override

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

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

我试过这样的话:

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)

}

它在控制台上提供此输出:

  

名称:

     

年龄:23​​

2 个答案:

答案 0 :(得分:8)

您没有覆盖name成员,只定义了具有相同名称的类构造函数参数。您应该将val添加到参数:

class Student(override val name : String)

case class会默默地为您执行此操作。

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

答案 1 :(得分:0)

您的代码正常运行,只是setage不返回任何内容(或者更好,它会返回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"
}