谁是Ruby级别块中的“自我”?

时间:2016-05-05 03:07:22

标签: ruby-on-rails ruby

所以,这在Javascript中非常清楚,自我会处于这种情况,但我在Ruby中并不积极。

class Product

  after_initialize do |p|
    p.set_approved
  end

  set_approved
    approved = true
  end
end

因为我很确定p会因为我确定代码是某种

def after_initialize(&blk)
  yield(self)
end

两种方法的上下文都是self,为什么我必须这样做

def set_approved(p)
  p.approved = true
end

1 个答案:

答案 0 :(得分:3)

在Ruby self中,thisclass Product # Usage type #1: Supply a Proc after_initialize do |p| # self here refers to the Product class since this block was defined at the # class level. p.set_approved end # Usage type #2: Call a method after_initialize :trigger_set_approved protected def trigger_set_approved # This is an instance method, so self is an instance of Product self.set_approved end end 更加锁定和可预测。你真的不得不试图切换一个块的绑定,当你这样做时,你可以给人们带来惊喜,这会导致混乱,所以通常可以避免。

以下是实际发生的事情,以及如果不受欢迎,您可以如何采取行动:

after_initialize

重新绑定给self.class.class_method_name的块可能会产生不利影响,因此通常不会这样做。如果您想要在产品上定义的类方法中调用,则必须调用class_method_name而不是{{1}}。

换句话说,它预计在正常情况下不会切换块的执行上下文。