Scala 枚举值vs枚举值

Scala 枚举值vs枚举值,scala,enums,Scala,Enums,我是从Java背景中学习Scala的,我发现与Java有显著不同的第一件事是枚举。我已经通过尝试和错误实现了我想要的一切,但我想更好地了解我在做什么 从Scala文档中,我被告知通过扩展类枚举来创建枚举,并通过将值设置为常量值来添加值,例如: object Label extends Enumeration{ val NONE = Value } 这和预期的差不多。我的问题不仅在于使用枚举,还在于使用自定义编写的枚举扩展的扩展。作为机器学习类(现在结束)的一部分,我编写了一段代码,通过标签

我是从Java背景中学习Scala的,我发现与Java有显著不同的第一件事是枚举。我已经通过尝试和错误实现了我想要的一切,但我想更好地了解我在做什么

从Scala文档中,我被告知通过扩展类
枚举来创建枚举,并通过将值设置为常量
值来添加值,例如:

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枚举)