1

我需要 eval 的特殊行为来评估字符串,例如:

'5a + 6b + 3a + 11b'

进入

'8a + 17b'

是否可以?如果是,你能举个恰当的例子吗?我最近发现了这个例子,演讲是关于用米和英寸来评估字符串。

4

3 回答 3

4

它的编写方式不是有效的 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>
于 2009-09-26T15:10:31.363 回答
2

好吧,这里的问题与 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
于 2009-09-26T15:02:29.540 回答
1

我想根据您的问题,这可能非常复杂。我不知道 ruby​​ 中的数学优化库。我担心红宝石评估是不可能的。但是您可能可以编写自己的优化器。如果你这样想这个表达式:

  • +
    • *
      • 5
      • 一种
    • *
      • 6
      • b
    • *
      • 3
      • 一种
    • *
      • 11
      • b

您可以将具有相等变量的加法分组,汇总数字并创建新的表达式字符串。对于解析Treetop可能值得一看。

于 2009-09-26T15:01:41.093 回答