是否有修改的简短版本并在Scala中分配变量?

时间:2014-05-30 12:44:20

标签: scala

我想知道是否有更短版本的

var longVariableName: MyType = MyTyp("Value")
longVariableName = longVariableName.addSomething("added")

case class MyType(value: String) {
  def addSomething(add: String): MyType = ???
}

也许像

var longVariableName: MyType = MyType("Value")
longVariableName = _.addSomething("extended")

会这么好:) 谢谢

3 个答案:

答案 0 :(得分:5)

我想最简单的方法是:

val longVariableName = MyTyp("Value")
.addSomething("added")
.addSomethingElse("other")
.addSomeMore("stuff")

只要每个方法返回基本类型(即“Builder”模式),您就可以进一步链接调用。 这样,你使用一个值(不是一个变量)并且假设每个方法调用都返回一个case类的新实例,它是不可变的,没有副作用。

此外,案例类使用复制方法支持类似构建器的模式,允许以不可变的方式“添加”信息。

这样的事情:

case class Player(name:String, rank:Option[String] = None) { 
    def withRank(rank:Int)= this.copy(rank=Some(s"top${100-rank}%")) 
}

val player = Player("sparky").withRank(5)

(或多线)

val player = Player("sparky")
.withRank(5)

答案 1 :(得分:3)

您可以为案例类定义+方法:

case class MyType(value: String) {
    def +(add: String) = MyType(value + add)
}

var longVariableName: MyType = MyType("Value")
longVariableName += "extended"

答案 2 :(得分:0)

您可以使用复制方法而无需定义任何其他内容。

case class MyType(value: String, otherValue: String, otherOthervalue: String)

val longName = MyType("Value","OtherValue","OtherOtherValue")
val longerName = longName.copy(value=longName.value+"extended")