Ruby中如何在一个类中调用另一个类的变量并实现实例属性对比
问题修复方案
核心错误点
- 第一处:
Element类的属性定义语法错误,attr_accessor后接的属性名必须是符号,你漏了前缀冒号 - 第二处:
Rock类的compare_to方法中误用了类变量标识符@@,你传入的ob1是方法局部参数,要取它的name属性直接调用ob1.name即可,@@是用来调用类变量的,完全不符合当前场景。
修正后的完整代码
class Element # 修正attr_accessor的语法,属性名加冒号转为符号 attr_accessor :name def initialize(name) @name = name end def compare_to(name) fail "This method should be overridden" end end class Rock < Element def compare_to(ob1) # 直接通过参数ob1调用它的name属性,和当前实例的@name对比 if @name == ob1.name return "do something" end return "help" end end class Paper < Element def compare_to(var) # 这里逻辑和Rock类同理,要取传入对象的name就用var.name end end rock = Rock.new('Rock') paper = Paper.new('Paper') puts rock.compare_to(paper)
运行说明
你调用rock.compare_to(paper)时,paper实例会作为参数传递给ob1,在Rock实例的方法内部,通过ob1.name就能直接访问到paper实例的name属性,完成跨实例的属性对比。
内容的提问来源于stack exchange,提问作者Desperate rookie5555
相关产品推荐
相关产品推荐

