Tap-metoden i Ruby

  En riktig juvel som lades till Ruby v. 1.9 är objektsmetoden ‘tap’. Metoden är intressant i två bemärkelser, dels för att implementeringen av den visar på en av Rubys absoluta fördelar och dels för dess smidiga användning.
  Vi kan börja med den senare punkten. Säg att vi har en uträkning som denna:
  (i + 3) * ((j - k) / 5)
  Det lämnas till läsaren att fantisera ihop någon kontext där den skulle kunna fylla någon som helst funktion, men förutsättningen är i någon form av loop i vilken de olika variablerna får olika värden. Låt nu säga att utfallet inte blir det som förväntas och att misstanken faller på deluttrycket (j – k). För att debugga detta, kräver de flesta språk en lösning i vilken uttrycket delas upp, i Ruby (utan ‘tap’) skulle detta se ut ungefär så här:
a = (j – k)
puts ”debug: #{a}”
(i + 3) * (a / 5)

  I just detta fall är detta kanske inget större ingrepp på koden, men det finns många sammanhang i vilket det kan behövas många liknande bearbetningar av koden och jämför man med ‘tap’ lösningen framstår det som onödigt omständigt:
(i + 3) * ((j – k).tap {|a| puts ”debug: #{a}”} / 5)
  Med denna justering kommer resultatet av (j – k) skrivas ut och vill man koppla in det hela i ett debug-system, är det bara att ändra puts till ett funktionsanrop för debuggning. För den som ställer sig frågan om något faktiskt är vunnet kommer här svaret: Ja. Den stora skillnaden är att kod läggs till, utan något omarbetning. Det gör arbetet med att debugga existerande kod betydligt mycket enklare, både sådan man själv skrivit, men framförallt sådan skriven inom större projekt med flera utvecklare.
  Som sagt är ‘tap’ en objektsmetod, så den är oberoende av vilken typ objektet är, så följande exempel (från Programming Ruby 1.9 – The Pragmatic Programmers’ Guide):
puts ”dog”.reverse.tap {|o| puts ”Reversed: #{o}”}.capitalize
vilket ger:
Reversed: god
God

  För den som missat det, kan det påpekas att allt i Ruby är objekt (del i klassen Object), inklusive textsträngar ”direkt” i koden, det är alltså ingen skillnad i utfallet på:
a = ”dog”
puts a.reverse

och
puts ”dog”.reverse
  Just denna del i språket möjliggör den enkla implementeringen av metoden:
   class Object
    def tap
      yield self
      self
    end
  end

  Eftersom ‘Object’ redan är deklarerat lägger denna bit kod endast till metoden ‘tap’ till alla objekt i klassen ‘Object’. Allt metoden gör, är att ”skicka” objektet till kod blocket {|a| puts ”debug: #{a}”} (i det första exemplet) och returnera objektet så som det kom in.
  Väldigt enkelt och smart nog för att till 1.9 versionen av Ruby bli en del av standarden, så nu behöver man inte ens lägga till metoden själv.

Detta inlägg är publicerat i Blogg och har etiketter , . Bokmärk detta inlägg.

Lämna ett svar

E-postadressen publiceras inte. Obligatoriska fält är märkta *

*

Följande HTML-taggar och attribut är tillåtna: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>


Sökmotoroptimering

Marknadsföring som fungerar! Sökmotoroptimering som möter era behov och krav!

Sökmotormarknadsföring

Annonsera på sökmotorerna! Syns när någon söker efter era produkter eller tjänster!

Website

Sökmotoroptimerad Webbdesign som lönar sig för er verksamhet!