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 は適切な名前で複製するのに十分簡単です)