0

我的 Ruby 语法知识可以忽略不计,希望有人能善意地将下面的函数翻译成伪代码,并可能提供一个如何调用它的示例?

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

1 回答 1

12

哇。那是一些难看的红宝石。

所以num这里实际上是一个String(提示是使用#suband#=~方法。

listArray一个

  • Regexp对象和/或
  • 成对Regexp和替换String对象。

如果给定Regexp的 s 都不匹配字符串,则该方法返回nil

如果未配对Regexp的字符串与字符串匹配,则该方法返回该字符串Regexp

如果成对Regexp匹配字符串,则该方法将字符串中Regexp匹配的部分替换为成对的替换文本,并返回修改后的String.

一旦 aRegexp匹配字符串,该方法返回 - 不Regexp考虑后面的 s。

在任何情况下都不会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 regexp IN regexps 
      IF HAS-MATCH ( text , regexp )
        如果有替换文本(正则表达式)
          返回替换匹配部分文本,正则表达式获取替换文本(正则表达式))
        别的
          返回正则表达式
        万一
      万一
    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"

实际上,我宁愿将 aHash用于最后一个,但由于它失去了原始列表的顺序(我该说谁不重要,不知道它是如何使用的),所以我没有。

于 2009-07-15T11:03:47.750 回答