简单谈谈Ruby的private和protected
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 的访问控制更像是一种“约定”而非强约束——它不是为了禁止子类使用父类私有方法,而是为了让你有意识地控制“对外暴露”的接口。理解这一点,以后再遇到类似问题就不会再纠结了。
Windows 10 是一款微软推出的经典操作系统,拥有硬件兼容性与多任务处理能力。它更偏向把系统状态查看和常用调节动作放在一起,适合需要持续观察和微调设备状态的场景。
极度公式是一款跨平台专业LaTeX公式识别编辑软件,支持OCR公式识别和多平台编辑。和使用说明,避免使用,享受完整功能与稳定支持。做扫描整理、文字提取和表格转换时,它能把识别后的处理步骤接得更顺,资料录入这类场景会省下不少时间。
















