siDDis Skrevet 6. mars 2007 Del Skrevet 6. mars 2007 Eg har tenkt å parse denne stringen: "13112007" sånn at @day = 13, @month = 11 og @year = 2007 Korleis kan det bli gjort? Trur eg fant det ut, spørs om det er korrekt måte? Det funker ijallefall... Sånn blei det @a = @params[:timestamp] @day = @a.slice(0,2) @month = @a.slice(2,2) @year = @a.slice(4,4) Lenke til kommentar
blacktower Skrevet 7. mars 2007 Del Skrevet 7. mars 2007 Ja, det var en en klar og eksplisitt måte. Prøvde å komme på en one-liner og endte opp med dette: e, day, month, year = *@params[:timestamp].split(/(..)(..)(....)/) En kort forklaring: - Stringen deles opp hver gang regex-utrykket matcher - * (splat) tilegner et array-element til hver variabel - Split returnerer en array med alle delene - e er bare for å bli kvitt et unødvendig empty string treff. En regex-ekspert kan kanskje si oss hvordan man unngår dette. En fordel med å samle verdiene i en array er at du kan gjøre videre prosessering, for eksempel: irb(main):127:0> e, day, month, year = "13112007".split(/(..)(..)(....)/).map{|s| s.to_i} => [0, 13, 11, 2007] irb(main):128:0> year => 2007 Lenke til kommentar
siDDis Skrevet 7. mars 2007 Forfatter Del Skrevet 7. mars 2007 Hmmm, i ein rails kontroller så blir det arrayet automatisk til variablene @day, @month @year? Lenke til kommentar
blacktower Skrevet 8. mars 2007 Del Skrevet 8. mars 2007 Ja, hvis du bruker de navnene så... slik: e, @day, @month, @year = "13112007".split(/(..)(..)(....)/) Lenke til kommentar
Magnus Holm Skrevet 8. mars 2007 Del Skrevet 8. mars 2007 Blacktower sin løsning bruker RegEx og blir dermed litt treigere enn din... user system total real siDDIs: 2.560000 0.220000 2.780000 (2.802457) blacktower: 4.830000 0.130000 4.960000 (4.970104) (Etter 1 million kjøringer) Lenke til kommentar
siDDis Skrevet 8. mars 2007 Forfatter Del Skrevet 8. mars 2007 Det er veldig stor forskjell ja... Finnes det ein enda raskare løsning? Forresten korleis tester du sånt? Lenke til kommentar
Magnus Holm Skrevet 8. mars 2007 Del Skrevet 8. mars 2007 (endret) Stor og stor.. Husk at dette er etter 1 million kjøringer require 'benchmark' def siddis(h = "13112007") @day = h.slice(0,2) @month = h.slice(2,2) @year = h.slice(4,4) end def blacktower(h = "13112007") e, @day, @month, @year = h.split(/(..)(..)(....)/) end n = 1_000_000 Benchmark.bm do |x| x.report("siDDIs:") { n.times { siddis } } x.report("blacktower:") { n.times { blacktower } } end EDIT: Dokumentasjon. Husk at http://ruby-doc.org/core og http://ruby-doc.org/stdlib har mange kjekke ting Endret 8. mars 2007 av Judofyr Lenke til kommentar
blacktower Skrevet 9. mars 2007 Del Skrevet 9. mars 2007 Treg og tregt fru blom, jeg vil nå se at det var forbausende raskt. La oss sammenligne med en typisk forespørsel Processing AccountController#list (for 10.1.202.159 at 2007-03-09 17:42:21) [GET] Session ID: 0d632b78f62854bf12075695bd9229ba Parameters: {"action"=>"list", "role"=>"4", "controller"=>"account"} Rendering within layouts/application Rendering account/list Completed in 0.03173 (31 reqs/sec) | Rendering: 0.01756 (55%) | DB: 0.00984 (31%) | 200 OK [http://sqaweb/account/role/4/list] Når en request tar ~32 ms, spiller det relativt liten rolle om noe du skal gjøre én gang i controlleren tar 0,0025 ms eller 0.0050 ms. Lenke til kommentar
horetore Skrevet 10. mars 2007 Del Skrevet 10. mars 2007 - e er bare for å bli kvitt et unødvendig empty string treff. En regex-ekspert kan kanskje si oss hvordan man unngår dette. Man trenger ikke være noen regex-ekspert for å gjøre dette.. day, month, year = *params[:timestamp].split(/(..)(..)(....)/)[1..-1] @params er forresten fy-fy, bruk params.. Lenke til kommentar
Anbefalte innlegg
Opprett en konto eller logg inn for å kommentere
Du må være et medlem for å kunne skrive en kommentar
Opprett konto
Det er enkelt å melde seg inn for å starte en ny konto!
Start en kontoLogg inn
Har du allerede en konto? Logg inn her.
Logg inn nå