2009-07-10 26 views
12

tengo este código:método con el mismo nombre y diferentes parámetros en Ruby

def setVelocity (x, y, yaw) 
    setVelocity (Command2d.new(x,y,yaw)) 
end 
def setVelocity (vel) 
...... 
end 

vel es una clase Command2D que tiene 3 atributos, es comparable y define +, básicamente es una clase conveniente para mí para gestionar los 3 atributos, así que quiero usarlo internamente en mi biblioteca (no quiero que sean privados, ni darles nombres extraños). Pero Ruby parece mantener solo el último setVelocity incluso cuando el número de parámetros es diferente. así que cuando llamo a setVelocity con 3 parámetros diré que necesito llamar a ese método con un solo parámetro.

Respuesta

29

Ruby en realidad no es compatible con la sobrecarga.

This page ofrece más detalles y una solución. Básicamente, usted crea un único método con un número variable de parámetros, y los trata de manera apropiada.

(recomiendo personalmente creando un método para reconocer las dos "sobrecargas falsos" diferente y luego un método para cada una sobrecarga, con nombres diferentes que reflejan los diferentes parámetros.)

Como alternativa, sólo proporcionan diferentes nombres a comience con :)

+0

En verdad, no es un tema que no está presente en sensei al Plato - ¿Cómo es que no tiene una insignia "generalista" ? Al momento de escribir, has publicado 2140 etiquetas diferentes, y las primeras 50 etiquetas tienen al menos 30 publicaciones. Me hace preguntarme qué se necesita para ser un "generalista". – Matt

+0

Sí, el generalista aún no se ha implementado. Jeff ha sugerido a Meta que no lo hará directamente, sino algo similar. –

0

Use attr_accessor para agregar atributos y obtendrá getters y setters automáticamente. Como alternativa, use attr_reader o attr_writer para obtener atributos de solo lectura o de solo escritura.

class Foo 
    attr_accessor :velocity 
end 

Ahora puede establecer y obtener el valor de este atributo como esto:

foo = Foo.new 
foo.velocity = 100 
puts foo.velocity # => 100 

Si desea agregar métodos para establecer el atributo basado en algunos parámetros, utilizar un nombre que refleja qué tipo de se espera que la entrada:

def velocity_from_yaw(x, y, yaw) 
    velocity = Command2d.new(x, y, yaw) 
end 

probablemente puede encontrar un mejor nombre en este caso, pero no sabe cuál es su x, y y guiñada significa realmente en su contexto.

2

Sólo por comparación, aquí es como me gustaría resolverlo:.

#!/usr/bin/env ruby 

class Command2D 
    def initialize(x, y, yaw) 
    @command = [x, y, yaw] 
    end 
end 

class Vehicle 
    def velocity=(command_or_array) 
    case command_or_array 
    when Command2D 
     self.velocity_from_command = command_or_array 
    when Array 
     self.velocity_from_array = command_or_array 
    else 
     raise TypeError, 'Velocity can only be a Command2D or an Array of [x, y, yaw]' 
    end 
    end 

    private 

    def velocity_from_command=(command) 
    @velocity = command 
    end 

    def velocity_from_array=(ary) 
    raise TypeError, 'Velocity must be an Array of [x, y, yaw]' unless ary.length == 3 
    @velocity = Command2D.new(*ary) 
    end 
end 

v1 = Vehicle.new 
v1.velocity = Command2D.new(1, 2, 3) 

v2 = Vehicle.new 
v2.velocity = [1, 2, 3] 

p v1 
p v2 
Cuestiones relacionadas