我对这个库如何运作感到困惑:
ApplicationController有一个名为selected_account()
的私有方法,您可以在此处看到:ApplicationController
然后,从another Controller来自ApplicationController的孩子,我们做了一个动作:
def index()
@selected_account = selected_account
graph = get_accounts_graph()
@accounts = Account.get_accounts_map(graph)
end
我们怎么能这样做?是不是超出了范围?
答案 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方法。