加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

Scala中的构造函数局部变量

发布时间:2020-12-16 19:00:43 所属栏目:安全 来源:网络整理
导读:我正在练习5.7“不耐烦的 Scala”,在那里我需要创建一个名为Person的类Person:构造函数上的String,并且有2个属性firstName和lastName由名称由空格分隔.我的第一个审判是: class Person(name:String) { private val nameParts = name.split(" ") val firstN
我正在练习5.7“不耐烦的 Scala”,在那里我需要创建一个名为Person的类Person:构造函数上的String,并且有2个属性firstName和lastName由名称由空格分隔.我的第一个审判是:

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

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

问题在于,现在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];
    }
 }

在这里,nameParts只存在于构造函数中,这是我正在寻找的.任何关于如何在Scala中完成的提示?

注意:我最终找到了一个更“Scalesque”的方式:

class Person(name:String) {
    val firstName::lastName::_ = name.split(" ").toList 
}

但我仍然想得到我的问题的答案.

解决方法

有一种方法可以避免私人门槛.只需使用数组的提取器:

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

编辑:

您可以通过工厂方法对伴侣和默认构造函数实现您想要做的工作,该构造函数首先和最后一个作为参数:

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

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

您的链接中的示例也可以正常工作,但它与我的第一个例子是一样的. Afaik没有办法在构造函数中创建一个临时变量.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读