Cod Ruby Traducere Cerere

voturi
0

Am neglijabil cunoștințe de sintaxă Ruby și a fost în speranța cineva ar fi un fel de ajuns pentru a traduce funcția de mai jos în codul pseudo și, eventual, oferă un exemplu de modul în care s-ar fi numit?

def in_list(num, list) 
   list = [*list] 
   list.each {|a,b| return (b)? num.sub(a,b) : a if num =~ a} 
   nil 
end
Întrebat 15/07/2009 la 10:51
sursa de către utilizator
În alte limbi...                            


1 răspunsuri

voturi
12

Wow. Asta e un rubin urât.

Deci , numaici este de fapt o String(offs vârful fiind la utilizarea #subși #=~metode.

listeste Arrayde

  • Regexp obiecte și / sau
  • perechi de Regexpși de înlocuire a Stringobiectelor.

Dacă nici unul dintre date Regexps se potrivesc șirului, metoda revine nil.

În cazul în care un nepereche se Regexppotrivește cu șirul, metoda returneaza asta Regexp.

În cazul în care un Paired se Regexppotrivește cu șirul, metoda substituie parte din șirul că Regexpmeciurile cu textul de înlocuire asociat, și returnează Modificate String.

Odată ce o se Regexppotrivește cu șirul, metoda se întoarce - nu mai târziu Regexps sunt luate în considerare.

În nici un caz este original Stringmodificat.

Este într-adevăr o Franken-metodă, IMHO, din moment ce încearcă să facă lucruri foarte diferite.

Un exemplu de apel:

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

Într-adevăr, cu acea multitudine de tipuri de returnare, se pare ca mai mult de o durere în fund decât merită.

În pseudo-cod

  DEF IN - LISTA ( text , regexps )
    Foreach regexp ÎN regexps 
      DACĂ ARE-POTRIVIRE ( text , regexp )
        IF HAS-SCHIMB-TEXT ( regexp )
          RETURN REPLACE-MATCHED-PORȚIE ( text , regexp , GET-SCHIMB-TEXT ( regexp ))
        ELSE
          RETURN regexp
        ENDIF
      ENDIF
    ENDFOREACH
    RETURN GĂSIT NIMIC-
  ENDDEF

Dar, cum am spus, acest lucru este un rubin urât-fund. Mi-ar evita utilizarea acestuia. Este un codesmell care îmi spune că o mulțime întreagă în neregulă cu acest cod.

Dacă aș fi avut o serie de Regexps, și a vrut să găsească primul care corespund cu un text, aș face:

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

Dacă aș fi avut o colecție de Regexp, perechi de text de înlocuire, și am vrut să înlocuiască primul meci într - un text, aș face acest lucru

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

Mi - ar folosi mai degrabă o Hashpentru ultima , de fapt, dar din moment ce pierde ordinea lista originală a venit (și cine sunt eu să spun că nu e important, nu știe cum este folosit), nu am făcut -o .

Publicat 15/07/2009 la 12:03
sursa de către utilizator

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