2012-10-25 88 views
4

在紅寶石中是否有這樣的東西?我可以在Ruby中動態調用數學運算符嗎?

send(+, 1, 2) 

我想使這段代碼看起來不那麼多餘

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

回答

12

沒錯,只需使用send(或更好,但public_send)像這樣:

arg1.public_send(op, arg2) 

該作品因爲Ruby中的大多數運營商(包括+,-,*, /,and more)只需調用方法。所以1 + 21.+(2)相同。

如果是用戶輸入,例如,您可能還想將其列入白名單op%w[+ - * /].include?(op),否則用戶將能夠調用任意方法(這是一個潛在的安全漏洞)。

+1

那是什麼'%w'符號?或者它比'[「+」,「 - 」,...]包含更清潔(op)' – MxyL

+0

您需要轉義''''%w'才能工作。 – oldergod

+2

'%w [a b c]'相當於'['a','b','c']' - 它只是字符串數組的簡寫形式(元素由空格分隔)。 –

0

作爲另一種選擇,如果你的操作和操作數正好是字符串格式,從gets法說,你也可以使用eval

例如:

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

eval a+o+b

變成

eval '1+2'

返回3

相關問題