gpt4 book ai didi

Scala - unapply 的隐式转换

转载 作者:行者123 更新时间:2023-12-04 05:57:35 26 4
gpt4 key购买 nike

我想要一个提取器来隐式转换它的参数,但它似乎不起作用。考虑这个非常简单的案例:

case class MyString(s: String) {}

implicit def string2mystring(x: String): MyString = new MyString(x)
implicit def mystring2string(x: MyString) = x.s

object Apply {
def unapply(s: MyString): Option[String] = Some(s)
}

但我无法按预期使用它:
val Apply(z) = "a"  // error: scrutinee is incompatible with pattern type

谁能解释为什么它无法从 String 转换参数至 MyString ?我希望它会调用 string2mystring("a")在飞行中。显然我可以通过说 val Apply(y) = MyString("a") 来解决这个问题。 ,但似乎我不应该这样做。

注意:此问题类似于 this one ,但是 1)对于为什么会发生这种情况并没有一个很好的答案,2)这个例子比它需要的更复杂。

最佳答案

模式匹配时不应用隐式转换。这不是您的代码的错误或问题,它只是 Scala 的创建者的设计决定。

要修复它,您应该编写另一个接受 String 的提取器。 — 这反过来又可以调用您的隐式转换。

或者,您可以尝试使用 View 绑定(bind),这似乎也可以,并且如果您稍后将其他隐式转换定义为 MyString 也可以使用。 :

object Apply {
def unapply[S <% MyString](s: S): Option[String] = Some(s.s)
}

关于Scala - unapply 的隐式转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6736569/

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