Scala 的不变性是否意味着无法修改列表或无法修改列表及其内容?
Does Scala's immutability mean the list can't be modified or the list and its contents can't be modified?
我正在学习 Scala 和函数编程及其不变性概念。
如果我的代码对这样的对象列表进行操作:
class Devices(
val devices_df: Dataset[Row],
){
private lazy val _devices = _initialize_list_of_devices()
def devices(): List[Device] = {
_devices
}
private[this] def _initialize_list_of_devices(): List[Device] = {
val devices_list = ListBuffer[Device]()
for (device <- devices_df.collect()) {
devices_list += new Device(
device.getAs[String]("DeviceName"),
)
}
devices_list.toList
}
}
我这样初始化列表:
val devices_list = new Devices(devices_df).devices()
然后,我像这样更新列表中的对象:
for (device <- devices_list) {
device.modify_instance_properties()
}
代码有效,我能够修改列表中的对象。
但是,当我尝试使用如下内容将另一个对象添加到列表中时:
devices_list += new Device("append another device")
不管是val devices_list
还是var devices_list
都失败了。
我只是想检查一下我没有误解事情,并想确认这些是真的:
- 不变性并不意味着列表中的对象不能被修改
- 对象似乎正在很好地更新它们的属性
- 不变性确实意味着列表无法更改
- 我应该无法将另一个对象添加到列表或从列表中删除现有对象
感谢您的宝贵时间和帮助
所以List
是一个不可变的集合,也就是说它的内容是不能改变的。 List
的实例将始终包含相同的对象。
List
包含的对象可以是不可变的,也可以不是不可变的,如果这些对象可以修改它们的内容,那么您可以“修改” List
;但实际上 List
从未改变,因为它仍然指向相同的 (mutable) 对象。
A val
是一个不可变引用,当您执行 val foo = x
时,您是在说 foo
将始终指向 x
对象 (同样,它可能是可变的或不可变的).
PS:你所有的代码都可以简化为:
final class Devices(val devices_df: Dataset[Row],) {
lazy val devices =
devices_df
.collect()
.iterator
.map(device => device.getAs[String]("DeviceName"))
.toList
}
我正在学习 Scala 和函数编程及其不变性概念。
如果我的代码对这样的对象列表进行操作:
class Devices(
val devices_df: Dataset[Row],
){
private lazy val _devices = _initialize_list_of_devices()
def devices(): List[Device] = {
_devices
}
private[this] def _initialize_list_of_devices(): List[Device] = {
val devices_list = ListBuffer[Device]()
for (device <- devices_df.collect()) {
devices_list += new Device(
device.getAs[String]("DeviceName"),
)
}
devices_list.toList
}
}
我这样初始化列表:
val devices_list = new Devices(devices_df).devices()
然后,我像这样更新列表中的对象:
for (device <- devices_list) {
device.modify_instance_properties()
}
代码有效,我能够修改列表中的对象。
但是,当我尝试使用如下内容将另一个对象添加到列表中时:
devices_list += new Device("append another device")
不管是val devices_list
还是var devices_list
都失败了。
我只是想检查一下我没有误解事情,并想确认这些是真的:
- 不变性并不意味着列表中的对象不能被修改
- 对象似乎正在很好地更新它们的属性
- 不变性确实意味着列表无法更改
- 我应该无法将另一个对象添加到列表或从列表中删除现有对象
感谢您的宝贵时间和帮助
所以List
是一个不可变的集合,也就是说它的内容是不能改变的。 List
的实例将始终包含相同的对象。
List
包含的对象可以是不可变的,也可以不是不可变的,如果这些对象可以修改它们的内容,那么您可以“修改” List
;但实际上 List
从未改变,因为它仍然指向相同的 (mutable) 对象。
A val
是一个不可变引用,当您执行 val foo = x
时,您是在说 foo
将始终指向 x
对象 (同样,它可能是可变的或不可变的).
PS:你所有的代码都可以简化为:
final class Devices(val devices_df: Dataset[Row],) {
lazy val devices =
devices_df
.collect()
.iterator
.map(device => device.getAs[String]("DeviceName"))
.toList
}