在Ruby中枚举的迭代

4
我可以帮你进行翻译。以下是需要翻译的内容:

我有一个名为user.rd的ruby类,其中包含一个枚举类型(UserStatus):

class User< ActiveRecord::Base
end

class UserStatus
  NEW = "new"
  OLD = "old"
  DELETED = "deleted"
end

有没有一种方法可以迭代所有枚举值?
3个回答

5
Ruby没有“enum”关键字,而是使用你定义的常量。 因此,你可以像这样迭代类中的常量:
#UserStatus.constants returns an array, which we then iterate over
UserStatus.constants.each do |el|
  p el
end

5
你所创建的是“常量”,而不是枚举。正如Zabba所说,“Ruby没有'enum'”。如果你必须保留这个数据结构,如果你已经在你的代码中使用了这些常量,那么你可以像这样迭代它们:
UserStatus.constants(false).each do |const_name|
  p [ const_name, UserStatus.const_get( const_name ) ]
end
#=> :NEW, "new"]
#=> [:OLD, "old"]
#=> [:DELETED, "deleted"]

上面使用false是为了防止您获取超类中定义的常量:

class Foo; A = 1; end
class Bar < Foo; B = 1; end

Bar.constants
#=> [:B, :A]
Bar.constants(false)
#=> [:B]

如果您不一定需要使用单个常量,那么您可能会对创建一个包含不可变值的冻结哈希表感兴趣:

class User < ActiveRecord::Base
  STATUS = {
    :new => 'new',
    :old => 'old',
    :deleted => 'deleted'
  }
  STATUS.freeze
  STATUS.values.each{ |v| v.freeze }
end

bob.status = User::STATUS[:new]
User::STATUS.each do |name,string|
  p [ name, string ]
end

2

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接