Làm thế nào tôi có thể làm cho này ngắn hơn và khả năng mở rộng:Làm thế nào để DRY trong Ruby?
def overview puts "All As:" for f in @a puts f end puts "\n" puts "All Bs:" for f in @b puts f end end
Làm thế nào tôi có thể làm cho này ngắn hơn và khả năng mở rộng:Làm thế nào để DRY trong Ruby?
def overview puts "All As:" for f in @a puts f end puts "\n" puts "All Bs:" for f in @b puts f end end
for f in @a
puts f
end
chúng ta có thể viết
puts @a.join("\n")
Trong trường hợp tổng quát, khi bạn muốn làm điều gì đó với một vài mảng, bạn có thể đặt các mảng vào một mảng và sau đó sử dụng each
ví dụ:
[@a, @b].each do |list|
list.each { |value| puts value }
end
và một khi bạn bắt đầu làm việc gì đó phức tạp hơn chỉ cần in ra giá trị, hãy sử dụng phương pháp trích xuất phương pháp trích xuất hoạt động bạn đang thực hiện, ví dụ:
[@a, @b].each do |list|
do_something_with list
end
Cuối cùng, nếu bạn cần để giữ cho nhãn mô tả ("Tất cả Như" vv), bạn có thể sử dụng một hash:
{'As' => @a, 'Bs' => @b}.each_pair do |label, values|
puts "All #{label}"
puts values.join("\n")
end
Nhưng nó sử dụng nhiều bộ nhớ hơn. – Hongli
có cách nào để có ít nhất một nhãn/thẻ nhỏ cho @a và @b được in không? câu hỏi được trả lời trong phần thứ hai của bạn! cảm ơn! – poseid
Nhận xét của Hongli đã được đăng trước khi tôi mở rộng câu trả lời với nhiều đề xuất. Để rõ ràng, anh ta đề cập đến việc sử dụng 'join' để tạo một chuỗi mới chứa tất cả các giá trị. – mikej
Chỉ cần đoán ...
def overview
puts "All As:"
puts_a(@a)
puts "\n"
puts "All Bs:"
puts_a(@b)
end
def puts_a(strs)
for str in strs
puts str
end
end
Tôi muốn làm điều gì đó như thế:
def overview
[@a, @b].each do |e|
puts e.join("\n")
end
end
def print_all(header, ary)
puts header
for f in ary
puts f
end
end
def overview
print_all("All As:", @a)
puts
print_all("All Bs:", @b)
end
'cho f trong ary; đặt f; kết thúc 'là không cần thiết. Chỉ cần 'đặt ary' sẽ thực hiện công việc. – steenslag
Không sử dụng 'for'. – Reactormonk