加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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等方法遇到的那样.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读