2012-04-02 63 views
1

有沒有其他的方式使它成爲另一種方式比封閉和define_method?在新方法中「嵌入」或使變量「靜態」的其他方法?

說我有這樣的:

def test 
    result=[1,2,3] 
    metadata=['foo', 'bar'] # for simplicity, could be fetched from database 
    result.define_singleton_method :headers, lambda { metadata } 
    result 
end 

我很好奇,是否有其他的方式嵌入,使靜態的或不好,「複製」元數據變量進入方法在Ruby中?

+0

你可以添加一些更多的代碼,描述你想要什麼?顯示它與沒有嵌入的東西有什麼不同。 – 2012-04-02 23:16:28

+0

如果您需要簡單的迭代功能,子類化數組或包含Enumerable模塊的類還有什麼用處? – 2012-04-02 23:32:03

+0

Andrew:由於範圍不同,因此元數據變量在f.e.時未定義。像在Matherus Moreira中定義的答案或者定義def在body中的閉包,並且調用test.headers – 2012-04-02 23:46:09

回答

1

我覺得那種玄乎要定義這樣的方法(可能是你應該有一個對象,它看起來像一個數組而比讓數組看起來像你的對象),但這也會起作用。

def test 
    result=[1,2,3] 
    result.instance_eval { @headers = ['foo', 'bar'] } 
    result.define_singleton_method(:headers) { @headers } 
    result 
end 

你也可以做這樣的事情(這是因爲它創建了一個二傳手,以及略有不同)。

module HasHeaders 
    attr_accessor :headers 
end 

def test 
    result = [1,2,3].extend HasHeaders 
    result.headers = ['foo', 'bar'] 
    result 
end 
+0

實例變量....非常好的主意,對我來說最好是使用Array(查詢數據庫)的結果和返回元數據的方法,而不是某些自定義類 – 2012-04-03 18:59:47

相關問題