我的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 :(得分:12)
哇。那是一些丑陋的红宝石。
所以num
这里实际上是String
(提示是使用#sub
和#=~
方法。
list
是<{p}}的Array
Regexp
个对象和/或Regexp
和替换String
个对象。如果给定的Regexp
没有匹配字符串,则该方法返回nil
。
如果未配对的Regexp
与字符串匹配,则该方法返回Regexp
。
如果配对Regexp
与字符串匹配,则该方法替换字符串的一部分
Regexp
与配对的替换文本匹配,并返回修改后的String
。
一旦Regexp
与字符串匹配,该方法将返回 - 不再考虑Regexp
。
在任何情况下都不会修改原始String
。
这真的是一种非常方法,恕我直言,因为它试图做很多不同的事情。
示例电话:
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
,但由于失去了订单,原始列表就进来了(我该说谁
这不重要,不知道它是如何使用的,我没有。