gpt4 book ai didi

scala - 如何在模式匹配期间进行隐式转换

转载 作者:行者123 更新时间:2023-12-04 12:32:30 24 4
gpt4 key购买 nike

我有一个关键字和运算符(以及其他一些)的枚举,例如(都是相似的):

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)
}

这种隐式转换允许我在 Token 处传递枚举值s 是预期的,例如
def testFunction[T](t: Token[T]) = ...
testFunction(Keywords.ARRAY) // gets converted
testFunction(Operators.PLUS) // gets converted too

似乎在匹配过程中也没有应用相同的隐式转换,即
val token = new Keyword("ARRAY")
token match {
case Keywords.ARRAY => ... // not selected but SHOULD be
case Operators.PLUS => ... // completely different Enum
...
}

为什么?如何克服这一点?

最佳答案

这不起作用,因为:

token match {
case Keywords.ARRAY => println("Array")
case _ => println("Something else")
}

本质上是一个 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")
}

或者您可以明确说明 token 的类型, 调用隐式魔法:
val token: Keywords.Value = new Keyword("ARRAY")
token match {
case Keywords.ARRAY => println("Array")
case _ => println("Something else")
}

或者最简单的解决方案,如果你可以没有隐含的生活:
token.value match {
case Keywords.ARRAY => println("Array")
case _ => println("Something else")
}

我知道这不是您要找的答案,但我希望您明白 match {...}真正的意思和什么是偏函数。

关于scala - 如何在模式匹配期间进行隐式转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19915931/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com