Ruby继承实验:如何让Second类的showVars输出父类变量?
Ruby继承中输出父类变量的正确实现
咱们先搞明白核心需求:让子类Second的showVars方法输出从父类First继承来的变量。这里得先区分实例变量和类变量,因为Ruby对这两种变量的继承处理逻辑不一样,我先分别给你演示正确的实现方式,再说说你可能踩的坑。
一、实例变量的情况(最常见场景)
如果父类里定义的是实例变量(以@开头),你首先得确保子类实例初始化时触发了父类的初始化逻辑——这是很多新手容易忽略的点!
正确代码示例
class First def initialize # 父类的实例变量在initialize中初始化 @parent_var = "我是父类的实例变量" @shared_var = "父子类共享的实例变量" end end class Second < First def initialize super # 必须调用super!否则父类的initialize不会执行,实例变量也不会被创建 @child_var = "我是子类的实例变量" end def showVars puts "所有实例变量(含继承的):" # 使用instance_variables获取当前实例的所有实例变量 instance_variables.each do |var_name| # 用instance_variable_get获取变量对应的值 puts "#{var_name} = #{instance_variable_get(var_name)}" end end end # 测试执行 second_obj = Second.new second_obj.showVars
你可能踩的坑
- 没调用
super:如果子类重写了initialize但没调用super,父类的实例变量根本不会在子类实例中被初始化,自然拿不到。 - 用了不存在的
variables方法:Ruby里没有直接的variables方法,要获取实例变量得用instance_variables,还要搭配instance_variable_get取值。
二、类变量的情况(共享型变量)
如果父类用的是类变量(以@@开头),这类变量是整个继承链共享的,子类可以直接访问,但要注意修改会影响整个继承链。
正确代码示例
class First @@class_var = "父类的类变量" end class Second < First def showVars puts "所有类变量(含继承的):" # 通过class.class_variables获取当前类的类变量(包括继承来的) self.class.class_variables.each do |var_name| # 用class_variable_get获取类变量的值 puts "#{var_name} = #{self.class.class_variable_get(var_name)}" end end end # 测试执行 second_obj = Second.new second_obj.showVars
注意事项
类变量是全局共享的,如果你在子类里修改@@class_var,父类和其他子类的这个变量也会跟着变,使用时要小心这种副作用。
总结一下关键要点
- 实例变量:必须通过
super触发父类初始化,用instance_variables+instance_variable_get访问。 - 类变量:直接通过类的
class_variables+class_variable_get访问,注意共享特性。
内容的提问来源于stack exchange,提问作者Ghoyos




