ruby – 有人可以帮助解释创建类的post_initialize回调(Sandi Me
我正在阅读Sandi Metz的POODR,并且遇到了一个我不太了解的编码原理.这是代码:
class Bicycle attr_reader :size,:chain,:tire_size def initialize(args = {}) @size = args[:size] || 1 @chain = args[:chain] || 2 @tire_size = args[:tire_size] || 3 post_initialize(args) end end class MountainBike < Bicycle attr_reader :front_shock,:rear_shock def post_initialize(args) @front_shock = args[:front_shock] @rear_shock = args[:rear_shock] end end mb = MountainBike.new(front_shock: 4,rear_shock: 5) puts mb.size puts mb.chain puts mb.tire_size puts mb.front_shock puts mb.rear_shock 此代码将为其各自的属性输出1,2,3,4,5.我不明白的是方法查找. 当山地自行车被实例化时,因为它没有自己的初始化方法,它将沿着方法查找链向上移动到它的超级类(自行车).但现在从那里开始,似乎Bicycle再次回到MountainBike的post_initialize方法.它不是继续推进方法链,而是如何回归? post_initialize一个ruby关键字,比如初始化,因为它提供某种特殊功能吗?是否有一些其他ruby内省方法可以用来查看发生了什么? 解决方法
这里要理解的重要一点是在这段代码中:
def initialize(args = {}) # ... post_initialize(args) end … post_initialize有一个隐含的接收者,self.换句话说,post_initialize(args)在这里等同于?到self.post_initialize(args),而self是MountainBike的一个实例.方法查找总是从接收者的类开始,?所以它可以轻松找到MountainBike#post_initialize. ? 这是一个谎言;在隐私方面,这并不等同;私人方法cannot be called with an explicit receiver.?那也是谎言;它实际上从接收者的单例类开始,然后它尝试它的类. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |