2009-10-15 5 views

Répondre

11

Oui, nous pouvons!

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] 

Cela fonctionne en créant des variables d'instance @ a0, a1 @, etc. sur l'objet pour représenter les indices de tableau 0, 1, etc. Il a une longueur constante de temps et les opérations index. Le reste des opérations (suppression, etc.) est un peu plus d'effort à mettre en œuvre, mais c'est tout à fait possible.

Notez que la propriété de durée constante pour l'opération d'index dépend du moteur d'exécution Ruby sous-jacent utilisant une structure de données appropriée pour les variables d'instance.

+2

Je pense que c'est la solution la plus ruby-esque. – Geo

3

Vous pourriez utiliser une liste chaînée, ce qui serait horriblement inefficace, mais possible. Vous pouvez également utiliser un arbre binaire (voir les commentaires ci-dessus). Je suppose, mon point est: vous ne pourriez pas obtenir un tableau décent sans support de langue de niveau inférieur. La structure de base que je suppose est utilisée dans le tableau Ruby est un tableau C (bien que je puisse me tromper). Avec un tel type fondamental, le soutien de niveau inférieur sera crucial pour n'importe quelle performance décente.

+0

N'a pas pensé à ça. Intéressant :) – Geo

2

Vous pouvez implémenter [] dans n'importe quel objet. Par exemple:

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

Je sais que, je parlais d'un tableau en soi. – Geo

0

Bien sûr, vous pouvez. Ruby est un langage de Turing-complet. Vous pouvez implémenter tout que vous pouvez implémenter en n'importe quel langage dans Ruby.

Questions connexes