0
我不能找出对象如何来很聪明无视即使首次执行下面的代码块。对象的方法查找路径(模块&方法重写)
它正在搜索的方法是在每个模块上
class A
include B,C,D,B
end
红宝石是否保持在侧模块名称的数组(因为它显然要D
)?
我不能找出对象如何来很聪明无视即使首次执行下面的代码块。对象的方法查找路径(模块&方法重写)
它正在搜索的方法是在每个模块上
class A
include B,C,D,B
end
红宝石是否保持在侧模块名称的数组(因为它显然要D
)?
我不是100%我明白你的问题,但我尽力......
红宝石实际上记住哪些模块被纳入一类和这些模块合并成方法查找路径。您可以使用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
你可以看到方法的解析顺序:子类 - >包含模块 - >父类。你也可以看到模块总是只包含一次。所以如果一个课程已经包含一个模块,它将不会再被重新包含。
A.included_modules?为我工作的足够好,足以告诉我,ruby保留了一组模块名称,并且我猜测它在这里所做的第一件事是通过该数组的所有元素,并查看是否有错误。谢谢! – 2012-01-16 00:25:14
你是什么意思“如果有问题”? Ruby有一个明确的方法解析顺序。意思是当提到它的名字时,它用来找到你正在调用的实际函数的算法。正如我所说,顺序是类 - >包含模块(按顺序尝试) - >父类。如果其中一个包含具有已定义名称的方法,则会使用它并且中止搜索。 – 2012-01-16 00:30:02
事实上,说的东西可能出问题我没有提的是,什么是错的,我只是说,显然,当我们去询问一个模块的时刻,如果响应某种形式的消息,什么红宝石确实是问自己included_modules,然后按照之前的说法做一些事情'一个包含的模块不会被重新引入'现在,我理解了关于方法查找路径的另一部分,但我知道它是如何工作的,因为它非常简单。这只是我把所有这些模块中声明 – 2012-01-16 00:40:51