Zapytanie Ruby Code Translation

głosy
0

Mam nieistotny znajomość składni Ruby i był nadzieją ktoś byłby na tyle uprzejmy, żeby przetłumaczyć funkcję poniżej w pseudo kod i ewentualnie stanowić przykład, jak to nazwać?

def in_list(num, list) 
   list = [*list] 
   list.each {|a,b| return (b)? num.sub(a,b) : a if num =~ a} 
   nil 
end
Utwórz 15/07/2009 o 10:51
źródło użytkownik
W innych językach...                            


1 odpowiedzi

głosy
12

Łał. To jakiś brzydki rubin.

Więc numtutaj jest rzeczywiście String(końcówkę offs będące korzystanie z #subi #=~metod.

listjest Arrayod

  • Regexp obiektów i / lub
  • par Regexpi zamienne Stringobiektów.

Jeśli żadna z podanych Regexps dopasować ciąg, zwracany przez metodę nil.

Jeżeli nieparzysty Regexpdopasowuje ciąg, metoda zwraca to Regexp.

Jeśli połączonemu Regexpdopasowuje ciąg, metoda zastępuje część napisu, że Regexpmecze ze skojarzonym tekstu zastępczego i zwraca zmodyfikowany String.

Gdy Regexpdopasowuje ciąg, metoda zwraca - nie później Regexps są uznawane.

W żadnym przypadku nie jest oryginalny Stringzmodyfikowane.

To naprawdę Franken-metoda, IMHO, ponieważ stara się robić bardzo różne rzeczy.

Przykładem połączenia:

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

Naprawdę, z tym wielu rodzajów powrotów, wydaje się bardziej upierdliwy niż to warte.

Pseudo-kod

  DEF IN - LISTA ( tekst , wyrażenia regularne )
    ForEach Regexp W wyrażeniach 
      IF HAS-match ( tekst , Regexp )
        IF HAS zastępczej tekście ( wyrażenia regularne )
          RETURN WYMIENIĆ dopasowane porcjowa ( tekst , regexp , GET-WYMIANA-TEXT ( regexp ))
        JESZCZE
          RETURN regexp
        ENDIF
      ENDIF
    endforeach
    RETURN NIC-FOUND
  ENDDEF

Ale jak powiedziałem, to jest jakaś brzydka dupa rubin. Chciałbym uniknąć korzystania z niej. Jest to zapachy kodu, który mówi mi, że dużo złego z tym kodem.

Gdybym miał tablicę Regexps, i chcieliśmy znaleźć się pierwszy pasujący tekst, chciałbym zrobić:

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

Gdybym miał kolekcję Regexp, par tekst zastępczy, a ja chciałem wymienić pierwszy mecz w jakimś tekście, chciałbym to zrobić

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

Wolę używać Hashza ostatni faktycznie, ale ponieważ traci kolejność oryginalna lista dołączonej (i kim jestem, by powiedzieć, że nie jest ważne, nie wiedząc, w jaki sposób jest on wykorzystywany), ja nie.

Odpowiedział 15/07/2009 o 12:03
źródło użytkownik

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