- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
mutable vs. immutable in Scala collections
在我发布这个问题之前,我已经阅读了上面的文章。显然如果你在 val 中存储一些东西,你不能修改它,但是如果你存储一个可变集合,例如 ArrayBuffer,你可以修改它!
scala> val b = ArrayBuffer[Int](1,2,3)
b: scala.collection.mutable.ArrayBuffer[Int] = ArrayBuffer(1, 2, 3)
scala> b += 1
res50: b.type = ArrayBuffer(1, 2, 3, 1)
scala> b
res51: scala.collection.mutable.ArrayBuffer[Int] = ArrayBuffer(1, 2, 3, 1)
使用 val
存储可变的 ArrayBuffer
有什么用?我认为 b 更改的唯一原因是因为 val b
将内存地址保存到该 ArrayBuffer(1,2,3)
。
如果你尝试 var x = 1; val y = x; x = 5; y
,输出仍然是 1。在这种情况下,y 存储一个实际值而不是 x 的地址。
Java 没有这种混淆,因为很明显不能将 Object 分配给 int 变量。
我如何知道 scala 中的变量何时携带值,何时是内存地址?将可变集合存储在不可变变量中有什么意义?
最佳答案
一个简单的答案是 vals 和 vars 都是引用。 Scala 中没有原始类型。它们都是对象。
val x = 1
是一个名为 x
的引用,它指向一个不可变的整数对象 1
。你不能做 1.changeTo(2)
什么的,所以如果你有
val value = 5
val x = value
var y = value
您可以执行 y += 10
这将更改 y
以引用一个新对象,(5 + 10)
= 15
。原来的 5
仍然是 5。
另一方面,您不能使用 x += 10
,因为 x
是一个 val,这意味着它必须始终指向 5
。所以,这不会编译。
你可能想知道为什么你可以先 val b = ArrayBuffer(...)
然后 b += something
即使 b
是一个瓦尔。那是因为 +=
实际上是一个方法,而不是一个赋值。调用 b += something
会被翻译成 b.+=(something)。 +=
方法只是将一个新元素(something
)添加到其可变自身并返回自身以进行进一步分配。
我们来看一个例子
scala> val xs = ArrayBuffer(1,2,3)
xs: scala.collection.mutable.ArrayBuffer[Int] = ArrayBuffer(1, 2, 3)
scala> val ys = ( xs += 999 )
ys: xs.type = ArrayBuffer(1, 2, 3, 999)
scala> xs
res0: scala.collection.mutable.ArrayBuffer[Int] = ArrayBuffer(1, 2, 3, 999)
scala> ys
res1: xs.type = ArrayBuffer(1, 2, 3, 999)
scala> xs eq ys
res2: Boolean = true
这确认 xs
和 ys
指向同一个(可变)ArrayBuffer。 eq
方法类似于Java 的==
,比较对象的身份。可变/不可变引用(val/var)和可变/不可变数据结构(ArrayBuffer、List)是不同的。因此,如果您执行另一个 xs += 888
,则作为指向可变数据结构的不可变引用的 ys
也包含 888
。
关于scala - 不可变 val 与可变 ArrayBuffer,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20020468/
我想要一个ArrayBuffer的二维数组 像这样: var myRowOfStrings = new ArrayBuffer[String] val myArrayOfRows = new Arra
假设我有一个 ArrayBuffer,它是一个 mp4 文件。我想创建一个新的 ArrayBuffer,其中包含一些额外的字节用作 header 信息,然后将 mp4 缓冲区存储在新的 的其余部分Ar
我正在尝试使用 .slice() 从 ArrayBuffer 创建 Blob,因为我需要复制 ArrayBuffer > 因为我知道它将来会被我无法控制/想要更改的代码更改(其 byteLength
我创建了一个用于下载pdf的应用程序。 pdf 基于 html 表格。该应用程序在所有浏览器中都工作正常,但是当我在 IE9 中运行时,我收到函数错误:“ArrayBuffer”未定义 Referen
我目前正在为 WebAuthN 编写概念验证 Web 应用程序(FIDO U2F, FIDO2) 整合。 返回字段cred.rawId的数据类型为ArrayBuffer。在 Chromes 的开发者控
这个问题过去已经得到了答案,但我肯定地说它仍然没有得到答案。 一般来说,几乎都有关于 ArrayBuffers 的文档,更不用说特定应用程序了。我已经研究了好几天了,没有结果。 本质上,我需要尝试将从
我有一个 ArrayBuffer,它是通过使用 Frida 读取内存返回的。我正在将 ArrayBuffer 转换为字符串,然后使用 TextDecoder 和 TextEncoder 转换回 Arr
我的目标是将 TIFF 图像加载到 HTML Canvas 上。前端接收 TIFF 图像的 ArrayBuffer,我能够利用 UTIF 解码 ArrayBuffer 并将其呈现在 HTML Canv
当我从 angular 6 项目上传图像时,我正在尝试按照教程将图像转换为 Base64。当我按下提交按钮时,我可以获得作为值的输出:“base64 代码”,而且我还可以通过使用“将你的 Base64
我正在尝试从 Arweave 中获取加密的原始缓冲区数据 (AES-256) ,传递给解密函数并使用它来显示图像。我正在尝试在前端(在我的 React 应用程序中)获取和解密 ArrayBuffer。
是否有任何特殊的案例类来表示空 ArrayBuffer可用于类似于 Nil 的模式匹配对于列表? 还有为什么这有效: scala> collection.mutable.ArrayBuffer.emp
Scala 在过滤不可变序列方面非常优雅: var l = List(1,2,3,4,5,6) l = l.filter(_%2==1) 但是我如何使用像 ArrayBuffer 这样的可变集合来做到
我有这个功能: def getTime() : ArrayBuffer[Timestamp] = { val offset = Timestamp.valueOf("2015-01-01 00
我有一个 Javascript ArrayBuffer,我想将其转换为十六进制字符串。 有人知道我可以调用的函数或已经存在的预先编写的函数吗? 我只能找到数组缓冲区到字符串函数,但我想要数组缓冲区的十
我正在尝试使用 FileReader API 将本地文件读入 ArrayBuffer,如下所示 let reader = new FileReader(); reader.onload = funct
假设我创建了初始大小等于 10 的 ArrayBuffer val buf = new ArrayBuffer[Int](10) 如果我确实调用了方法 buf.size - 缓冲区的大小是否等于 0?
我正在尝试使用 AES-CTR 算法在浏览器上解密数据。 WebCrypto API需要将计数器作为 BufferSource 传递.如何将计数器(数字)转换为预期的输入(字节数组)? 我使用的是全零
我有通过 TCP 连接 (WebSocket) 发送的二进制信息。这以编码格式跟踪到控制台,如下所示: 53 54 41 52 54 45 44 3a 31 34 32 38 36 30 32 30
因此,我有一个 ArrayBuffer[Signal],其中每个 Signal 都有一个时间戳(数组按此时间戳排序)。我想进行二进制搜索并返回某个范围内的信号的 Seq[Signal]。现在是用线性搜
我想在我的程序中使用 ArrayBuffer 来保存数字列表。我想将它用作队列。每次删除列表中的第一项并使用它。然后我想知道每次我删除第一个项目时队列中的所有其他数字都会移动一个位置。我的意思是下次我
我是一名优秀的程序员,十分优秀!