stavo lavorando attraverso la "Programmazione in Scala" libro, e ha colpito un po 'un problema per l'attuazione della classe Rational
nel Capitolo 6.Come evitare perdite di memoria Scala - costruttori Scala
Questo è il mio primo versione della classe Rational
(basato sul libro)
class Rational(numerator: Int, denominator: Int) {
require(denominator != 0)
private val g = gcd(numerator.abs, denominator.abs)
val numer = numerator/g
val denom = denominator/g
override def toString = numer + "/" + denom
private def gcd(a: Int, b: Int): Int =
if(b == 0) a else gcd(b, a % b)
// other methods go here, neither access g
}
il problema qui è che il campo g rimane per tutta la durata della classe, anche se mai più accessibile. Questo problema può essere visto eseguendo il seguente programma finto:
object Test extends Application {
val a = new Rational(1, 2)
val fields = a.getClass.getDeclaredFields
for(field <- fields) {
println("Field name: " + field.getName)
field.setAccessible(true)
println(field.get(a) + "\n")
}
}
La sua uscita sarà:
Field: denom
2
Field: numer
1
Field: g
1
Una soluzione che ho trovato al Scala Wiki comporta la seguente:
class Rational(numerator: Int, denominator: Int) {
require(denominator != 0)
val (numer, denom) = {
val g = gcd(numerator.abs, denominator.abs)
(numerator/g, denominator/g)
}
override def toString = numer + "/" + denom
private def gcd(a: Int, b: Int): Int =
if(b == 0) a else gcd(b, a % b)
// other methods go here
}
Qui, il campo g è solo locale al suo blocco, ma, eseguendo la piccola applicazione di test, ho trovato un altro campo x$1
che conserva una copia della tupla composta da (numer, denom)
!
Field: denom
2
Field: numer
1
Field: x$1
(1,2)
C'è un modo per costruire un razionale a Scala con l'algoritmo di cui sopra, senza causare perdite di memoria?
Grazie,
Flaviu Cipcigan
stessa domanda: http://stackoverflow.com/questions/1118669/h OW-do-you-definire-a-local-var-val-in-the-primario-costruttore-in-scala –
Grazie, e mi dispiace per chiedere ancora una volta la questione :). Le risposte nel post collegato hanno chiarito la mia domanda. –
Hai confermato che 'denom' e' numer' sono veramente valori? Non sarei affatto sorpreso se fossero "solo" i metodi di accesso del modulo 'def denom = x $ 1._2'. – Raphael