ルビーでこんなのありますか?
send(+, 1, 2)
このコードの冗長性を減らしたい
if op == "+"
return arg1 + arg2
elsif op == "-"
return arg1 - arg2
elsif op == "*"
return arg1 * arg2
elsif op == "/"
return arg1 / arg2
ルビーでこんなのありますか?
send(+, 1, 2)
このコードの冗長性を減らしたい
if op == "+"
return arg1 + arg2
elsif op == "-"
return arg1 - arg2
elsif op == "*"
return arg1 * arg2
elsif op == "/"
return arg1 / arg2
うん、単に次のようsend
に (または、できればpublic_send
) を使用します。
arg1.public_send(op, arg2)
これが機能するのは、Ruby のほとんどの演算子 ( +
、-
、*
、/
などを含む) が単純にメソッドを呼び出すためです。1 + 2
と同じです1.+(2)
。
また、ユーザー入力の場合は、ホワイトリストに登録することもop
できます。たとえば%w[+ - * /].include?(op)
、そうしないと、ユーザーが任意のメソッドを呼び出すことができます (セキュリティ上の脆弱性が生じる可能性があります)。
他のオプションとして、演算子とオペランドがたまたまgets
メソッドからの文字列形式である場合は、次を使用することもできますeval
。
例えば:
a = '1'; b = '2'; o = '+'
eval a+o+b
になる
eval '1+2'
返す3