Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby 呼叫的时间​​`super`_Ruby - Fatal编程技术网

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-inside
set
方法,因为有prepend的祖先链。

很好地解释了ruby文档中的
super
和:

super的行为类似于调用超类的方法实现的方法调用。在您的示例中,return关键字从Parent::test返回并继续执行Child::test,就像任何其他方法调用一样


在您的情况下,有人只是将
retval
定义为
super
,然后在代码中使用retval而不是super。

这取决于
retval=super
retval
之间的代码。你没有提供,所以我们无法回答。@sawa你重写了一半的帖子,但选择突出“和平”?为什么不修一下呢?我不明白。@SergioTulentsev我就知道你会这么说。:)@萨瓦:是的,这不是第一次了/@sawa我用这些信息编辑了这篇文章,很抱歉。所以,如果我在我的方法的最后一行中使用
super
,这是等效的吗?是的。当您在没有参数的情况下调用super时,Ruby会向当前对象的父对象发送一条消息,要求它调用与当前方法同名的方法,并将传递给当前方法的参数传递给它。此答案不会回答问题。