【问题标题】:Ruby - File for EnumsRuby - 枚举文件
【发布时间】:2016-02-03 16:23:34
【问题描述】:

在 C# 中,我习惯于创建一个名为“Enums.cs”的文件,并在其中定义我的应用程序需要的所有枚举...我认为这样做更容易。现在使用 Ruby,我阅读并选择了 module 方法来定义枚举,因为我可以将 int 与“单词”相关联,例如:

module ContractType
  Undefined = 0
  Internship = 1
  CLT = 2
  Contractor = 4
end

现在我怎样才能让我的“用户”模型公开像newGuy.CurrentContractType = ContractType.Internship 这样的属性?!?

我是否import 模块? extend?或者我应该引用所有枚举所在的GlobalEnums.rb 文件?

【问题讨论】:

    标签: c# ruby-on-rails ruby enums


    【解决方案1】:

    好问题。只需 require 文件顶部的 GlobalEnums.rb 模块,然后像这样引用模块和常量:

    newGuy.currentContractType = ContractType::Internship
    

    您会注意到,在 Ruby 中,:: 用于引用命名空间(类或模块)中的常量,而不是 .。如果你有不止一层的嵌套,你只需链接::s:

    module Foo
      module Bar
        class Baz
          Qux = "quux"
        end
      end
    end
    
    p Foo::Bar::Baz::Qux
    # => "quux"
    

    附:我建议浏览一下 Ruby 风格指南 such as this one,尤其是 Naming section。除了极少数例外,Ruby 中的方法和变量名称为 snake_case。模块和类名是CamelCase,其他常量通常是SCREAMING_CAMEL_CASE

    考虑到这一点,经验丰富的 Rubyist 可能会这样编写您的代码:

    module MyApp
      module ContractType
        UNDEFINED = 0
        INTERNSHIP = 1
        CLT = 2
        CONTRACTOR = 4
      end
    end
    
    # Assuming this is somewhere inside the MyApp namespace...
    new_guy.current_contract_type = ContractType::INTERNSHIP
    

    例如,Integer(n) 之类的严格转换方法和URI(str)Nokogiri::XML(str) 之类的快捷构造函数。

    【讨论】:

    • 我应该require 'GlobalEnums.rb' 还是require 'ContractType'?如果它在不同的文件夹中是否重要?
    • 在 Ruby 中,您传递给 require 的参数应该对应于文件的名称,因此(取决于该文件的路径)它应该是 require 'GlobalEnums.rb'
    猜你喜欢
    • 2012-05-04
    • 1970-01-01
    • 2012-12-05
    • 2012-11-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多