2009-10-15 17 views

Respuesta

11

Sí, podemos!

class MyArray 
    include Enumerable 

    def initialize 
    @size = 0 
    end 

    def <<(val) 
    instance_variable_set("@a#{@size}".to_sym, val) 
    @size += 1 
    end 

    def [](n) 
    instance_variable_get("@a#{n}") 
    end 

    def length 
    @size 
    end 

    def each 
    0.upto(@size - 1) { |n| yield self[n] } 
    end 
end 

a = MyArray.new 
a << 1 
a << 2 
p a.to_a  #=> [1,2] 

Esto funciona mediante la creación de variables de instancia @ a0, a1 @, etc. en el objeto para representar los índices de matriz 0, 1, etc. Tiene longitud y de índice de las operaciones de tiempo constante. El resto de las operaciones (eliminar, etc.) requieren un poco más de esfuerzo, pero es absolutamente posible.

Tenga en cuenta que la propiedad de tiempo constante para la operación de índice depende del tiempo de ejecución de Ruby subyacente utilizando una estructura de datos apropiada para las variables de instancia.

+2

Creo que esta es la solución más estilo ruby. – Geo

3

Puede usar una lista vinculada, lo que sería tremendamente ineficiente, pero posible. También podría usar un árbol binario (ver comentarios anteriores).

Supongo que mi punto es: no se puede obtener una matriz decente sin un soporte de idiomas de nivel inferior. La estructura básica que supongo que se usa en la matriz de Ruby es una matriz C (aunque podría estar equivocado). Con un tipo tan fundamental, el soporte de nivel inferior será crucial para un rendimiento decente en cualquier lugar.

+0

No he pensado en eso. Interesante :) – Geo

2

Puede implementar [] en cualquier objeto. Por ejemplo:

def [](index) 
    proxy_object.send(index.to_sym) 
end 
+0

Lo sé, me refería a una matriz per se. – Geo

0

Claro que sí. Ruby es un lenguaje completo de Turing. Puede implementar todo que puede implementar en cualquier idioma en Ruby.

Cuestiones relacionadas