2011-03-23 66 views
0

的在C#中的數組工作的方法,你可以寫一個擴展方法是這樣的:定義是在一個特定類型的對象

public static Debt[] Foo(this Debt[] arr, int num) 
{ 
    // Do something 
} 

這將使你的債務陣列上使用Foo()debts.Foo(3)

你可以在Ruby中做到這一點嗎?我知道你可以寫下在陣列工作的方法:

class Array 
    def foo 
    # blah 
    end 
end 

但是這適用於所有類型的數組,而不僅僅是Debt小號

感謝陣列提前。

回答

3

extend方法是將實例方法添加到特定對象。所以在你情況下,將:

class YourClass 
    def foo 
    # blah 
    end 
end 

debts.extend(YourClass) 
debts.foo # now foo method is instance method of debts object 

其實它debts對象創建單獨的類,然後添加到它的方法。但你不能使用這個類,這就是爲什麼它叫「鬼」類

+0

感謝您的快速回答,但我在哪裏可以在我的程序中調用'debts.extend'?我正在使用導軌。 – 2011-03-23 12:43:58

+0

你的意思是有特殊的地方像幫手?我不知道,但擴展在Rails通常使用靜音混合def self.included(base) base.extend ClassMethods end這是一個元編程,看看這個http://pragprog.com/screencasts/v-dtrubyom/所述-紅寶石對象模型和 - 元編程 – megas 2011-03-23 12:49:48

1

這會有點棘手,因爲Ruby陣列不是同質的。也就是說,您可以在數組中存儲不同類型的對象。這將導致我需要首先驗證數組中的所有對象的類型爲Debt,如果他們是那麼我可以使用foo作用於陣列。

您可以繼續開拓Array並添加foo方法,但也許你應該創建一個FooArray,而不是和擴展Array。通過這種方式,您可以重新定義一些方法,如<<push,以確保您只需要Debt。既然你知道只有Debt可以被添加到你的陣列,你可以打電話foo()沒有擔心。

0

我相信你可以通過擴展Ruby的Array類或更好的方式來做到這一點,但定義自己的類Array類,並將選定的數組方法委託給本地對象。

Stack = Array.extract([ 
    :last, 
    :push, 
    :pop, 
    :size, 
    :clear, 
    :inspect, 
    :to_s 
]) 

爲什麼這比替代方法更好是explained here

相關問題