更新
ここではすべての答えが適切ですが、@ seniaは、追加の手順を必要とせずに、最も直接的にそうします。これはバグにつながる可能性がありますが、何百ものメソッドでMap [Symbol、T]規則を使用する場合は、マップ作成前の1ステップの暗黙的な変換が推奨されます(Symbol Mapキーのpermgenストレージを回避します)。とにかく、ここにポン引きがあります:
class SymbolProvidesPair(i: Symbol) { def ->[T](s: T) = (i.toString.tail, s) }
@inline implicit def symbol2String(i: Symbol) = new SymbolProvidesPair(i)
オリジナル
マップで文字列キーを使用するのは少し面倒ですが、速度が遅くなり、IMOであり、記号キーほど構文的に簡単ではありません。
val map: Map[String, Int] = Map("strings" -> 1, "blow" -> 2)
val map: Map[String, Int] = Map('symbols -> 1, 'rock -> 2)
だから、私は私のかゆみを掻くために暗黙的に作成しました:
implicit def symbolKey2String[A <: Symbol, B](x:(A,B)) = (x._1.toString, x._2)
いくつかのこと:
1)これは正しい署名ですか?上記は機能しますが、A <: Symbol
私は、Symbolから派生したものとSymbolに等しいものを意味します。
2)手動でマップを入力するときにこれを使用します。つまり、便宜上です。私はこの暗黙の問題で何かを打つつもりですか?問題(たとえば、string2Intなど)を引き起こさないのに十分なエッジケースのようですが、何かが足りないかどうかはわかりません。
ありがとう
編集
わかりました、まあ#1私は実際に私が意味することを言うことができ[Symbol, B]
ます[A <: Symbol, B]
しかし今、私は別の問題に気づきました。シンボルから文字列への暗黙のボックスは、すべての新しいマップに対してMap [String、Type]を明示的に定義する必要があるため、ある種の隅に私を閉じ込めます(つまり、優れたコンパイラ型推論を失います)。シンボルキーを使用できるようにするため。
それでは、型署名を指定しない場合に[String、Type]を推測して、両方の世界、地図記号キーを最大限に活用するにはどうすればよいでしょうか。つまり、次の場合にコンパイラにMap [String、Int]を推測させます。
val map = Map('foo -> 1)