Geplaatst door Remco van 't Veer
vr, 22 feb 2008 08:00:00 GMT
Tijdreizen is verschrikkelijk handig maar jammer genoeg niet altijd even gemakkelijk. Als de realiteit het niet toestaat dan passen die gewoon aan!
class Time
def self.now_with_warping
@warptime || now_without_warping
end
class << self
alias_method :now_without_warping, :now
alias_method :now, :now_with_warping
end
def warp
self.class.instance_variable_set('@warptime', self)
yield
ensure
self.class.instance_variable_set('@warptime', nil)
end
end
Hiermee kunnen we gemakkelijk terug naar “Unix Epoch”:
Time.at(0).warp do
puts "The current time is: #{Time.now}"
end
Of vlak voor het einde der tijden:
Time.at(2 ** 31 - 1).warp do
Time.now + 1
end
Wat heb je er aan? Heel handig om tijds afhankelijke zaken te testen!
Geplaatst in ruby, dagmethode | 2 reacties
Geplaatst door Michiel de Mare
do, 21 feb 2008 08:00:00 GMT
Ik heb altijd wel een irb of rails console openstaan, en ik ben dol op methods
om te kijken wat een object allemaal kan, maar wat krijg je toch een ontiegelijke hoeveelheid troep terug, vooral in Rails.
Daarom dit:
class Object
def mymethods
(methods - Object.instance_methods).sort
end
end
(1..2).methods.size # => 150
(1..2).mymethods.size # => 46
Geplaatst in ruby, ruby on rails, dagmethode | 2 reacties
Geplaatst door Michiel de Mare
wo, 20 feb 2008 11:04:00 GMT
Op 5 juni van dit jaar komt de derde editie van Ruby En Rails eraan! Net zoals vorig jaar vindt het plaats in Amsterdam. Inschrijven kun je je nog niet, maar we zijn wel op zoek naar sprekers.
Als je een leuk idee hebt voor een presentatie, laat ons het dan snel weten!
Enige suggesties:
- Ruby 1.9
- Ervaringen met Rails deployment in Nederland
- Live een Facebook app bouwen met Rails
- Tools voor Rails – IDE’s, editors, debuggers, etc.
Aanmelden als spreker gaat via het e-mailadres rubyenrails2008(ape)rubyenrails.nl. Vermeld s.v.p. welk onderwerp je wilt behandelen en hoeveel tijd je nodig hebt.
Geplaatst in ruby on rails, events | Tags rer2008 | geen reacties
Geplaatst door Michiel de Mare
wo, 20 feb 2008 08:00:00 GMT
Het kostte me even voordat ik de algemeen aanvaarde manier om de grootste van twee waarden te bepalen had gevonden. Ik verwachtte een methode in Kernel
of in Comparable
. In plaats daarvan is de Ruby Manier om een array met beide waarden aan te maken en daaraan te vragen wat de hoogste waarde is.
[x,y].max
Nou, kort is het zeker, maar het staat me toch niet aan, om drie redenen:
- Je maakt een array aan om twee ints te vergelijken? Dat moest haast wel vreselijk inefficiënt zijn, toch? Goed, ik weet dat je je als ervaren Rubyist niet druk hoort te maken om efficiëntie.
- Ik vind de naam verwarrend. Wanneer ik max hoor denk ik aan een maximum. Ik denk aan maximaal. De maximumsnelheid in Nederland:
[you.speed,120].min
. Klopt niet.
- Door twee waarden in de array op te nemen plaats je ze op gelijke voet, vaak ten onrechte. Vaak is de tweede waarde alleen een voetnoot. Je zegt: ik wil waarde size (en trouwens, die moet minstens 1.2 zijn.) Dat wordt niet uitgedrukt door
[size, 1.2].max
Vandaar,
at_most
and
at_least
:
size.at_least(1.2)
seconds / attempts.at_least(1)
Implementatie te triviaal om te laten zien.
Geplaatst in ruby, dagmethode | geen reacties
Geplaatst door Michiel de Mare
di, 19 feb 2008 14:38:50 GMT
De laatste maandag van de maand komt eraan, dus vindt op 25 februari de tweede bijeenkomst van amsterdam.rb plaats! De vorige keer was een groot succes met een flinke opkomst. We houden het deze keer weer op dezelfde lokatie: de Bekeerde Suster aan de Nieuwmarkt, vanaf een uur of acht.
Voor vragen (of om te zien wie er vorige keer gekomen zijn) is er een Google Group ter coördinatie: amsterdam-rb
Tot maandag!
Geplaatst in ruby, ruby on rails, events | geen reacties
Geplaatst door Michiel de Mare
di, 19 feb 2008 08:00:00 GMT
Hash
heeft een invert
-methode, maar vaak heb je een hash die als values arrays heeft. Je wilt natuurlijk geen arrays als keys, maar juist dat elk element in de array een key wordt met als value een array met alle oorspronkelijke keys.
Simpel voorbeeld
{1 => [3,4]}.inv_multi
# => {3=>[1], 4=>[1]}
Complex voorbeeld
{1 => [3,4,5,6], 2 => [3,4], 4 => 11}.inv_multi
# => {5=>[1], 11=>[4], 6=>[1], 3=>[1, 2], 4=>[1, 2]}
De methode:
class Hash
def inv_multi
# there's inject! again. daily method #5
inject!({}) do |h,(k,v)| # Is this obvious? If not, say so!
# this lambda binds h and k.
l = lambda {|x| (h[x] ||= []) << k}
# value doesn't have to be an array
Array === v ? v.each(&l) : l[v]
end
end
end
Geplaatst in ruby, dagmethode | geen reacties