我的 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
(提示是使用#sub
and#=~
方法。
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
用于最后一个,但由于它失去了原始列表的顺序(我该说谁不重要,不知道它是如何使用的),所以我没有。