include
在红宝石上,私有的原因是什么,Object#extend
而是公共的?
问问题
2864 次
3 回答
10
Object#extend
必须是公开的,否则你将无法使用它。毕竟,它的目的是将模块混入对象中,因此您通常将其称为 like obj.extend(Foo)
,这对于私有方法是不可能的。
Module#include
通常只在模块体内使用,如下所示:
class Bar
include Foo
end
即它通常在没有接收器的情况下被调用,因此它不必是公开的。当然,它也不必是私有的。
我的猜测是它是私有的原因是它更具侵入性,因为它改变了每个实例的行为Bar
,而Object#extend
只改变了一个对象。因此,Module#include
在某种意义上“更危险”,因此被设为私有。
我不知道这是否是实际原因,但它与其他类似的方法如Module#define_method
.
于 2010-11-18T13:11:45.040 回答
1
能够Foo.include(Bar)
在任何时候运行很可能是非常讨厌的错误的来源。
于 2010-11-18T14:48:15.367 回答
1
为了补充 Jörg W Mittag 的回答,Object#extend 也可用于包含要在类级别使用的模块实例方法(该类的所有实例也可以使用):
module Foo
def bar (baz)
end
end
class Qux
extend Foo
bar 'asdf'
end
于 2010-12-01T21:29:10.157 回答