我按照这些说明为二维数组创建了一个自定义类。
class SparseArray
attr_reader :hash
def initialize
@hash = {}
end
def [](key)
hash[key] ||= {}
end
def rows
hash.length
end
alias_method :length, :rows
end
如何修改此类,以便可以使用 Object#each do 遍历对象的第一级和第二级?请用简单的术语解释一下,我是新手。
如何在对象上使用 each 方法的示例:
sparse_array[0][0] = "row 1 column 1"
sparse_array[0][1] = "row 1 column 2"
sparse_array[1][0] = "row 2 column 1"
sparse_array.each do |row|
# sparse_array[0] on first iteration
row.each do |column|
# sparse_array[0][0] on first iteration
end
end
您应该在SparseArray
上定义each
方法,并使用它来包装包装的哈希values
:
def each &block
@hash.values.each(&block)
end
Hash
也有一个each
方法:
hash.each {|key, value| puts "#{key} #{value}" }
但是如果你想要一个更好的方法,把它放在你的类中:
def each(&block)
hash.each do |row,column_hash|
column_hash.each do |column, value|
block.call(row,column,value)
end
end
end
然后你可以做这样的事情:
sparse_array.each do |row, column, value|
puts "row: #{row}, column: #{column}, value: #{value}"
end