Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/24.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/shell/5.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_Protected_Nomethoderror - Fatal编程技术网

从超类调用Ruby保护的可见性

从超类调用Ruby保护的可见性,ruby,protected,nomethoderror,Ruby,Protected,Nomethoderror,我有一个小代码,它似乎在某种程度上相互矛盾: 第二个可见性受保护。调用受保护方法时,发送方必须是接收方的子类,或者接收方必须是发送方的子类。否则将引发NoMethodError 类测试 def publico(otro) 奥特罗·普洛特 结束 结束 Hija类1——接收方d是发送方c的子类 我们可能会得出这样的结论:这种行为类似于“发送者或接收者必须继承了该方法”。有了这一点,我们可以解释,由于A(不知道m的存在)和B(知道m的存在但不继承它)都没有继承该方法,因此会产生错误 尽管这也可能是一

我有一个小代码,它似乎在某种程度上相互矛盾:

第二个可见性受保护。调用受保护方法时,发送方必须是接收方的子类,或者接收方必须是发送方的子类。否则将引发
NoMethodError

类测试
def publico(otro)
奥特罗·普洛特
结束
结束
Hija类<试验
受保护的def保护;结束
结束
Test.new.publico(Hija.new)
我得到以下输出:

NoMethodError:为调用受保护的方法'prot'# 阳具


我错过了什么?显然,“接收方必须是发送方的子类”选项不可用。

虽然它不适用于对受保护方法一无所知的父类,但它适用于定义受保护方法的子类的子类。例如

class A
  def n(other)
    other.m
  end
end

class B < A
  def m
    1
  end

  protected :m

end

class C < B
end

class D < C
end

a = A.new
b = B.new
c = C.new
d = C.new

c.n b #=> 1 -- sender C is a subclass of B
b.n b #=> 1 -- m called on defining class
a.n b # raises NoMethodError although reciever B is  a subclass of sender A
b.n c #=> 1 -- reciever C is subclass of sender B
c.n d #=> 1 -- reciever D is sublcass of sender C
A类
def n(其他)
其他
结束
结束
B类1——发送方c是b的一个子类
b、 在定义类时调用nb#=>1--m
a、 nb#虽然receiver b是sender a的一个子类,但它会引起命名错误
b、 nC#=>1——接收器c是发送器b的子类
c、 n d#=>1——接收方d是发送方c的子类
我们可能会得出这样的结论:这种行为类似于“发送者或接收者必须继承了该方法”。有了这一点,我们可以解释,由于A(不知道m的存在)和B(知道m的存在但不继承它)都没有继承该方法,因此会产生错误


尽管这也可能是一个bug。

受保护的方法只能从同一类或子类的实例中调用。Hija是Test的一个子类。Test不是Hija的一个子类。所以Hija中的受保护方法对测试实例不可用

如果你的例子是另一种方式:

class Hija
  protected def prot; end
end
class Test < Hija
  def publico(otro)
    otro.prot
  end
end
Test.new.publico(Hija.new)
class-Hija
受保护的def保护;结束
结束
等级测试

工作正常。

您编写的代码实际上不是您的原始代码。它对应于文档示例中的
a.n b
案例,该案例引发了异常,如前所述。文档中存在冲突(在这方面,您的问题有点误导,但提出了一个很好的观点)。
class Hija
  protected def prot; end
end
class Test < Hija
  def publico(otro)
    otro.prot
  end
end
Test.new.publico(Hija.new)