Запрос на перевод кода Ruby - PullRequest
0 голосов
/ 15 июля 2009

У меня незначительное знание синтаксиса Ruby, и я надеялся, что кто-то будет достаточно любезен, чтобы перевести приведенную ниже функцию в псевдокод и, возможно, привести пример того, как она будет вызываться?

def in_list(num, list) 
   list = [*list] 
   list.each {|a,b| return (b)? num.sub(a,b) : a if num =~ a} 
   nil 
end

1 Ответ

12 голосов
/ 15 июля 2009

Ничего себе. Это какой-то уродливый рубин.

Таким образом, num здесь на самом деле String (завершается использование методов #sub и #=~.

list является Array из

  • Regexp объекты и / или
  • пар Regexp и заменяющих String объектов.

Если ни один из заданных Regexp s не соответствует строке, метод возвращает nil.

Если непарной Regexp соответствует строка, метод возвращает, что Regexp.

Если парная Regexp соответствует строке, метод заменяет часть строки что Regexp совпадает с парным текстом замены и возвращает измененный String.

Как только Regexp совпадает со строкой, метод возвращает значение - не позднее Regexp с.

Ни в коем случае оригинал String не изменяется.

Это действительно откровенный метод, ИМХО, поскольку он пытается делать совершенно разные вещи.

Пример вызова:

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

Действительно, с таким множеством возвращаемых типов, это похоже на боль в заднице, чем стоит.

в псевдокоде

  DEF <i>IN</i>-<i>LIST</i>( <b>text</b>, <b>regexps</b> )
    FOREACH <b>regexp</b> IN <b>regexps</b>
      IF <i>HAS-MATCH</i>( <b>text</b>, <b>regexp</b> )
        IF <i>HAS-REPLACEMENT-TEXT</i>( <b>regexp</b> )
          RETURN <i>REPLACE-MATCHED-PORTION</i>( <b>text</b>, <b>regexp</b>, <i>GET-REPLACEMENT-TEXT</i>(<b>regexp</b>) )
        ELSE
          RETURN <b>regexp</b>
        ENDIF
      ENDIF
    ENDFOREACH
    RETURN <i>NOTHING-FOUND</i>
  ENDDEF

Но, как я уже сказал, это какой-то уродливый рубин. Я бы не стал его использовать. Это кодовый код, который говорит мне, что в этом коде много неправильного.

Если бы у меня был массив Regexps, и я хотел найти первый, который соответствовал некоторому тексту, я бы сделал:

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

Если бы у меня была коллекция Regexp, заменяющих текстовые пары, и я хотел бы заменить первое совпадение в некотором тексте, я сделал бы это

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

Я бы предпочел использовать Hash для последнего на самом деле, но так как это теряет порядок, в котором появился оригинальный список (и кто я такой, чтобы сказать это не важно, не зная, как это используется), я не знал.

...