2010-06-27 118 views
6

我想在Ruby中找到某種類型的所有子類,稱爲Command,並且我遇到了下面的代碼,它完美地實現了這個技巧,但是我並不真正瞭解它是如何工作的,主要是class << [Subtype]部分。我曾試着讀過這本書,但我覺得還有一些我失蹤的Ruby魔法。是否有人可以給我講解一下:-)Ruby enum_for混淆

ObjectSpace.enum_for(:each_object, class << Command; self; end).to_a() 

回答

5

class << Command; self; end返回單一類的Command。這是Command是唯一(直接)實例的類。

在ruby中,C的子類的單例類是C的單例類的子類。所以Command的所有子類都有從Command的單例類繼承的單例類。

ObjectSpace.each_object(C)遍歷作爲類C或其某個子類的實例的所有對象。所以通過做ObjectSpace.each_object(singleton_class_of_command)你遍歷命令及其所有的子類。

enum_for位返回一個Enumerable枚舉each_object迭代的所有元素,因此您可以將它變成一個包含to_a的數組。

+0

明智的解釋,謝謝!所以它基本上與此相同: commands = [] ObjectSpace.each_object(class << Command; self; end){| c |命令<< c} 現在看起來很簡單,我應該能夠解決這個問題:) – amarsuperstar 2010-06-27 12:19:52