Ruby 呼叫的时间`super`
我应该理解这段代码:Ruby 呼叫的时间`super`,ruby,Ruby,我应该理解这段代码: module Stealth module MixpanelSessionTracking def set(flow:, state:) retval = super if ENV['MIXPANEL_PROJECT_TOKEN'].present? mixpanel = Stealth::Mixpanel.new mixpanel.tracker.track(user_id, 'State Change
module Stealth
module MixpanelSessionTracking
def set(flow:, state:)
retval = super
if ENV['MIXPANEL_PROJECT_TOKEN'].present?
mixpanel = Stealth::Mixpanel.new
mixpanel.tracker.track(user_id, 'State Change', {
'flow' => flow,
'state' => state
})
end
retval
end
end
class Session
prepend Stealth::MixpanelSessionTracking
end
end
为什么我要将super
设置为setval
变量,然后在方法定义末尾调用retval
变量
我可以在方法定义的末尾使用super
吗
编辑:
antecessor类方法:
module Stealth
class Session
(...)
def set(flow:, state:)
store_current_to_previous(flow: flow, state: state)
@flow = nil
@session = canonical_session_slug(flow: flow, state: state)
Stealth::Logger.l(topic: "session", message: "User #{user_id}: setting session to #{flow}->#{state}")
$redis.set(user_id, session)
end
(...)
end
end
首先,您需要查看类的
祖先
,因为您使用的是前置
,所以它类似于[隐身::MixpanelSessionTracking,Session]
然后调用
set
首先从会话类中调用隐身::MixpanelSessionTracking和super-insideset
方法,因为有prepend的祖先链。很好地解释了ruby文档中的super
和:
super的行为类似于调用超类的方法实现的方法调用。在您的示例中,return关键字从Parent::test返回并继续执行Child::test,就像任何其他方法调用一样
在您的情况下,有人只是将
retval
定义为super
,然后在代码中使用retval而不是super。这取决于retval=super
和retval
之间的代码。你没有提供,所以我们无法回答。@sawa你重写了一半的帖子,但选择突出“和平”?为什么不修一下呢?我不明白。@SergioTulentsev我就知道你会这么说。:)@萨瓦:是的,这不是第一次了/@sawa我用这些信息编辑了这篇文章,很抱歉。所以,如果我在我的方法的最后一行中使用super
,这是等效的吗?是的。当您在没有参数的情况下调用super时,Ruby会向当前对象的父对象发送一条消息,要求它调用与当前方法同名的方法,并将传递给当前方法的参数传递给它。此答案不会回答问题。