关于Scala变量可变性的问题

2023-12-10

我明白那个val关键字确定基础变量是不可变类型(以后不能重新分配)。现在我在 scala 编程中遇到了一段(第 3 章,scala 中的后续步骤 - 用类型参数化数组),它指出

val greetStrings: Array[String] = new Array[String](3)
greetStrings(0) = "Hello"
greetStrings(1) = ", "
greetStrings(2) = "world!\n"

这三行代码说明了 需要理解的一个重要概念 关于 Scala 的含义 瓦尔。当你定义一个变量时 val,变量不能被重新赋值, 但它所指的对象 仍有可能改变。所以 在这种情况下,您无法重新分配 greetStrings 到不同的数组; greetStrings 将始终指向 相同的 Array[String] 实例 它被初始化了。但你可以改变 该 Array[String] 的元素 随着时间的推移,所以数组本身是 可变的。

所以改变数组的元素是有效的。如果我们这样定义它是无效的

greetStrings = Array("a","b","c")

它满足下面的陈述

当你定义一个变量时 val,变量不能被重新赋值, 但它所指的对象 仍有可能改变。

但如果我声明这样的事情

val str = "immutable string"

根据书中给出的定义

这是什么意思它所引用的对象仍然可能被更改在上面的代码行中?


声明一个val不保证甚至暗示不可变类型。它仅声明您可能在 Java 中调用的内容final多变的。标识符不能重新分配,但值可以是可变类型。

在字符串值的示例中,您有两个val和一个不可变类型 String。所以这个标识符既不可重新分配也不可修改(不可变)。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

关于Scala变量可变性的问题 的相关文章

  • 从apache Spark中的文本文件查找rdd中存储的数据大小

    我是 Apache Spark 版本 1 4 1 的新手 我编写了一段小代码来读取文本文件并将其数据存储在 Rdd 中 有没有一种方法可以获取 rdd 中数据的大小 这是我的代码 import org apache spark SparkC
  • Scala:为什么 Actor 是轻量级的?

    是什么让演员如此轻盈 我什至不确定它们是如何工作的 它们不是单独的线程吗 当他们说轻量级时 他们的意思是每个参与者都没有映射到单个线程 JVM 提供共享内存线程 锁作为主要形式 并发抽象 但分享了 内存线程是相当重量级的 并招致严重的绩效处
  • 基于值的类混乱

    我正在寻求一些澄清基于值的类的定义 https docs oracle com javase 8 docs api java lang doc files ValueBased html 我无法想象 最后一个要点 6 应该如何与第一个要点一
  • Scala 正则表达式替换为匿名函数

    在 Ruby 中 我可以通过以下方式替换字符串中的字符 a one1two2three a gsub d e e to i 1 gt one2two3three 从第二行开始评估块的结果将替换模式中匹配的内容 我们可以在 Scala 中做类
  • 强制类型差异

    在 Scala 中 我可以在编译时强制执行类型相等 例如 case class Foo A B a A b B implicit ev A B scala gt Foo 1 2 res3 Foo Int Int Foo 1 2 scala
  • Scala:var List 与 val MutableList

    在 Odersky 等人的 Scala 书中 他们说使用列表 我还没有从头到尾读过这本书 但所有的例子似乎都使用了 val List 据我了解 还鼓励人们使用 vals 而不是 vars 但在大多数应用程序中 使用 var List 或 v
  • 由于 UTFDataFormatException 导致 Spark 中的任务无法序列化:编码字符串太长

    我在 Yarn 上运行 Spark 应用程序时遇到一些问题 我有非常广泛的集成测试 运行时没有任何问题 但是当我在 YARN 上运行应用程序时 它将抛出以下错误 17 01 06 11 22 23 ERROR yarn Applicatio
  • 对 HList 进行协变过滤

    我打算以协变方式过滤 HList 我也想包含子类 所以协变滤波器Foo应捕获以下元素Foo也Bar 我已经构建了这个例子来尝试 lt lt 看看它是否做了我想做的事情 http scastie org 6465 http scastie o
  • scala:抽象类实例化?

    我怎么会实例化一个抽象类呢 abstract class A val a Int val a new A val a 3 或者是隐式创建了一些具体的类 那些大括号之后是做什么用的new A mean 这样 您就隐式扩展了A 你所做的是语法糖
  • 通过spark-shell以静默模式执行scala脚本

    需要通过spark shell以静默模式执行scala脚本 当我使用时spark shell i file scala 执行后 我进入scala交互模式 我不想进入那里 我尝试执行spark shell i file scala 但我不知道
  • 在 Java 中使用 Scala 常量

    我目前正在评估 Scala 的未来项目 并发现了一些奇怪的事情 我在 JSP 中为我们创建了以下常量 val FORMATED TIME formatedTime 但这没有用 经过一番尝试后 我决定反编译以了解其真相 private fin
  • 如何从 lift webapp 读取文件

    我想在我的 lift 应用程序中读取 xml 文件 val data XML load new java io InputStreamReader new java io FileInputStream 文件名 编码 然而 我得到java
  • 帮助我理解这段 Scala 代码:scalaz IO Monad 和隐式

    这是后续this https stackoverflow com questions 7404495 help me understand this scala code scalaz io monad问题 这是我试图理解的代码 它来自ht
  • IntelliJ IDEA 13 给出有关不兼容类型的无效错误(Play 中的 Java-Scala-InterOp)

    我刚刚从 IDEA 12 升级到 13 社区版 从那时起 我在 IDEA 中收到关于我的游戏项目的类型不兼容的错误 Option
  • 如何识别远程参与者?

    我有一个远程参与者 客户端 它正在向另一个远程参与者 服务器 注册 然后注销 使用关闭挂钩 然而 虽然服务器接收到注销 但实际sender财产是一个不同的 Channel 对象 所以在我的服务器日志中我有 Registered new cl
  • 为什么我可以使用 Scala REPL 中的 Java 库,但不能使用脚本中的 Java 库?

    我正在开发一个使用 Joda Time 的 Scala 脚本 直到今天 这一切都运行良好 不知怎的 有些东西发生了变化 它不再起作用了 这有效 scala cp lib Welcome to Scala version 2 9 1 fina
  • sbt:编译测试时设置特定的 scalacOptions 选项

    通常我使用这组选项来编译 Scala 代码 scalacOptions Seq deprecation encoding UTF 8 feature unchecked language higherKinds language impli
  • 具有动态命名参数的 Scala 案例类副本

    对于具有参数数量的 scala 案例类 21 e g case class Car type String brand String door Int 其中类型 吉普车 品牌 丰田 门 4 etc 还有一个复制方法允许使用命名参数覆盖 Ca
  • 内存泄漏在哪里?

    我使用 InetAddress 来解析 IP 地址 但现在如果 IP 不可用 则需要存储主机名 所以我介绍了一个班级Host case class Host name String ip InetAddress import Host ad
  • 如何向数据框spark添加标题和列?

    我有一个数据框 我想在其中添加标题和第一列 手动 这是数据框 import org apache spark sql SparkSession val spark SparkSession builder master local appN

随机推荐