0

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

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

我知道在我的数学示例中,方法的区别在于应用的操作,而在另一个方面,区别在于匹配的内容。有没有一种优雅的方法可以通过提供子字符串来动态创建新方法?

4

2 回答 2

1

这个怎么样

%w[syn sim].each do |str|
  if w.include? str
    w.sub!(/.*?#{str}\|/, '')
    return w unless similar?(word, w)
  end
end
于 2013-05-12T01:33:12.580 回答
0

如果您意识到这string.sub!(/xxx/, '')将什么都不做并且nil如果string不包含xxx. 所以你可以写

if w.sub!(/.*?syn\|/, '') or w.sub!(/.*?sim\|/, '')
  return w unless similar?(word, w)
end
于 2013-05-12T13:12:27.770 回答