2009-09-14 62 views
4

是否有任何理由這樣做使用塊初始化,就像這樣:使用塊初始化有什麼好處嗎?

x = Observer.new do 
    add_event(foo) 
    some_other_instance_method_on_observer 
    self.some_attribute = something 
end 

使用點運算符的一個實例變量,像這樣的初始化屬性,而不是:

x = Observer.new 
x.add_event(foo) 
x.some_other_instance_method_on_observer 
x.some_attribute = something 

回答

5

這裏唯一的原因是有更簡潔的代碼(您不必在方法調用之前添加實例名稱)。通常使用塊可以編寫非常簡潔易讀的代碼。有時候你可以節省你的代碼消費者大量的輸入甚至代碼邏輯。 這是一個傳統的案例!

file = File.open("some_file.txt","w") 
file << "more code" 
file.close 

比較它這個漂亮的塊替代:

File.open("some_file.txt","w") { |file| file << "adding new stuff" } 

它不必打開的麻煩和close(我個人一直忘了這一個)的文件中保存自己的用戶。相反,這讓他專注於他想要的東西。

嘗試,當你想寫得真好DSL的投資塊在這種情況下+。

4

一個優點是,它使很明顯,這些附加操作是初始化操作。

1

基於khell的答案,在塊內創建的變量超出了塊的範圍,如果您沒有更多使用它,這是件好事。

0

如果你的代碼是一個方法,它返回的對象。比較

def create_observer 
    Observer.new {|x| x.foo, x.bar = calculate_foo, calculate_bar } 
end 

def create_observer 
    x = Observer.new 
    x.foo = calculate_foo 
    x.bar = calculate_bar 
    x 
end 

因此,使用塊可能會允許您將邏輯寫入一行。 即使你在第二個例子中使用並行作業,你仍然需要3行。

另外,檢查出taphere。它有類似的好處。