在Ruby中,与Java中的枚举相对应的是什么?

29 浏览
0 Comments

在Ruby中,与Java中的枚举相对应的是什么?

在Ruby中,实现枚举习惯用法的最佳方式是什么?我希望有一种类似于Java/C#枚举的方法可以使用(几乎)相同的方式。

0
0 Comments

在Ruby中,有没有类似于Java中的enum类型呢?这个问题的出现是因为在Java中,我们可以使用enum来定义一组具有固定取值的常量,并且可以通过枚举类型来访问这些常量。然而,在Ruby中并没有内置的enum类型,因此需要寻找一种类似的解决方法。

在上述讨论中,提到了一种可以模拟enum的方法,即使用一个类来定义一组常量,并将它们存储在一个数组中。具体的实现如下所示:

class MyClass
  MY_ENUM = [MY_VALUE_1 = 'value1', MY_VALUE_2 = 'value2']
end

这种方法具有以下优点:

1. 它可以将值直观地分组在一个整体中;

2. 它可以在编译时进行一些检查(与仅使用符号相比);

3. 可以很容易地访问所有可能的值的列表,只需使用`MY_ENUM`;

4. 可以很容易地访问不同的值,如`MY_VALUE_1`;

5. 它可以存储任何类型的值,而不仅仅是符号。

虽然符号更好,因为如果在另一个类中使用时不必写外部类的名称(`MyClass::MY_VALUE_1`),但是上述方法更接近Java/C#的功能、语法和最小代码开销。此外,还可以嵌套定义,甚至可以深层嵌套,仍然可以通过`MyClass::MY_ENUM.flatten`获取所有的值。

尽管上述方法可以模拟enum的功能,但仍然有一些不清楚的地方,比如如何使用这个enum。希望能够给出一些例子来说明如何使用这个enum。

0
0 Comments

在Ruby中,有人提出了一种类似于Java中enum的解决方案。这种解决方案是通过一个名为Enum的类来实现的,可以用来定义枚举类型。这个类中有一个私有方法enum_attr,用于定义枚举的属性。这个方法接收两个参数,一个是属性的名字,一个是属性的值。在这个方法中,通过define_method来定义属性的getter和setter方法。getter方法的名字为属性名加上问号,返回属性的值是否为0;setter方法的名字为属性名加上等号,接收一个参数,根据参数的值来设置属性的值。Enum类的构造方法接收一个参数,用于初始化枚举对象的属性。Enum类还有一个to_i方法,用于将枚举对象转换为整数。

这种解决方案可以通过继承Enum类来定义具体的枚举类型。例如,在定义一个FileAttributes类时,可以使用enum_attr方法来定义各个属性。然后就可以创建FileAttributes的实例,并调用其相应的方法来获取或设置属性的值。

这种解决方案适用于数据库和处理C风格的常量/枚举的情况。与使用哈希类型的解决方案相比,它不会因为拼写错误而导致静默失败。

然而,这种解决方案也存在一些问题。首先,每次使用枚举对象时都需要进行堆分配,这意味着需要进行垃圾回收,并且读取时间也会因为缓存未命中而减少。其次,这种解决方案与C#/Java中的枚举不太相似,可能会导致人们不太愿意接受。

总之,这种解决方案虽然能够解决问题,但并不是唯一的解决方案,选择适合问题的解决方案取决于具体的上下文。

0
0 Comments

在Ruby中,等效于Java的enum有两种方式:使用符号(: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

如果你需要将枚举值传递(例如,存储在数据库中)并且需要能够将值转换回符号,可以结合两种方法。例如:

COMMODITY_TYPE = {
  currency: 1,
  investment: 2,
}
def commodity_type_string(value)
  COMMODITY_TYPE.key(value)
end
COMMODITY_TYPE[:currency]

如果要将枚举存储到数据库中,我会使用常量的方法。当然,在从数据库中取出数据时,你需要进行一些查找操作。你还可以在保存到数据库时使用:minnesota.to_s,以保存符号的字符串版本。Rails可能有一些帮助方法来处理其中的一些情况。

不了解C#,但是Java的枚举有顺序,并且有用处。在Ruby中,你可以使用模块来分组常量。

对于类型检查,可以使用常量进行检查。

(以上内容是根据提供的文本整理而成,不代表本人观点或立场。)

0