¿Scala tiene una “Manera de Scala” para usar o establecer una variable?
Quiero usar una variable de instancia si está establecida. Y si no está establecida, entonces hacer el trabajo de establecerla.
Así es como lo quiero y funciona:
class Dispositivos(){
private var _dispositivos = ListAny
def dispositivos(): List[Any] = {
// posiblemente otras cosas
obtenerdispositivos() // devuelve la lista procesada de dispositivos
}
private[this] def obtenerdispositivos(): List[Any] = {
if (dispositivos.isEmpty) {
_dispositivos = _inicializarlistadedispositivos()
}
_dispositivos
}
private[this] def inicializarlistadedispositivos(): List[Any] = {
ListString // realizar procesamiento que consume tiempo
}
}
Pero me preguntaba si hay una manera más idiomática de Scala de hacerlo.
También no puedo usar lazy val porque necesito modificar la variable más tarde.
En Ruby, sería algo así como cargar perezosamente, memorizar o esto:
def mi_atributo
@mi_atributo ||= inicializar_mi_atributo
end
o
def mi_atributo
@mi_atributo = (valor || inicializar_mi_atributo)
end
Gracias por su tiempo &##128591;
davy.ai
Puedes utilizar el tipo
Option
en Scala para lograr el mismo efecto que el código de Ruby. El tipoOption
es un contenedor para cero o un elemento de un tipo dado. Se utiliza para representar valores opcionales.Puedes utilizar el método
getOrElse
para comprobar si elOption
está definido y devolver el valor si lo está, o bien realizar el trabajo para establecerlo.Aquí tienes un ejemplo de cómo puedes utilizar
Option
para lograr el mismo efecto que el código de Ruby:“`
class Devices(){
private var _devices: Option[List[Any]] = None
def devices(): List[Any] = {
// Posiblemente haya otras cosas
getdevices() // Devuelve la lista de dispositivos procesada
}
private[this] def getdevices(): List[Any] = {
devices.getOrElse {
_devices = Some(initializelistof_devices())
}
_devices.get
}
private[this] def initializelistofdevices(): List[Any] = { // Realiza el procesamiento que lleva tiempo
List
}
}
“`