更新
ここではすべての回答が良いですが、@ seniaの方が、追加の手順を必要とせずに最も直接的です。これはおそらくバグにつながりますが、何百ものメソッドでMap [Symbol、T]規則を使用する場合、マップ作成の前に1ステップの暗黙の変換が優先されます(Symbol Mapキーのpermgen格納を避ける)。ただ、IMO、私を遅くしてあり、記号キーとして目にとして文法的に容易ではない
それは私にマップの文字列キーを使用してビットを気にスカラマップ、文字列への記号キーの埋め込み
class SymbolProvidesPair(i: Symbol) { def ->[T](s: T) = (i.toString.tail, s) }
@inline implicit def symbol2String(i: Symbol) = new SymbolProvidesPair(i)
オリジナル:いずれにせよ、ここでは売春斡旋業者です。
implicit def symbolKey2String[A <: Symbol, B](x:(A,B)) = (x._1.toString, x._2)
カップルの事:
1)これが正しい署名である
val map: Map[String, Int] = Map("strings" -> 1, "blow" -> 2)
val map: Map[String, Int] = Map('symbols -> 1, 'rock -> 2)
だから、私は私のかゆみを傷つけるために暗黙的に作成されましたか?上記の作品は、しかし、A <: Symbol
私は、Symbolに匹敵する何かをSymbolから派生するものを意味するために取る。
2)手動でマップを入力するときはこれを使用します。すなわち便宜上のものである。私は暗黙のうちに何かの騒ぎにぶつかりますか?それは問題を引き起こさないように(例えばstring2Intのような)問題を引き起こしているようですが、何かが欠けているかどうかはわかりません。
おかげで[OK]を
EDIT
、うまく#1私は実際に代わり[A <: Symbol, B]
の[Symbol, B]
、私が何を意味するかと言うことができます。しかし、今、私は別の問題、シンボル対で自分自身を見つけます文字列暗黙的には、私はシンボル・キーを使用できるようにするために、すべての新しいマップ(すなわち、素晴らしいコンパイラ・タイプの推論を失う)に対してMap [String、Type]を明示的に定義する必要があります。
どのようにして、シンボルのキーをマップすることができますが、タイプシグネチャを指定しないと[String、Type]が推測されますか?つまり、私がやるとき地図[文字列、INT]推測するコンパイラを持っている:あなたは、明示的にマップのタイプを指定する必要はありません
val map = Map('foo -> 1)
hmmm、私は "A"の代わりに "Symbol"を使うことができますね;-) – virtualeyes
この種の動作は他の開発者を驚かせるかもしれません。おそらく ' - >'を他の言葉に置き換えるほうがいいでしょうか?たとえば、 ': - ' 'や'〜> 'などです。 – senia
私はPimp-My-Libraryパターン(正確にあなたの答えで提供されるパターンです)の文脈では、Symbol - > Typeは完璧です。 Scalaコンパイラの素晴らしい点は、混乱した人はマウスを " - >"の上に置くと、クリックして暗黙的に参照できることです。 Ruby、Groovyなどでは、明示的なドキュメンテーションがなくても謎めいた謎のツアーがはるかに多い。また、シンボルマップキーは、permgenを取ります。そのため、見かけ上の使用で眉毛(および調査)が増えるはずです。最後に、コンパイラーはMap [String、Type]を推論します。その結果、どのように起こっているのかを調べる必要があります。 – virtualeyes