Constructor-local variables in Scala

scala

Solution

There is a way to avoid the `private val`. Just use the extractor of `Array`:

class Person(name: String) {
  val Array(first, last) = name.split(" ")
}

edit:

What you want to do can be achieved through a factory method on the companion and a default constructor that takes first and last as param:

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

But for this simple case I would prefer my first suggestion.

The example in your link would also work, but it's kind of the same as my first example. Afaik there is no way to create a temporary variable in the constructor.

Problem

I'm on exercise 5.7 of "Scala for the Impatient", where i need to create a class Person that takes a name:String on constructor and has 2 properties firstName and lastName filled from name split by whitespace. My first trial was : ``` class Person(name:String) { private val nameParts = name.split(" ") val firstName = nameParts(0) val lastName = nameParts(1) } ``` The problem is, that now nameParts remains as a private field always visible within the class, when in fact should only exist within the constructor's local environment. The Java equivalent of what I want would be: ``` class Person{ private final String firstName; private final String lastName; Person(String name){ final String[] nameParts = name.split(" "); firstName = nameParts[0]; lastName = nameParts[1]; } } ``` Here, nameParts exists only withing the constructor, which is what i'm aiming for. Any hints on how this can be done in Scala? NOTE: I ended up finding a more "Scalesque" way: ``` class Person(name:String) { val firstName::lastName::_ = name.split(" ").toList } ``` but I still would like to get an answer to my question.

Original source

Related problems