开发者

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?


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

def hello() :hello end


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.


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 }


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.


Another way:

define_method(:greet) { puts 'hello' }

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


Yet another way:

def greet() return 'Hello' end
0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜