Ruby中的枚举
在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中看起来非常整洁