Ruby-Code Übersetzung-Anfrage

stimmen
0

Ich habe vernachlässigbar Wissen Ruby-Syntax und hoffte, dass jemand so freundlich wäre, die Funktion unten in Pseudo-Code zu übersetzen und möglicherweise ein Beispiel dafür, wie sie genannt werden würden?

def in_list(num, list) 
   list = [*list] 
   list.each {|a,b| return (b)? num.sub(a,b) : a if num =~ a} 
   nil 
end
Veröffentlicht am 15/07/2009 um 10:51
quelle vom benutzer
In anderen Sprachen...                            


1 antworten

stimmen
12

Beeindruckend. Das ist einige hässliche Rubin.

Also numhier ist eigentlich eine String(die Spitze offs die Verwendung des Wesens #subund #=~Methoden.

listist eine Arrayvon

  • Regexp Objekte und / oder
  • Paare Regexpund StringErsatzobjekten.

Falls keine der angegebenen Regexps entsprechen die Zeichenfolge, die Methode zurückgibt nil.

Wenn ein ungepaarten Regexpdie Zeichenfolge übereinstimmt, gibt die Methode , dass Regexp.

Wenn Sie ein gekoppeltes Regexpder Zeichenfolge übereinstimmt, ersetzt das Verfahren den Teil der Zeichenfolge , dass die RegexpBegegnungen mit dem gekoppelten Ersetzungstext und gibt die modifizieren String.

Sobald eine Regexpder Zeichenfolge übereinstimmt, gibt die Methode - nicht später Regexps berücksichtigt werden.

In keinem Fall ist die ursprüngliche Stringgeändert.

Es ist wirklich ein franken-Methode, IMHO, da es sehr verschiedene Dinge zu tun versucht.

Ein Beispiel Aufruf:

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

Wirklich, mit dieser Vielzahl von Rückgabetypen, wie es scheint eher einen Schmerz im Arsch, als es wert ist.

In Pseudo-Code

  DEF IN - LIST ( Text , regexps )
    FOREACH regexp IN regexps 
      IF HAS-MATCH ( Text , regexp )
        IF HAS-ERSATZ-TEXT ( regexp )
          RETURN REPLACE-Matched-PORTION ( Text , regexp , GET-ERSATZ-TEXT ( regexp ))
        SONST
          RETURN regexp
        ENDIF
      ENDIF
    endforeach
    RETURN NICHTS-GEFUNDEN
  ENDDEF

Aber wie gesagt, das ist einige hässliche Esel Rubin. Ich würde mit ihm vermeiden. Es ist ein codesmell, die mich gibt es eine ganze Menge falsch mit diesem Code teilt.

Wenn ich eine Reihe von hatte Regexps, und wollte die ersten finden , die einen Text abgestimmt, würde ich tun:

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

Wenn ich eine Sammlung von hatte Regexp, Ersatztextpaare, und ich wollte das erste Spiel in einem Text ersetzen, würde ich dies tun

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

Ich würde eher eine Verwendung Hashfür das letzte wirklich, aber da , dass die Reihenfolge , in der ursprünglichen Liste kam verliert (und wer bin ich sagen , dass nicht wichtig ist, nicht zu wissen , wie es verwendet wird ), habe ich nicht.

Beantwortet am 15/07/2009 um 12:03
quelle vom benutzer

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