關於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?
- 7. 什麼是Ruby中的Object :: private和Object :: public?
- 8. 什麼是公共密鑰
- 9. 什麼是公共接口?
- 10. Ruby中的private和private_class_method關鍵字
- 11. Private Dim和Private Property有什麼區別?
- 12. 是什麼區別包括和parsedinclude
- 13. 爲什麼'Private Sub`而不是`Public Sub`
- 14. Github公共密鑰的公共URL是什麼
- 15. 什麼是包括用C
- 16. 什麼是「#包括‘myfile.php’做
- 17. Ruby中的include和extend有什麼區別?
- 18. 爲什麼`private val`和`private final val`不同?
- 19. Ext.Container不包括公共click事件
- 20. 是什麼公共財產,朋友和公共變量在VB6的區別
- 21. 包括爲共同的HTML
- 22. 爲什麼「Extracted Interfaces」是內部的而不是公共的?
- 23. 爲什麼公共靜態類的類
- 24. 關於在公共類
- 25. 什麼是AWS公共IP限制? (公共IP不彈性IP)
- 26. 爲什麼有些領域是公共的,有些是屬性?
- 27. 公共靜態,公共和靜態方法有什麼區別?
- 28. 什麼是C#相當於公共最後靜態的Java中
- 29. Instagram的API包括hashtag和內容使用公共應用
- 30. C++和Ruby之間的關係和依賴關係是什麼?
謝謝您的回答! – 2010-11-19 08:35:32