3

Scala ではどのようにプライマリ コンストラクターでローカル変数を定義できますか?

私は本からこの演習を解決する必要がありますScala for the impatient:

new Person("Fred Smith") のように、名前、スペース、および姓を含む文字列を受け入れるプライマリ コンストラクターを持つクラス Person を記述します。読み取り専用プロパティの firstName と lastName を指定します。プライマリ コンストラクターのパラメーターは、var、val、またはプレーン パラメーターのどれにする必要がありますか? なんで?

そして今のところ、私のソリューションは次のようになります。

class Person(firstLast: String) {
  private[this] val firstLastAsArr = firstLast.trim.split(" ")

  val firstName = firstLastAsArr (0)
  val lastName = firstLastAsArr (1)
}

変数の可視性をプライマリ コンストラクター スコープに制限するにはどうすればよいfirstLastAsArrですか (クラス スコープを持つようになりました)。

4

5 に答える 5

5

1 つの解決策は、一度に初期化firstNameすることです。これにより、初期化ブロック内のローカル一時値に変換できます。lastNamefirstLastAsArr

class Person(firstLast: String) {
  val (firstName, lastName) = {
    val firstLastAsArr = firstLast.trim.split(" ")
    (firstLastAsArr(0), firstLastAsArr(1))
  }
}
于 2013-06-20T10:22:15.597 に答える
4

これは一般的な答えではありませんが、この特定の方法で次のように書くことができます。

  val Array(firstName, lastName) = firstLast.trim.split(" ")
于 2013-06-20T10:25:28.840 に答える
2

中間変数は厳密には必要ありません。

class Person(firstLast: String) {
  val (firstName, lastName) =
    firstLast.trim.split(" ") match {case Array(first, last) => (first, last)}
}

ただし、たとえば、名と姓が 1 つずつあることを確認したために、 to からfirstLastto へfirstNameの変換lastNameが大幅に長くなる場合は、分割ビジネス全体を専用の方法でカプセル化します。

class Person(firstLast: String) {
  val (firstName, lastName) = split(firstLast)

  private def split(firstLast: String): (String, String) = {
    val firstLastAsArr = firstLast.trim.split(" ")
    ...
    (first, last)
  }
}
于 2013-06-20T10:24:44.757 に答える
1

コンストラクターでのパターン マッチングは問題なく機能しますが、そのようなロジックをコンストラクターからファクトリ メソッドに移動することを検討する必要があります。

case class Person(firstName: String, lastName: String)
object Person{
  def apply(firstLast: String) = {
    val firstLastAsArr = firstLast.trim.split(" ")
    new Person(firstLastAsArr(0), firstLastAsArr(1))
  }
}

val p = Person("My Title")
于 2013-06-20T10:46:00.547 に答える
0

プライマリ コンストラクターでのパターン マッチングがうまく機能する

  class Person(_fullName:String) {
    val (firstName, lastName) =  _fullName.split(" ") match {
      case Array(x:String, y:String, _*) => (x,y)
      case _ => (null,null)
    }
  }

完全な回答については、私の github を参照して ください https://github.com/BasileDuPlessis/scala-for-the-impatient/blob/master/src/main/scala/com/basile/scala/ch05/Ex07.scala

于 2014-05-21T08:15:11.187 に答える