Scala中的构造函数局部变量

Chi*_*rlo 15 scala

我正在使用"Scala for the Impatient"练习5.7,我需要创建一个类名为 Person的类:构造函数上的字符串,并且有两个属性firstNamelastName由名称分隔的空格填充.我的第一次试验是:

class Person(name:String) {
  private val nameParts = name.split(" ")

  val firstName = nameParts(0)
  val lastName = nameParts(1)
}
Run Code Online (Sandbox Code Playgroud)

问题是,现在nameParts仍然是一个在类中始终可见的私有字段,实际上应该只存在于构造函数的本地环境中.我想要的Java相当于:

 class Person{
    private final String firstName;
    private final String lastName;

    Person(String name){
        final String[] nameParts = name.split(" ");
        firstName = nameParts[0];
        lastName = nameParts[1];
    }
 }
Run Code Online (Sandbox Code Playgroud)

在这里,nameParts只存在构造函数,这正是我的目标.有关如何在Scala中完成此操作的任何提示?

注意:我最终找到了更"Scalesque"的方式:

class Person(name:String) {
    val firstName::lastName::_ = name.split(" ").toList 
}
Run Code Online (Sandbox Code Playgroud)

但我还是希望得到我的问题的答案.

dre*_*xin 13

有一种方法可以避免private val.只需使用以下提取器Array:

class Person(name: String) {
  val Array(first, last) = name.split(" ")
}
Run Code Online (Sandbox Code Playgroud)

编辑:

您可以通过随播广告上的工厂方法以及以第一个和最后一个作为参数的默认构造函数来实现您想要做的事情:

class Person(val first: String, val last: String)

object Person {
  def apply(name: String) = {
    val splitted = name.split(" ")
    new Person(splitted(0), splitted(1))
  }
}

scala> Person("Foo Bar")
res6: Person = Person@37e79b10

scala> res6.first 
res7: String = Foo

scala> res6.last
res8: String = Bar
Run Code Online (Sandbox Code Playgroud)

但对于这个简单的案例,我更喜欢我的第一个建议.

链接中的示例也可以使用,但它与我的第一个示例相同.Afaik无法在构造函数中创建临时变量.


cay*_*ann 5

我的想法很简单

class Person(n: String) {
  val firstName = n.split(" ")(0)
  val lastName = n.split(" ")(1)
}
Run Code Online (Sandbox Code Playgroud)

如果你想分解公共代码,那么drexin对数组的回答非常好.但它需要读者在第5章中没有的知识.但是,第4章介绍了使用元组的var,因此以下内容是可以实现的:

class Person(n: String) {
  val (firstName, lastName) = { val ns = n.split(" "); (ns(0), ns(1)) }
}
Run Code Online (Sandbox Code Playgroud)