定义私有方法的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
的含义是什么?
答案 0 :(得分:13)
无法使用显式接收器调用私有方法。但是它们可以被类的任何子类和实例调用。
Here对Ruby中的public
,protected
和private
方法做了很好的解释。
答案 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;。