How do I define a method on one line in Ruby?
Is def greet; puts "hello"; end
the only way to define a method on one line in Ruby?
Solution 1:
You can avoid the need to use semicolons if you use parentheses:
def hello() :hello end
Solution 2:
No Single-line Methods
From rubocop/ruby-style-guide#no-single-line-methods:
Avoid single-line methods. Although they are somewhat popular in the wild, there are a few peculiarities about their definition syntax that make their use undesirable. At any rate - there should be no more than one expression in a single-line method.
NOTE: Ruby 3 introduced an alternative syntax for single-line method definitions, that's discussed in the next section of the guide.
# bad
def too_much; something; something_else; end
# okish - notice that the first ; is required
def no_braces_method; body end
# okish - notice that the second ; is optional
def no_braces_method; body; end
# okish - valid syntax, but no ; makes it kind of hard to read
def some_method() body end
# good
def some_method
body
end
One exception to the rule are empty-body methods.
# good
def no_op; end
Endless Methods
From rubocop/ruby-style-guide#endless-methods:
Only use Ruby 3.0's endless method definitions with a single line body. Ideally, such method definitions should be both simple (a single expression) and free of side effects.
NOTE: It's important to understand that this guideline doesn't contradict the previous one. We still caution against the use of single-line method definitions, but if such methods are to be used, prefer endless methods.
# bad
def fib(x) = if x < 2
x
else
fib(x - 1) + fib(x - 2)
end
# good
def the_answer = 42
def get_x = @x
def square(x) = x * x
# Not (so) good: has side effect
def set_x(x) = (@x = x)
def print_foo = puts("foo")
P.S.: Just to give an up-to-date full answer.