迭代在ruby中的枚举

Ran*_*Ran 3 ruby enums

我有以下具有枚举(UserStatus)的ruby类(user.rd):

class User< ActiveRecord::Base
end

class UserStatus
  NEW = "new"
  OLD = "old"
  DELETED = "deleted"
end
Run Code Online (Sandbox Code Playgroud)

有没有办法可以迭代所有枚举值?

Zab*_*bba 5

Ruby没有"枚举".这些是您定义的常量.鉴于此,您可以迭代类中的常量,如下所示:

#UserStatus.constants returns an array, which we then iterate over
UserStatus.constants.each do |el|
  p el
end
Run Code Online (Sandbox Code Playgroud)


Phr*_*ogz 5

你在那里创造的东西叫做'常数',而不是枚举.正如扎巴所说,"红宝石没有'枚举'." 如果你必须保留这个数据结构,如果你已经在代码中使用了常量,那么你可以像这样迭代它们:

UserStatus.constants(false).each do |const_name|
  p [ const_name, UserStatus.const_get( const_name ) ]
end
#=> :NEW, "new"]
#=> [:OLD, "old"]
#=> [:DELETED, "deleted"]
Run Code Online (Sandbox Code Playgroud)

false需要使用上面的代码来防止你获得超类中定义的常量:

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

Bar.constants
#=> [:B, :A]
Bar.constants(false)
#=> [:B]
Run Code Online (Sandbox Code Playgroud)

如果您没有使用单个常量,您可能有兴趣创建一个不可变值的冻结哈希:

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
Run Code Online (Sandbox Code Playgroud)