3 回答

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

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