2010-11-29 16 views
67

¿Es def greet; puts "hello"; end la única forma de definir un método en una línea en Ruby?¿Cómo puedo definir un método en una línea en Ruby?

+10

Como puede ver en las respuestas, es posible definir un método de diferentes maneras en una sola línea, pero la pregunta es, ¿o sí? Cualquier definición debe escribirse de forma clara y limpia por razones de mantenimiento y legibilidad, de modo que si la línea única se vuelve difícil de manejar o confusa, extiéndala. Algunos lenguajes parecen alentar la codificación breve como una forma de ser codicioso, pero el estilo de codificación de Ruby alienta la elegancia, la legibilidad y el mantenimiento por encima de la perfección. Logre los tres primeros y nos inclinaremos ante usted. –

Respuesta

81

Usted puede evitar la necesidad de usar punto y coma si se utiliza paréntesis:

def hello() :hello end 
+0

Esto es más largo que usar punto y coma ...? – Apollys

37
def add a,b; a+b end 

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

o puede utilizar el método define_method. (Edit: de este obsoleto en uno de rubí 1,9)

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

No es necesario ';' antes de 'end'. – Nakilon

+0

@Nakilon, corregido ahora. Gracias – edgerunner

+3

No parece estar en desuso en Ruby 2+ – michau

9

Otra forma:

define_method(:greet) { puts 'hello' } 

puede ser utilizado si usted no desea introducir nuevas posibilidades de método, mientras que definirlo.

+0

NoMethodError: método privado 'define_method 'llamado Objeto: Clase en Ruby 1.9.3 – Jared

+3

' define_method' ha sido "privatizado" en Ruby 1.9 – edgerunner

+0

¡¡¡Deprecated !!! @Jared ¡Actualízalo! : P –

5

otra manera:

def greet() return 'Hello' end 
+11

En Ruby, el valor de retorno de un método es el valor devuelto por la última declaración. No necesita el 'retorno' aquí ya que no es una cláusula de guardia. – Damien

51

acaba de dar la respuesta fresco completo:

En general, evite sola métodos en 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, debe haber no más de una expresión en un método de línea ú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 

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

# good 
def no_op; end 

De bbatsov/ruby-style-guide.

Cuestiones relacionadas