迭代在ruby中的枚举

时间:2010-12-24 12:05:55

标签: ruby enums

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

class User< ActiveRecord::Base
end

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

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

3 个答案:

答案 0 :(得分:5)

Ruby没有“枚举”。这些是您定义的常量。 鉴于此,您可以迭代类中的常量:

#UserStatus.constants returns an array, which we then iterate over
UserStatus.constants.each do |el|
  p el
end

答案 1 :(得分: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 :(得分:2)

请注意:http://code.dblock.org/ShowPost.aspx?id=184(略微改善http://www.rubyfleebie.com/enumerations-and-ruby/)。让您写下以下内容。

class Gender
  include Enum

  Gender.define :MALE, "male"
  Gender.define :FEMALE, "female"
end

当然

Gender.all
Gender::MALE