【问题标题】:What is the difference in calling a method explicitely and implicitely?显式和隐式调用方法有什么区别?
【发布时间】:2014-11-13 14:57:49
【问题描述】:

据我了解,在 ruby​​ 中,我们不能在 self 上调用私有方法(不可能在 self 上显式调用私有方法)。如果你调用一个没有任何receiver的方法,那么它就会被self调用,那为什么我们不能调用一个带有self的私有方法呢?

抱歉,我并没有真正理解显式调用和隐式调用(使用 self 和不使用 self)的区别。

我知道我可能会投下反对票,但我仍然想知道。谁能告诉我。

【问题讨论】:

  • 如果您不必考虑self,我想实现会更容易。比如:如果方法是私有的并且有一个接收者,那么就提出一个NoMethodError

标签: ruby


【解决方案1】:

至少在 MRI 中,这些概念是相同的。显式调用公共调用,隐式调用私人调用。

解析器识别三种方法调用:

  1. 具有显式接收器的方法,例如obj.foo(1)
  2. 带有隐式接收器的方法,例如foo(1)
  3. 具有隐式接收器且没有参数的方法,例如foo

评估者将这些中的每一个识别为不同的“调用类型”。这些类型(分别)是:

  1. CALL_PUBLIC
  2. CALL_FCALL
  3. CALL_VCALL

在拨打电话之前会检查此呼叫类型:

if (((noex & NOEX_MASK) & NOEX_PRIVATE) && scope == CALL_PUBLIC) {
    return NOEX_PRIVATE;
}

即如果方法是私有的并且调用类型是公共的,则不要调用该方法(受保护的调用工作方式相同,但还要检查接收者的类)。

因此,只要有明确的接收者(即使它是实例方法定义中的self),该调用就是“公共调用”。

【讨论】:

  • 受保护的通话怎么样?
  • 受保护的呼叫实际上只是一个私人呼叫,在返回之前会额外检查接收者的类。在访问控制方面,逻辑只关心公开与不公开。
猜你喜欢
  • 2012-08-04
  • 2012-08-04
  • 2012-03-13
  • 2021-09-23
  • 1970-01-01
  • 2011-03-04
  • 2018-09-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多