我想实现一个表数据结构。也许您可以推荐更好的替代方案,但由于Ruby不提供对多维数组的内置支持,最近的解决方案是使用哈希和数组作为索引
pseudoTable = Hash.new
pseudoTable[[0,"id"]] = 23
pseudoTable[[0,"name"]] = "Hans"
现在我尝试了以下
class MyTable
attr_accessor :id, :table_hash
def [](a,b)
@table_hash[[a,b]]
end
end
那么,Ruby中是否有可能给def []()
提供两个参数?
如果没有,你能推荐另一种方法(内置数据结构而不是Hash等更适合)来实现一个能够动态扩展的表和可以顺序迭代的奖励点吗?
答案 0 :(得分:3)
这是您正在寻找的行为吗?
class MyTable
def initialize()
@table = Hash.new
end
def [](a, b)
return nil if @table[a].nil?
@table[a][b]
end
def []=(a, b, c)
@table[a] ||= {}
@table[a][b] = c
end
end
用法:
2.4.1 :038 > a = MyTable.new
=> #<MyTable:0x007faf6f9161c8 @table={}>
2.4.1 :039 > a[0,0]
=> nil
2.4.1 :040 > a[0,0] = 1
=> 1
2.4.1 :041 > a[0,0]
=> 1
我非常有信心有更好的方法可以做到这一点,而且这个解决方案可能包含一些错误,但希望它能演示如何定义和使用多参数[]
和[]=
方法
答案 1 :(得分:2)
您可以尝试使用ruby-numo library
apt install -y git ruby gcc ruby-dev rake make
gem install specific_install
gem specific_install https://github.com/ruby-numo/narray.git
irb
arr = Numo::Narray[[1], [1, 2], [1, 2, 3]]
=> Numo::Int32#shape=[3,3]
[[1, 0, 0],
[1, 2, 0],
[1, 2, 3]]
arr[0, 0]
=> 1
arr[0, 1]
=> 0
arr[0, 2]
=> 0
arr[0, 3]
IndexError: index=3 out of shape[1]=3
您可以了解更详细的文档there
答案 2 :(得分:1)
您所做的工作会很好,但问题是@table_hash
不会被识别为哈希。你需要初始化它。
class MyTable
attr_accessor :id, :table_hash
def initialize(*args)
@table_hash = Hash.new
super
end
def [](a,b)
@table_hash[[a,b]]
end
end