为了账号安全,请及时绑定邮箱和手机立即绑定

如何在Ruby中实现枚举?

/ 猿问

如何在Ruby中实现枚举?

撒科打诨 2019-11-22 10:56:32

在Ruby中实现枚举用法的最佳方法是什么?我正在寻找可以(几乎)使用的东西,例如Java / C#枚举。



查看完整描述

3 回答

?
慕容森

两种方式。符号(: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


查看完整回答
反对 回复 2019-11-22
?
繁星淼淼

我很惊讶没有人提供以下内容(从RAPI gem中获得):


class Enum


  private


  def self.enum_attr(name, num)

    name = name.to_s


    define_method(name + '?') do

      @attrs & num != 0

    end


    define_method(name + '=') do |set|

      if set

        @attrs |= num

      else

        @attrs &= ~num

      end

    end

  end


  public


  def initialize(attrs = 0)

    @attrs = attrs

  end


  def to_i

    @attrs

  end

end

可以这样使用:


class FileAttributes < Enum

  enum_attr :readonly,       0x0001

  enum_attr :hidden,         0x0002

  enum_attr :system,         0x0004

  enum_attr :directory,      0x0010

  enum_attr :archive,        0x0020

  enum_attr :in_rom,         0x0040

  enum_attr :normal,         0x0080

  enum_attr :temporary,      0x0100

  enum_attr :sparse,         0x0200

  enum_attr :reparse_point,  0x0400

  enum_attr :compressed,     0x0800

  enum_attr :rom_module,     0x2000

end

例:


>> example = FileAttributes.new(3)

=> #<FileAttributes:0x629d90 @attrs=3>

>> example.readonly?

=> true

>> example.hidden?

=> true

>> example.system?

=> false

>> example.system = true

=> true

>> example.system?

=> true

>> example.to_i

=> 7

这在数据库方案中或在处理C样式常量/枚举(如使用RAPI广泛使用的FFI的情况)时效果很好。


而且,您不必担心像输入错误一样会导致无提示失败,就像使用哈希类型的解决方案一样。


查看完整回答
反对 回复 2019-11-22
?
梵蒂冈之花

最惯用的方法是使用符号。例如,代替:


enum {

  FOO,

  BAR,

  BAZ

}


myFunc(FOO);

...您可以只使用符号:


# You don't actually need to declare these, of course--this is

# just to show you what symbols look like.

:foo

:bar

:baz


my_func(:foo)

它比枚举更开放,但与Ruby精神非常契合。


符号的表现也很好。例如,比较两个符号是否相等,比比较两个字符串要快得多。


查看完整回答
反对 回复 2019-11-22

添加回答

回复

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信