1

これらの手順に従って、2次元配列のカスタムクラスを作成しました。

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を使用してオブジェクトの第1レベルと第2レベルを反復処理できるように、このクラスを変更するにはどうすればよいですか?簡単に説明してください、私は初心者です。

オブジェクトで各メソッドを使用する方法の例:

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
4

2 に答える 2

1

Hasheach方法もあります:

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
于 2012-10-15T17:09:58.517 に答える
1

eachでメソッドを定義し、SparseArrayそれを使用してラップさvaluesれたハッシュをラップする必要があります。

def each &block
  @hash.values.each(&block)
end
于 2012-10-15T17:04:15.310 に答える