1

単純な数学文字列"1 2 3 * + 4 5 - /"を のような整数および/または記号の配列に変換しようとしてい[1, 2, 3, :*, :+, 4, 5, :-, :/]ます。

これよりもエレガントな (そして拡張可能な) ソリューションはありますか?

def tokenize s
    arr = s.split(/ /)
    symbols = %w{ + - / * }
    arr.collect! do |c| 
        if symbols.include?(c)
            c.to_sym
        else
            c.to_i
        end
    end
end
4

3 に答える 3

1
def tokenize(str)
  str.split.map! { |t| t[/\d/] ? t.to_i : t.to_sym }
end

トークンが一連の操作に含まれているかどうかを確認する代わりに、数字が含まれているかどうかを確認することができます (ユースケースの場合)。したがって、それは整数または演算のいずれかです。

Array#collect!また、とArray#map!は同一でありString#split、デフォルトでは空白で分割されることに注意してください。

于 2013-01-06T05:19:50.197 に答える
0
def tokenize s
  s.scan(/(\d+)|(\S+)/)
  .map{|num, sym| num && num.to_i || sym.to_sym}
end
于 2013-01-06T05:01:48.987 に答える
0

どうですか...

h = Hash[*%w{+ - / *}.map { |x| [x, x.to_sym] }.flatten]

その後、

arr.map { |c| h[c] || c.to_i }

一緒に:

def tokenize s
    h = Hash[*%w{+ - / *}.map { |x| [x, x.to_sym] }.flatten]
    s.split.map { |c| h[c] || c.to_i }
end
于 2013-01-06T02:26:50.157 に答える