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.