为自定义二维数组创建每个方法

时间:2012-10-15 16:36:38

标签: ruby each sparse-array

我按照这些instructions为二维数组创建了一个自定义类。

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#遍历对象的第一级和第二级?请简单解释一下,我是新手。

我将如何在对象上使用每个方法的示例:

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

2 个答案:

答案 0 :(得分:1)

您应该在each上定义SparseArray方法并使用它来包装已包装哈希的values

def each &block
  @hash.values.each(&block)
end

答案 1 :(得分:1)

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