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

如何在ruby类文件中声明用于类声明的变量?,ruby,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 dele

因此,我有一个类文件,如:

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_key和$attributes_struct?

变量在逻辑上属于类内部,因此您可以将它们作为常量移动到类内部:

module MyModule
  class MyClass

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

    ATTRIBUTES_STRUCT = Struct.new(OBJ_KEYS)

但是,实际上不需要单独的obj_keys变量。另外,它对Struct返回的类的读者也很有帮助。new与其他类一样是大写的snake case。因此,这可能是一个更好的方法:

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]

很抱歉,但我不清楚您为什么首先引入全局变量和委托。你能解释一下你以后想如何使用MyClass吗?你到底想达到什么目的?难道你不能创建一个模块并将它们包含在课堂中吗?谢谢,这很有意义。尽管我认为我仍然需要OBJ_KEYS变量来执行委托逻辑。使用结构的方法增加了一些复杂性,而不仅仅是使结构的属性成为include类的实例变量,并使用attr_访问器为它们创建访问方法。你的情况有什么值得付出代价的?好问题。我计划将响应中的json对象存储到属性中。我认为我的推理是将json对象属性与ruby定义的实例方法和其他attr_访问器分开,这样我和其他开发人员就可以清楚地知道哪些属性是json对象的直接结果,哪些属性是ruby属性/帮助器。这听起来很合理。