2012-06-12 30 views
31

Có phương pháp viết một dòng này cho mỗi khối trong Ruby không?Có thể có một dòng mỗi khối trong Ruby không?

cats.each do |cat| 
    cat.name 
end 

Tôi đang cố gắng rút ngắn số lượng mã trong dự án của mình. Tôi đang sử dụng Ruby 1.9.2.

Cảm ơn!

+5

Thử mèo này.đọc {| cat | cat.name} –

Trả lời

42

Có, bạn sẽ viết:

cats.each { |cat| cat.name } 

Hoặc simply:

cats.each(&:name) 

Lưu ý rằng Enumerable#each trả về cùng một đối tượng bạn đang iterating trên (cats), vì vậy nó chỉ có ý nghĩa để sử dụng nó nếu bạn đang thực hiện một số loại tác dụng phụ trong khối. Nhiều khả năng, bạn muốn để có được những tên con mèo, vì vậy bạn sẽ sử dụng Enumerable#map biểu hiện thay vì:

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

Nếu tôi muốn làm một cái gì đó như thế này (hiện tại là hai lớp lót): User.where (: email => /[email protected]/).each do | user | user.destroy kết thúc – Goalie

+1

'User.where (: email => /[email protected] /). each (&: destroy)'. Ở đây 'mỗi' có ý nghĩa bởi vì phá hủy là một tác dụng phụ. Nhưng tôi muốn viết: 'User.destroy_all (: email => /[email protected]/)' – tokland

46

Chỉ cần loại bỏ các ngắt dòng:

cats.each do |cat| cat.name end 

Lưu ý, có hai kiểu mã hóa khác nhau khi nói đến để chặn. Một phong cách mã hóa nói với luôn sử dụng do/end cho các khối mà span nhiều dòng và luôn sử dụng {/} cho các khối dòng đơn. Nếu bạn làm theo trường đó, bạn nên viết

cats.each {|cat| cat.name } 

Phong cách khác là để luôn sử dụng do/end cho các khối mà chủ yếu được thực hiện đối với tác dụng phụ của họ và {/} cho các khối mà chủ yếu được thực hiện cho giá trị trả lại của chúng. Kể từ khi each ném đi giá trị trả về của khối, nó chỉ có ý nghĩa để vượt qua một khối cho các tác dụng phụ của nó, vì vậy, nếu bạn theo trường đó, bạn nên viết nó với do/end.

Nhưng khi @tokland đề cập, cách thành ngữ hơn sẽ được để viết

cats.each(&:name) 
9

Một trick mà tôi sử dụng cho đường ray giao diện điều khiển/IRB là lệnh với tách ';' ví dụ.

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

rằng nên làm điều đó quá.

+0

điều này rất xấu, hãy nhìn vào câu trả lời được chấp nhận. Bạn nên tránh ";" càng nhiều càng tốt cho khả năng đọc mã. Hoặc ít nhất là thêm dấu cách vào dòng nhảy. Ngoài ra câu hỏi yêu cầu "chặn một lớp lót" không cho. –

Các vấn đề liên quan