Scala有使用或设置变量"Scala Way"吗?



如果设置了实例变量,我想使用它。如果没有设置,则执行设置工作。

所以这就是我想要的,它有效:

class Devices(){
private var _devices = List[Any]()
def devices(): List[Any] = {
// possibly other stuff
_get_devices() // return processed list of devices
}
private[this] def _get_devices(): List[Any] = {
if (_devices.isEmpty) {
_devices = _initialize_list_of_devices()
}
_devices
}
private[this] def _initialize_list_of_devices(): List[Any] = {
List[String]("_initialized") // perform time-consuming processing
}
}

但我想知道是否有更惯用的Scala方法

我也不能使用lazy val,因为我稍后需要修改变量。

在Ruby中,它可能是类似于懒惰加载、记忆或这样的东西:

def my_attribute
@my_attribute ||= initialize_my_attribute
end

def my_attribute
@my_attribute = (value || initialize_my_attribute)
end

谢谢你抽出时间🙏

您可以使用lazy val将变量的初始化推迟到第一次访问时:

class Devices(){
private lazy val _devices: List[Any] = {
List[String]("_initialized") // perform time-consuming processing
}
}

从多个线程访问lazy val是安全的。

我只想把它打出来,这样我以后就不会忘记它,以防它以后帮助别人。

@kolmar的回答和@SwiftMango的评论让我想到了这个:

Devices.scala:

class Devices(){
println("in constructor")
lazy val _devices = _initialize_list_of_devices() // I swapped these two statements
//val _devices = _initialize_list_of_devices()    // to get at the results below
def devices(): List[Any] = {
println("in getter")
_devices
}
private[this] def _initialize_list_of_devices(): List[Any] = {
println("initializing=======")
List[String]("_initialized") // perform time-consuming processing
}
}

Main.scala:

var devices_class = new Devices()
val devices_list = devices_class.devices()
devices_class.devices()

输出为:
没有lazy(即val _devices = _initialize_list_of_devices():

in constructor
initializing=======
in getter
in getter

使用lazy(即lazy val _devices = _initialize_list_of_devices():

in constructor
in getter
initializing=======
in getter

我学到并获得了清晰的东西:

  • lazy不会阻止初始化进程多次运行,即不会进行缓存/内存
  • lazy确实将初始化推迟到使用变量时,即它正在进行延迟加载/求值
  • val帮助程序员记住不要重新分配给变量(与var相反(;因此,(以一种迂回的方式(有助于保持初始化过程只运行一次,即帮助程序员记住使用变量的缓存/存储值

我混淆了懒惰和内存化/缓存。

再次感谢大家的帮助🙏

最新更新