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

ImmutableScala コア ライブラリの の直接のサブタイプは次のとおりです。

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

それ以外は特に言及していませんImmutable

Immutable 2009 年に Martin Odersky の「大量の新しいコレクションのチェックイン」に追加されて以来、変更されていません。私はそのコミットを検索していますがImmutable、それが最初に導入されたときも、バウンドとして使用されることはなかったようです。

正直なところ、これらの特性の背後に意図があったとは思えません。Odersky はおそらくImmutable、型引数を不変コレクションにバインドするために使用することを計画していましたが、それをよく考えました。しかし、それは私の憶測です。

于 2013-07-17T01:43:30.213 に答える
2

いわゆるプリミティブ型 (Boolean、Byte、Char、Short、Int、Long、Float、Double) は本質的に不変です。5 は 5 です。

それ以外の場合、不変性は値の格納方法のプロパティです。に格納されている場合、(互換性のある型の) 新しい値に自由に置き換えることができますvarvar拡張により、構築された型 ( classes、traits、およびobjects) は、構築後に内部状態を変更できるかどうかに応じて、不変または可変のいずれかになります。

Java のString(Scala の としても使用されるString) は不変です。

ただし、可変性を示していないため、これはあなたの例とは何の関係もありません。+ある値のメソッドを別の値に適用するとどうなるかを示しただけです。

+(明らかな) 左側のオペランドを変更するメソッドを実装できることは確かに可能ですが、それを行うことはめったにありません。その種の変更が必要な場合は、+=代わりに従来どおりメソッドを定義します。

+任意の値に適用できるという点で (引数 / 右側のオペランドの場合) は、文字列連結の解釈が適用されるようStringに定義された特別なクラスへの暗黙的な変換によるものです。つまり、式の型が定義されていない場合、Scala はそれを に変換して連結します。+(s: String)+e1 + "e2"e1+e1String"e2"

于 2013-07-17T01:20:02.350 に答える