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?

RyanScottLewis
fonte
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:

102

Você pode evitar a necessidade de usar ponto-e-vírgulas se usar parênteses:

def hello() :hello end
cara de cavalo
fonte
1
Isso é mais longo do que usar ponto-e-vírgulas ...?
Apollys apoia Monica de
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 .

Sergey Alekseev
fonte
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 }
edgerunner
fonte
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.

Victor Deryagin
fonte
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
Josh D
fonte
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