Onze dagmethode #8: Object.alias_class_method
Geplaatst door Remco van 't Veer do, 14 feb 2008 08:00:00 GMT
In een eerdere dagmethode wordt een alias gemaakt voor een class methode. Dat is een beetje lastig omdat de Module#alias_method
eigenlijk alleen opereert op instance methoden. Gelukkig is een class niet meer dan een instance van Class
en kunnen we dus die instance gebruiken om alias_method
op uit te voeren.
Een bekende methode om een object instance uit te breiden is met de class<<
notatie. Hiermee kan je een object voorzien van een singleton/eigen/virtual/meta-class welke je kan voorzien van methoden voor die specifieke instancie. Omdat binnen een class definitie self
verwijst naar de class instance van deze definitie kunnen we het volgende schrijven:
class Foo
class << self
alias_method :neu, :new
end
end
Deze Foo
class kunnen we nu instanceren met neu
(merk op dat new
gewoon een class methode is). Omdat de class<<
notitie binnen een class een beetje een rommelige indruk wekt, gebruik ik liever de volgende uitbreiding op Object
:
class Object
def self.alias_class_method(new_name, old_name)
meta = class << self; self; end
meta.send :alias_method, new_name, old_name
end
end
Hiermee kan je schrijven:
class Foo
alias_class_method :neu, :new
end
Zie voor mee informatie over eigenclasses de discussie tussen Nutter en Lam op Ruby-core.