代码之家  ›  专栏  ›  技术社区  ›  oldhomemovie

红宝石中有点复杂的eval

  •  1
  • oldhomemovie  · 技术社区  · 15 年前

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

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

    进入之内

    '8a + 17b'
    

    有可能吗?如果是,你能举个适当的例子吗?我发现 this 最近的例子,讨论的是用米和英寸来评估弦。

    3 回复  |  直到 15 年前
        1
  •  4
  •   sepp2k    15 年前

    它的编写方式,这不是有效的Ruby语法,因此它不能 eval 预计起飞时间。

    您有两种选择:

    a)不要使用eval。我认为这是最好的选择,但我认为这取决于上下文。

    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>
    
        2
  •  2
  •   khelll    15 年前

    好吧,这里的问题与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
    
        3
  •  1
  •   Roman    15 年前

    我想这可能很复杂,这取决于你的问题。我不知道Ruby中的数学优化库。我担心用Ruby Eval是不可能的。但您可能可以编写自己的优化器。如果你这样想的话:

    • +
      • *
        • 5个
      • *
      • *
      • *
        • 11个

    您可以使用相同的变量对加和进行分组,汇总数字并创建新的表达式字符串。用于解析 Treetop 可能值得一看。