scala中的成员智能分配?

时间:2013-12-19 22:46:38

标签: scala

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

我们可以在这里找到:

  • 我们遇到了ThirdPartyLibrary和ThirdPartyType(无法更改)
  • 该库不提供重新分配属性对象的功能。
  • 库确实提供了分配属性值的功能。它表现为具有公共成员的JavaBean POJO。

我能做到:

props.a = myprops.a
props.b = myprops.b
...

但是当我们更新到ThirdParty库的V2时,此模式会中断。 ThirdPartyType获得了我们没有复制的新成员。

这不能通过反思来解决吗?

2 个答案:

答案 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没问题。