2016-12-27 2 views
0

Wie kann ich eine Klasse ohne Instanzmethoden erstellen? Nicht einmal __send__ oder __id__.Erstellen Sie eine Klasse ohne Instanzmethoden in Ruby

+1

Warum möchten Sie das tun? Was versuchst du zu erreichen? – akuhn

+0

Was ist praktisch, wenn man so etwas macht? Es ist sehr unklar, was Sie erreichen möchten. – Makoto

+1

@ Makoto warum sollte man sich um die Praktikabilität kümmern? Wenn ich etwas google, stolpere ich nie über Google und sage: "Hey, warum würdest du wissen wollen, ob es meine Suche gibt **. Bist du sicher, dass du das wissen willst?" –

Antwort

5

können Sie Module#undef_method verwenden Methoden undefine:

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> 

In diesem Beispiel Foo erbt von BasicObject, weil diese Klasse selbst definiert nur sehr wenige Instanzmethoden hat und somit undefining sie schneller ist. Dies ist nicht obligatorisch, was bedeutet, dass Sie Instanzmethoden von jeder Klasse unabhängig von der Klasse deklinieren können, so dass es sehr gut geschrieben werden könnte:

+1

Ich habe das nicht versucht, aber wenn das funktioniert und alle Methoden entfernt werden, dann muss 'undef_method' die letzte sein, die undefiniert ist. Es muss sich selbst definieren. Sind Sie sicher, dass dies der Fall ist? – sawa

+0

@sawa, 'undef_method' ist eine (private) Klassenmethode, daher wird sie nicht entfernt. Willkommen zurück. –

+0

@CarySwoveland Warum wird es nicht entfernt, wenn es privat ist? Nicht so häufig wie zuvor, aber ich bin gelegentlich unterwegs, besonders wenn ich das Gefühl habe, dass sich mein Ranking ändern könnte. – sawa

Verwandte Themen