gpt4 book ai didi

scala - AnyVal case 类的转换序列 (Seq[T < : AnyVal]) to its runtime representation efficiently

转载 作者:行者123 更新时间:2023-12-03 14:31:17 26 4
gpt4 key购买 nike

假设我有一个值(value)案例类

case class Id(i:Int) extends AnyVal

以及包含此值案例类的序列
Seq(Id(1), Id(2), Id(3))

有没有办法将这些值转换为 Int否则,需要对序列进行迭代(例如,通过执行 Seq(Id(1), Id(2), Id(3)).map(_.i) ?

我问的原因是我认为值案例类的好处在于您可以在运行时使用具有 native 类型作为表示的值类,因此非常高效。但并非所有使用的库都支持这些类的自动“转换”。因此,当它是一个简单的属性时,必须传递原生类型没什么大不了的,因为编译器可以优化它。但是当有一个序列时,我必须显式地映射它,这意味着对所有值都会发生不必要的迭代,因为它实际上除了在运行时映射到相同的值之外什么都不做。有没有办法避免这种情况并在这种情况下使用编译器的一些优化?

最佳答案

正如 Alexey Romanov 在评论中推测的那样,值类在存储在 Seq 中时实际上是装箱的。 .这是 javap -c 的输出为 def bar = Seq(Id(1)) :

  public scala.collection.Seq<Id> bar();
Code:
0: getstatic #25 // Field scala/collection/Seq$.MODULE$:Lscala/collection/Seq$;
3: getstatic #30 // Field scala/Predef$.MODULE$:Lscala/Predef$;
6: iconst_1
7: anewarray #32 // class Id
10: dup
11: iconst_0
12: new #32 // class Id
15: dup
16: iconst_1
17: invokespecial #35 // Method Id."<init>":(I)V
20: aastore
21: invokevirtual #39 // Method scala/Predef$.genericWrapArray:(Ljava/lang/Object;)Lscala/collection/mutable/WrappedArray;
24: invokevirtual #43 // Method scala/collection/Seq$.apply:(Lscala/collection/Seq;)Lscala/collection/GenTraversable;
27: checkcast #45 // class scala/collection/Seq
30: areturn

注意返回类型是 Seq<Id>还有那个 Id."<init>"在第 17 行调用。鉴于此,没有映射的拆箱是不可能的。

这个拳击的解决方案是 Opaque Types在 Scala 3 中,如果该提议被接受。不过,我不确定他们是否会解决您的问题。

关于scala - AnyVal case 类的转换序列 (Seq[T < : AnyVal]) to its runtime representation efficiently,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54186745/

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