如何在Scala中获取与类参数同名的字段?

kor*_*dge 2 scala case-class

采取如下的简单类:

class Person(name: String, age: Int) {}
Run Code Online (Sandbox Code Playgroud)

现在,当我实例化这个类时,我通常希望它的用户能够使用nameage.喜欢:

val ronald = new Person("Ronald", 22)
val ronaldsName = ronald.name  // <-
Run Code Online (Sandbox Code Playgroud)

当然,这不起作用,除非我定义一个被调用的gettername,或者创建Person一个case类.后者是一个简单的解决方案,但我觉得我在滥用案例类?

前者有点不方便,因为我不能简单地说:

class Person(name: String, age: Int) {
  def name = name
}
Run Code Online (Sandbox Code Playgroud)

所以,那么我必须name将类的构造函数中的第一个重命名为其他东西,比如personNameor _namen.但这在我看来有点令人困惑,而且不那么优雅.这是相同的概念/变量/值,所以它应该具有完全相同的名称,对吗?

那么......这里最好或最正确的做法是什么?添加它是如此诱人case.

Jea*_*let 7

您只需添加val将参数转换为类的公共字段:

class Person(val name: String, val age: Int)
             ^^^               ^^^
Run Code Online (Sandbox Code Playgroud)

正如您所注意到的,案例类默认情况下会这样做.

  • 它曾经是纯粹的语法糖(pre scala 2.8),因为该例子与`class Person(_name:String,_age:Int)<val name = _name;无法区分.vale age = _age}`.但是在scala 2.8中添加命名参数会产生不幸的副作用,即第二个(手动)解决方案将丑陋的`_name`和`_age`参数名称暴露给外部.从那时起,确实没有其他方法可以为参数和字段提供相同的非错误名称,而不是为参数添加"val". (2认同)