加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

ruby – 有人可以帮助解释创建类的post_initialize回调(Sandi Me

发布时间:2020-12-17 03:33:02 所属栏目:百科 来源:网络整理
导读:我正在阅读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 po
我正在阅读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.?那也是谎言;它实际上从接收者的单例类开始,然后它尝试它的类.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读