对象的方法查找路径(模块和方法覆盖)

时间:2012-01-15 23:49:27

标签: ruby

我无法弄清楚即使第一次执行该对象如何聪明地忽略下面的代码块。

它正在搜索的方法是在每个模块上

class A
  include B,C,D,B
end

ruby​​是否保留了一组模块名称(因为它显然称为D)?

1 个答案:

答案 0 :(得分:2)

我不是100%我理解你的问题,但我尽我所能......

Ruby实际上会记住哪些模块包含在一个类中,并将这些模块合并到方法的查找路径中。您可以使用A.included_modules

向课程询问其包含的方法

包含模块的方法放在当前类中定义的模块之上。请看这个例子:

class X
  def foo
    puts 'Hi from X'
  end
end

module AnotherFoo
  def foo
    puts "Hi from AnotherFoo"
    super
  end
end

class Y < X
  include AnotherFoo
end

y = Y.new
y.foo
# Hi from another foo
# Hi from X

class Y < X
  include AnotherFoo
  def foo
    puts "Hi from Y"
    super
  end
end

y.foo
# Hi from Y
# Hi from another foo
# Hi from X

您可以看到方法解析顺序:子类 - &gt;包含的模块 - &gt;父类。您还可以看到模块始终只包含一次。因此,如果一个类已经包含一个模块,它将不会再次被重新包含。