scala 中什么时候必须使用分号?

2024-01-02

我正在学习如何在 Scala 中编程,并被告知分号在 Scala 中是可选的。因此,考虑到这一点,我尝试使用以下没有分号的嵌套代码块。但是,它会在 Scala REPL 中引发错误

scala> { val a = 1
 | {val b = a * 2
 | {val c = b + 4
 | c}
 | }
 | }
<console>:17: error: Int(1) does not take parameters
   {val b = a * 2

带分号的样本工作得很好。

scala> { val a = 1;
 | { val b = a*2;
 | { val c = b+4; c}
 | }
 | }
res22: Int = 6

因此,在我看来,分号并不是真正可选的,并且在某些情况下是强制性的。请问什么情况下必须加分号?


我将尝试从您的示例中提取本质。

考虑以下代码片段:

{ val x = 1 { val y = 2 } }

对于编译器来说,它看起来像是语法糖

{ val x = 1.apply({ val y = 2 }) }

但对象1没有apply方法需要块,因此编译器会产生错误:

错误:Int(1) 不带参数

  { val x = 1 { val y = 2 } }
              ^

将此对比

object I { def apply(a: => Any): Unit = () }
{ val x = I { val y = 2 } }

这有效,因为I now does有一个apply method.

为了更容易区分这两种情况,编译器在第一种情况下需要一个分号。

现在人们可能想知道为什么之间要换行val x = 1{不转换为推断的分号。我认为规范中的相关引用是这样的(1.2 换行符 https://scala-lang.org/files/archive/spec/2.12/01-lexical-syntax.html#newline-characters)(省略了大部分枚举([...]),强调我的):

Scala 语法 [...] 包含产生式,其中 选修的nl接受标记,但不接受分号。这有 效果是一个这些位置之一的换行符不会终止 表达或陈述。这些立场可概括如下:

[...]

  • 在左大括号前面 ‘{’, 如果该大括号是当前语句或表达式的合法延续,

    [...]

请注意,此引用仅涵盖带有single可选换行符。它不适用于两个或多个连续换行符,例如

scala> {
     |   val x = 1
     | 
     |   { val y = 2 }
     | }

是有效的,并且{ val y = 2 }被解析为单独的表达式。

I guess动机是允许嵌入带有语法糖的 DSL,如下所示:

MY_WHILE(x >= 0)
{
  println(x)
  x -= 1
}

如果必须将这样的每一个都包含起来,那就真的很奇怪了MY_WHILE- 语句放入一对额外的圆括号中,不是吗?

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

scala 中什么时候必须使用分号? 的相关文章

随机推荐

  • Dart - 数字格式

    有没有办法与NumberFormat显示 如果双精度值为 15 00 则为 15 15 50 如果双精度值是 15 50 感谢您的帮助 事实上 我认为一起去更容易truncateToDouble https api dartlang org
  • 什么是WordArray?

    我一直在看加密js https github com brix crypto js and 它的编码器 https github com brix crypto js blob develop docs QuickStartGuide wi
  • 从 Ant 调用 FindBugs:将空格分隔的文件列表传递给 java

    我正在尝试从 Ant 内部调用 FindBugs 为了控制 FindBugs 可用的内存量 我选择不使用 ant task 我现在遇到的问题是我想在命令行上将一些jar传递给FindBugs java jar findbugs jar fo
  • Rails:如何将 add_index 添加到现有表

    我已经迁移了一个名为 units 的表 其中包含多个列 我想知道如何使用 cmd 将独立的 add index 迁移到该表 这段代码是否正确 class AddIndexToUnits lt ActiveRecord Migration d
  • 将未知行数添加到“静态单元格”UITableView

    我在 Interface Builder 中创建了一个静态表 其中包含 6 个部分 每个部分的行数都不同 我现在想添加具有不同行数的第七部分 首先 一旦我取消注释 Xcode 插入的标准表委托方法 我就会在 self tableView t
  • 结构变量不会因赋值而改变

    struct st int a1 3 int a2 2 int a3 1 void main void x a3 1 if x a3 1 printf TRUE n else printf FALSE n x a3 1 if x a3 1
  • 如何相对于背景图像宽度定位元素

    注意 我没有 JS 访问权限 这必须通过 CSS 来完成 我的背景图像 850 x 1080 位于屏幕右下角 我对图像进行了缩放 使其占据宽度的 38 background position right bottom background
  • java.io.FileNotFoundException:类路径资源

    import org springframework beans factory BeanFactory import org springframework beans factory xml XmlBeanFactory import
  • Flutter:从 Future 获取价值的正确方法

    我有一个返回图像目录路径的函数 它执行一些额外的检查 例如目录是否存在 然后它会做出相应的行为 这是我的代码 Future
  • 我可以欺骗 HttpRequest.Current.Request.IsLocal 吗?

    我正在运行一个 Web 应用程序 如果在本地运行 它会显示一些调试行为 资源字符串周围的引号等 并且我想在我无法访问互联网的会议上在我的笔记本电脑上演示该应用程序 所以它必须是本地的 应用程序使用 HttpContext Current R
  • 复制文件而不覆盖

    我只是似乎无法在命令行上找到一种方法来表示 将目录 A 中的所有文件复制到目录 B 中 但如果该文件已存在于目录 B 中 则不要覆盖它 无论哪个文件较新 并且不要提示我 我已经经历过复制 移动 xcopy 和 robocopy 我能得到的最
  • 使用 DSC 无人值守安装 .net Framework 4.6.2

    我正在尝试以自动方式在许多服务器上安装 4 6 2 不实施 WSUS 或其他方式 我的目标是利用 PowerShell DSC 因为我们正在以这种方式配置其他方面 但是 我尝试过的资源 xWindowsUpdate 中的 xHotfix 和
  • 从 linq 在新对象中创建新属性

    所以我正在执行 linq to sql 查询 结果以 IEnumerable 形式出现 从此列表中 我为返回的每个结果创建一个新对象 我已经使用的存储过程正在按我想要的顺序返回对象 我们有一个排行榜 查询后结果按降序排列 我遇到问题的部分是
  • 如何解决“无法解析:org.webrtc:google-webrtc”?

    我构建了一个 android webrtc 应用程序 但是当将 webrtc 添加到 android studio 项目时 实现 org webrtc google webrtc 1 0 我收到此错误 无法解析 org webrtc goo
  • JSP/Glassfish 的 PHP .htaccess 模拟

    如何限制 JSP Glassfish 中的文件 PDF 访问 以便只能从源代码而不是直接的 url 打开它们 对于 PHP 项目 我使用 htaccess webapp 下的任何内容WEB INF无法通过直接 URL 访问目录 但应用程序代
  • 如何在sql Developer oracle中使用spool命令

    亲爱的 我无法使用 spool 命令 它不起作用或者我没有做正确的事情 我正在尝试将查询结果保存在 txt 文件中 也尝试使用 csv 保存 select csv from table但它也不起作用 所以我写的是 set echo off
  • 从 Hibernate 3 迁移到 4 会减慢启动速度

    我们正在尝试将我们的项目从 hibernate 3 迁移到 hibernate 4 一切工作正常 但问题是启动 我们不使用 JPA 我们直接使用 hibernate 以及 xml 文件和映射文件
  • SVG 渐变不起作用

    我有一个 svg 我需要用渐变填充它 css 是由脚本添加的 如果你使用单一 RGB 颜色 一切都可以正常工作 但使用渐变时 SVG 会产生白色背景 脚本后的结果代码
  • RibbonComboBox 选定的图库项目在鼠标离开时恢复为旧值

    我已将 WPF 功能区替换为最新的库 组合框选择更改会触发数据网格的重新加载 我的 RibbonComboBox 有问题 如果我将鼠标光标移出所选项目 则所选项目将恢复为旧项目 如果我将光标保持在所选项目上直到数据网格重新加载完成 则新值将
  • scala 中什么时候必须使用分号?

    我正在学习如何在 Scala 中编程 并被告知分号在 Scala 中是可选的 因此 考虑到这一点 我尝试使用以下没有分号的嵌套代码块 但是 它会在 Scala REPL 中引发错误 scala gt val a 1 val b a 2 va