所以,这在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
答案 0 :(得分:3)
在Ruby self
中,this
比class 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}}。
换句话说,它预计在正常情况下不会切换块的执行上下文。