gpt4 book ai didi

scala - 如何在 Scala 中完全避免运行时反射?

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

备注 这是一个社区帖子,应根据需要添加示例。如果您无法直接编辑答案以添加示例(问题示例或解决方案),请在评论中发布带有指向要点(或类似内容)的链接或添加单独的答案,以便稍后集成。

Scala 3 可能不包含 scala.reflect.runtime根本没有(Dotty 目前没有,而且计划这样做也不确定)。虽然适用于 Scala 2 和 Dotty 的答案可能更适合用于过渡目的和立即提高性能,但也欢迎特定于 Dotty 的解决方案。

引用

https://www.cakesolutions.net/teamblogs/ways-to-pattern-match-generic-types-in-scala

最佳答案

一般建议TypeTag s 在编译时生成(由于每个使用站点的宏扩展,这可能具有显着的编译时间开销)并在运行时使用,也会产生一些潜在的运行时开销,具体取决于它们的使用的确切性质。因此,即使在 Scala 2 中,它们也可能只用作最后的手段(我们希望在这里解决所有此类问题,因此不需要最后的手段)。相比之下,使用 instanceOf 的东西,直接或间接,速度极快。
使用 Java 反射instanceOfsuper fast . classOf (即 Java 的 getClass )几乎一样快。
使用类标签ClassTag 上的引用相等s 也应该非常快。
使用包装类型作为类型类的实例化
如果可能,您可能需要考虑将您的类型包装在一个类中,为其提供一个具体的“Java”类型。虽然经常会有开销,但您可以使用 value classes .
包装类上的类型类通常是公开功能的好方法。顺便说一句,正如@Blaisorblade 指出的那样,“类型标记只是一个无法无天的类型类(使用方法 typeName: Stringtpe: Type)+ 实例实现”。这将我们带到下一个选项:
如果需要,使用宏
(目前 Dotty 不支持,但计划中)
尽管可能有点难以习惯,但与使用 TypeTag 相比,使用宏的代码的最终结果应该是更清晰的语法。 .此外,宏的用途远远超出 TypeTag .
精选实例
匹配集合的类型参数
例子TypeTag 的典型用例,摘自热门帖子 Scala: What is a TypeTag and how do I use it?是对集合类型执行临时多态性:

import scala.reflect.runtime.universe._

def meth[A : TypeTag](xs: List[A]) = typeOf[A] match {
case t if t =:= typeOf[String] => "list of strings"
case t if t <:< typeOf[Foo] => "list of foos"
}

scala> meth(List("string"))
res67: String = list of strings

scala> meth(List(new Bar))
res68: String = list of foos
不像 ClassTag , TypeTag是运行时反射。也许我在这里使用它是错误的,尽管这种行为非常令人惊讶。至少在 REPL 中,我没有收到以下警告:
def meth[A : ClassTag](xs: List[A]) = xs match {
case xs: List[String] => "list of strings"
case xs: List[Foo] => "list of foos"
}

meth(List(new Bar))
res10: String = "list of strings"
解决方案
这是来自@smarter on gitter(假设我们不需要分别处理不同类型的空列表):
def meth[A](xs: List[A]) = xs match {
case Nil => "nil"
case (_: String) :: _ => "list of strings"
case (_: Foo) :: _ => 'list of foos"
}
这使用 instanceOf ,所以它应该非常快。

关于scala - 如何在 Scala 中完全避免运行时反射?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50138533/

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