You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用for和yield时出现编译错误,请求排查Scala代码问题

Scala For推导式语法错误分析与修复

咱们先拆解下你这段代码的核心问题:

val loginInfoFuture: Future[LoginInfo] = credentialsProvider.authenticate(credentials)
for{loginInfo <- loginInfoFuture}{ println("in loginInfo future") }
yield Future{Ok(Json.toJson(JsonResultError("Invalid Body Type. Need Json")))}

问题根源

Scala的for推导式是一个完整的表达式,必须严格遵循for { ... } yield ...的结构——yield是这个表达式的核心组成部分,绝对不能拆到for的闭合花括号外面。你现在的写法相当于先单独执行了一个不带yield的for循环(它仅返回Future[Unit],只做println的副作用操作),然后凭空写了个yield,这完全不符合语法规则,IDE报错是必然的。

哪怕你改成} yield Ok(...)也没用,因为前面的for { ... }{ ... }已经是一个独立的无返回值for循环,后面的yield找不到对应的for推导式,自然还是语法错误。

修复后的代码

你需要把yield整合到for的代码块结构里,同时注意:既然你在处理Future,yield的结果会自动被包装成Future,没必要手动再套一层Future{...}。正确的写法应该是这样:

val loginInfoFuture: Future[LoginInfo] = credentialsProvider.authenticate(credentials)
val resultFuture: Future[Result] = for {
  loginInfo <- loginInfoFuture
} yield {
  println("in loginInfo future")
  Ok(Json.toJson(JsonResultError("Invalid Body Type. Need Json")))
}

为什么REPL里看似正常?

大概率是你在REPL里测试的代码结构是正确的——比如把yield放在了for的花括号范围内,或者REPL的语法解析器对某些不规范写法的容忍度比IDE(比如IntelliJ)更高,但这并不代表写法是合规的,生产代码必须遵循严格的语法规则。

内容的提问来源于stack exchange,提问作者Manu Chadha

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 09:08:38