gpt4 book ai didi

smalltalk - 在Smalltalk中定义枚举类型的惯用方式是什么?

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

像Java,C#等一样。如何在Smalltalk中定义类似enum Direction { input, output }的内容?

最佳答案

琐碎的方法

最简单的方法是让类方方法返回符号或其他基本对象(例如整数)。

因此,您可以将示例编写如下:

Direction class>>input
^ #input

Direction class>>output
^ #output

以及用法:
Direction input

主要缺点是:
  • 即使枚举不同(您可以返回例如^ self name + '::input'),碰巧返回相同值的任何其他“枚举”也将等于此值。
  • 在调试过程中,您会看到对象的实际值,这对于基于数字的枚举尤其难看(嗯...这7是什么意思?)

  • 对象方法

    更好的方法是创建自己的枚举对象并返回其实例。

    该对象应:
  • 会覆盖=hash,因此您可以按您的值进行比较,并使用枚举作为哈希集合(字典)中的键
  • 存储实际的唯一值表示形式
  • 具有自定义printOn:方法以简化
  • 的调试

    它可能看起来像这样
    Object subclass: #DirectionEnum
    slots: { #value }
    classVariables: { }
    category: 'DirectionEnum'

    "enum accessors"
    DirectionEnum class>>input
    ^ self new value: #input

    DirectionEnum class>>output
    ^ self new value: #output

    "getter/setters"
    DirectionEnum>>value
    ^ value

    DirectionEnum>>value: aValue
    value := aValue

    "comparing"
    DirectionEnum>>= anEnum
    ^ self class = anEnum class and: [ self value = anEnum value ]

    DirectionEnum>>hash
    ^ self class hash bitXor: self value hash

    "printing"
    DirectionEnum>>printOn: aStream
    super printOn: aStream.
    aStream << '(' << self value asString << ')'

    用法还是一样的
    Direction input.
    DirectionEnum output asString. "'a DirectionEnum(output)'"

    并解决了琐碎方法中提到的问题。

    显然,这需要做更多的工作,但是效果更好。如果您有许多枚举,则可以将基本行为移至新的父类(super class) Enum,然后 DirectionEnum仅需要包含类端方法。

    关于smalltalk - 在Smalltalk中定义枚举类型的惯用方式是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49450934/

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