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. mysqli_fetch_object時創建新的對象實例
- 2. 在實例對象中創建JFrame
- 3. 使用新詞創建對象實例
- 4. Java創建地圖對象的實例
- 5. 創建新的實例對象
- 6. 如何創建對象的實例?
- 7. Java對象實例創建問題
- 8. 全局創建對象實例
- 9. Asp.net MVC4,C#創建對象實例
- 10. Java創建深空對象的實例
- 11. 的Flex對象創建一倍實例
- 12. 如何基於對象名稱創建javascript對象的實例
- 13. 在注入對象時強制創建對象的新實例
- 14. 無法實例化對象:只創建第一個對象
- 15. 新陣列(_)填充(對象)不創建對象的新實例
- 16. 從實物創建ASMX存根對象的一個實例
- 17. 創建實例
- 18. 創建實例
- 19. 創建實例
- 20. 我如何獲得在php中創建另一個對象實例的實例?
- 21. 創建一個對象的新實例,或修改現有的實例?
- 22. 創建createjs對象的新實例每次都返回相同的實例
- 23. 無法創建抽象類的實例
- 24. 對象實例沒有新建?
- 25. 創建不同的對象實例列表,並使用這些對象
- 26. Javascript:從已經實例化的對象創建對象與原型
- 27. Django 1.9更新模型對象創建一個新對象實例
- 28. 什麼時候創建第一個Python對象的「對象」和「類型」實例?
- 29. 有沒有辦法獲得創建另一個對象的對象的實例?
- 30. Node.js對象實例是否爲每個用戶創建一個對象?
當你說`Class.new`時,你的字面意思是`Class.new`還是你使用`Class`作爲實際類的佔位符? – sepp2k 2011-01-26 20:09:48