2009-10-15 67 views

回答

11

是的,我們可以!

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] 

這通過在對象上創建實例變量@ A0,A1 @等來表示數組的下標0,1,...等,具有恆定時間長度和索引操作。其餘的操作(刪除等)實施起來要多一點努力,但這絕對有可能。

請注意,索引操作的常量時間屬性取決於基礎Ruby運行時使用實例變量的適當數據結構。

+2

我認爲這是最紅寶石般的解決方案。 – Geo

3

您可以使用鏈接列表,這將是可怕的低效率,但可能。你也可以使用二叉樹(見上面的評論)。

我想,我的觀點是:如果沒有較低級別的語言支持,您無法獲得體面的陣列。我假設在Ruby數組中使用的基本結構是一個C數組(儘管我可能是錯的)。有了這樣一個基本類型,低層次的支持對於任何地方的體面表現都至關重要。

+0

沒想過。有趣:) – Geo

2

您可以在任何對象中實現[]。例如:

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

我知道,我指的是一個數組本身。 – Geo

0

當然可以。 Ruby是一種圖靈完整語言。你可以實現的一切,你可以在中實現任何語言在Ruby中。

相關問題