考慮下面的例子
def futureFoo() = {
Future.successful(true)
}
def recFoo(x: List[Int]): Unit = {
if (x.isEmpty) return
for {
b <- futureFoo()
v = getNewListOfValues(x.last)
_ = recFoo(v)
} yield b
}
我需要等待futureFoo完成,然后再打電話recFoo。問題是無論我嘗試什么,我都會收到以下錯誤:
discarded non-Unit value
我還嘗試將其轉換為 while 回圈,但由于將來我要么得到相同的錯誤,要么 while 條件不更新,因為它必須在 a for comprehensionor 中更新map。
關于如何防止該錯誤的任何想法?
uj5u.com熱心網友回復:
嘗試這個。
def recFoo(x: List[Int]): Unit =
if (x.nonEmpty)
futureFoo().foreach(_ => recFoo(getNewListOfValues(x.last)))
uj5u.com熱心網友回復:
你得到的具體原因
discarded non-Unit value
在您的錯誤訊息中,您在return.
請注意,在 Scala 中,幾乎不應該使用return關鍵字。Scala 是一種面向運算式的語言;每個塊(例如函式體)計算為從塊中最后一行回傳的值。
因此,例如,請考慮以下代碼段:
val foo = {
import scala.util.Random
if (Random.nextInt() % 2 == 0) {
17
} else {
"bar"
}
}
從if到右括號之后的所有內容"bar"都是一個運算式——不是一個陳述句。斯卡拉在臉上,不具備在Java和其他語言的方式做“if陳述句”。特別是,編譯器需要推斷 name 的型別foo,并且由于foo具體可以是 theInt 17或 the String "bar",所以推斷的型別是Intand的最接近的共同祖先String,即Any。
在您的問題中,正文中的最后一個運算式recFoo如下:
for {
b <- futureFoo()
v = getNewListOfValues(x.last)
_ = recFoo(v)
} yield b
這個運算式的型別是什么?在許多語言中,for引入了一個statement,但 Scala 不是這樣——這是一個運算式,而不是一個陳述句,并且像所有運算式一樣,一旦我們評估它,它就會有一個值。該值具有 type Future[Unit],并且與所有非Unit值一樣,編譯器警告您正在丟棄一個值,這(幾乎)總是一個錯誤。(為什么你會費心去生產一個非Unit價值然后不使用它呢?這樣的想法。)
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/331458.html
標籤:斯卡拉
