Onze dagmethode #14: Time#warp

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 ,  | 2 reacties

Onze dagmethode #13: Object#mymethods

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 , ,  | 2 reacties

2008.rubyenrails.nl

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 ,  | Tags  | geen reacties

Onze dagmethode #12: Comparable#at_least

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 ,  | geen reacties

25 februari: amsterdam.rb

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 , ,  | geen reacties

Onze dagmethode #11: Hash#inv_multi

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 ,  | geen reacties

Oudere artikelen: 1 ... 3 4 5 6 7 ... 20