如何根據名稱動態調用方法?當名稱包含在字符串變量中時,如何動態調用方法?例如:class MyClass
def foo; end
def bar; endendobj = MyClass.new
str = get_data_from_user # e.g. `gets`, `params`, DB access, etc.str #=> "foo"# somehow call `foo` on `obj` using the value in `str`.我怎樣才能做到這一點?這樣做是否存在安全風險?
3 回答

夢里花落0921
TA貢獻1772條經驗 獲得超6個贊
您想要做的是稱為動態調度。在Ruby中它很容易,只需使用public_send
:
method_name = 'foobar'obj.public_send(method_name) if obj.respond_to? method_name
如果該方法是私有/受保護的,請send
改用,但更喜歡public_send
。
如果價值method_name
來自用戶,則存在潛在的安全風險。要防止漏洞,您應該驗證哪些方法可以實際調用。例如:
if obj.respond_to?(method_name) && %w[foo bar].include?(method_name) obj.send(method_name)end

忽然笑
TA貢獻1806條經驗 獲得超5個贊
你真的要小心這個。使用用戶數據來調用任何方法send
可以為用戶打開空間以執行他們想要的任何方法。 send
通常用于動態調用方法名稱 - 但要確保輸入值是可信的并且不能由用戶操縱。
黃金法則永遠不會信任來自用戶的任何輸入
- 3 回答
- 0 關注
- 654 瀏覽
添加回答
舉報
0/150
提交
取消