首页 文章

主构造函数中的Scala局部变量

提问于
浏览
2

如何在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 回答

  • 5

    一种解决方案是立即初始化 firstNamelastName ,从而允许将 firstLastAsArr 转换为初始化块内的本地临时值:

    class Person(firstLast: String) {
      val (firstName, lastName) = {
        val firstLastAsArr = firstLast.trim.split(" ")
        (firstLastAsArr(0), firstLastAsArr(1))
      }
    }
    
  • 4

    这不是一般答案,但你可以用这种特殊的方式写:

    val Array(firstName, lastName) = firstLast.trim.split(" ")
    
  • 0

    您不需要严格需要中间变量:

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

    但是,如果从 firstLastfirstNamelastName 的转换长得更长,例如,因为您检查确实只有一个名字和一个姓氏,那么我会将整个拆分业务封装在一个专用方法中:

    class Person(firstLast: String) {
      val (firstName, lastName) = split(firstLast)
    
      private def split(firstLast: String): (String, String) = {
        val firstLastAsArr = firstLast.trim.split(" ")
        ...
        (first, last)
      }
    }
    
  • 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")
    
  • 2

    主构造函数中的模式加工效果很好

    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

相关问题