为什么这段代码有效?我知道private
可以作为方法的修饰符,并且使用显式接收器(self
)将不起作用。
我知道会有一个SystemStackError,但我想了解可见性的概念。
class Methods
private
def private_method
puts "I'm in private method"
self.private_method
end
end
class ChildMethods < Methods
def private_method
super
end
end
ChildMethods.new.private_method
答案 0 :(得分:1)
你有两个private_method
方法,一个在超类中(私有)和一个子类中的覆盖(公共)。
您的代码有效,因为超类中的self.private_method
不会调用自己的私有private_method
,而是在子类中公开的。{/ p>
例如,这不起作用:
Methods.new.send(:private_method)
答案 1 :(得分:1)
无法为显式接收器调用私有方法,但可以像隐式那样调用
由于没有明确的接收器,这也可以正常工作
1 class Methods
2 private
3 def private_method
4 puts "I'm in private method"
5 private_method
6 end
7 end
8 class ChildMethods < Methods
9 def public_method
10 private_method
11 end
12 end
13 ChildMethods.new.public_method
但是这会引发错误,因为self
是一个明确的接收者。
1 class Methods
2 private
3 def private_method
4 puts "I'm in private method"
5 self.private_method # <-------------------------
6 end
7 end
8 class ChildMethods < Methods
9 def public_method
10 private_method
11 end
12 end
13 ChildMethods.new.public_method
Press ENTER or type command to continue
I'm in private method
1.rb:5:in `private_method': private method `private_method' called for #<ChildMethods:0x00000101084290> (NoMethodError)
from 1.rb:10:in `public_method'
from 1.rb:13:in `<main>'
这也很好用:
1 class Methods
2 private
3 def private_method
4 puts "I'm in private method"
5 self.public_method # <-------------------------
6 end
7 end
8 class ChildMethods < Methods
9 def public_method
10 private_method
11 end
12 end
13 ChildMethods.new.public_method