gpt4 book ai didi

scala - 模式匹配中的隐式 ClassTag

转载 作者:行者123 更新时间:2023-12-04 17:45:18 25 4
gpt4 key购买 nike

让我们以这个为例:

import scala.reflect._

def get[T](list: List[Any])(implicit tag: ClassTag[T]) = {
list.flatMap {
case element: T => Some(element)
case _ => None
}
}

我可以用 get()获取 T 类型的值来自一个列表(例如 get[String](list) 会给我该列表中的所有字符串)。

现在,我明白编译器提供了类型 ClassTag[String] 的值。自动地。我也明白 ClassTag是一个类型类,幕后某处有一段代码,上面写着 implicitly[ClassTag[T]].getRuntimeClass()管他呢。

但如果是这样,我们怎么能在没有 class 标签的情况下进行模式匹配(在这种情况下我们无法区分删除的类型)?我的意思是,如果我声明一个隐式参数(由编译器自动提供),我会得到一种行为,但如果我不这样做,我会得到一种不同的行为,这是如何实现的?

最佳答案

编译器会自动将您的代码大致翻译为:

  def get[T](list: List[Any])(implicit tag: ClassTag[T]) = list.flatMap {
case (element @ tag(_: T)) => Some(element)
case _ => None
}
ClassTag有一个 unapply(x: Any)允许它对值进行模式匹配的重载。我已经清理了从 reify 获得的树只显示相关部分,但这会显示完整的树:
scala.reflect.runtime.universe.reify { 
def get[T](list: List[Any])(implicit tag: ClassTag[T]) = {
list.flatMap {
case element: T => Some(element)
case _ => None
}
}
}

另见 scaladoc :

The compiler tries to turn unchecked type tests in pattern matches into checked ones by wrapping a (_: T) type pattern as ct(_: T), where ct is the ClassTag[T] instance. Type tests necessary before calling other extractors are treated similarly. SomeExtractor(...) is turned into ct(SomeExtractor(...)) if T in SomeExtractor.unapply(x: T) is uncheckable, but we have an instance of ClassTag[T].

关于scala - 模式匹配中的隐式 ClassTag,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36874755/

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