How do I define a method on one line in Ruby?

Ruby

Ruby Problem Overview


Is def greet; puts "hello"; end the only way to define a method on one line in Ruby?

Ruby Solutions


Solution 1 - Ruby

You can avoid the need to use semicolons if you use parentheses:

def hello() :hello end

Solution 2 - Ruby

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.

Solution 3 - Ruby

def add a,b; a+b end

The semicolon is the inline statement terminator for Ruby

Or you can use the define_method method. (Edit: This one's deprecated in ruby 1.9)

define_method(:add) {|a,b| a+b }

Solution 4 - Ruby

Another way:

define_method(:greet) { puts 'hello' }

May be used if you don't want to enter new scope for method while defining it.

Solution 5 - Ruby

Ruby 3.0.0 adds "endless" definitions for methods with exactly one statement:

def greet = puts("hello")

Note that the one-statement limitation means that this can't be written as:

# NOT ALLOWED
def greet = puts "hello"

SyntaxError: unexpected string literal, expecting `do' or '{' or '('
def greet = puts "hello"
                 ^

It seems that this change was intended to either encourage the use of one-line methods or adjust to the reality that they are very common but hard to read -- "this kind of simple method definition [is estimated to] account for 24% of the entire method definitions" of the ruby/ruby code base.

Solution 6 - Ruby

Yet another way:

def greet() return 'Hello' end

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionRyanScottLewisView Question on Stackoverflow
Solution 1 - RubyhorseyguyView Answer on Stackoverflow
Solution 2 - RubySergey AlekseevView Answer on Stackoverflow
Solution 3 - RubyedgerunnerView Answer on Stackoverflow
Solution 4 - RubyVictor DeryaginView Answer on Stackoverflow
Solution 5 - RubyDanView Answer on Stackoverflow
Solution 6 - RubyLifeweaverView Answer on Stackoverflow