次のような文字列を評価するには、eval の特別な動作が必要です。
'5a + 6b + 3a + 11b'
の中へ
'8a + 17b'
出来ますか?もしそうなら、適切な例を挙げていただけますか?最近、この例を見つけました。そこでは、メートルとインチで文字列を評価するという話がありました。
この書き方は有効なRuby構文ではないため、eval
edできません。
次の 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>
さて、ここでの問題は 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 で数理最適化を行うライブラリを知りません。ruby eval では無理だと思います。しかし、おそらく独自のオプティマイザを作成できます。この表現を次のように考えます。
等しい変数で加数をグループ化し、数値を要約して、新しい式文字列を作成できます。解析のためにTreetopは一見の価値があります。