我无法弄清楚即使第一次执行该对象如何聪明地忽略下面的代码块。
它正在搜索的方法是在每个模块上
class A
include B,C,D,B
end
ruby是否保留了一组模块名称(因为它显然称为D
)?
答案 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;父类。您还可以看到模块始终只包含一次。因此,如果一个类已经包含一个模块,它将不会再次被重新包含。