亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

'eval'應該是討厭的嗎?

'eval'應該是討厭的嗎?

Qyouu 2019-09-03 17:12:07
我多次使用eval紅寶石的功能。但我聽說有人說evals很討厭。當被問到為什么以及如何,我永遠無法得到令人信服的理由不使用它。他們真的很討厭嗎?如果是,以什么方式?評估有哪些“更安全”的選擇?
查看完整描述

3 回答

?
湖上湖

TA貢獻2003條經驗 獲得超2個贊

在Ruby中,有幾個噱頭可能比eval()以下更合適:

  1. #send一個允許您調用一個名稱為字符串并將參數傳遞給它的方法。

  2. yield 允許您將代碼塊傳遞給將在接收方法的上下文中執行的方法。

  3. 通常,簡單Kernel.const_get("String")就足以獲得您的名稱為字符串的類。

我想我無法詳細解釋它們,所以我只是給了你提示,如果你有興趣,你會谷歌。


查看完整回答
反對 回復 2019-09-03
?
12345678_0001

TA貢獻1802條經驗 獲得超5個贊

eval不僅不安全(正如其他地方所指出的那樣),它也很慢。每次執行時,evaled代碼的AST都需要重新解析(對于例如JRuby,轉向字節碼),這是一個字符串繁重的操作,也可能對緩存局部性有害(假設正在運行)程序不是eval很多,因此解釋器的相應部分因此緩存冷,除了很大)。


eval你問,為什么在Ruby中根本沒有?“因為我們可以”大多數 - 事實上,當eval發明時(對于LISP編程語言),它主要用于表演!更重要的eval是,當您想要“將解釋器添加到解釋器中”時,使用正確的東西,用于元編程任務,例如編寫預處理器,調試器或模板引擎。這類應用程序的常見想法是按摩一些Ruby代碼并調用eval它,它肯定會重新發明并實現特定于域的玩具語言,這也是一個陷阱,也被稱為Greenspun的第十條規則。需要注意的是:注意成本,例如對于模板引擎,eval在啟動時進行所有操作而不是運行時間; 并且不eval不可信代碼,除非你知道如何“馴服”它,即根據能力規則理論選擇并強制執行語言的安全子集。后者是很多非常困難的工作(例如,看看Java是如何完成的 ;我不知道Ruby的任何這樣的努力)。


查看完整回答
反對 回復 2019-09-03
  • 3 回答
  • 0 關注
  • 556 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號