是否有一種在Ruby中編寫每個塊的單行方法?Ruby中每塊可能有一行嗎?
cats.each do |cat|
cat.name
end
我試圖縮短我的項目中的代碼量。我正在使用Ruby 1.9.2。
謝謝!
是否有一種在Ruby中編寫每個塊的單行方法?Ruby中每塊可能有一行嗎?
cats.each do |cat|
cat.name
end
我試圖縮短我的項目中的代碼量。我正在使用Ruby 1.9.2。
謝謝!
是的,你可以這樣寫:
cats.each { |cat| cat.name }
或者simply:
cats.each(&:name)
注意Enumerable#each
返回相同的對象你迭代(cats
),所以它纔有意義使用它如果你在這個區塊內執行某種副作用。最有可能的,你想獲得貓的名字,所以你會使用Enumerable#map表達,而不是:
cat_names = cats.map(&:name)
只需刪除換行符:
cats.each do |cat| cat.name end
注意,有兩種不同的編碼風格,當談到阻止。一個編碼風格說要總是使用do
/end
爲其跨越多行和總是使用{
/單行塊}
塊。如果你按照那個學校,你應該寫
cats.each {|cat| cat.name }
另一個風格是總是使用do
/end
對於這些主要是由於它們的副作用執行和塊{
/}
爲塊,其主要用於執行他們的回報價值。由於each
拋棄了該塊的返回值,因此只有通過阻止其副作用纔有意義,因此,如果您關注該學校,則應該使用do
/end
來編寫它。
但作爲@tokland提到,越慣用的方法是將寫
cats.each(&:name)
我使用鋼軌控制檯另一個技巧/ IRB是分離與命令「;」例如
[1,2].each do |e| ; puts e; end
for cat in cats;cat.name;end
應該做到這一點。
這非常難看,請看看接受的答案。你應該避免「;」儘可能的代碼易讀性。或者至少在跳線上添加空格。另外一個問題是要求「阻止一個班輪」而不是。 –
試試這個cats.each {| cat | cat.name} –