现在我在一串文字中找到匹配项:
if w.include? 'syn'
w.sub!(/.*?syn\|/, '')
return w unless similar?(word, w)
elsif w.include? 'sim'
w.sub!(/.*?sim\|/, '')
return w unless similar?(word, w)
end
但我希望能够将它们结合起来,就像我在另一个小程序中所做的那样(这只是它的一小部分):
def plus
self.meta_reduce(:+)
end
def minus
self.meta_reduce(:-)
end
def times
self.make_float
self.meta_reduce(:*)
end
def divide
self.make_float
self.meta_reduce(:/)
end
def make_float args = nil
return args.to_f if args
@value = @value.map {|n| n.to_f }
end
def meta_reduce operation = :sym
if @value.length < 2
raise 'calculator is empty'
end
@value = self.push(@value.pop(2).reduce(operation))
end
我知道在我的数学例子中,方法的不同之处在于应用的操作,而在另一方面,差异将是匹配的内容。有没有一种优雅的方法可以通过提供子串来动态创建一个新方法?
答案 0 :(得分:1)
这个怎么样
%w[syn sim].each do |str|
if w.include? str
w.sub!(/.*?#{str}\|/, '')
return w unless similar?(word, w)
end
end
答案 1 :(得分:0)
如果您发现string.sub!(/xxx/, '')
将无效,并且如果nil
不包含string
,则会返回xxx
,您的代码可以大量压缩。所以你可以写
if w.sub!(/.*?syn\|/, '') or w.sub!(/.*?sim\|/, '')
return w unless similar?(word, w)
end