gpt4 book ai didi

scala - 斯卡拉(Scala)。具有一个字段的案例类可以是值类吗?

转载 作者:行者123 更新时间:2023-12-03 09:07:57 26 4
gpt4 key购买 nike

Scala 2.10引入了value classes。它们对于编写类型安全代码非常有用。此外,还有一些限制,其中一些将被编译器检测到,而某些则需要在运行时分配。

我想使用case class语法创建值类,以允许创建-没有新语法和对人类友好的toString。没有模式匹配,因为它需要分配。

所以问题是:使用case class语法是否需要分配值类?

最佳答案

您可以具有作为值类的案例类。从下面的示例中可以看到,没有对象创建。当然,除了不可避免的拳击比赛之外,如果您会选择“任意”。

这是一小段scala代码

class ValueClass(val value:Int) extends AnyVal

case class ValueCaseClass(value:Int) extends AnyVal

class ValueClassTest {

var x: ValueClass = new ValueClass(1)

var y: ValueCaseClass = ValueCaseClass(2)

def m1(x:ValueClass) = x.value

def m2(x:ValueCaseClass) = x.value
}

还有字节码,它不包含两个值类的丝毫痕迹。
Compiled from "ValueClassTest.scala"
public class ValueClassTest {
public int x();
Code:
0: aload_0
1: getfield #14 // Field x:I
4: ireturn

public void x_$eq(int);
Code:
0: aload_0
1: iload_1
2: putfield #14 // Field x:I
5: return

public int y();
Code:
0: aload_0
1: getfield #21 // Field y:I
4: ireturn

public void y_$eq(int);
Code:
0: aload_0
1: iload_1
2: putfield #21 // Field y:I
5: return

public int m1(int);
Code:
0: iload_1
1: ireturn

public int m2(int);
Code:
0: iload_1
1: ireturn

public rklaehn.ValueClassTest();
Code:
0: aload_0
1: invokespecial #29 // Method java/lang/Object."<init>":()V
4: aload_0
5: iconst_1
6: putfield #14 // Field x:I
9: aload_0
10: iconst_2
11: putfield #21 // Field y:I
14: return
}

关于scala - 斯卡拉(Scala)。具有一个字段的案例类可以是值类吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17658301/

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