итерация по enum в ruby - PullRequest
       6

итерация по enum в ruby

3 голосов
/ 24 декабря 2010

у меня есть следующий класс ruby ​​(user.rd) с перечислением (UserStatus):

class User< ActiveRecord::Base
end

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

есть ли способ перебрать все значения перечисления?

Ответы [ 3 ]

5 голосов
/ 24 декабря 2010

То, что вы там создали, называется «константами», а не перечислениями. Как сказал Забба, «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
5 голосов
/ 24 декабря 2010

В Ruby нет "enum". Это те константы, которые вы определили. Учитывая это, вы можете перебирать константы в классе следующим образом:

#UserStatus.constants returns an array, which we then iterate over
UserStatus.constants.each do |el|
  p el
end
2 голосов
/ 17 марта 2011

Посмотрите на это: 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...