2011-07-25 22 views
1

私は驚いています。 Rangeを入力するための実装の制限が、Int.MaxValueによって制限されているのはなぜですか?おかげさまで 範囲の制限

+0

内部で 'Range'がパラメータ化されておらず、' Int'を使用しているためですか? '新しい範囲(開始:Int、終了:Int、ステップ:Int)' http://www.scala-lang.org/api/current/index.html#scala.collection.immutable.Range –

+0

そして?それは明らかですが、Longを使わない理由は何ですか? – dvigal

+0

回答をもう一度確認できますか? – soc

答えて

5

NumericRange docsから、

NumericRangeは、任意のタイプで を作品Rangeクラスのより一般的なバージョンです。範囲タイプの実装はIntegral で指定する必要があります。

Range.BigInt,Range.Longおよび Range.BigDecimalがあります。完全性のためにRange.Intが存在するが、Intベースの scala.Rangeがより効果的でなければならない。私の意見で

val r1 = new Range(0, 100, 1) 
val veryBig = Int.MaxValue.toLong + 1 
val r2 = Range.Long(veryBig, veryBig + 100, 1) 
assert(r1 sameElements r2.map(_ - veryBig)) 
+0

Imhoこれは許容されたサイズに関する質問には答えず、要素として使用できるタイプについては答えません。 – soc

+0

@socあなたはもちろんです。最初の優先順位では、どんな理由であれ、私は興味があります。範囲の許容サイズは2^31になりました。おそらく理由はコレクションのデザインにある... – dvigal

0

他の答えは単に間違っています。

これは他の数値タイプを使用できることを示していますが、Rangeは、Scala/Javaの他のすべてのコレクションと同様に2³¹要素しか保持できないという事実は変わりません。

私が知る限り、このデザイン決定の背後には本当の根拠はありません。 64ビットコレクションを持つことは確かに素晴らしく、64ビットインデックスを持つ配列のサポートはJavaにとっては一般的ですが、既存の言語/コレクションフレームワークに統合するのは難しいです。 JVMは合計40億個のオブジェクトに限られていると言う人もいますが、確認できませんでした。

関連する問題