如何在Scala中我可以在主构造函数中定义局部变量?
我需要从 Scala for the impatient
书中解决这个练习:
编写具有主构造函数的Person,该构造函数接受包含第一个名称,空格和姓氏的字符串,例如new Person(“Fred Smith”) . 提供只读属性firstName和lastName . 主构造函数参数应该是var,val还是plain参数?为什么?
现在我的解决方案看起来像这样:
class Person(firstLast: String) {
private[this] val firstLastAsArr = firstLast.trim.split(" ")
val firstName = firstLastAsArr (0)
val lastName = firstLastAsArr (1)
}
我如何限制 firstLastAsArr
变量可见性到主构造函数范围(现在它有类范围)?
5 回答
一种解决方案是立即初始化
firstName
和lastName
,从而允许将firstLastAsArr
转换为初始化块内的本地临时值:这不是一般答案,但你可以用这种特殊的方式写:
您不需要严格需要中间变量:
但是,如果从
firstLast
到firstName
和lastName
的转换长得更长,例如,因为您检查确实只有一个名字和一个姓氏,那么我会将整个拆分业务封装在一个专用方法中:构造函数中的模式匹配工作正常,但您应该考虑将此类逻辑从构造函数移动到工厂方法:
主构造函数中的模式加工效果很好
请参阅我的github获取完整答案https://github.com/BasileDuPlessis/scala-for-the-impatient/blob/master/src/main/scala/com/basile/scala/ch05/Ex07.scala