为何Ruby代码中protected方法可用而private方法不可用?
Ruby中private与protected方法的核心区别及问题解析
关键规则差异
Ruby里的private和protected方法都限制外部访问,但核心区别在于跨实例调用的权限:
- private方法:只能在当前实例的上下文里隐式调用,绝对不能通过
对象.方法名的形式调用,哪怕是同一个类的其他实例也不行。你只能在实例内部直接写方法名(比如grade),不能用other_instance.grade这种写法。 - protected方法:允许同一个类(或其子类)的任意实例之间互相调用,可以用
对象.方法名的形式访问其他实例的protected方法。
你的代码问题分析
看你代码里的better_grade_than?方法:
def better_grade_than?(other_student) grade > other_student.grade ? true : false end
这里的other_student.grade是当前实例调用另一个Student子类实例的方法:
- 当
grade是protected时,因为joe和bob都属于Student类体系(子类实例),这种跨实例调用是允许的,所以代码正常运行。 - 改成private后,
other_student.grade属于显式调用另一个实例的private方法,完全违反了Ruby的private方法访问规则,因此抛出NoMethodError。
让private版本可用的修改方案
如果一定要用private方法,你可以用send方法绕过访问限制(不推荐,会破坏封装性):
def better_grade_than?(other_student) grade > other_student.send(:grade) ? true : false end
内容的提问来源于stack exchange,提问作者layschips
相关产品推荐
相关产品推荐

