¿Cómo defino un método en una línea en Ruby?

92

¿Es def greet; puts "hello"; endla única forma de definir un método en una línea en Ruby?

RyanScottLewis
fuente
11
Como puede ver en las respuestas, es posible definir un método de diferentes maneras en una sola línea, pero la pregunta es, ¿debería hacerlo? Cualquier definición debe escribirse de manera clara y limpia por razones de mantenimiento y legibilidad, por lo que si la línea única se vuelve difícil de manejar o confusa, extiéndala. Algunos lenguajes parecen fomentar la codificación concisa como una forma de ser estudiosos de código, pero el estilo de codificación Ruby fomenta la elegancia, la legibilidad y la facilidad de mantenimiento por encima de la estudios. Cumpla los tres primeros y nos inclinaremos ante usted.
the Tin Man

Respuestas:

102

Puede evitar la necesidad de usar punto y coma si usa paréntesis:

def hello() :hello end
caballo
fuente
1
¿Esto es más largo que usar punto y coma ...?
Apollys apoya a Monica
73

Simplemente dé la respuesta nueva y completa:

En general, evite los métodos de una sola línea. Aunque son algo populares en la naturaleza, hay algunas peculiaridades sobre su sintaxis de definición que hacen que su uso sea indeseable. En cualquier caso, no debería haber más de una expresión en un método de una sola línea .

# 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

Una excepción a la regla son los métodos de cuerpo vacío.

# good
def no_op; end

De bbatsov / ruby-style-guide .

Sergey Alekseev
fuente
39
def add a,b; a+b end

El punto y coma es el terminador de instrucciones en línea para Ruby

O puedes usar el define_methodmétodo. (Editar: este está en desuso en ruby ​​1.9)

define_method(:add) {|a,b| a+b }
edgerunner
fuente
4
No parece estar obsoleto en Ruby 2+
michau
9

De otra manera:

define_method(:greet) { puts 'hello' }

Puede usarse si no desea ingresar un nuevo alcance para el método mientras lo define.

Victor Deryagin
fuente
NoMethodError: método privado `define_method 'llamado para Object: Class en Ruby 1.9.3
Jared
3
define_methodha sido "privatizado" en Ruby 1.9
edgerunner
8

Otra forma más:

def greet() return 'Hello' end
Josh D
fuente
12
En Ruby, el valor de retorno de un método es el valor devuelto por la última declaración. No necesita el returnaquí ya que no es una cláusula de protección.
Damien
1
Voto a favor porque, aunque no es necesario , returnpuede agregar legibilidad para aquellos menos versados ​​(o familiarizados con) Ruby. Es una de esas cosas de YMMV ...
Potherca