簡體   English   中英

send和instance_eval之間的Ruby差異?

[英]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

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來調用單個方法。

您可能也對Object#public_sendBasicObject#__send__

無論你使用send做什么都是instance_eval的適當子集。 也就是說, send的參數必須是單個方法(及其參數),而instance_method的參數是任意代碼。 因此,無論何時send ,都可以使用instance_eval重寫它,但反之亦然。

但是,在性能方面, sendinstance_eval快得多,因為執行send不需要額外的解析,而instance_eval需要解析整個參數。

在您的示例中,結果將是相同的,但第一個將運行得更快。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM