Aanvraag Ruby Code Vertaling

stemmen
0

Ik heb te verwaarlozen Ruby syntax kennis en hoopte dat iemand zou zo vriendelijk om onderstaande functie te vertalen naar pseudo-code en in voorkomend geval een voorbeeld van hoe het zou worden genoemd zijn?

def in_list(num, list) 
   list = [*list] 
   list.each {|a,b| return (b)? num.sub(a,b) : a if num =~ a} 
   nil 
end
De vraag is gesteld op 15/07/2009 om 10:51
bron van user
In andere talen...                            


1 antwoorden

stemmen
12

Wauw. Dat is een lelijke robijn.

Dus numhier is eigenlijk een String(de tip offs die het gebruik van de #suben #=~methoden.

listeen Arrayvan

  • Regexp voorwerpen en / of
  • paren Regexpen vervanging Stringvoorwerpen.

Als geen van de gegeven Regexps deze tekenreeks, retourneert de methode nil.

Als een ongepaard Regexpovereenkomt met de string, retourneert de methode die Regexp.

Als een gepaarde Regexpovereenkomt met de string, de methode vervangt het deel van de string die de Regexpwedstrijden met de gepaarde vervangende tekst, en geeft de gewijzigde String.

Zodra een Regexpovereenkomt met de string, retourneert de methode - uiterlijk Regexps worden beschouwd.

In geen enkel geval is de oorspronkelijke Stringgewijzigd.

Het is echt een franken-methode, IMHO, omdat het probeert om heel andere dingen te doen.

Een voorbeeld gesprek:

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

Echt, met die veelheid aan terugkeer types, het lijkt erop dat meer een pain in the ass dan het waard is.

In pseudo-code

  DEF IN - LIST ( tekst , regexps )
    Foreach regexp IN regexps 
      IF HAS-MATCH ( tekst , regexp )
        IF HAS-VERVANGING-TEXT ( regexp )
          RETURN VERVANGEN afgestemd portie ( tekst , regexp , GET-VERVANGING-TEXT ( regexp ))
        ANDERS
          RETURN regexp
        STOP ALS
      STOP ALS
    ENDFOREACH
    RETURN NIETS-GEVONDEN
  ENDDEF

Maar zoals ik al zei, dit is een lelijke-ass robijn. Ik wil voorkomen dat het gebruik het. Het is een codesmell die me vertelt dat er is een heleboel mis met deze code.

Als ik een serie van gehad Regexps, en wilde de eerste die wat tekst gematched vinden, zou ik doe:

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

Als ik had een collectie van Regexp, vervangende tekst paren, en ik wilde de eerste wedstrijd te vervangen in een tekst, zou ik dit doen

# 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"

Ik zou liever gebruik maken van een Hashvan de laatste eigenlijk, maar aangezien dat verliest de volgorde waarin de oorspronkelijke lijst kwam (en wie ben ik om te zeggen dat is niet belangrijk, niet wetend hoe het gebruikt wordt), dat deed ik niet.

antwoordde op 15/07/2009 om 12:03
bron van user

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