我的 Ruby 语法知识可以忽略不计,希望有人能善意地将下面的函数翻译成伪代码,并可能提供一个如何调用它的示例?
def in_list(num, list)
list = [*list]
list.each {|a,b| return (b)? num.sub(a,b) : a if num =~ a}
nil
end
我的 Ruby 语法知识可以忽略不计,希望有人能善意地将下面的函数翻译成伪代码,并可能提供一个如何调用它的示例?
def in_list(num, list)
list = [*list]
list.each {|a,b| return (b)? num.sub(a,b) : a if num =~ a}
nil
end
哇。那是一些难看的红宝石。
所以num这里实际上是一个String(提示是使用#suband#=~方法。
list是Array一个
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用于最后一个,但由于它失去了原始列表的顺序(我该说谁不重要,不知道它是如何使用的),所以我没有。