结合两个非常相似的ruby if语句

时间:2013-05-11 21:53:22

标签: ruby regex string methods match

现在我在一串文字中找到匹配项:

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

我知道在我的数学例子中,方法的不同之处在于应用的操作,而在另一方面,差异将是匹配的内容。有没有一种优雅的方法可以通过提供子串来动态创建一个新方法?

2 个答案:

答案 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