简单谈谈Ruby的private和protected
作者:归人云淡风轻
时间:2026-06-28
浏览:0
Ruby中private方法允许子类调用,但必须隐式调用(直接写方法名),不能显式指定接收者;protected方法则可显式指定接收者,但仅限于同类或子类实例。这种访问控制更像是约定而非强约束,可通过send等方法绕过。
本文目录
先从一个让人抓头的小例子说起。

class Test private def test_print puts 'test' end end class Test2 < Test def test_print2 # self.test_print #=> 这里加上self就不能调用,private method `test_print' called for # (NoMethodError) test_print #=> 不加self就能调用 end end Test2.new.test_print2
同样是调用父类的私有方法,为什么加上 self 就报错,不加反而能顺利执行?这个行为在刚接触Ruby时很容易让人懵圈。
关键在于,Ruby 的 private 跟 Ja va 或 C++ 里“子类不能访问”的语义完全不同。Ruby 允许子类调用父类的私有方法,但有一条铁规矩:不能显式指定接收者——也就是说,调用时不能写 self.method_name,只能直接写 method_name,因为此时接收者默认为 self。
翻一下《The Ruby Way》,书里讲得更清晰:
- private:类和子类都能调用,但私有方法不能指定调用者,默认就是
self。 - protected:类和子类都能调用,而且可以指定调用者(比如用
self.method_name)。
这下就全通了。上面代码中 self.test_print 相当于显式指定了接收者,Ruby 直接拒绝;而直接写 test_print 则符合“默认 self”的规则,自然能正常执行。
Ruby 的访问控制更像是一种“约定”而非强约束——它不是为了禁止子类使用父类私有方法,而是为了让你有意识地控制“对外暴露”的接口。理解这一点,以后再遇到类似问题就不会再纠结了。
作者最新文章
AO3中文界面设置指南与核心功能使用教程
2026-10-14 23:28
解决win10运行3DMAX自动重启的方法
2026-10-13 17:08
哔哩哔哩投稿封面上传失败怎么解决
2026-10-13 15:55
漫蛙漫画官网免费漫画入口
2026-10-13 13:19
漫蛙漫画app免费下载安装最新版
2026-10-13 13:18
热门文章
更多
精品专题
更多
Mac软件
更多
WINDOWS
更多










































