在ApplicationController中调用私有方法?

时间:2013-12-19 19:17:26

标签: ruby-on-rails

我对这个库如何运作感到困惑:

ApplicationController有一个名为selected_account()的私有方法,您可以在此处看到:ApplicationController

然后,从another Controller来自ApplicationController的孩子,我们做了一个动作:

 def index()
    @selected_account = selected_account
    graph = get_accounts_graph()
    @accounts = Account.get_accounts_map(graph)
  end

我们怎么能这样做?是不是超出了范围?

3 个答案:

答案 0 :(得分:2)

起初可能会让人感到困惑,但在Ruby private中并不意味着它在Java / C ++中意味着什么。祖先可以很好地调用私人方法。

private实际上意味着您无法使用显式目标调用该方法。也就是说,如果foo是私有的,您可以使用foo()来呼叫,但不能使用self.foo()obj.foo()。这样你就可以只为自己调用私有方法了。

此外,Ruby有protected。语义与Java / C ++不同 - protected方法只能从同一个类的实例中调用。它很少使用。

答案 1 :(得分:2)

对于那些来自java或c#world的人来说,这会让人感到困惑。但这是一个不错的解释

  

在Ruby中,继承层次结构或包/模块并不是真的   进入等式,更确切地说是关于哪个对象   特定方法调用的接收者。声明方法时   在Ruby中私有,这意味着永远不能使用   显式接收者。任何时候我们都可以调用私有方法   一个隐含的接收器,它将永远成功。这意味着我们可以打电话给   从类中声明的私有方法以及所有方法   这个类的子类

答案 2 :(得分:0)

子控制器继承自ApplicationController,因此它可以自行调用内部私有方法而不会出现问题。没有范围问题。子类继承其超类的所有public / private / protected方法。