2011-12-14 16 views
7

Tengo un módulo que existe para ser incluido en dos clases similares. Algunos de los métodos que se incluirán en el módulo para uso idéntico por ambas clases devuelven una nueva instancia.Cómo devolver una nueva instancia de self desde un método de instancia de ruby ​​

Pero, ¿cómo codificar en el módulo que se debe llamar al constructor de la clase contenedora?

Un ejemplo simplificado:

module Point3D 
    def initialize(x,y,z) 
    @x = x 
    @y = y 
    @z = z 
    end 

    def * (scalar) 
    <myclass>.new(@x * scalar, @y * scalar, @z * scalar) 
    end 
end 

class Vertex 
    include Point3D 
end 

class Vector 
    include Point3D 
end 

lo tanto, en la definición de * ¿Cómo puedo llamar al constructor de tal manera que en el contexto de la clase Vertex volvió un nuevo vértice y en el contexto de la clase Vector es devuelto un nuevo vector sin volver a definir todos los métodos en cada clase?

Respuesta

12

Puede llamar al método 'clase' para obtener la clase de obj.

Para este caso, es

def * (scalar) 
    self.class.new(...) 
end 
+1

ah hombre ... me ganaste por segundos. : @ –

3

Uso self.class para conseguir el objeto de la clase en la que se incluye el módulo.

Cuestiones relacionadas