class Child < Parent ADDITIONAL_METHODS += ['xyz','qwe']endclass Parent ADDITIONAL_METHODS = ['common'] ADDITIONAL_METHODS.each do |key| define_method key do ... end endend
这不起作用,因为ADDITIONAL_METHODS始终取自Parent类,并且创建的唯一方法是常见的.有没有办法从派生类访问该属性?
解决方法 示例代码不起作用,因为在声明Parent之前使用Parent作为Child的祖先.这会产生这个错误:
uninitialized constant Parent (nameError)
如果它实际上适合你,则意味着父确实在Child之前声明了.在这种情况下,ADDITIONAL_METHODS上的#each循环在Child甚至存在之前执行,因为您在方法定义之外的类中给出的指令会立即执行:
class Foo def initialize puts "second" end puts "first"endFoo.newputs "third"
产出:
firstsecondthird
解
您可能希望实现一个类方法并立即调用它来执行它.
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"endclass Child < Parent add_my_methods 'xyz','qwe'endc = Child.newc.common # outputs "common"c.xyz # outputs "xyz"c.qwe # outputs #qwe"
对于后代的元编程,这是一种常见的模式,就像您可能已经使用#has_many,#before_filter等方法遇到的那样.
总结以上是内存溢出为你收集整理的ruby-on-rails – 在父级中使用派生类的属性全部内容,希望文章能够帮你解决ruby-on-rails – 在父级中使用派生类的属性所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)