Lan*_*ard 31 ruby introspection
列出所有定义方法的最短,单行方式是attr_accessor什么?我想这样做,如果我有一个类MyBaseClass,任何扩展它的东西,我可以attr_accessor在子类中定义.像这样的东西:
class MyBaseClass < Hash
def attributes
# ??
end
end
class SubClass < MyBaseClass
attr_accessor :id, :title, :body
end
puts SubClass.new.attributes.inspect #=> [id, title, body]
Run Code Online (Sandbox Code Playgroud)
如何显示attr_reader和attr_writer定义?
duk*_*ave 43
提取的属性在一个数组,将它们分配到一个恒定,那么图示它们到attr_accessor.
class SubClass < MyBaseClass
ATTRS = [:id, :title, :body]
attr_accessor(*ATTRS)
end
Run Code Online (Sandbox Code Playgroud)
现在您可以通过常量访问它们:
puts SubClass.ATTRS #=> [:id, :title, :body]
Run Code Online (Sandbox Code Playgroud)
sep*_*p2k 39
没有办法(单行或其他)列出attr_accessor定义的所有方法,只列出attr_accessor定义的方法而不定义自己的attr_accessor.
这是一个覆盖MyBaseClass中的attr_accessor的解决方案,用于记住使用attr_accessor创建的方法:
class MyBaseClass
def self.attr_accessor(*vars)
@attributes ||= []
@attributes.concat vars
super(*vars)
end
def self.attributes
@attributes
end
def attributes
self.class.attributes
end
end
class SubClass < MyBaseClass
attr_accessor :id, :title, :body
end
SubClass.new.attributes.inspect #=> [:id, :title, :body]
Run Code Online (Sandbox Code Playgroud)
继承人使用mixin而不是继承:
module TrackAttributes
def attr_readers
self.class.instance_variable_get('@attr_readers')
end
def attr_writers
self.class.instance_variable_get('@attr_writers')
end
def attr_accessors
self.class.instance_variable_get('@attr_accessors')
end
def self.included(klass)
klass.send :define_singleton_method, :attr_reader, ->(*params) do
@attr_readers ||= []
@attr_readers.concat params
super(*params)
end
klass.send :define_singleton_method, :attr_writer, ->(*params) do
@attr_writers ||= []
@attr_writers.concat params
super(*params)
end
klass.send :define_singleton_method, :attr_accessor, ->(*params) do
@attr_accessors ||= []
@attr_accessors.concat params
super(*params)
end
end
end
class MyClass
include TrackAttributes
attr_accessor :id, :title, :body
end
MyClass.new.attr_accessors #=> [:id, :title, :body]
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
20499 次 |
| 最近记录: |