所以我有一个类文件:
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
?
答案 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]