2016-12-27 98 views
0

如何創建一個沒有定義實例方法的類?甚至沒有__send____id__在Ruby中創建一個沒有實例方法的類

+1

爲什麼要這麼做?你想達到什麼目的? – akuhn

+0

做這種事情的實用性是什麼?目前還不清楚你想達到什麼目的。 – Makoto

+1

@Makoto爲什麼會關心實用性?當我谷歌的時候,我從來沒有偶然發現谷歌說:「嘿,你爲什麼想知道我的搜索是否有**,你確定你想知道嗎?」 –

回答

5

您可以使用Module#undef_method取消定義方法:

class Foo < BasicObject 
    instance_methods.each { |method| undef_method(method) } 
end 

Foo.instance_methods #=> [] 
foo = Foo.new 
foo.__id__   #=> NoMethodError: undefined method `__id__' for #<Foo:0x007fb9da565dd8> 
foo.__send__(:test) #=> NoMethodError: undefined method `__send__' for #<Foo:0x007fb9da565dd8> 

在這個例子中Foo繼承BasicObject,因爲這個類本身具有定義很少有實例方法,因此,取消定義他們更快。這不是強制性的,也就是說,無論從哪個類繼承,您都可以取消定義實例方法,因此它可以寫得很好:

class Foo 
    instance_methods.each { |method| undef_method(method) } 
end 
+1

我還沒有試過這個,但是如果這個工作,並且所有的方法都被刪除了,那麼'undef_method'必須是最後一個未定義的。它必須自我定義。你確定這是事實嗎? – sawa

+0

@sawa,'undef_method'是一個(私有)類方法,所以它不會被刪除。歡迎回來。 –

+0

@CarySwoveland它爲什麼不被刪除,如果它是私人的?沒有以前那麼頻繁,但我偶爾會在周圍,尤其是當我覺得我的排名可能會改變時。 – sawa

相關問題