ruby-on-rails – 在父级中使用派生类的属性
发布时间:2020-12-17 02:22:29 所属栏目:百科 来源:网络整理
导读:我正在尝试使用define_method为从超类继承的类创建其他方法: class Child Parent ADDITIONAL_METHODS += ['xyz','qwe']endclass Parent ADDITIONAL_METHODS = ['common'] ADDITIONAL_METHODS.each do |key| define_method key do ... end endend 这不起作用
我正在尝试使用define_method为从超类继承的类创建其他方法:
class Child < Parent ADDITIONAL_METHODS += ['xyz','qwe'] end class Parent ADDITIONAL_METHODS = ['common'] ADDITIONAL_METHODS.each do |key| define_method key do ... end end end 这不起作用,因为ADDITIONAL_METHODS始终取自Parent类,并且创建的唯一方法是常见的.有没有办法从派生类访问该属性? 解决方法
示例代码不起作用,因为在声明Parent之前使用Parent作为Child的祖先.
这会产生这个错误: uninitialized constant Parent (NameError) 如果它实际上适合你,则意味着父确实在Child之前声明了.在这种情况下,ADDITIONAL_METHODS上的#each循环在Child甚至存在之前执行,因为您在方法定义之外的类中给出的指令会立即执行: class Foo def initialize puts "second" end puts "first" end Foo.new puts "third" 产出: first second third 解 您可能希望实现一个类方法并立即调用它来执行它. class Parent private def self.add_my_methods( *methods ) ( methods.empty? ? [ 'common' ] : methods ).each do |key| define_method key do p key end end end add_my_methods # will implement "common" end class Child < Parent add_my_methods 'xyz','qwe' end c = Child.new c.common # outputs "common" c.xyz # outputs "xyz" c.qwe # outputs #qwe" 对于后代的元编程,这是一种常见的模式,就像您可能已经使用#has_many,#before_filter等方法遇到的那样. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |