我最近在看 ruby 元编程这本书,现在遇到问题
class C
def public_method
self.private_method
end
private
def
private_method;
end
end
C.new.public_method
会报错,这个可以理解 但是我
object = C.new
object.public_method
仍然报错。请问为什么
刚刚看 ihower 的 rspec 幻灯片,里面有段代码也是用 self.private_method 来调用的,不知道是不是以前老点的 ruby 版本是这样做的。http://www.slideshare.net/ihower/rspec-7394497
#10 楼 @ptmagic obj.some_method(1,2)
这里方法 some_method 的接收者就不是你自己阿(是 obj)
私有方法的关键是不能用 self 去调用,只能写在公开方法中被调用,这样就天然保证了它对外不可见,比如对于这样的类定义:
class A
public
def pub_method
end
private
def pri_method
end
end
你可以这样:
a = A.new
a.pub_method
但是对于私有方法则不能:
a = A.new
a.pri_method # 这样写违反原则 “private方法不能显式指定接收者”
pri_method # 这样是就变成调用外面某个名叫pri_method的函数了,事与愿违
这样导致的结果就是:如果你想调用 pri_method,那就必须放在 class A ... end 这段代码里面
class A
public
def pub_method
pri_method # 这样写才正确,于是确保了私有方法的私有性
end
private
def pri_method
end
end