[英]Ruby difference between send and instance_eval?
我知道send接受帶有參數的字符串或符號,而instance_eval接受字符串或塊,並且給定接收器它們的區別可能很明顯。
我的問題是下面的例子中“引擎蓋下 ”的區別是什么?
1234.send 'to_s' # '1234'
1234.instance_eval 'to_s' # '1234'
從精細手冊 :
發送(符號[,args ...])→obj
send(string [,args ...])→obj調用由symbol標識的方法,並將指定的任何參數傳遞給它。 [...]當通過字符串標識方法時,字符串將轉換為符號。
instance_eval(string [,filename [,lineno]])→obj
instance_eval {| | block}→obj在接收器( obj )的上下文中計算包含Ruby源代碼或給定塊的字符串。 為了設置上下文,在代碼執行時將變量
self
設置為obj ,使代碼可以訪問obj的實例變量。
因此send
執行一個方法,而instance_eval
執行任意代碼塊(作為字符串或塊),並將self
設置為您正在調用instance_eval
的對象。
在您的情況下,沒有太大的區別,因為您要處理的字符串instance_eval
只是一個方法。 主要區別在於,任何閱讀代碼的人(包括六個月內的代碼)都會想知道為什么要使用instance_eval
來調用單個方法。
無論你使用send
做什么都是instance_eval
的適當子集。 也就是說, send
的參數必須是單個方法(及其參數),而instance_method
的參數是任意代碼。 因此,無論何時send
,都可以使用instance_eval
重寫它,但反之亦然。
但是,在性能方面, send
比instance_eval
快得多,因為執行send
不需要額外的解析,而instance_eval
需要解析整個參數。
在您的示例中,結果將是相同的,但第一個將運行得更快。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.