1

任何人都可以分享对scala中“不可变”特征的见解吗?乍一看,我认为这将是一个很好的控制结构来限制我正在构建的类,但奇怪的是我注意到原始类型不会扩展它。是否有一个原因?有没有办法将语法绑定到 Immutable 或 AnyVal?

class Test {

  def test[T<:Immutable](x:T)={
   println("passes "+x)

 }
  case class X(s:String) extends Immutable

  test(X("hello")) //passes
  // test("fail")  - does not pass compiler

}
4

2 回答 2

2

所谓的原始类型(Boolean、Byte、Char、Short、Int、Long、Float、Double)本质上是不可变的。5 就是 5 就是 5。你不能对 5 做任何事情来把它变成任何不是 5 的东西。

否则,不变性是值如何存储的属性。如果存储在 avar中,var则可以用新值(兼容类型)自由替换。通过扩展,构造类型(classes、traits 和objects)可以是不可变的或可变的,这取决于它们是否允许在构造之后更改其任何内部状态。

Java String(也用作 Scala String)是不可变的。

但是,这些都与您的示例无关,因为您没有证明可变性。+您只是展示了将一个值的方法应用于另一个值时会发生什么。

虽然可以实现一种+改变其(明显)左侧操作数的方法当然是可能的,但很少有人这样做。如果需要这种突变,通常会+=改为定义该方法。

+有点特殊,因为它可以应用于任何值(如果参数/右手操作数)是String通过隐式转换为特殊类定义+(s: String)的,以便+可以应用字符串连接解释。换句话说,如果您编写e1 + "e2"并且表达式的类型e1没有定义+,那么 Scala 将转换e1String并将其与"e2".

于 2013-07-17T01:20:02.350 回答
2

ImmutableScala 核心库中唯一的直接子类型是:

  • collection.immutable.Traversable
  • collection.parallel.immutable.ParIterable

根本没有别的指涉Immutable

Immutable 自 2009 年在 Martin Odersky 的“海量新系列签到”中添加以来,一直没有改变。我正在搜索那个提交,它看起来Immutable甚至在它首次被引入时也从未被用作绑定。

老实说,我怀疑这些特征背后是否有太多意图。Odersky 可能计划使用Immutable将类型参数绑定到不可变集合上,然后考虑得更好。但这只是我的猜测。

于 2013-07-17T01:43:30.213 回答