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)