在 ruby 中,private method 不能被显式调用,即使是 self 调用也不行,但是在这种情况下:
class A
def say_hi
puts 'hi'
end
def word=(w)
@word=w
end
private :word=, :say_hi
def method1
say_hi #ok (1)
self.say_hi #error,不能显示调用 (2)
###调用同为私有方法 的 word
word="hello" #ok, 但不是调用了word method 而是创建了一个临时变量word (3)
self.word "hello" # 可以!! Ruby在内部里边到底是如何判断哪些私有方法可以被self调用,而且是如何实现的? (4)
end
end
而且这么做有何意义?这种情况貌似只会发生在私有方法名以=
结束的情况下。
在stackoverflow上有类似提问,解答是为了避免歧义性
You are correct in assuming this is to avoid ambiguity. It's more a safeguard to the potential harm of ruby's dynamic nature. It ensures that you cannot override accessors by opening up the class again later. A situation that can arise, for example by eval'ing tainted code.
但我还是不太明白。
烦请问一下有谁了解这是为何吗? 谢谢!