scala是否支持成员分配?
假设:
case class C(var x:Int, var y:Int)
val c = C(1,2)
val d = C(3,4)
是否有运营商将d的每个成员分配给c。
在C / C ++中你会得到:
struct C{ int x, int y)
C c = {1,2}
C d = {3,4}
c = d
EDIT1
成员分配的一大好处就是它的自动化,在
两个
c() = d
和
c.copyFrom( d )
两者都遇到维护问题 - 如果新成员被添加到C中,很容易忽略将成员添加到用户创建的功能中。真正需要的是自动复制这些值的方法。
EDIT2
此行为的另一个用例:
val props:ThirdPartyType = ThirdPartyLibrary.getProperties()
val myprops:ThirdPartyType = MyLibrary.loadPropertiesFromFile()
props @= myprops // magic member-wise assignment
我们可以在这里找到:
我能做到:
props.a = myprops.a
props.b = myprops.b
...
但是当我们更新到ThirdParty库的V2时,此模式会中断。 ThirdPartyType获得了我们没有复制的新成员。
这不能通过反思来解决吗?
答案 0 :(得分:5)
增强很容易:
scala> :pa
// Entering paste mode (ctrl-D to finish)
case class C(var x:Int, var y:Int)
val c = C(1,2)
val d = C(3,4)
// Exiting paste mode, now interpreting.
defined class C
c: C = C(1,2)
d: C = C(3,4)
scala> implicit class CUpdater(val c: C) { def update(d: C) = { c.x=d.x ; c.y=d.y } }
defined class CUpdater
scala> c() = d
scala> c
res1: C = C(3,4)
适用于可变性的常见警告。你没有听到我的声音。
答案 1 :(得分:3)
这将为您提供一个单独的对象,其中复制了所有案例类构造函数参数,但它不会更改d
指向的原始对象:
d = c.copy()
如果你真的想要修改d
所指向的原始对象(也许是因为你在其他地方引用了它 - 想想C编程语言中指向结构的指针),那么我认为你会有用元编程(即反射或宏)做一些奇特的事情,以获得一般的解决方案。
但我建议使用不可变的val
进行编程,几乎总是这样!如果你可以忍受,copy
没问题。