我找不到在scala中做类似事情的自然方式:
class Car {
var speed: Int
var color: String
}
var myCar = new Car()
myCar.set {
speed = 5
color = "green"
}
我知道在其他语言中可以使用Groovy。我也知道我可以用这样的构造函数来做到这一点:
val myCar = new Car {
speed = 5
color = "green"
}
我感兴趣的是一种方法来做同样的事情,而不是在对象构造,但后来,一旦对象已经创建
这是我到目前为止所做的事情:
class Car (var speed: Int, var color: String) {
def set(f: (Car) => Unit) = {
f(this)
}
}
val myCar = new Car(5, "red")
myCar.set { c =>
c.speed = 12
c.color = "green"
}
但我不喜欢为每个属性编写'c'var
关于我如何做到这一点或是否有更简单的方法?
答案 0 :(得分:2)
除非绝对必要,否则你应该避免使用可变类。您可以在Scala中正常执行此操作:
case class Car(speed: Int, color: String)
val c1 = Car(5, "red")
val c2 = c1.copy(speed = 12, color = "green")
(然后c2
是汽车的新版本,而c1
保持不变。)
如果你想坚持你的可变类型,为什么不只是
class Car(var speed: Int, var color: String)
val myCar = new Car(5, "red")
import myCar._
speed = 12
color = "green"
使用专用的set
方法:
class Car(var speed: Int, var color: String) {
def set(speed: Int = this.speed, color: String = this.color): Unit = {
this.speed = speed
this.color = color
}
}
val myCar = new Car(5, "red")
myCar.set(speed = 12, color = "green")
myCar.set(color = "blue")
答案 1 :(得分:1)
虽然我们都同意说var reassignement是丑陋的,但这是一个可能的解决方案
object DoTo {
def apply[T](that: T)(functions: (T) => Unit*): T = {
functions foreach { _.apply(that) }
that
}
}
class Car (var speed: Int, var color: String) {
def move() = println("moving")
def stop() = println("stop")
}
val myNewCar = DoTo(new Car(12, "red")) (
_.move(),
_.stop(),
_.speed = 15,
_.color = "green"
)
这不是我最初想要的,但我找不到更简单的使用宏的方法: - (
答案 2 :(得分:1)
您可以通过导入变量来实现:
class Car {
var speed: Int = _
var color: String = _
}
// ...
val myCar = new Car();
// a blocks that works with myCar:
{
import myCar._
// access the content without any prefix
speed = 5
color = "green"
}