es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

¿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;

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Puedes utilizar el tipo Option en Scala para lograr el mismo efecto que el código de Ruby. El tipo Option 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 el Option 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] = {
    List // Realiza el procesamiento que lleva tiempo
    }
    }
    “`

Comments are closed.