显式和隐式调用方法有什么区别?

时间:2014-11-13 14:57:50

标签: ruby

根据我的理解,在ruby中我们不能在self上调用private方法(在self上调用私有方法是不可能的)。如果你在没有任何接收器的情况下调用一个方法,那么就会在self上调用它,那为什么我们不能用self本身调用一个私有方法呢?

很抱歉,但我并没有明确地和明确地(通过自我和没有自我)进行调用的确切区别。

我知道我可能会投票但仍想知道。有谁能告诉我。

1 个答案:

答案 0 :(得分:3)

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

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

  1. 具有明确接收器的方法,例如obj.foo(1)
  2. 具有隐式接收器的方法,例如foo(1)
  3. 具有隐式接收器且没有参数的方法,例如foo
  4. 评估者将这些中的每一个都识别为不同的“呼叫类型”。这些类型分别是:

    1. CALL_PUBLIC
    2. CALL_FCALL
    3. CALL_VCALL
    4. 在拨打电话前会检查此通话类型:

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

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

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