scala - scala "Illegal start of simple expression" 用于理解 if
问题描述
我正在实现一个简单的内存中、类似 Redis 的 KeyValue 存储,并且在 for comprehension 以下代码段中的 if 语句上遇到编译失败:
/*
Returns the specified elements of the list stored at key. The offsets start and
stop are zero-based indexes, with 0 being the first element of the list to n. */
def lrange(k: keyT, maxIdx:Int, minIdx:Int): List[valT] = {
val l = lookup(k)
//assert(maxIdx >= minIdx && maxIdx <= (l length) && minIdx >= 0, "invalid min or max argument. list size ")
for {
(x: valT, i: Int) <- l zipWithIndex //tried without explicit typing
if i <= maxIdx && i >= minIdx //tried indenting if
} yield x
}
编辑器 (IntelliJ) 未显示任何错误,但在尝试构建和运行测试时收到以下构建错误。
[INFO] --- scala-maven-plugin:3.3.2:compile (default) @ DS4300Project3 ---
[INFO] .../Spring2019/DS4300/scala/DS4300Project3/src/main/scala:-1: info: compiling
[INFO] Compiling 3 source files to .../Spring2019/DS4300/scala/DS4300Project3/target/classes at 1550678144065
[ERROR] .../Spring2019/DS4300/scala/DS4300Project3/src/main/scala/com/rejevichb/homework3/KeyValStore.scala:70: error: illegal start of simple expression
[ERROR] if (i <= maxIdx) && (i >= minIdx) //tried indenting if
[ERROR] ^
[ERROR] one error found
[INFO] ------------------------------------------------------------------------
[INFO] BUILD FAILURE
[INFO] ------------------------------------------------------------------------
具体来说:
KeyValStore.scala:70: error: illegal start of simple expression
感谢您对这里出了什么问题的任何指导或见解,因为我不清楚解决方案。
解决方案
这正是您应该谨慎使用后缀运算符的原因。
for {
i <- "a" zipWithIndex
if true
} yield i
被解析为
for { i <- ("a" zipWithIndex if true) } yield i
因为编译器试图解释zipWithIndex
为二进制中缀运算符,但随后遇到if true
,这确实不是一个简单的表达式。
解决方法:
只是不要使用后缀操作,使用句点:
for { i <- "a".zipWithIndex if true } yield i
添加分号以强制
zipWithIndex
解释为后缀操作:for { i <- "a" zipWithIndex; if true } yield i
然后享受您的功能警告:
警告:后缀运算符 zipWithIndex 应该通过使隐式值 scala.language.postfixOps 可见来启用。
推荐阅读
- c++ - 复制赋值运算符,向量
- python-3.x - utf-16 编码字符串是否需要 [0xff, 0xfe] 前缀?
- python-3.x - TensorFlow:从 NSynth 数据集中提取具有给定特征的数据
- javascript - 在 Amchart 上的 2 点之间放置 1 小时
- pandas - 两个日期之间的差异会产生不同的结果
- r - 在 MacOS 上查找 R 解释器
- png - 使用 cytoscape 函数 cy.png 导出 PNG 不包含 popper.js 标签
- wordpress - 根据 Wordpress 用户链接
- javascript - 带有 React 组件加载图像的 SharePoint 框架
- autodesk-forge - Autodesk forge 查看器在更新 tls1.2 后出现错误