2011-01-26 168 views
0

創建對象實例

x = Class.new(or method) 
x.method 

Class.new(or method) do |x| 
x.method 
end 
+1

當你說`Class.new`時,你的字面意思是`Class.new`還是你使用`Class`作爲實際類的佔位符? – sepp2k 2011-01-26 20:09:48

回答

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方法不會做的事情塊,塊的內容永遠不會運行。