« Movable Type 4.2 · Pagina principale · Apple Shitmouse »

Matrice incompleta

Giovedì 25 Settembre 2008 alle 17:27

Qualche tempo fa mi è capitato di dover usare la classe Matrix presente nella libreria standard di Ruby e mi sono subito accorto che è terribilmente incompleta. Personalmente la ritengo veramente scritta con i piedi, per elencare tutti i problemi che ha non mi basterebbero 10 post sul blog quindi elencherò solo tre piccoli problemi per cui ho trovato tre piccole soluzioni molto eleganti e che vale la pena leggere per capire quanto Ruby sia affascinante come linguaggio.

Il problema principale è dovuto al fatto che chi ha scritto la classe ha pensato le matrici come oggetti non mutabili. Una volta creati non è possibile modificare i valori al suo interno ma soltanto leggerli. Per risolvere questo problema basta definire la funzione []=.

class Matrix
  def []=(row,column,value)
    @rows[row][column] = value
  end
end

Il secondo problema è la stessa creazione della matrice. Questa può essere fatta soltanto passando una serie di righe che devono essere già state lette quindi un algoritmo in linea durante la lettura di un file non è possibile. Per risolvere questo basta definire l'operatore << ed usarlo per concatenare una nuova riga.

class Matrix
  def <<(row)
    @rows << row
  end
end

L'ultimo problema è dovuto al fatto che Matrix non fa distinzione tra matrici quadrate, rettangolari o semplici vettori quindi si devono usare row_size e col_size per avere il numero di righe e colonne presenti. Nel caso delle matrici quadrate mi è bastato estendere la classe e usare alias al suo interno per definire un nuovo nome per il metodo row_size.

class SquareMatrix < Matrix
  alias size row_size
end

Commenti

Non ci sono commenti per questo post. Se vuoi scriverne uno usa il form qui sotto.

Nuovo Commento
*
*

*

* Campo obbligatorio.

Nel commento puoi usare i tag: <a href>, <br/>, <strong>, <p>, <em>. Tutti gli altri verranno eliminati. I collegamenti senza link saranno trasformati automaticamente. Le interruzioni di linea saranno inserite ogni volta che si preme invio.