更新
这里的所有答案都很好,但@senia's 这样做是最直接的,不需要额外的步骤。这可能会导致错误,但是当在数百种方法中使用 Map[Symbol, T] 约定时,最好在创建映射之前进行 1 步隐式转换(避免符号映射密钥永久存储)。无论如何,这是皮条客:
class SymbolProvidesPair(i: Symbol) { def ->[T](s: T) = (i.toString.tail, s) }
@inline implicit def symbol2String(i: Symbol) = new SymbolProvidesPair(i)
原创
在 Maps 中使用字符串键有点困扰我,只是让我慢下来,而且,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
我的意思是,从符号派生的东西与等于符号的东西。
2)当我手动输入地图时,我将使用它;即只是为了方便。我会用这种隐含的方式遇到任何障碍吗?似乎边缘情况足以不会引起问题(例如 string2Int),但不确定我是否遗漏了一些东西。
谢谢
编辑
好吧,好吧#1我实际上可以说出我的意思,[Symbol, B]
而不是[A <: Symbol, B]
但是现在我发现自己遇到了另一个问题,符号到字符串的隐式将我置于某种角落,因为我必须为所有新 Map 显式定义 Map[String, Type]为了能够使用符号键。
那么如何在不指定类型签名时获得两全其美的映射符号键,但使用推断的 [String, Type] 呢?即当我这样做时让编译器推断 Map[String, Int] :
val map = Map('foo -> 1)