Запрос рубин Код перевода

голоса
0

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

def in_list(num, list) 
   list = [*list] 
   list.each {|a,b| return (b)? num.sub(a,b) : a if num =~ a} 
   nil 
end
Задан 15/07/2009 в 10:51
источник пользователем
На других языках...                            


1 ответов

голоса
12

Вау. Вот некоторые уродливые рубин.

Так numвот на самом деле является String(кончик офф являются использование из #subи #=~методов.

listэто Arrayиз

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

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

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

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

После того, Regexpсоответствует строке, метод возвращает - не позднее Regexps не рассматриваются.

Ни в коем случае это оригинальный Stringмодифицирована.

Это действительно Франкен-метод, имхо, так как он пытается сделать очень разные вещи.

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

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

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

В псевдокоде

  DEF IN - LIST ( текст , регэкспы )
    FOREACH регулярное_выражение В регулярных выражениях 
      IF HAS-MATCH ( текст , регулярное выражение )
        ЕСЛИ HAS-ЗАМЕНА-TEXT ( регулярное выражение )
          ВОЗВРАТ REPLACE-MATCHED-ПОРЦИЯ ( текст , регулярное выражение , GET-ЗАМЕНА-TEXT ( регулярное выражение ))
        ELSE
          ВОЗВРАТ регулярное_выражение
        ENDIF
      ENDIF
    ENDFOREACH
    Не ВОЗВРАТ НИЧЕГО-НАЙДЕНО
  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для последнего на самом деле, но так , что теряет порядок первоначальный список пришел в (и кто я такой, чтобы сказать , что это не важно, не зная , как он используется), я не сделал.

Ответил 15/07/2009 в 12:03
источник пользователем

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