访问该对象的变量

时间:2018-02-10 09:50:05

标签: scala

我正在尝试在scala中编写一个对象比较脚本。它只需要比较两个对象的相同类型的变量

class Student (name : String) {

  def nameEquals (that : Student) = {
    that match {
      case that : Student => this.name == that.name (throws error)
    }
  }
}

为什么我不能访问那些变量,即使我们知道它的类型?

3 个答案:

答案 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作为参数)。