Demande Ruby Code de traduction

voix
0

J'ai négligeable connaissance de la syntaxe Ruby et espérais que quelqu'un serait assez bon pour traduire la fonction ci-dessous dans le code pseudo et peut-être donner un exemple de la façon dont il serait appelé?

def in_list(num, list) 
   list = [*list] 
   list.each {|a,b| return (b)? num.sub(a,b) : a if num =~ a} 
   nil 
end
Créé 15/07/2009 à 10:51
source utilisateur
Dans d'autres langues...                            


1 réponses

voix
12

Sensationnel. C'est un peu ruby ​​laid.

Donc , numici est en fait un String(les compromis pointe étant l'utilisation des #subet #=~méthodes.

listest un Arraydes

  • Regexp des objets et / ou
  • paires de Regexpet remplacement des Stringobjets.

Si aucune des données Regexps correspondent à la chaîne, la méthode retourne nil.

Si un apparié Regexpcorrespond à la chaîne, la méthode retourne que Regexp.

Si un apparié Regexpcorrespond à la chaîne, la méthode substitue la partie de la chaîne que les Regexpmatchs avec le texte de remplacement associé, et renvoie la modification String.

Une fois un Regexpcorrespond à la chaîne, retourne la méthode - au plus tard Regexps sont considérés.

En aucun cas , l'original est Stringmodifié.

Il est vraiment une Franken méthode, à mon humble avis, car il essaie de faire des choses très différentes.

Un exemple d'appel:

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

En fait, avec cette multitude de types de retour, il semble que plus d'une douleur dans le cul que ça vaut le coup.

En pseudo-code

  DEF EN - LISTE ( texte , regexps )
    FOREACH regexp EN regexps 
      SI HAS-MATCH ( texte , regexp )
        SI HAS-REPLACEMENT-TEXT ( regexp )
          RETOUR REPLACE-appariée PORTION ( texte , regexp , GET-REMPLACEMENT-TEXTE ( regexp ))
        AUTRE
          RETOUR regexp
        FIN SI
      FIN SI
    endforeach
    RETOUR RIEN TROUVE-
  enddef

Mais comme je l'ai dit, c'est une ruby-cul laid. Il faut éviter de l'utiliser. Il est un codesmell qui me dit qu'il ya beaucoup de mal à ce code.

Si je devais un tableau de Regexps, et je voulais trouver le premier qui correspondait à un texte, je le ferais:

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

Si j'avais une collection de Regexppaires de texte de remplacement, et je voulais remplacer le premier match dans un texte, je ferais ceci

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

Je préfère utiliser un Hashpour la dernière en fait, mais depuis que perd l'ordre de la liste initiale est venu (et qui suis - je dire que c'est pas important, ne sachant pas comment il est utilisé), je ne l' ai pas.

Créé 15/07/2009 à 12:03
source utilisateur

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