Jos*_* MN 7 enums scala implicit-conversion scala-2.10
我有关键字和运算符的枚举(以及其他一些),例如(都是相似的):
object Keywords extends Enumeration {
val AND, ARRAY, BEGIN, ...= Value
case class Keyword(keyword: Value) extends Token[Value] {
def this(keyword: String) = this(Keywords.fromString(keyword))
def value = keyword
}
implicit def valueToKeyword(keyword: Value) = new Keyword(keyword)
}
Run Code Online (Sandbox Code Playgroud)
这种隐式转换允许我传递枚举值,其中Tokens是预期的,例如
def testFunction[T](t: Token[T]) = ...
testFunction(Keywords.ARRAY) // gets converted
testFunction(Operators.PLUS) // gets converted too
Run Code Online (Sandbox Code Playgroud)
似乎在匹配期间也没有应用相同的隐式转换
val token = new Keyword("ARRAY")
token match {
case Keywords.ARRAY => ... // not selected but SHOULD be
case Operators.PLUS => ... // completely different Enum
...
}
Run Code Online (Sandbox Code Playgroud)
为什么?怎么克服这个?
这不起作用,因为:
token match {
case Keywords.ARRAY => println("Array")
case _ => println("Something else")
}
Run Code Online (Sandbox Code Playgroud)
本质上是一个具有以下类型签名的PartialFunction:PartialFunction[Keywords.Value, Unit]. 这意味着不会应用隐式,因为它要么是isDefinedAt要么不是用于该输入。
如果未定义,case _ => ...则将捕获我的示例代码中的所有内容。如果它根本没有定义并且没有任何东西可以匹配它,那么你会得到一个MatchError抛出。
在您的情况下token,类型Token[Value]未在匹配将编译为的部分函数Keywords.Value中定义,因为只定义了类型。
如果您真的想要隐式,那么您可以明确要求隐式(是的,这句话很有趣:))
implicitly[Keywords.Value](token) match {
case Keywords.ARRAY => println("Array")
case _ => println("Something else")
}
Run Code Online (Sandbox Code Playgroud)
或者,您可以显式声明 , 的类型token以调用隐式魔法:
val token: Keywords.Value = new Keyword("ARRAY")
token match {
case Keywords.ARRAY => println("Array")
case _ => println("Something else")
}
Run Code Online (Sandbox Code Playgroud)
或者最简单的解决方案,如果你可以没有隐含的生活:
token.value match {
case Keywords.ARRAY => println("Array")
case _ => println("Something else")
}
Run Code Online (Sandbox Code Playgroud)
我知道这不是您要寻找的答案,但我希望您了解什么是match {...}真正的含义以及偏函数是什么。