1

scala.Symbol の 1 つの問題は、Symbol とそれが基づいている String の 2 つのオブジェクトにあるようです。

Sym を次のように定義しても、この余分なオブジェクトを削除できないのはなぜですか。

class Sym private(val name:String) extends AnyVal {
    override def toString = "'" + name
}

object Sym {
    def apply(name:String) = new Sym(name.intern)
}

確かに、オブジェクトの割り当てによるパフォーマンスへの影響は小さいと思われますが、Scala をより深く理解している人からのコメントは光り輝くでしょう。特に、上記は参照による等価性を介して効率的なマップを提供しますか?

上記の単純な「Sym」のもう 1 つの利点は、多くの文字列キーが存在するマップ中心のアプリケーションにありますが、文字列が多くのまったく異なる種類のものに名前を付けている場合、タイプ セーフな Sym クラスを定義できるため、マップが確実に表示されます。プログラマー、コンパイラー、およびリファクタリング ツールが、実際に鍵となるのは何か。

(Symbol も Sym も拡張できません。前者は明らかに選択によるものであり、後者は AnyVal を拡張するためですが、Sym は適切な名前で複製するのに十分簡単です)

4

3 に答える 3

0

残念ながら、 AnyVal のオブジェクト割り当ては、例の Map のように、コレクションに配置されるたびに強制されます。これは、値クラスをコレクションの型パラメーターにキャストする必要があり、新しい型にキャストすると常に割り当てが強制されるためです。これにより、Sym を値クラスとして宣言する利点がほとんどなくなります。値クラスについては、Scala ドキュメント ページの割り当ての詳細を参照してください。

于 2013-09-07T15:24:26.147 に答える
0

AnyValクラスは実際にはString. 魔法のように追加されたメソッドとタイプ セーフは、コンパイラのトリックにすぎません。それはStringあちこちに転送されます。

パターン マッチング (Symbolの目的だと思います) のために、Scala はオブジェクトのクラスを必要とします。したがって— Symbol extends AnyRef

于 2013-09-07T19:31:45.120 に答える