Scala 枚举值vs枚举值
我是从Java背景中学习Scala的,我发现与Java有显著不同的第一件事是枚举。我已经通过尝试和错误实现了我想要的一切,但我想更好地了解我在做什么 从Scala文档中,我被告知通过扩展类Scala 枚举值vs枚举值,scala,enums,Scala,Enums,我是从Java背景中学习Scala的,我发现与Java有显著不同的第一件事是枚举。我已经通过尝试和错误实现了我想要的一切,但我想更好地了解我在做什么 从Scala文档中,我被告知通过扩展类枚举来创建枚举,并通过将值设置为常量值来添加值,例如: object Label extends Enumeration{ val NONE = Value } 这和预期的差不多。我的问题不仅在于使用枚举,还在于使用自定义编写的枚举扩展的扩展。作为机器学习类(现在结束)的一部分,我编写了一段代码,通过标签
枚举来创建枚举,并通过将值设置为常量值来添加值,例如:
object Label extends Enumeration{
val NONE = Value
}
这和预期的差不多。我的问题不仅在于使用枚举,还在于使用自定义编写的枚举扩展的扩展。作为机器学习类(现在结束)的一部分,我编写了一段代码,通过标签来分隔数据(例如,用于TDIDT)。在底部是一小片,以了解我困惑的地方。Data
对象是可运行的,只是为了尝试一下
首先,关于打印声明,我认为这是真的,但事实并非如此
println(Label.NONE.equals(MessageLabel.NONE))//Thought this would be true, is false
为什么会这样?即使MessageLabel继承的NONE
直接来自Label,类型系统仍然坚持它们是不同的枚举值
其次,也是更重要的是,我一直在Label.Value
和Label#Value
之间来回奔波,基本上是随意的。我发布的版本:
def splitByLabel[T这不是枚举特有的
scala> class A { class B ; val None = new B }
defined class A
scala> class C extends A ; class D extends A
defined class C
defined class D
scala> val c = new C ; val d = new D
c: C = C@45fe3ee3
d: D = D@4cdf35a9
scala> c.None == d.None
res0: Boolean = false
没有人会想到这是真的。一个值在一个(超级)构造函数中初始化,另一个在另一个构造函数中初始化
另外,Value
不是一个常数;它是一个函数,它说,“给我另一个值。”所以你为每个实例生成一个值
在Java中,不能从这个意义上扩展枚举,“扩展”是添加成员或增加扩展,但子类化意味着子集或受限域
在这种情况下,人们更喜欢组合而不是继承。给定一组工作日和周末,我通过将它们相加来获得所有天数,而不是通过将工作日延长到周末
是以路径相关方式使用枚举的示例
现行规范的另一个问题是:
scala> MessageLabel.NONE
res4: MessageLabel.Value = <Invalid enum: no field for #0>
scala>MessageLabel.NONE
res4:MessageLabel.Value=
这不是枚举特有的
scala> class A { class B ; val None = new B }
defined class A
scala> class C extends A ; class D extends A
defined class C
defined class D
scala> val c = new C ; val d = new D
c: C = C@45fe3ee3
d: D = D@4cdf35a9
scala> c.None == d.None
res0: Boolean = false
没有人会想到这是真的。一个值在一个(超级)构造函数中初始化,另一个在另一个构造函数中初始化
另外,Value
不是一个常数;它是一个函数,它说,“给我另一个值。”所以你为每个实例生成一个值
在Java中,不能从这个意义上扩展枚举,“扩展”是添加成员或增加扩展,但子类化意味着子集或受限域
在这种情况下,人们更喜欢组合而不是继承。给定一组工作日和周末,我通过将它们相加来获得所有天数,而不是通过将工作日延长到周末
是以路径相关方式使用枚举的示例
现行规范的另一个问题是:
scala> MessageLabel.NONE
res4: MessageLabel.Value = <Invalid enum: no field for #0>
scala>MessageLabel.NONE
res4:MessageLabel.Value=
标签#值
是类型标签
中的类型值
。值
是值标签
中的类型值
(这有点混淆,因为既有类标签
又有对象标签
(即值))因此MessageLabel.Value
是Label#Value
,因为MessageLabel
是类型(class
)Label
)的一个实例。但它不是Label.Value
,因为MessageLabel
不是值(object
)标签
。没有消息标签#值
,因为没有类消息标签
(或特征)
(FWIW我发现scala枚举
非常混乱,我更喜欢在scala代码中使用Java枚举)标签#值
是类型标签
中的类型值
是值标签
中的类型值。(这有点令人困惑,因为您同时拥有类标签
和对象标签
(即值))。因此MessageLabel.value
是标签#值
,因为MessageLabel
是该类型(类
)的一个实例Label
。但它不是一个Label.Value
,因为MessageLabel
不是值(object
)Label
。也没有MessageLabel\Value
,因为没有类MessageLabel
(或trait)
(FWIW我发现scala枚举
非常混乱,我更喜欢在scala代码中使用Java枚举)