如何在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属性/帮助器。这听起来很合理。