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

如何在Scala中获取与类参数同名的字段?,scala,case-class,Scala,Case Class,以如下所示的简单类为例: class Person(name: String, age: Int) {} 现在,当我实例化这个类时,我通常希望它的用户能够使用name和age。比如: val ronald = new Person("Ronald", 22) val ronaldsName = ronald.name // <- 因此,我必须将类构造函数中的第一个名称重命名为其他名称,如personName或\u name或n。但在我看来,这有点令人困惑,也远没有那么优雅。它是相同的

以如下所示的简单类为例:

class Person(name: String, age: Int) {}
现在,当我实例化这个类时,我通常希望它的用户能够使用
name
age
。比如:

val ronald = new Person("Ronald", 22)
val ronaldsName = ronald.name  // <-
因此,我必须将类构造函数中的第一个
名称
重命名为其他名称,如
personName
\u name
n
。但在我看来,这有点令人困惑,也远没有那么优雅。它是相同的概念/变量/值,所以它应该有完全相同的名称,对吗


所以。。。这里的最佳或正确做法是什么?添加
case

非常诱人,您只需添加
val
即可将参数转换为类的公共字段:

class Person(val name: String, val age: Int)
             ^^^               ^^^

正如您所注意到的,Case类在默认情况下是这样做的。

如果您不打算从类继承,我相信Case类是一个不错的选择。@BlakePettersson这取决于您是否需要它们的相等语义,您经常这样做,但并不总是这样。@BlakePettersson,你认为即使你永远不会在
表达式中使用它们,使用它们在语义上也是正确的吗?我喜欢case类的便利性,但是前缀
case
(误导性地)表明它用于模式匹配。?case类是自动实现equals和hashCode的语法糖,以及自动创建用于实例化case类的伴随对象。除非您需要不同的equals和hashCode语义(如@AlexeyRomanov所述),否则我认为这是正确的。继承会破坏隐式equals契约,这就是为什么如果需要,应该使用普通类的原因。这么简单。谢谢但我想尽可能深入地理解Scala:这是其他表达式的语法糖分吗?(与
case类
es相同?)。如果是这样,你能告诉我(我们)一些解释它的文章吗?:)可以在构造函数的参数列表或类的主体中定义字段。这不是真正的语法糖-没有其他方法可以完全等同于它。它曾经是纯粹的语法糖(scala 2.8之前),因为这个例子与
类人物(_name:String,_age:Int){val name=_name;vale age=_age}
没有区别。但是在scala 2.8中添加命名参数产生了不幸的副作用,即第二个(手动)解决方案将丑陋的
\u name
\u age
参数名称暴露在外面。从那时起,除了在参数前面加上
val
前缀之外,没有其他方法可以使参数和字段都具有相同的非损坏名称。
class Person(val name: String, val age: Int)
             ^^^               ^^^