繁体   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