在 Scala 中更改不可变变量
Changing immutable variable in Scala
我有一个特征 Usertest
,其中我有一个不可变变量 name
和一个可变变量 age
。在声明我已使用空字符串初始化 name
时,我使用具有变量 name
和 Student
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"
}
我有一个特征 Usertest
,其中我有一个不可变变量 name
和一个可变变量 age
。在声明我已使用空字符串初始化 name
时,我使用具有变量 name
和 Student
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"
}