ruby-on-rails – 在父级中使用派生类的属性

ruby-on-rails – 在父级中使用派生类的属性,第1张

概述我正在尝试使用define_method为从超类继承的类创建其他方法: class Child < Parent ADDITIONAL_METHODS += ['xyz', 'qwe']endclass Parent ADDITIONAL_METHODS = ['common'] ADDITIONAL_METHODS.each do |key| define_method 我正在尝试使用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

这不起作用,因为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 – 在父级中使用派生类的属性所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1276134.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-09
下一篇 2022-06-09

发表评论

登录后才能评论

评论列表(0条)

保存