【问题标题】: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 中的 public、protected 和 private 方法。
【解决方案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 中没有私有方法。隐私是“只是建议,而不是规则”。