2012-06-12 33 views
31

是否有一種在Ruby中編寫每個塊的單行方法?Ruby中每塊可能有一行嗎?

cats.each do |cat| 
    cat.name 
end 

我試圖縮短我的項目中的代碼量。我正在使用Ruby 1.9.2。

謝謝!

+5

試試這個cats.each {| cat | cat.name} –

回答

42

是的,你可以這樣寫:

cats.each { |cat| cat.name } 

或者simply

cats.each(&:name) 

注意Enumerable#each返回相同的對象你迭代(cats),所以它纔有意義使用它如果你在這個區塊內執行某種副作用。最有可能的,你想獲得貓的名字,所以你會使用Enumerable#map表達,而不是:

cat_names = cats.map(&:name) 
+0

如果我想要做這樣的事情(目前是兩行代碼),那麼該怎麼辦:User.where(:email => /[email protected]/)each do | user | user.destroy end – Goalie

+1

'User.where(:email => /[email protected] /)。each(&:destroy)'。這裏'each'是有道理的,因爲摧毀是一個副作用。但我會寫:'User.destroy_all(:email => /[email protected]/)' – tokland

46

只需刪除換行符:

cats.each do |cat| cat.name end 

注意,有兩種不同的編碼風格,當談到阻止。一個編碼風格說要總是使用do/end爲其跨越多行和總是使用{ /單行塊}塊。如果你按照那個學校,你應該寫

cats.each {|cat| cat.name } 

另一個風格是總是使用do/end對於這些主要是由於它們的副作用執行和塊{/}爲塊,其主要用於執行他們的回報價值。由於each拋棄了該塊的返回值,因此只有通過阻止其副作用纔有意義,因此,如果您關注該學校,則應該使用do/end來編寫它。

但作爲@tokland提到,越慣用的方法是將寫

cats.each(&:name) 
9

我使用鋼軌控制檯另一個技巧/ IRB是分離與命令「;」例如

[1,2].each do |e| ; puts e; end 
-2
for cat in cats;cat.name;end 

應該做到這一點。

+0

這非常難看,請看看接受的答案。你應該避免「;」儘可能的代碼易讀性。或者至少在跳線上添加空格。另外一個問題是要求「阻止一個班輪」而不是。 –

相關問題