2016-11-04 91 views
1

我被兩個東西卡住了。這是我的文件的結構。方法,返回實例方法列表

class Person 
    #... 
    def self.class_name (object) 
    object.class.name 
    end 
end 

class Worker < Person 
    #... 
end 

class Client < Person 
    #... 
end 

c = Client.new("1", "2", "3", "4") 
Person.class_name(c) 

我想創建方法,其中作爲參數,我可以把一些物體,它會檢測到,什麼類,並返回我的所有的實例方法,它不需要任何參數列表。後來我需要以某種方式使用所有這些方法。

我發現這一點:

testObject.class.name 
# returns name of class as a string 

Class.instance_methods(false) 
# returns list of instance method, which were defined in Class 

第一個問題是,我不明白爲什麼我不能讓像

className = testObject.class.name 
className.instance_methods(false) 

我想,那是因爲我得到了剛下課名字,作爲一個刺痛,而不是真正的提及這個班級。我甚至創建了簡單的class_name方法,它返回類的正確名稱,但我想知道如何使用instance_methods(false),一旦我有這個名字。還有一些選擇只選擇方法,不需要任何參數?

回答

2

我想創建方法,其中作爲參數,我可以把一些對象 ,它會檢測到,什麼類,並返回我的所有 實例方法

class Person 
    def self.instance_methods(object) 
    object.class.instance_methods(false) 
    end 
end 

使用列表:

c = Client.new("1", "2", "3", "4") 
Person.instance_methods(c) 
#=> returns an array of all instance methods defined in Client class 

也有一些選項只能選擇方法,其不需要 任何參數?

是的,你必須檢查methodarity,並選擇那些具有零:

class Person 
    def self.instance_methods_with_arity_zero(object) 
    object.class.instance_methods(false).map do |method| 
     object.method(method).arity.zero? 
    end 
    end 
end 

用法:

c = Client.new("1", "2", "3", "4") 
Person.instance_methods_with_arity_zero(c) 
#=> returns an array of instance methods which take no arguments defined in Client class 

後一種方法可縮短使用第一定義方法:

def self.instance_methods_with_arity_zero(object) 
    # we are using the previously defined instance_methods method 
    instance_methods(object).map { |method| object.method(method).arity.zero? } 
end 
+0

謝謝很多!你可能是我在任何論壇上見過的最快的人:D。 –

+0

@DanZawadzki不客氣!這只是一個巧合,我在創建它之後才注意到你的問題:D –

+0

一切工作正常,但我現在想着如何「激活」這些方法。你也可以給我建議一些關於ror的有用信息嗎?目前,我基於http://ruby-doc.org。有什麼我可以使用? –

1

你不必把它變成一個字符串:

klass = testObject.class 
methods = klass.instance_methods(false) 

如果你要處理的類名的字符串表示,然後把它放回一類一:

klass = "String".constantize 
string_methods = klass.instance_methods(false) 
+0

非常感謝!我不明白,添加'.name'將其轉換爲字符串。我一定會記得! –