关于ruby,include
是什么原因是私有的,而Object#extend
是公开的?关于ruby,为什么包括private和extend是公共的?
回答
Object#extend
已将公开,否则您将无法使用它。毕竟,它的目的是将一个模块混合到一个对象中,所以你通常将它称为obj.extend(Foo)
,这对于私有方法来说是不可能的。
Module#include
通常只使用的模块体的内部,像这样:
class Bar
include Foo
end
即它通常被称为没有接收器,所以它不必公开。当然,也不是也是私有的。
我的猜测是,为什么它是私有的是,它是更具侵入性的原因,因为它改变了的Bar
每实例的行为,而Object#extend
只改变一个对象。因此,Module#include
在某种意义上是“更危险的”,因此是私人的。
我不知道这是否是实际原因,但它与其他类似方法如Module#define_method
一致。
它不*有*。如果它是私有的,你可以使用它:'obj.send(:extend,Foo)','obj.instance_eval {extend Foo}',不包括模块class Bar的情况;延伸Foo;结束' – 2012-06-02 20:39:17
@ Marc-AndréLafortune:或者'class << obj;延伸Foo;当然了。就像我说的,这只是一个猜测。 – 2012-06-02 22:26:26
我回复你的第一句话:“Object#extend'必须是公开的,否则你将无法使用它。” – 2012-06-02 23:43:02
为了能够在任何时候运行Foo.include(Bar)
很可能是非常讨厌的错误的来源。
为了补充约尔格W¯¯米塔格的回答,对象#扩展也可用于包括模块的实例方法的类等级中使用(这也将提供给该类的所有实例):
module Foo
def bar (baz)
end
end
class Qux
extend Foo
bar 'asdf'
end
- 1. C++和Ruby共享公共类的最佳方法是什么?
- 2. JavaScript:什么是.extend和.prototype用于?
- 3. Ruby的包括什么是相反的?
- 4. Dojo:有什么关于'class extend'的吗?
- 5. 为什么这个公共字段有一个PRIVATE标志?
- 6. 什么是Ruby中的Object :: private和Object :: public?
- 7. 什么是公共接口?
- 8. Ruby中的private和private_class_method关键字
- 9. Ruby中的include和extend有什么区别?
- 10. 为什么'Private Sub`而不是`Public Sub`
- 11. 什么是包括用C
- 12. 什么是“#包括‘myfile.php’做
- 13. Github公共密钥的公共URL是什么
- 14. Ext.Container不包括公共click事件
- 15. 是什么公共财产,朋友和公共变量在VB6的区别
- 16. 为什么“Extracted Interfaces”是内部的而不是公共的?
- 17. 什么是AWS公共IP限制? (公共IP不弹性IP)
- 18. 为什么有些领域是公共的,有些是属性?
- 19. Instagram的API包括hashtag和内容使用公共应用
- 20. 什么是C#相当于公共最后静态的Java中
- 21. C++和Ruby之间的关系和依赖关系是什么?
- 22. 为什么Apache的公共数学基于int分数?
- 23. Yocto:为什么要包括一个包?
- 24. 公共保护是什么意思?
- 25. c中的“PRIVATE int func_name()”中的“PRIVATE”是什么?
- 26. 为什么Joomla不使用私人,公共和受保护的关键字?
- 27. 为OOP描述公共封装的目的是什么?
- 28. 为什么java.io.FileDescriptor的构造函数是公共的?
- 29. 什么是公共类[接口]在vb.net是什么意思?
- 30. 闭包的括号是什么意思?
谢谢您的回答! – 2010-11-19 08:35:32