Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/cocoa/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby 显式和隐式调用方法的区别是什么?_Ruby - Fatal编程技术网

Ruby 显式和隐式调用方法的区别是什么?

Ruby 显式和隐式调用方法的区别是什么?,ruby,Ruby,根据我的理解,在ruby中,我们不能对self调用私有方法(显式地对self调用私有方法是不可能的)。如果你调用一个没有任何接收者的方法,那么它会在self上被调用,那么为什么我们不能调用self本身的私有方法呢 抱歉,我没有真正理解显式和隐式调用(有self和无self)的区别 我知道我可能会落选,但我还是想知道。有人能告诉我吗。至少在核磁共振成像中,这些概念是相同的。显式调用是公共调用,隐式调用是私有调用 解析器识别三种方法调用: 带有显式接收器的方法,例如obj.foo(1) 具有隐式接收

根据我的理解,在ruby中,我们不能对self调用私有方法(显式地对self调用私有方法是不可能的)。如果你调用一个没有任何接收者的方法,那么它会在self上被调用,那么为什么我们不能调用self本身的私有方法呢

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


我知道我可能会落选,但我还是想知道。有人能告诉我吗。

至少在核磁共振成像中,这些概念是相同的。显式调用是公共调用,隐式调用是私有调用

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

  • 带有显式接收器的方法,例如
    obj.foo(1)
  • 具有隐式接收器的方法,例如
    foo(1)
  • 具有隐式接收器且无参数的方法,例如
    foo
  • 评估者将每种类型识别为不同的“呼叫类型”。这些类型分别为:

  • CALL\u PUBLIC
  • CALL\u FCALL
  • CALL\u VCALL
  • 在进行呼叫之前,会检查此呼叫类型:

    if (((noex & NOEX_MASK) & NOEX_PRIVATE) && scope == CALL_PUBLIC) {
        return NOEX_PRIVATE;
    }
    
    也就是说,如果方法是私有的,调用类型是公共的,则不要调用该方法(受保护的调用的工作方式相同,但也检查接收方的类)


    因此,每当有一个显式的接收者(即使它是实例方法定义中的
    self
    ),该调用就是一个“公共调用”。

    如果不必考虑
    self
    ,我想实现会更容易。类似于:如果方法是私有的,并且有一个接收者,那么提出一个
    NoMethodError
    。受保护的调用如何?受保护的调用实际上只是一个私有调用,在返回之前需要额外检查接收者的类。在访问控制方面,逻辑只关注公共与非公共。