Dipende. La soluzione migliore imho è di nascondere la reale
implementazione tramite un oggetto. Es.
class GraficoMomenti
def ref(x,y)
...
end
def setref(x,y,val)
...
end
def momento(x,y,w)
...
end
end
Così il programma usa la classe grafico in maniera trasparente e tu
puoi usare come indici ciò che preferisci (float, un oggetto tipo
Point, etc.).
I dati invece potresti memorizzarli in un hash (caso di tanti dati ma
sparsi sul grafico), in un array (la tua griglia è praticamente
piena), oppure il risultato di una funzione se questi seguono una
distribuzione continua. Potresti in tal caso anche fare in modo che il
metodo #momento o #[] sia memoized se hai una griglia piena/continua
ma accedi a pochi elementi o a sempre gli stessi. Insomma si cerca di
evitare di costruire array 1000x1000 e calcolare per ogni cella un
valore.
Ad esempio usando come implementazione un array (griglia piena, indici
interi) e come interfaccia [] e []= puoi fare (untested code):
class GraficoMomenti
def initialize
@arr = Array.new
end
def
@arr[x][y]
end
def []=(x,y,val)
unless @arr[x]
@arr[x] = Array.new
end
@arr[x][y]=val
end
end
a = GraficoMomenti.new
a[1,2]=5
puts a[1,2]
oppure con un Hash
class GraficoMomenti
def initialize
@hash = Hash.new
end
def
@hash[[x,y]]
end
def []=(x,y,val)
@hash[[x,y]]=val
end
end
a = GraficoMomenti.new
a[1,2]=5
puts a[1,2]
oppure supponendo che la tua griglia sia continua con una funzione
memoized
require ‘memoize’
class GraficoMomenti
include Memoize
def fun(x,y)
x^y
end
def
@arr[x][y]
end
@cache = memoize(:[])
def []=(x,y,val)
manipoliamo la cache di memoize
@cache[[[x,y]]] = val
end
end
a = GraficoMomenti.new
a[1,2]=5
puts a[1,2]