为何在Ruby方括号方法中需索引self而非实例变量?
为什么必须用
self[position_array]而不是直接操作@array? 嘿,这个问题其实很好理解,核心在于你重写的方法和原生数组的方法完全是两回事,我给你掰碎了说:
首先,你的@array是Ruby内置的Array对象,它自带的[]方法根本不支持传入数组当索引来获取二维元素!原生数组的[]只认整数、范围这些类型的参数,当你把[0,1]这样的数组传给它时,它会尝试把这个数组转换成整数(因为它只接受整数索引),这自然就会抛出no implicit conversion of Array into Integer的错误——这就是报错的直接原因。
然后,你在Thing类里重写的[]方法,是属于Thing实例的方法,不是给原生Array用的!你自己写的逻辑应该是把传入的数组参数拆成两个维度的索引,比如:
def [](pos) @array[pos[0]][pos[1]] end
所以当你调用self[position_array]的时候,你是在调用你自己给Thing类定制的这个方法,它知道怎么处理数组类型的索引,帮你去二维数组里拿到对应元素。
举个完整的代码例子更直观:
class Thing def initialize @array = [[10, 20], [30, 40]] end # 这是你重写的、属于Thing实例的[]方法 def [](position_array) @array[position_array[0]][position_array[1]] end def get_value(position_array) # ❌ 报错:调用的是原生Array的[],不支持数组参数 # @array[position_array] # ✅ 正确:调用的是你自己重写的Thing的[]方法 self[position_array] end end thing = Thing.new puts thing.get_value([0,1]) # 输出20,正常运行
简单总结一下:
@array是原生Ruby数组,它的[]方法不理解数组类型的索引;- 你重写的
[]方法只属于Thing类的实例,只有通过self(或者直接用thing[xxx])调用,才能触发你自定义的逻辑,实现用数组索引取二维元素的需求。
内容的提问来源于stack exchange,提问作者Senyokbalgul
相关产品推荐
相关产品推荐

