2009-07-15 2 views
0

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

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

Любая идея, с какими аргументами этот код вызывается? У меня была трещина в понимании этого, но я довольно смущен. Для меня это слишком умно или слишком глупо, чтобы понять первоначальное намерение. – tomafro

+0

Это слишком глупо. Хороший код комментируется, использует значимые имена переменных и во многих отношениях не является частью этого кода. – rampion

ответ

12

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

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

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

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

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

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

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

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

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

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

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

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

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

В псевдокоде

 
    DEF IN-LIST(text, regexps) 
    FOREACH regexp IN regexps 
     IF HAS-MATCH(text, regexp) 
     IF HAS-REPLACEMENT-TEXT(regexp) 
      RETURN REPLACE-MATCHED-PORTION(text, regexp, GET-REPLACEMENT-TEXT(regexp)) 
     ELSE 
      RETURN regexp 
     ENDIF 
     ENDIF 
    ENDFOREACH 
    RETURN NOTHING-FOUND 
    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 для последнего на самом деле, но так, что теряет порядок первоначальный список пришел в (и кто я сказать , что не я важно, не зная, как он используется), я этого не сделал.

+0

Был на полпути, написав ответ, когда вы разместили свой. Я пришел к тем же выводам re: regexp matching, и согласен, что это уродливо. – tomafro