我需要使用if语句来获得帮助,该if语句仅在对期货的理解中测试为假时才运行。我是scala的新手,并以this blog post作为指导。
代码是
for {
emptyResults: Boolean = areResultsEmpty(content)
resp <- getResp(content) if !emptyResults
} yield resp
如果emptyResults
为true,则getResp()
会引发错误,但是在以上情况下,即使getResp()
为true,emptyResults
也会运行。我如何确保getResp()
仅在emptyResults
为假的情况下运行?
我还尝试过编写如下的if语句,但是会引发错误error: value map is not a member of Any
acmResp <- if (!emptyResults) {
getResp(content)
}
答案 0 :(得分:3)
for
的理解是“语法糖”。这意味着,在将其翻译成字节码之前,先将其翻译成另一种标准语言构造。
在这种情况下,您有一个生成器<-
和一个守护程序if ...
。它将转换为一个map()
调用和一个withFilter()
调用。因此,您看到了,您无法通过添加保护条件来阻止生成器执行。守卫只能充当对传递到yield
的内容的过滤器。
要获得所需的内容,您必须将条件测试移至for
理解之外,此时,将其简化为简单的map()
即可。
val result = if (areResultsEmpty(content)) {
. . . //some default
} else {
getResp(content).map(/*do work*/)
}
答案 1 :(得分:0)
您不能在a中的任何生成器之前进行分配。
for {
emptyResults: Boolean = areResultsEmpty(content) // Not allowed
resp <- getResp(content) if !emptyResults
} yield resp
相反,请尝试以下操作:
if(!areResultsEmpty(content)) {
for {
resp <- getResp(content)
} yield resp
}
else {
...
}
答案 2 :(得分:0)
您可以在理解表达式中调用areResultsEmpty
的后卫。
for {
resp <- getResp(content) if !areResultsEmpty(content)
} yield resp