Geplaatst door Michiel de Mare
ma, 18 feb 2008 08:00:00 GMT
Ruby 1.9 heeft Object#tap
. Lang geleden introduceerde DannyObject#with
. Dan is er nog Object#instance_eval
.
Hebben deze methodes iets gemeen behalve hun raadselachtige namen?
Het blijkt van wel.Deze methoden vallen in de familie methoden die:
- Voor elk
Object
gedefinieerd zijn.
- Een block nemen en dat altijd éénmaal uitvoeren
- Niets anders doen
Misschien verbaast het je dat er maar liefst drie methoden in deze categorie zijn. En er is zelfs nog een vierde!
Want zelfs binnen deze strenge specificaties zijn er nog een paar openstaande punten:
- Wat retourneren we? Het object zelf? Of het resultaat van het block?
- Binnen het block, wat is
self
? Is het het object? Of is het onveranderd (waardoor we het object als argument moeten meegeven)?
Hoe zit dat voor de methoden die we net hebben genoemd?
tap
: retourneert resultaat, zelfde self
in block
with
: retourneert self
, zelfde self
in block
instance_eval
: retourneert resultaat, andere self
in block.
En de ontbrekende methode:
switch
: retourneert self
, andere self
in block.
Laten we deze methoden in actie zien!
Lees verder...
Geplaatst in ruby, dagmethode | geen reacties
Geplaatst door Michiel de Mare
zo, 17 feb 2008 21:54:12 GMT
Soms lijkt Rails een beetje topzwaar. Maar het is lang niet zo erg als het lijkt.
Geplaatst in ruby on rails | geen reacties
Geplaatst door Michiel de Mare
vr, 15 feb 2008 08:00:00 GMT
Het is vrijdag dus we houden het kort.
[String,Symbol].each{|c|c.class_eval {alias +@ to_sym}}
Is het een Symbol? Is het een String? Who gives a damn!
hash[+key]
Geplaatst in ruby, dagmethode | 2 reacties
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.
Geplaatst in ruby, dagmethode | geen reacties
Geplaatst door Michiel de Mare
wo, 13 feb 2008 08:00:00 GMT
Jullie kennen natuurlijk
flatten
.
flatten
neemt een array en walst hem plat. Na afloop bevat de array alleen nog niet-arrays. Maar soms heb je een array van arrays van arrays en wil je hem in een array van arrays omtoveren. Wat we nodig hebben is flatten-light:
mjoin
module Enumerable
def mjoin
inject!([]) {|memo,x| a.each {|x| memo << x}}
end
end
(lees meer over
inject!
).
Wanneer heb je dit nodig? Altijd als je map
wilt gebruiken maar je wilt niet elke keer precies één waarde teruggeven. en daarnaast sommige waardes in de array zelf arrays zijn, waardoor flatten
afvalt.
Klinkt dat uitermate zeldzaam? In feite is dit anders een doodnormale datastructuur. Een tabel is een array van arrays, en een join is een operatie die per row nul of meer resultaten teruggeeft. En vandaar ook de naam! (join
is natuurlijk al bezet – mjoin was geïnspireerd door dit artikel).
Binnenkort meer over tabellen als datastructuur in Ruby.
Geplaatst in ruby, dagmethode | 1 reactie