2010-09-29 4 views

Antwort

6

In Ruby können Sie immer Methoden zu einer vorhandenen Klasse hinzufügen, auch wenn sie ein Kern ein:

class String 
    def bar 
    "bar" 
    end 
end 

"foo".bar # => "bar" 

Diese Funktion wird als „Offene Klassen.“ Es ist ein großartiges Feature, aber Sie sollten vorsichtig sein: Verwenden Sie es achtlos und Sie werden patching like a monkey sein.

17

Eigentlich haben Sie die Point-Klasse nicht neu definiert, Sie haben sie wieder geöffnet. Ein kleiner Code-Schnipsel, den Unterschied zu verdeutlichen:

class Point 
    def foo 
    end 
end 

class Point 
    def bar 
    end 
end 

Jetzt Point zwei Methoden hat: foo und bar. Die zweite Definition von Point hat also die vorherige Definition nicht ersetzt, sondern hinzugefügt. Dies ist sowohl in Ruby-Skripten als auch in irb möglich (dies ist auch mit Klassen aus der Standard-Bibliothek möglich, nicht nur mit Ihren eigenen).

Es ist auch möglich, wirklich Klassen neu zu definieren, indem remove_const mit der vorherige Bindung des Klassennamen zu entfernen, zuerst:

class Point 
    def foo 
    end 
end 
Object.send(:remove_const, :Point) 
class Point 
    def bar 
    end 
end 
Point.instance_methods(false) #=> ["bar"]