2009-10-15 12 views

Odpowiedz

11

Tak, możemy!

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] 

ten polega na tworzeniu instancji zmiennych @ a0 @ a1 itp od obiektu, który reprezentuje indeksu tablicy 0, 1, itp ma długość i indeksu czynności stała czasowa. Reszta operacji (usunięcie itp.) Wymaga nieco więcej wysiłku, ale jest to absolutnie możliwe.

Należy zauważyć, że stała właściwość czasu dla operacji indeksu zależy od podstawowego środowiska wykonawczego Ruby, wykorzystującego odpowiednią strukturę danych dla zmiennych instancji.

+2

Myślę, że to najbardziej rubinowe rozwiązanie. – Geo

3

Możesz użyć połączonej listy, która byłaby horrendalnie nieefektywna, ale możliwa. Możesz również użyć drzewa binarnego (zobacz powyższe komentarze).

Chyba moim celem jest: nie można uzyskać porządnej tablicy bez obsługi języków niższego poziomu. Podstawową strukturą, którą zakładam w tablicy Ruby jest tablica C (choć mógłbym się mylić). Przy tak podstawowym typie wsparcie na niższym poziomie będzie miało kluczowe znaczenie dla godnej wydajności.

+0

Nie myślałem o tym. Interesujące :) – Geo

2

Możesz zaimplementować [] w dowolnym obiekcie. Na przykład:

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

Wiem, że miałem na myśli tablicę per se. – Geo

0

Pewnie, że możesz. Ruby jest językiem pełnym Turinga. Możesz zaimplementować wszystko, co, które możesz zaimplementować w języku w języku Ruby w wersji.

Powiązane problemy