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/, '')に戻ることに気付いた場合、コードは現状のままで大幅に圧縮できます。だからあなたは書くことができますnilstringxxx

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