stdlib/matrix.rb
#
# Yields all elements of the matrix, starting with those of the first row,
# or returns an Enumerator if no block given.
# Elements can be restricted by passing an argument:
# * :all (default): yields all elements
# * :diagonal: yields only elements on the diagonal
# * :off_diagonal: yields all elements except on the diagonal
# * :lower: yields only elements on or below the diagonal
# * :strict_lower: yields only elements below the diagonal
# * :strict_upper: yields only elements above the diagonal
# * :upper: yields only elements on or above the diagonal
#
#   Matrix[ [1,2], [3,4] ].each { |e| puts e }
#     # => prints the numbers 1 to 4
#   Matrix[ [1,2], [3,4] ].each(:strict_lower).to_a # => [3]
#
Yields all elements of the matrix, starting with those of the first row,
or returns an Enumerator if no block given.


Yields all elements of the matrix starting with those of the first row or returns an Enumerator if no block given .
def each(which = :all) 
    return to_enum :each, which unless block_given?
    last = column_count - 1
    case which
    when :all
      block = Proc.new
      @rows.each do |row|
        row.each(&block)
      end
    when :diagonal
      @rows.each_with_index do |row, row_index|
        yield row.fetch(row_index){return self}
      end
    when :off_diagonal
      @rows.each_with_index do |row, row_index|
        column_count.times do |col_index|
          yield row[col_index] unless row_index == col_index
        end
      end
    when :lower
      @rows.each_with_index do |row, row_index|
        0.upto([row_index, last].min) do |col_index|
          yield row[col_index]
        end
      end
    when :strict_lower
      @rows.each_with_index do |row, row_index|
        [row_index, column_count].min.times do |col_index|
          yield row[col_index]
        end
      end
    when :strict_upper
      @rows.each_with_index do |row, row_index|
        (row_index+1).upto(last) do |col_index|
          yield row[col_index]
        end
      end
    when :upper
      @rows.each_with_index do |row, row_index|
        row_index.upto(last) do |col_index|
          yield row[col_index]
        end
      end
    else
      raise ArgumentError, "expected #{which.inspect} to be one of :all, :diagonal, :off_diagonal, :lower, :strict_lower, :strict_upper or :upper"
    end
    self
  end
def each ( which = :all ) return to_enum :each , which unless block_given? last = column_count - 1 case which when :all block = Proc . new @rows . each do | row | row . each ( & block ) end when :diagonal @rows . each_with_index do | row , row_index | yield row . fetch ( row_index ) { return self } end when :off_diagonal @rows . each_with_index do | row , row_index | column_count . times do | col_index | yield row [ col_index ] unless row_index == col_index end end when :lower @rows . each_with_index do | row , row_index | 0 . upto ( [ row_index , last ] . min ) do | col_index | yield row [ col_index ] end end when :strict_lower @rows . each_with_index do | row , row_index | [ row_index , column_count ] . min . times do | col_index | yield row [ col_index ] end end when :strict_upper @rows . each_with_index do | row , row_index | ( row_index + 1 ) . upto ( last ) do | col_index | yield row [ col_index ] end end when :upper @rows . each_with_index do | row , row_index | row_index . upto ( last ) do | col_index | yield row [ col_index ] end end else raise ArgumentError , "expected #{which.inspect} to be one of :all, :diagonal, :off_diagonal, :lower, :strict_lower, :strict_upper or :upper" end self end
Yields all elements of the matrix, starting with those of the first row,
or returns an Enumerator if no block given.
Yields all elements of the matrix starting with those of the first row or returns an Enumerator if no block given .
# :yield: e
which
<not_specific>