Como faço para definir um método em uma linha em Ruby?


92

É def greet; puts "hello"; enda única maneira de definir um método em uma linha em Ruby?


11
Como você pode ver pelas respostas, é possível definir um método de maneiras diferentes em uma única linha, mas a questão é, você deveria? Qualquer definição deve ser escrita de uma forma que seja clara e limpa por motivos de manutenção e legibilidade, portanto, se a linha única se tornar difícil de manejar ou confusa, espalhe-a. Algumas linguagens parecem encorajar a codificação concisa como uma forma de estudar o código, mas o estilo de codificação Ruby incentiva a elegância, a legibilidade e a manutenção acima do estudo. Cumpra os três primeiros e nós nos curvaremos a você.
o Homem de Lata de

Respostas:



73

Basta dar uma nova resposta completa:

Em geral, evite métodos de linha única. Embora sejam um tanto populares na natureza, existem algumas peculiaridades sobre sua sintaxe de definição que tornam seu uso indesejável. De qualquer forma - não deve haver mais de uma expressão em um método de linha única .

# 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 ; make it kind of hard to read
def some_method() body end

# good
def some_method
  body
end

Uma exceção à regra são os métodos de corpo vazio.

# good
def no_op; end

Do guia do estilo bbatsov / rubi .


39
def add a,b; a+b end

O ponto-e-vírgula é o terminador da instrução embutida para Ruby

Ou você pode usar o define_methodmétodo. (Editar: este está obsoleto no Ruby 1.9)

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

4
Não parece ter seu uso suspenso no Ruby 2+
michau

9

Outra maneira:

define_method(:greet) { puts 'hello' }

Pode ser usado se você não quiser inserir um novo escopo para o método ao defini-lo.


NoMethodError: método privado `define_method 'chamado para Object: Class no Ruby 1.9.3
Jared

3
define_methodfoi "privatizado" em Ruby 1.9
edgerunner

8

Ainda outra maneira:

def greet() return 'Hello' end

12
Em Ruby, o valor de retorno de um método é o valor retornado pela última instrução. Você não precisa do returnaqui, pois não é uma cláusula de guarda.
Damien

1
Aprovado porque, embora não seja necessário , returnpode adicionar legibilidade para aqueles menos versados ​​em (ou familiarizados com) Ruby. É uma daquelas coisas YMMV ...
Potherca
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.