Ruby中的枚举

时间:2020-03-05 18:56:52  来源:igfitidea点击:

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

解决方案

回答

大多数人使用符号(这是:foo_bar语法)。它们是唯一的不透明值。符号不属于任何枚举样式类型,因此它们实际上并不是C枚举类型的忠实表示,但是它的含义几乎一样。

回答

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

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精神非常契合。

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

回答

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

回答

这完全取决于我们使用Java或者Cenums的方式。如何使用它将决定我们将在Ruby中选择的解决方案。

尝试使用本机的"设置"类型,例如:

>> enum = Set['a', 'b', 'c']
=> #<Set: {"a", "b", "c"}>
>> enum.member? "b"
=> true
>> enum.member? "d"
=> false
>> enum.add? "b"
=> nil
>> enum.add? "d"
=> #<Set: {"a", "b", "c", "d"}>

回答

符号是红宝石的方式。但是,有时需要与一些C代码或者某些Java或者某些暴露某些事物的Java进行交谈。

#server_roles.rb
module EnumLike

  def EnumLike.server_role
    server_Symb=[ :SERVER_CLOUD, :SERVER_DESKTOP, :SERVER_WORKSTATION]
    server_Enum=Hash.new
    i=0
    server_Symb.each{ |e| server_Enum[e]=i; i +=1}
    return server_Symb,server_Enum
  end

end

然后可以这样使用

require 'server_roles'

sSymb, sEnum =EnumLike.server_role()

foreignvec[sEnum[:SERVER_WORKSTATION]]=8

当然可以将其抽象化,我们可以滚动我们自己的Enum类

回答

有人继续写了一个名为Renum的红宝石。它声称获得最接近的Java / Clike行为。就我个人而言,我仍在学习Ruby,当我想让特定的类包含静态枚举(可能是哈希)时,我感到有些震惊,因为它无法通过Google轻松找到。

回答

另一种方法是将Ruby类与包含名称和值的哈希一起使用,如以下RubyFleebie博客文章中所述。这使我们可以轻松地在值和常量之间进行转换(尤其是如果我们添加类方法以查找给定值的名称)。

回答

我认为实现像类型一样的枚举的最佳方法是使用符号,因为符号的行为几乎都是整数(当涉及到performace时,使用object_id进行比较);我们无需担心索引编制,它们在代码xD中看起来非常整洁