7

ルビーでこんなのありますか?

send(+, 1, 2)

このコードの冗長性を減らしたい

if op == "+"
  return arg1 + arg2
elsif op == "-"
  return arg1 - arg2
elsif op == "*"
  return arg1 * arg2
elsif op == "/"
  return arg1 / arg2
4

2 に答える 2

17

うん、単に次のようsendに (または、できればpublic_send) を使用します。

arg1.public_send(op, arg2)

これが機能するのは、Ruby のほとんどの演算子 ( +-*/など含む) が単純にメソッドを呼び出すためです。1 + 2と同じです1.+(2)

また、ユーザー入力の場合は、ホワイトリストに登録することもopできます。たとえば%w[+ - * /].include?(op)、そうしないと、ユーザーが任意のメソッドを呼び出すことができます (セキュリティ上の脆弱性が生じる可能性があります)。

于 2012-10-25T01:16:02.027 に答える
1

他のオプションとして、演算子とオペランドがたまたまgetsメソッドからの文字列形式である場合は、次を使用することもできますeval

例えば:

a = '1'; b = '2'; o = '+'

eval a+o+b

になる

eval '1+2'

返す3

于 2017-08-23T19:00:53.097 に答える