Ruby中的私有方法

时间:2015-09-11 13:12:17

标签: ruby-on-rails ruby oop

定义私有方法的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的含义是什么?

4 个答案:

答案 0 :(得分:13)

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

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

答案 1 :(得分:5)

与其他语言不同,Ruby中private的作用是使用显式接收器

Aka,您无法致电some_variable.some_private_method甚至self.some_private_method

就是这样。它们仍然是遗传的。您可以阅读更多here

答案 2 :(得分:3)

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

您无法从ApplicationController外部(或授权控制器的子类)调用authorization_method。在控制台中尝试此操作:

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

答案 3 :(得分:2)

正如丹尼尔在his response私人方法&#34中所指出的那样,不能用明确的接收者来调用&#34;。换句话说,你不能使用&#34; dot&#34;来调用私有方法。符号。这与Java不同,您可以调用this.privateMethod()。在Ruby self.private_method失败,但您可以将其称为private_method

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

如果您的实例obj具有私有private_method,则可以通过以下方式调用该方法:

obj.send :private_method

现实是,严格来说Ruby中没有私有方法。隐私只是推荐,而不是规则&#34;。