簡體   English   中英

Ruby lambda的proc和'instance_eval'

[英]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,多余的參數將被靜默丟棄。

在您的情況下, lambproc使用一個參數調用

來自instance_eval的文檔

給instance_eval一個塊時,obj也作為該塊的唯一參數傳入

instance_evalBasicObject類的方法,可以在實例中調用。 因此,例如,給定的塊將可以訪問私有方法。

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設計目的是為了在對象內調用它。

來自instance_eval的文檔

為了設置上下文,在代碼執行時將變量self設置為obj,從而使代碼可以訪問obj的實例變量和私有方法。

暫無
暫無

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

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