小编典典

如何在 Ruby 中实现枚举?

all

在 Ruby 中实现枚举习惯用法的最佳方法是什么?我正在寻找可以(几乎)使用的东西,例如 Java/C# 枚举。


阅读 91

收藏
2022-04-02

共1个答案

小编典典

两种方式。符号(:foo符号)或常数(FOO符号)。

当您想增强可读性而不用文字字符串乱扔代码时,符号是合适的。

postal_code[:minnesota] = "MN"
postal_code[:new_york] = "NY"

当你有一个重要的基础值时,常量是合适的。只需声明一个模块来保存您的常量,然后在其中声明常量。

module Foo
  BAR = 1
  BAZ = 2
  BIZ = 4
end

flags = Foo::BAR | Foo::BAZ # flags = 3

添加于 2021-01-17

如果您正在传递枚举值(例如,将其存储在数据库中)并且您需要能够将值转换回符号,则有两种方法的混搭

COMMODITY_TYPE = {
  currency: 1,
  investment: 2,
}

def commodity_type_string(value)
  COMMODITY_TYPE.key(value)
end

COMMODITY_TYPE[:currency]

这种方法的灵感来自回答

如果您担心符号拼写错误,请确保您的代码在您使用不存在的键访问值时引发异常。您可以通过使用fetch而不是[]

my_value = my_hash.fetch(:key)

或者如果您提供不存在的密钥,则默认情况下使哈希引发异常:

my_hash = Hash.new do |hash, key|
  raise "You tried to access using #{key.inspect} when the only keys we have are #{hash.keys.inspect}"
end

如果哈希已经存在,您可以添加异常引发行为:

my_hash = Hash[[[1,2]]]
my_hash.default_proc = proc do |hash, key|
  raise "You tried to access using #{key.inspect} when the only keys we have are #{hash.keys.inspect}"
end

通常,您不必担心常量的错字安全。如果你拼错了一个常量名,它通常会引发一个异常。

我还建议您阅读此处的其余答案,因为有很多方法可以解决此问题,并且归结为您关心的其他语言枚举的含义

2022-04-02