Ruby Code Překlad Request

hlasů
0

Mám zanedbatelnou Ruby syntax znalosti a doufal, že někdo by byl tak laskav a přeložit funkci zespodu do pseudokódu a případně poskytnout příklad toho, jak by to být nazýván?

def in_list(num, list) 
   list = [*list] 
   list.each {|a,b| return (b)? num.sub(a,b) : a if num =~ a} 
   nil 
end
Položena 15/07/2009 v 10:51
zdroj uživatelem
V jiných jazycích...                            


1 odpovědí

hlasů
12

Wow. To je nějaký ošklivý ruby.

Takže numtady je vlastně String(hrot off bytí užívání #suba #=~metod.

listje Arrayz

  • Regexp objektů a / nebo
  • páry Regexpa náhradní Stringobjekty.

Pokud žádný z výše uvedených Regexps odpovídala řetězec, vrací metoda nil.

Pokud je nepárová Regexpodpovídá řetězec, vrací metoda, která Regexp.

Pokud se spárované Regexpodpovídá řetězec, metoda nahradí část řetězce, že Regexpzápasy s párovým nahrazení textu a vrátí změněný String.

Jakmile se Regexpshoduje řetězec, vrací metoda - nejpozději Regexps jsou považovány.

V žádném případě je původní Stringupravený.

Je to opravdu franken metoda, IMHO, protože se snaží dělat velmi odlišné věci.

Příklad volání:

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

Skutečně, s tímto množstvím typů vratných, vypadá to, že větší bolest v zadku, než to stojí za to.

V pseudo-code

  DEF IN - SEZNAM ( textové , regexps )
    Foreach regexp IN regexps 
      IF HAS-MATCH ( textu , regexp )
        IF HAS-VÝMĚNA-TEXT ( regexp )
          RETURN REPLACE-uzavřeno dávkou ( textu , regexp , GET-VÝMĚNA-TEXT ( regexp ))
        JINÝ
          RETURN regexp
        ENDIF
      ENDIF
    ENDFOREACH
    RETURN NIC nalezenou
  enddef

Ale jak jsem řekl, je to nějaký ošklivý-ass ruby. Já bych se zabránilo jeho použití. Je to pachy v kódu, který mi říká, že je tu spoustu s tímto kódem v pořádku.

Kdybych měl řadu Regexpsa chtěl najít první ten, který odpovídal nějaký text, udělám:

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

Kdybych měl sbírku Regexp, výměna textových párů, a chtěl jsem, aby nahradit první zápas v nějakém textu, tak bych to udělat

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

Raději bych použít Hashpro poslední ve skutečnosti, ale vzhledem k tomu, že ztrácí pořadí původní seznam je přiložen v (a kdo jsem já, abych řekl, že to není důležité, neví, jak se to používá), já ne.

Odpovězeno 15/07/2009 v 12:03
zdroj uživatelem

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