如何在ruby类文件中声明用于类声明的变量?

时间:2018-02-17 03:16:10

标签: ruby

所以我有一个类文件:

require 'forwardable'
require 'json'
require 'plissken'

$obj_keys = [
  :id,
  :title,
  # ...
]

$attributes_struct = Struct.new(*$obj_keys)

module MyModule
  class MyClass
    extend Forwardable

    attr_reader :attributes
    delegate $obj_keys => :attributes

    def initialize(data={})
        @attributes = $attributes_struct(*data.values)

我不希望$obj_keys$attributes_struct成为全局变量,但我不确定如何声明它们以便我仍然可以使用相同的工作逻辑。如何在此文件中以不同方式声明$obj_keys$attributes_struct

1 个答案:

答案 0 :(得分:1)

无论如何,变量在逻辑上都属于类,所以你可以在类中移动它们作为常量:

module MyModule
  class MyClass

    OBJ_KEYS = [
        :id,
        :title,
        # ...
    ]

    ATTRIBUTES_STRUCT = Struct.new(OBJ_KEYS)

...

但是,不需要单独的obj_keys变量。此外,对于Struct.new返回的类的读者来说,它有助于像其他类一样大写(蛇形)。所以这可能是一个更好的方法:

module MyModule
  class MyClass

    Attributes = Struct.new(:id, :title)

您始终可以从运行时获取有关该类的信息:

2.5.0 :001 > Attributes = Struct.new(:id, :title)
 => Attributes
2.5.0 :002 > Attributes.instance_methods(false)
 => [:title, :id=, :title=, :id]
2.5.0 :003 > attrs = Attributes.new(1, 'Hello')
 => #<struct Attributes id=1, title="Hello">
2.5.0 :004 > attrs.to_h
 => {:id=>1, :title=>"Hello"}
2.5.0 :005 > attrs.to_h.keys
 => [:id, :title]