我正在尝试在scala中编写一个对象比较脚本。它只需要比较两个对象的相同类型的变量
class Student (name : String) {
def nameEquals (that : Student) = {
that match {
case that : Student => this.name == that.name (throws error)
}
}
}
为什么我不能访问那些变量,即使我们知道它的类型?
答案 0 :(得分:0)
只需定义名称,如val:
class Student (val name : String)
答案 1 :(得分:0)
您既可以将属性定义为val,也可以将类定义为case类,默认情况下将应用val。两者都可以正常工作。
case class Student (name : String)
class Student (val name : String)
答案 2 :(得分:0)
会发生这种情况,因为当您声明class Student(name: String)
时,您只声明成员name
,该成员是私有且无法访问其他对象。
要从外部访问Student.name
,您需要一个getter。您可以像这样声明Student
类:
class Student(val name: String) {
def nameEquals(that: Student) = this.name == that.name
}
将name
声明为val
会为私有成员val
创建一个同名的getter方法。如果你想为这个成员设置一个setter(通常,首选不变性),你可以将name
声明为var
,并且可以为name
分配一个值
如果您使用val
,也可以跳过case class
,如下所示:
case class Student(name: String) {
def nameEquals(that: Student) = this.name == that.name
}
也就是说,因为case class
默认情况下为成员值提供了getter方法,以及简单数据类的一些其他常用方法,例如,甚至是一个相等的方法,它可能适合您例如,只需使用它:
case class Student(name: String)
可以让你比较两个这样的学生:Student("John Doe") == Student("John Doe")
和Student("Jane Doe") != Student("John Doe")
,它们都评价为true
,这可能正是你想要做的。
顺便说一下,nameEquals
方法中不需要该模式匹配子句,因为that
情况是唯一可能的情况(除了null
作为参数)。