Câu hỏi cũ (và "đã trả lời"), nhưng tôi sẽ ném hai xu của mình làm câu trả lời.
TL; DR - Bạn không cần phải làm vậy, nhưng nó có thể làm cho mã của bạn rõ ràng hơn rất nhiều trong một số trường hợp.
Mặc dù không sử dụng trả lại rõ ràng có thể là "cách của Ruby", nhưng thật khó hiểu với các lập trình viên làm việc với mã không quen thuộc hoặc không quen thuộc với tính năng này của Ruby.
Đó là một ví dụ hơi khó hiểu, nhưng hãy tưởng tượng có một hàm nhỏ như thế này, thêm một số vào số đã truyền và gán nó cho một biến thể hiện.
def plus_one_to_y(x)
@y = x + 1
end
Đây có phải là một hàm trả về một giá trị hay không? Thật sự rất khó để nói ý nghĩa của nhà phát triển, vì cả hai đều gán biến thể hiện, và cũng trả về giá trị được gán.
Giả sử sau đó, một lập trình viên khác (có lẽ không quen thuộc với cách Ruby trả về dựa trên dòng mã cuối cùng được thực thi) xuất hiện và muốn đưa vào một số câu lệnh in để ghi nhật ký, và hàm này trở thành ...
def plus_one_to_y(x)
@y = x + 1
puts "In plus_one_to_y"
end
Bây giờ chức năng bị phá vỡ nếu bất cứ điều gì mong đợi một giá trị trả về . Nếu không có gì mong đợi một giá trị trả về, nó là tốt. Rõ ràng nếu ở đâu đó xa hơn chuỗi mã, một cái gì đó gọi đây là giá trị được trả về, nó sẽ thất bại vì nó không lấy lại được những gì nó mong đợi.
Câu hỏi thực sự bây giờ là đây: có điều gì thực sự mong đợi một giá trị được trả về không? Điều này đã phá vỡ một cái gì đó hay không? Nó sẽ phá vỡ một cái gì đó trong tương lai? Ai biết! Chỉ một đánh giá mã đầy đủ của tất cả các cuộc gọi sẽ cho bạn biết.
Vì vậy, đối với tôi ít nhất, cách tiếp cận thực tiễn tốt nhất là hoặc rất rõ ràng rằng bạn đang trả lại một cái gì đó nếu nó quan trọng, hoặc không trả lại bất cứ điều gì khi nó không.
Vì vậy, trong trường hợp hàm demo nhỏ của chúng tôi, giả sử chúng tôi muốn nó trả về một giá trị, nó sẽ được viết như thế này ...
def plus_one_to_y(x)
@y = x + 1
puts "In plus_one_to_y"
return @y
end
Và nó sẽ rất rõ ràng với bất kỳ lập trình viên nào rằng nó trả về một giá trị, và khó hơn nhiều để họ phá vỡ nó mà không nhận ra nó.
Ngoài ra, người ta có thể viết nó như thế này và bỏ qua tuyên bố trả lại ...
def plus_one_to_y(x)
@y = x + 1
puts "In plus_one_to_y"
@y
end
Nhưng tại sao phải bỏ đi từ trở lại? Tại sao không đặt nó vào đó và làm cho nó rõ ràng 100% những gì đang xảy ra? Nó thực sự sẽ không ảnh hưởng đến khả năng thực hiện mã của bạn.