Ruby kode Oversettelse Forespørsel

stemmer
0

Jeg har ubetydelig Ruby syntaks kunnskap og håpet noen ville være så snill å oversette funksjonen nedenfor i pseudo-kode og muligens gi et eksempel på hvordan det ville bli kalt?

def in_list(num, list) 
   list = [*list] 
   list.each {|a,b| return (b)? num.sub(a,b) : a if num =~ a} 
   nil 
end
Publisert på 15/07/2009 klokken 09:51
kilden bruker
På andre språk...                            


1 svar

stemmer
12

Wow. Det er noen stygge rubin.

numher er faktisk en String(spiss offs være bruk av #subog #=~metoder.

lister en Arrayav

  • Regexp objekter og / eller
  • parene Regexpog erstatnings Stringobjekter.

Hvis ingen av de gitte Regexps matche strengen, som metoden returnerer nil.

Hvis et uparet Regexpsamsvarer med strengen, returnerer den metode som Regexp.

Dersom en sammenkoblet Regexpsamsvarer med strengen, idet fremgangsmåten erstatter den del av strengen som til Regexpfyrstikker med den sammenkoblede erstatningsteksten, og returnerer den modifiserte String.

Når en Regexpmatcher strengen, returnerer metoden - senest Regexps er vurdert.

I noen tilfeller er det opprinnelige Stringendret.

Det er virkelig en Franken-metoden, IMHO, siden den prøver å gjøre veldig forskjellige ting.

Et eksempel samtale:

 in_list("abe lincoln", [ [/linc/, 'zelda'] ]) #=> "abe zeldaoln"
 in_list("abe lincoln", [ [/linc/] ]) #=> /linc/
 in_list("abe lincoln", [ [/link/] ]) #=> nil

Virkelig, med det mangfold av returtyper, virker det som mer av en smerte i ræva enn det er verdt.

I pseudo-kode

  DEF IN - LIST ( tekst , regexps )
    Foreach regexp I regexps 
      IF HAR-MATCH ( tekst , regexp )
        IF HAR-ERSTATNING-TEKST ( regexp )
          RETURN BYTT matchet-DELER ( tekst , regexp , GET-BYTTE-TEKST ( regexp ))
        ELLERS
          RETURN regexp
        SLUTT OM
      SLUTT OM
    ENDFOREACH
    RETURN INGENTING-FUNNET
  ENDDEF

Men som jeg sa, dette er litt stygg-ass rubin. Jeg ville unngå å bruke det. Det er en codesmell som forteller meg at det er en hel masse galt med denne koden.

Hvis jeg hadde en rekke Regexps, og ønsket å finne den første som matchet litt tekst, vil jeg gjøre:

# general case
regexps.find { |re| text =~ re }
# example
[ /earn/, /more/, /sessions/, /by/, /sleaving/ ].find { |re| "A baby?" =~ re } # would return /by/

Hvis jeg hadde en samling av Regexp, utskifting tekst parene, og jeg ønsket å erstatte den første kampen i tekst, vil jeg gjøre dette

# general case
text_dupe = text.dup
pairs.find { |re,replace| text_dupe.sub!( re, replace ) }
# example
text_dupe = "One two three four".dup
[ [/ape/, 'frog'], [/our/, 'my'] ].find { |re,replace| text_dupe.sub!( re, replace } } # would return "One two three fmy"

Jeg vil heller bruke en Hashfor siste faktisk, men siden den mister rekkefølgen den opprinnelige listen kom inn (og hvem er jeg til å si det er ikke viktig, uten å vite hvordan det brukes), jeg gjorde ikke det.

Svarte 15/07/2009 kl. 11:03
kilden bruker

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more