Ruby attr_accessor与实例方法混淆:赋值方法调用未生效问题求助
问题分析:为什么
change_price方法没能修改@price? 哈哈,这个坑我当初学Ruby的时候也踩过!你的问题核心在于Ruby对赋值方法的调用规则,咱们一步步拆解:
你的误区在哪里?
在change_price方法里,你写的price=(2)并没有调用你定义的price=实例方法,而是被Ruby解析成了局部变量的赋值操作——它创建了一个名为price的局部变量,把2赋值给它,但这个变量和实例变量@price半毛钱关系都没有!
Ruby的规则是:当你在方法内部写变量名=(值)这种形式时,会优先把它当作局部变量的初始化,而不是调用同名的赋值方法。这是为了避免歧义,毕竟局部变量赋值是很常见的操作。
怎么解决?
要明确告诉Ruby你要调用的是实例的price=方法,必须加上self.前缀:
class Item def change_price self.price=(2) # 加上self.,明确调用实例方法 end def price=(value) @price = value end def price @price end end my_item = Item.new p my_item.price # 输出 nil my_item.change_price p my_item.price # 输出 2
或者更简洁的Ruby风格写法(允许省略括号):
self.price = 2
补充知识点
Ruby中,普通实例方法在内部调用时可以省略self.,但以=结尾的赋值方法必须显式加self.,否则都会被当成局部变量处理。这是赋值方法独有的规则,记住这一点就能避免很多类似的坑啦!
内容的提问来源于stack exchange,提问作者user3029400
相关产品推荐
相关产品推荐

