Coming from a Python background, where there is always a "right way to do it" (a "Pythonic" way) when it comes to style, I'm wondering if the same exists for Ruby. I've been using my own style guidelines but I'm thinking about releasing my source code, and I'd like it to adhere to any unwritten rules that might exist.
Is it "The Ruby Way" to explicitly type out return
in methods? I've seen it done with and without, but is there a right way to do it? Is there maybe a right time to do it? For example:
def some_func(arg1, arg2, etc)
# Do some stuff...
return value # <-- Is the 'return' needed here?
end
Old (and "answered") question, but I'll toss in my two cents as an answer.
TL;DR - You don't have to, but it can make your code a lot more clear in some cases.
Though not using an explicit return may be "the Ruby way", it's confusing to programmers working with unfamiliar code, or unfamiliar with this feature of Ruby.
It's a somewhat contrived example, but imagine having a little function like this, which adds one to the number passed, and assigns it to an instance variable.
def plus_one_to_y(x)
@y = x + 1
end
Was this meant to be a function that returned a value, or not? It's really hard to say what the developer meant, as it both assigns the instance variable, AND returns the value assigned as well.
Suppose much later, another programmer (perhaps not that familiar with how Ruby does returns based on last line of code executed) comes along and wants to put in some print statements for logging, and the function becomes this...
def plus_one_to_y(x)
@y = x + 1
puts "In plus_one_to_y"
end
Now the function is broken if anything expects a returned value. If nothing expects a returned value, it's fine. Clearly if somewhere further down the code chain, something calling this is expecting a returned value, it's going to fail as it's not getting back what it expects.
The real question now is this: did anything really expect a returned value? Did this break something or not? Will it break something in the future? Who knows! Only a full code review of all calls will let you know.
So for me at least, the best practice approach is to either be very explicit that you are returning something if it matters, or return nothing at all when it doesn't.
So in the case of our little demo function, assuming we wanted it to return a value, it would be written like this...
def plus_one_to_y(x)
@y = x + 1
puts "In plus_one_to_y"
return @y
end
And it would be very clear to any programmer that it does return a value, and much harder for them to break it without realizing it.
Alternatively, one could write it like this and leave out the return statement...
def plus_one_to_y(x)
@y = x + 1
puts "In plus_one_to_y"
@y
end
But why bother leaving out the word return? Why not just put it in there and make it 100% clear what's happening? It will literally have no impact on your code's ability to perform.