yo estaba trabajando a través de la "Programación en Scala" libro, y llamó la atención un poco de un problema en la implementación de la clase Rational
en el Capítulo 6.Evitar pérdidas de memoria Scala - Scala constructores
Ésta es mi primera versión de la clase Rational
(basado en el 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
}
el problema aquí es que el campo g permanece durante toda la vida de la clase, incluso si nunca se accede de nuevo. Este problema se puede ver mediante la ejecución del siguiente programa de simulacro:
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")
}
}
Su producción va a ser:
Field: denom
2
Field: numer
1
Field: g
1
Una solución que encontré en el Scala Wiki consiste en lo siguiente:
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
}
Aquí, el campo g es solo local para su bloque, pero, al ejecutar la pequeña aplicación de prueba, encontré otro campo x$1
que conserva una copia de la tupla que consiste en (numer, denom)
!
Field: denom
2
Field: numer
1
Field: x$1
(1,2)
¿Hay alguna manera de construir un racional en Scala con el algoritmo anterior, sin causar ninguna pérdida de memoria?
Gracias,
Flaviu Cipcigan
La misma pregunta: http://stackoverflow.com/questions/1118669/h ow-do-you-define-a-local-var-val-in-the-primary-constructor-in-scala –
Gracias, y lo siento por hacer la pregunta de nuevo :). Las respuestas en la publicación vinculada aclararon mi pregunta. –
¿Has confirmado que 'denom' y' numer' son realmente valores? No me sorprendería si fueran "solo" métodos de acceso de la forma 'def denom = x $ 1._2'. – Raphael