【问题标题】:Private methods in RubyRuby 中的私有方法
【发布时间】:2015-12-08 01:38:30
【问题描述】:

定义私有方法的 Rails 控制器示例:

class ApplicationController < ActionController::Base
  private
  def authorization_method
    # do something
  end
end

然后,它被用于ApplicationController 的子类中:

class CustomerController < ApplicatioController
  before_action :authorization_method

  # controller actions
end

如何从子类调用私有方法? Ruby中private是什么意思?

【问题讨论】:

标签: ruby-on-rails ruby oop


【解决方案1】:

不能使用显式接收器调用私有方法。但是它们可以被该类的任何子类和实例调用。

Here 很好地解释了 Ruby 中的 publicprotectedprivate 方法。

【讨论】:

    【解决方案2】:

    private 在 Ruby 中的作用与其他语言不同,它使方法可以显式接收器调用。

    也就是说,你不能打电话给some_variable.some_private_method,甚至不能打电话给self.some_private_method

    就是这样。他们仍然被继承。你可以阅读更多here

    【讨论】:

      【解决方案3】:

      子类继承了超类的所有方法和属性,包括它的私有方法。实际上,您正在调用属于子类的私有方法。

      你不能做的是从 ApplicationController(或 Authorization 控制器的子类)外部调用 authorization_method。在控制台中试试这个:

       > ApplicationController.new.authorization_method
       # NoMethodError: protected method `authorization_method' called for #<ApplicationController:0x0000000bb65778>
      

      【讨论】:

        【解决方案4】:

        正如 Daniel 在 his response 私有方法中指出的那样,“不能使用显式接收器调用”。换句话说,您不能使用“点”表示法调用私有方法。这与您可以调用this.privateMethod() 的Java 不同。在 Ruby 中 self.private_method 失败,但您可以将其称为 private_method

        但是还有另一种方法可以调用 any 对象的私有方法,Rails 在内部使用该方法调用之前/之后的操作。

        如果您有一个实例obj 和私有private_method,您可以通过以下方式调用该方法:

        obj.send :private_method
        

        现实是,在严格意义上,Ruby 中没有私有方法。隐私是“只是建议,而不是规则”。

        【讨论】:

          猜你喜欢
          • 2013-11-10
          • 2011-05-16
          • 2010-09-24
          • 2012-05-19
          • 2013-05-06
          • 1970-01-01
          • 2012-01-09
          • 1970-01-01
          • 2017-09-17
          相关资源
          最近更新 更多