1

次のような文字列を評価するには、eval の特別な動作が必要です。

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

の中へ

'8a + 17b'

出来ますか?もしそうなら、適切な例を挙げていただけますか?最近、この例を見つけました。そこでは、メートルとインチで文字列を評価するという話がありました。

4

3 に答える 3

4

この書き方は有効なRuby構文ではないため、evaledできません。

次の 2 つのオプションがあります。

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>
于 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 で数理最適化を行うライブラリを知りません。ruby eval では無理だと思います。しかし、おそらく独自のオプティマイザを作成できます。この表現を次のように考えます。

  • +
    • *
      • 5
      • a
    • *
      • 6
      • b
    • *
      • 3
      • a
    • *
      • 11
      • b

等しい変数で加数をグループ化し、数値を要約して、新しい式文字列を作成できます。解析のためにTreetopは一見の価値があります。

于 2009-09-26T15:01:41.093 に答える