我需要 eval 的特殊行为来评估字符串,例如:
'5a + 6b + 3a + 11b'
进入
'8a + 17b'
是否可以?如果是,你能举个恰当的例子吗?我最近发现了这个例子,演讲是关于用米和英寸来评估字符串。
它的编写方式不是有效的 ruby 语法,因此无法eval
编辑。
你有两个选择:
a) 不要使用评估。我认为这是最好的选择,但我认为这取决于上下文。
b) 将语法更改为5.a + 6.b + 3.a + 11.b
并定义适当的 a 和 b 方法,如下所示:
class Expr
attr_accessor :a,:b
def initialize(a,b)
@a, @b = a,b
end
def +(other)
Expr.new(a + other.a, b + other.b)
end
def inspect
"<expr: #{a}a + #{b}b>"
end
end
class Numeric
def a
Expr.new(self, 0)
end
def b
Expr.new(0, self)
end
end
5.a + 6.b + 3.a + 11.b #=> <expr: 8a + 17b>
好吧,这里的问题与 Ruby 的 eval 无关。您需要一个简单的解释器(解析器+评估器)来解释上述表达式。您的问题有一些解决方案,但您需要对您尝试解析的语法给出适当的解释。
例如,在你的情况下,我会做这样的事情:
res = ['a','b'].map do |sym|
'5a + 6b + 3a + 11b'.scan(/(\d+)#{sym}/).flatten.inject(0){|sum,x| sum + x.to_i}.to_s + sym
end.join(" + ")
puts res #=> 8a + 17b
我想根据您的问题,这可能非常复杂。我不知道 ruby 中的数学优化库。我担心红宝石评估是不可能的。但是您可能可以编写自己的优化器。如果你这样想这个表达式:
您可以将具有相等变量的加法分组,汇总数字并创建新的表达式字符串。对于解析Treetop可能值得一看。