在 Ruby 中实现枚举习惯用法的最佳方法是什么?我正在寻找可以(几乎)使用的东西,例如 Java/C# 枚举。
两种方式。符号(:foo符号)或常数(FOO符号)。
: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而不是[]:
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
通常,您不必担心常量的错字安全。如果你拼错了一个常量名,它通常会引发一个异常。
我还建议您阅读此处的其余答案,因为有很多方法可以解决此问题,并且归结为您关心的其他语言枚举的含义