2013-01-09 40 views
4

在Ruby中,一組可通過設置被初始化[1,2,3] 所以陣列:數組[1,2,3]Ruby語言特徵[1,2,3]

是否可以編寫一些代碼來爲我自己的類做同樣的事情? 或者它只是一些內置類的語言功能?

+0

作爲邊注,'數組[1,2,3]'將調用'陣列。[]',但'數組[1,2,3] '(在'y'後面有一個空格)將會調用'Kernel#Array'。 –

+0

Avdi Grimm在[此評論](http://blog.mojotech.com/post/38317154050#comment-746181678)中描述了像'Kernel#Array'這樣的方法作爲「轉換函數」。 –

回答

5

在Ruby中,foo[bar, baz]只是爲foo.[](bar, baz)語法糖。所有你需要的是一種名爲[]的方法。

順便說一句:你只需要看看文檔,例如爲Set

[](*ary)

創建包含該給定對象的新集合。

這就是那裏的文檔。

基本上,所有你需要的是

class Foo 
    def self.[](*args, &block) 
    new(*args, &block) 
    end 
end 
2
class X 
    attr_accessor :contents 

    def self.[](*x) 
    obj = self.new 
    obj.contents = x 
    obj 
    end 
end 
5

是的,因爲[][]=只是方法,它們可以被覆蓋。

你可以嘗試這樣的事:

class MyArray 
    attr_accessor :data 

    def self.[](*values) 
    obj = MyArray.new 
    obj.data = values 
    return obj 
    end 
end