Q
創建對象實例
0
A
回答
1
之間的差別取決於類。例如對於File
對象,
File.open("foo.txt", "wb") do |f|
f.write("x")
end
當塊退出時,文件句柄將自動關閉。但這只是習慣用法,通常這個類定義了語義,並且選擇它是否爲塊提供變體。
6
x = SomeClass.new
x.some_method
這首先創建的SomeClass
一個實例(調用initialize
不帶參數)。然後在該實例上調用方法some_method
。
SomeClass.new do |x|
x.some_method
end
這產生的SomeClass
一個實例,調用initialize
與塊作爲其參數。該塊帶有一個參數,並在該參數上調用some_method
。塊的調用方式以及調用的頻率取決於SomeClass
的初始化方法。
在許多情況中圖案
SomeClass.some_creation_method do |x|
x.some_method
end
被使用,以使得some_creation_method
創建SomeClass
實例,它產生的塊,然後釋放該塊完成後使用該實例的所有資源(例如,它可能關閉文件句柄,刪除臨時文件等)。這是File.open
所做的。
在所討論的類是從字面上Class
的情況下的塊將class_eval
版上新建立的類,即
c = Class.new do
some_code
end
相當於
c = Class.new
c.class_eval do
some_code
end
1
這裏是一個簡單的例子表明這兩者不相同。如果您的課程的initialize
方法最後名爲yield(self)
,它們只會相當。
class MyClass
def initialize(name)
@name = name
end
def say_hi
puts "Hi, I am #{@name}"
end
end
x = MyClass.new("Bob")
x.say_hi
#=> Hi, I am Bob
MyClass.new("Jim") do |x|
x.say_hi
end
#=> (nothing prints out)
在第二個例子中,我傳遞一個塊new
,但因爲我的initialize
方法不會做的事情塊,塊的內容永遠不會運行。
相關問題
- 1. 在實例對象中創建JFrame
- 2. Java創建地圖對象的實例
- 3. 創建新的實例對象
- 4. 的Flex對象創建一倍實例
- 5. 如何創建對象的實例?
- 6. 全局創建對象實例
- 7. Asp.net MVC4,C#創建對象實例
- 8. 新陣列(_)填充(對象)不創建對象的新實例
- 9. 從實物創建ASMX存根對象的一個實例
- 10. 創建實例
- 11. 創建實例
- 12. 創建實例
- 13. 我如何獲得在php中創建另一個對象實例的實例?
- 14. 銷燬對象的舊實例並在循環中創建新實例
- 15. 無法創建抽象類的實例
- 16. 什麼時候創建第一個Python對象的「對象」和「類型」實例?
- 17. Django 1.9更新模型對象創建一個新對象實例
- 18. Node.js對象實例是否爲每個用戶創建一個對象?
- 19. 有沒有辦法獲得創建另一個對象的對象的實例?
- 20. NEST過濾源並使用對象構造函數創建對象的實例
- 21. 創建未設置爲對象實例的Outlook應用程序對象引用
- 22. EntityFramework對象未在模型創建中設置爲對象的實例
- 23. MVVM - ConfigurationManager創建「對象引用未設置爲對象的實例」錯誤
- 24. 對象實例沒有新建?
- 25. 創建子類的實例是否會自動創建其超類對象?
- 26. 反射 - 不能創建一個新的對象實例C#
- 27. 在Python中創建對象實例的問題
- 28. 創建一個對象[多個相同的實例]
- 29. 在C++中創建「對象的新實例」方法
- 30. 訪問,而無需創建對象實例的原型屬性
當你說`Class.new`時,你的字面意思是`Class.new`還是你使用`Class`作爲實際類的佔位符? – sepp2k 2011-01-26 20:09:48