Stare (i „z odpowiedzią”) pytanie, ale w odpowiedzi dorzucę moje dwa centy.
TL; DR - nie musisz, ale w niektórych przypadkach może to uczynić twój kod bardziej przejrzystym.
Chociaż nieużywanie wyraźnego zwrotu może być „sposobem Rubiego”, jest to mylące dla programistów pracujących z nieznanym kodem lub niezaznajomionych z tą funkcją Rubiego.
To nieco wymyślony przykład, ale wyobraź sobie taką małą funkcję, która dodaje jeden do przekazanej liczby i przypisuje ją do zmiennej instancji.
def plus_one_to_y(x)
@y = x + 1
end
Czy miała to być funkcja zwracająca wartość, czy nie? Naprawdę trudno powiedzieć, co miał na myśli programista, ponieważ zarówno przypisuje zmienną instancji, jak i zwraca również przypisaną wartość.
Załóżmy, że dużo później, inny programista (być może nie tak dobrze zaznajomiony z tym, jak Ruby zwraca na podstawie ostatniej linii wykonanego kodu) pojawia się i chce umieścić kilka instrukcji print do logowania, a funkcja staje się następująca ...
def plus_one_to_y(x)
@y = x + 1
puts "In plus_one_to_y"
end
Teraz funkcja jest zepsuta, jeśli cokolwiek oczekuje zwróconej wartości . Jeśli nic nie oczekuje zwróconej wartości, wszystko jest w porządku. Oczywiście, jeśli gdzieś dalej w łańcuchu kodu coś wywołującego to oczekuje zwróconej wartości, zakończy się niepowodzeniem, ponieważ nie odzyska tego, czego oczekuje.
Prawdziwe pytanie brzmi teraz: czy coś naprawdę spodziewało się zwróconej wartości? Czy to coś zepsuło, czy nie? Czy to coś zepsuje w przyszłości? Kto wie! Dowiesz się tylko o pełnym przeglądzie kodu wszystkich połączeń.
Tak więc przynajmniej dla mnie najlepszym podejściem jest albo bardzo wyraźne, że zwracasz coś, jeśli ma to znaczenie, albo w ogóle nic nie zwracasz, gdy tak nie jest.
Więc w przypadku naszej małej funkcji demo, zakładając, że chcemy, aby zwracała wartość, byłoby to zapisane w ten sposób ...
def plus_one_to_y(x)
@y = x + 1
puts "In plus_one_to_y"
return @y
end
Dla każdego programisty byłoby bardzo jasne, że zwraca wartość, a znacznie trudniej byłoby mu ją złamać, nie zdając sobie z tego sprawy.
Alternatywnie można napisać to w ten sposób i pominąć instrukcję return ...
def plus_one_to_y(x)
@y = x + 1
puts "In plus_one_to_y"
@y
end
Ale po co zawracać sobie głowę pomijaniem słowa zwrot? Dlaczego nie po prostu go tam umieścić i wyjaśnić w 100%, co się dzieje? Dosłownie nie będzie to miało wpływu na zdolność twojego kodu do działania.