簡體   English   中英

Ruby:當使用 instance_eval(&lambda) 與 instance_eval { lambda.call } 時,lambda 中 self 的不同值

[英]Ruby: different values of self inside lambda when using instance_eval(&lambda) vs instance_eval { lambda.call }

我想調用一個 lambda 來改變它的自我價值。 搜索它,我到達了instance_exec ,它應該完成工作。

但是,經過 1 個多小時的學習示例后,我發現這種行為無法解釋:

class Dummy

  class << self

    attr_accessor :my_lambda

  end

  self.my_lambda = proc { self }

  def test
    self.class.my_lambda.call
  end

  def test1
    instance_eval(&self.class.my_lambda)
  end

  def test2
    instance_eval { self.class.my_lambda.call }
  end

end

Dummy.new.test
=> Dummy # I was expecting this, returns the class, lexical scope (where `self` was defined)

Dummy.new.test1
=> #<Dummy:0x00007fe982f8b678> # I was expecting this, `self` changed to the receiver of `instance_eval`, which is the instance, so `self` returned the instance.

Dummy.new.test2
=> Dummy # I can't understand this, at all. Why isn't it the same as test1?

那么,為什么我們從instance_eval(&self.class.my_lambda)instance_eval { self.class.my_lambda.call }得到不同的結果?

此外,由於我們正在調用 Lambdas ......如果我將類級別變量更改為:

self.my_lambda = lambda { self }

然后 Dummy.new.test1 拋出異常ArgumentError: wrong number of arguments (given 1, expected 0) ,我也不明白為什么,因為我知道 lambdas 對參數數量有嚴格的限制,但我們沒有通過任何時候我們使用了instance_eval(&self.class.my_lambda)

令人驚訝的是,在寫完這個長問題后,我立即設法在多一分鍾內回答了它。 我需要一只橡皮鴨。 無論如何。

我誤解了instance_eval 它“在接收者(obj)的上下文中執行給定的塊。”

因此, #test2 instance_eval { self.class.my_lambda.call }的給定塊確實是在將self設置為實例的情況下執行的,仍然在其中調用了 lambda,這不會改變它的自身。

然而,在#test1 ,連字符&改變PROC到塊,然后將其傳遞給instance_eval ,所以這是PROC自己的身體,將其與執行的self改變。

暫無
暫無

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

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