gpt4 book ai didi

ruby - 有人可以帮助解释类创建的 post_initialize 回调吗 (Sandi Metz)

转载 作者:数据小太阳 更新时间:2023-10-29 07:13:23 26 4
gpt4 key购买 nike

我正在阅读 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。我不明白的是查找方法。

当一辆山地自行车被实例化时,因为它没有自己的initialize 方法,它会沿着方法查找链向上移动到它的父类(super class)(Bicycle)。但现在从那里开始,Bicycle 似乎又回到了 MountainBike 的 post_initialize 方法中。与其继续沿着方法链往上走,还不如往下走呢? post_initialize 是不是像 initialize 这样的 ruby​​ 关键字,因为它提供某种特殊功能?我可以使用其他一些 ruby​​ 自省(introspection)方法来查看发生了什么吗?

最佳答案

这里要理解的重要一点是在这段代码中:

def initialize(args = {})
# ...
post_initialize(args)
end

...post_initialize 有一个隐式接收者,self。也就是说,这里的post_initialize(args)等价于self.post_initialize(args)self是 MountainBike 的一个实例。方法查找始终从接收者的类开始, 因此可以轻松找到 MountainBike#post_initialize

那是个谎言;就隐私而言,这是不等同的; 私有(private) 方法 cannot be called with an explicit receiver .
那也是谎言;它实际上从接收者的单例类开始,但随后它尝试它的类。

关于ruby - 有人可以帮助解释类创建的 post_initialize 回调吗 (Sandi Metz),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37709722/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com