[英]Ruby lambda's proc's and 'instance_eval'
當我將lambda作為instance_eval
傳遞給instance_eval
,它似乎傳遞了一個額外的參數:
lamb = -> { puts 'hi' }
proc = Proc.new { puts 'hi' }
instance_eval(&lamb)
# >> ArgumentError: wrong number of arguments (given 1, expected 0)
# from (irb):5:in `block in irb_binding'
# from (irb):7:in `instance_eval'
instance_eval(&proc)
# => hi
instance_exec(&lamb)
# => hi
為什么會這樣呢? 請注意,此問題與lambda為什么會引發錯誤無關。 這是眾所周知的。 問題是關於WHY instance_eval
將接收方的self
發送為參數。 不需要它,並且令人困惑。 而且AFAIK沒有記錄。
這會有所幫助,但不能解釋為什么紅寶石會這樣做。 instance_eval
是將self
設置為接收者; 為什么還要通過將self
傳遞給過程來混淆事物?
來自文檔
對於使用lambda或->()創建的proc,如果將錯誤數量的參數傳遞給具有多個參數的Proc,則會生成錯誤。 對於使用Proc.new或Kernel.proc創建的proc,多余的參數將被靜默丟棄。
在您的情況下, lamb
和proc
使用一個參數調用
給instance_eval一個塊時,obj也作為該塊的唯一參數傳入
instance_eval
是BasicObject
類的方法,可以在實例中調用。 因此,例如,給定的塊將可以訪問私有方法。
class Test
def call
secret_number + 100
end
private
def secret_number
42
end
end
test = Test.new
show_secret = -> (obj) { puts secret_number }
test.instance_eval(&show_secret) # print 42
沒有實例,當前上下文的self
將作為參數傳遞。 我認為instance_eval
設計目的是為了在對象內調用它。
為了設置上下文,在代碼執行時將變量self設置為obj,從而使代碼可以訪問obj的實例變量和私有方法。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.