尝试将简单的数学字符串"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
答案 0 :(得分:1)
def tokenize(str)
str.split.map! { |t| t[/\d/] ? t.to_i : t.to_sym }
end
不是检查令牌是否在一组操作中,而是检查它是否包含数字(对于您的用例)。所以它可以是整数,也可以是操作。
另请注意,Array#collect!
和Array#map!
相同,默认情况下String#split
会在空白处拆分。
答案 1 :(得分: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
答案 2 :(得分:0)
def tokenize s
s.scan(/(\d+)|(\S+)/)
.map{|num, sym| num && num.to_i || sym.to_sym}
end