我有以下代码.编译时我得到一个错误说
value email is not a member of Player
class Player(email: String)
{
override def equals(player: Any): Boolean = {
player match {
case p: Player => email.equals(p.email)
case _ => false
}
}
}
Run Code Online (Sandbox Code Playgroud)
我是一名尝试Scala的Java程序员,无法弄清楚为什么会出现这个错误(据我所知,email是播放器实例的成员).有人可以给出解释以及如何解决这个问题吗?
Mic*_*jac 15
email只是一个构造函数参数,而不是类本身的成员.你可以通过前面的方式来制作它val
class Player(val email: String) {
override def equals(player: Any): Boolean = {
player match {
case p: Player => email.equals(p.email)
case _ => false
}
}
}
Run Code Online (Sandbox Code Playgroud)
为了完整起见,您还可以手动创建email以下成员Player:
class Player(e: String) {
val email: String = e
...
}
Run Code Online (Sandbox Code Playgroud)
或者def(如果你出于某种原因想要):
class Player(e: String) {
def email: String = e
...
}
Run Code Online (Sandbox Code Playgroud)
正如@ srgfed01所提到的,您也可以在构造函数中包含访问修饰符.例如:
class Player(private val email: String)
Run Code Online (Sandbox Code Playgroud)
案例类会自动为您的类生成getter,但默认情况下它们都是公共的.
我更喜欢将构造函数参数声明为类成员的第一种方法,因为它清晰,简洁,并且减少了代码混乱(想象一下,如果你有10个params,你想要访问器).
使用case类,而不是使用普通类并编写自己的equals方法,如下所示:
case class Player(email: String)
Run Code Online (Sandbox Code Playgroud)
将自动为您生成equals和hashCode方法.额外的好处是,如果您更改字段,则保证equals/hashCode保持同步.如果您要进行任何类型的序列化,大多数库都会使用案例类.
| 归档时间: |
|
| 查看次数: |
3258 次 |
| 最近记录: |