3 回答

TA貢獻2003條經驗 獲得超2個贊
在Ruby中,有幾個噱頭可能比eval()
以下更合適:
有
#send
一個允許您調用一個名稱為字符串并將參數傳遞給它的方法。yield
允許您將代碼塊傳遞給將在接收方法的上下文中執行的方法。通常,簡單
Kernel.const_get("String")
就足以獲得您的名稱為字符串的類。
我想我無法詳細解釋它們,所以我只是給了你提示,如果你有興趣,你會谷歌。

TA貢獻1802條經驗 獲得超5個贊
eval不僅不安全(正如其他地方所指出的那樣),它也很慢。每次執行時,evaled代碼的AST都需要重新解析(對于例如JRuby,轉向字節碼),這是一個字符串繁重的操作,也可能對緩存局部性有害(假設正在運行)程序不是eval很多,因此解釋器的相應部分因此緩存冷,除了很大)。
eval你問,為什么在Ruby中根本沒有?“因為我們可以”大多數 - 事實上,當eval發明時(對于LISP編程語言),它主要用于表演!更重要的eval是,當您想要“將解釋器添加到解釋器中”時,使用正確的東西,用于元編程任務,例如編寫預處理器,調試器或模板引擎。這類應用程序的常見想法是按摩一些Ruby代碼并調用eval它,它肯定會重新發明并實現特定于域的玩具語言,這也是一個陷阱,也被稱為Greenspun的第十條規則。需要注意的是:注意成本,例如對于模板引擎,eval在啟動時進行所有操作而不是運行時間; 并且不eval不可信代碼,除非你知道如何“馴服”它,即根據能力規則理論選擇并強制執行語言的安全子集。后者是很多非常困難的工作(例如,看看Java是如何完成的 ;我不知道Ruby的任何這樣的努力)。
- 3 回答
- 0 關注
- 556 瀏覽
添加回答
舉報