【问题标题】:Enums in Rails: uppercase or lowercase?Rails 中的枚举:大写还是小写?
【发布时间】:2017-03-02 08:06:35
【问题描述】:

随着互联网上提到的大多数 JAVA 枚举,到处都提到枚举应该全部大写(例如:ACTIVE)。

喜欢这里:Coding Conventions - Naming Enums

但是对于 Rails,在所有示例和文档中,它们都使用小写的枚举值(例如:'active'),例如:http://edgeapi.rubyonrails.org/classes/ActiveRecord/Enum.html

这是有道理的,因为 rails 还通过这些枚举的名称提供实例方法(例如:obj.active?)。这是 Rails 中的枚举被用作小写字母的唯一原因,还是还有更多? 当我们使用枚举作为小写时,我们也不同于约定,应该是这样吗?还是我们也应该在 Rails 中使用大写枚举?

例如,我的模型中有一个 status 枚举,按照惯例,它可以是 activedraftinactive ,应该是:

enum status: {active: 1, draft: 2, inactive: 3}

或:

enum status: {ACTIVE: 1, DRAFT: 2, INACTIVE: 3}

哪一个?为什么?

【问题讨论】:

  • 你能举几个例子吗?
  • 虽然我还没有使用大写字母,但我之前已经创建了大写的枚举,例如 Active 和创建的方法,例如 obj.Active?
  • 这里,我只是添加了示例。另外,是的 obj.Active?会起作用,obj.ACTIVE 也会起作用吗?和 obj.active?只是想知道什么是约定。而且RAILS也是这样吗,如果和JAVA不同,为什么不遵循一般的编码约定。
  • @SambhavSharma:您所说的“通用编码约定”是什么? :)
  • 一般,正如我所读过的,大多数语言都有将枚举保持为全部大写(java、c、c++)的约定。不过,我猜 JavaScript 会将其首字母大写,其余字母小写。也就是说,ACTIVE -> java, c, c++ etc. Active -> JavaScript, C# etc.

标签: ruby-on-rails ruby enums


【解决方案1】:

在 Rails 中枚举应该是snake_case

为什么?因为枚举用于构造方法名称。 Ruby 中的方法名应该是snake_caseaccording to the community convention。使用 ALLCAPSCamelCase 可能会导致错误和混乱,因为 Ruby 将此类标识符视为常量。

ActiveRecord::Enum 无法与 Java 等语言级别的枚举构造相媲美。

声明一个枚举属性,其中值映射到 数据库,但可以按名称查询。
http://api.rubyonrails.org/classes/ActiveRecord/Enum.html

ActiveRecord::Enum 中的键映射不是常量。相反,它只是一个与 Ruby 风格的元编程一起使用的列表,它添加了一些方法来使位掩码列更容易(并且更有趣)使用。

在您的示例中,它实际上类似于:

enum status: [ :ACTIVE, :DRAFT, :INACTIVE ] 

枚举类型是一种特殊的数据类型,它使变量能够 一组预定义的常量。变量必须等于以下之一 为它预定义的值。常见的例子包括 罗盘方向(NORTH、SOUTH、EAST 和 WEST 的值)和 一周中的几天。
https://docs.oracle.com/javase/tutorial/java/javaOO/enum.html

Java 中的枚举基本上是美化的 switch 语句,其中类常量表示可能的值。

【讨论】:

    【解决方案2】:

    这是有道理的,因为 rails 还通过这些枚举的名称提供实例方法(例如:obj.active?)。这是RAILS中的枚举被用作小写的唯一原因吗?

    我认为这是主要原因,是的。在 ruby​​ 中使用 obj.Active?obj.ACTIVE? 这样的方法是非常不习惯的。已经不需要任何理由了。 :)

    【讨论】:

    • 没错,当我第一次这样创建时,有这样的方法名称感觉很奇怪。
    • “在 ruby​​ 中拥有像 obj.Active? 这样的方法是非常不习惯的”——Kernel#Integer() 和家人呢?
    • @mudasobwa 我知道有人会弹出这个。 :) 这些是转换方法。与故意类同名。与普通方法非常不同(在意图上)。
    • @mudasobwa: 你敢给我找一个遵循这个命名约定的谓词:)
    • 我可以生产一个特定的宝石,等到它在 GH 上产生 1OK 星然后回来......但是,是的,你是对的 :)
    猜你喜欢
    • 2023-01-18
    • 1970-01-01
    • 1970-01-01
    • 2015-10-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-22
    相关资源
    最近更新 更多