rubysolo/dentakuを使うことにより、安全に数学的および論理的な式を評価することが出来ます
使い方
シンプルな評価
calculator = Dentaku::Calculator.new
calculator.evaluate('1 + 1')
# => 2
変数の参照
calculator.evaluate('hoge + 1', hoge: 1)
# => 2
# 複数変数を宣言する場合
calculator.evaluate('hoge + huga + piyo', hoge: 1, huga: 2, piyo: 3)
# => 6
変数の値をメモリに保存してから、それらの保存された値に対して式を評価することもできます
calculator.store(one: 1)
calculator.evaluate('one + 1')
# => 2
例外処理
evaluateが評価する式にエラーがある場合、evaluateはnilを返します。
例外をそのまま返したい場合はevaluate!を使用します
calculator.store(one: 1)
calculator.evaluate('aaa + 1')
# => nil
calculator.evaluate!('aaa + 1')
# => UnboundVariableError: no value provided for variables: aaa
組み込み関数
dentakuにはあらかじめ式の評価に使える関数がいくつか備わっています。
Math: +, -, *, /, %, ^, |, &
Also, all functions from Ruby's Math module, including SIN, COS, TAN, etc.
Comparison: <, >, <=, >=, <>, !=, =,
Logic: IF, AND, OR, NOT, SWITCH
Numeric: MIN, MAX, SUM, AVG, COUNT, ROUND, ROUNDDOWN, ROUNDUP
Selections: CASE
String: LEFT, RIGHT, MID, LEN, FIND, SUBSTITUTE, CONCAT, CONTAINS
if
if文はif(条件式, 真, 偽)のように使用できます
calculator.evaluate('if(hoge >= 1, hoge + 1, -1)', hoge: 1)
# => 2
calculator.evaluate('if(hoge >= 1, hoge + 1, -1)', hoge: 0)
# => -1
### switch switch文は`switch(変数, 条件1, 返り値1, 条件2, 返り値2..., else返り値)`のように書けます
calculator.evaluate('switch(hoge, 0, 1+1, 1, 2+2, -1)', hoge: 0)
# => 2
calculator.evaluate('switch(hoge, 0, 1+1, 1, 2+2, -1)', hoge: 1)
# => 4
calculator.evaluate('switch(hoge, 0, 1+1, 1, 2+2, -1)', hoge: 2)
# => -1
rubyでいうところのこんな感じです
case hoge
when 0
1+1
when 1
2+2
else
-1
end
自作関数
dentakuでは組み込まれている関数以外にも自身で関数を定義できます
定義にはadd_functionを使用します
add_function(:関数名, :返り値の型, ->(引数1, 引数2, ...) { 処理 })
# 階乗の関数定義
calculator.add_function(:pow, :numeric, ->(mantissa, exponent) { mantissa ** exponent })
calculator.evaluate(pow(2, 2))
# => 4
コメントの挿入
calculator.evaluate('hoge + 1 /* This is a comment */', hoge: 2)