【问题标题】:How to override multi dimensional array operator ruby如何覆盖多维数组运算符ruby
【发布时间】:2022-11-17 13:14:02
【问题描述】:
我想覆盖多维数组运算符
worksheet['column1'][1]= 'works' should change worksheet so that in row 1 in 'column1' value is 'works'.
我对工作表所做的其他事情有效,所以这不是连接问题。我也没有收到任何错误,但它不起作用。
我试过这个:
def self.[]=(col,row,value)
$ws[col,row] = value
end
我也试过这个:
def self.[]=(*args)
(col,row,value) = args
$ws[col,row] = value
end
【问题讨论】:
标签:
arrays
ruby
multidimensional-array
overriding
operators
【解决方案1】:
worksheet['column1'][1]=语句其实不是一个方法调用,而是两个。因此,要使其工作,您需要定义两个方法。
我会尝试以下操作:
# create a new column class
class Column
def initialize(sheet, column)
@sheet = sheet
@column = column
end
def []=(row, value)
@sheet[@column, row] = value
end
end
# use like this
def self.[](column)
Column.new($ws, column)
end
第一个 [] 调用将返回一个 Column 的实例,它存储指向工作表和要设置的列的指针。指向工作表的指针实际上不是必需的,因为您使用的是全局 $ws 变量。但是全局变量在 Ruby 中通常被认为是一种代码味道,因此我会显式地传递它以使将来的重构更容易。
第二个[]= 调用将由列实例处理。