2016-01-22 66 views
3

好的,我想問題已經在標題中完成了。 沒什麼大的,但我只是想知道。我有一個方法返回一個正確的值或錯誤代碼枚舉項。例如這樣的事情:未來[任何]和未來之間的區別[_]

def doMyStuff(): Future[_] = { 
    val result = db.queryMyData().map { 
     case some(data) => 
      val modifiedData = data.doStuff() 
      modifiedData 
     case None => 
      Errors.THIS_IS_FALSE 
    } 
    result 
} 

db.queryMyData()返回一個未來,而只是data.doStuff()修改數據。

現在我直觀地寫了Future[_],導致返回值很靈活。但是,當我在其他庫中查看時,我已經看到使用了Future[Any]。這似乎也是邏輯,當你在函數返回時使用一個匹配的情況來檢查它是哪個數據。

它使用的代碼,例如這樣的事情:

doMyStuff().map { 
    case data: MyDataType => // Blah blah 
    case Errors.Value => // error handling 
} 

所以,我的問題是:什麼是使用任何的區別_這裏,爲什麼我應該使用正確一個?

+0

我想關閉這個有利於它是重複的:http://stackoverflow.com/questions/15186520/scala-any-vs-underscore-in-generics。我有金錘,所以我想在獲得其他人的反饋意見之前將其標記爲重複並因此將其關閉。 – cmbaxter

+0

我只是想建議使用'任何[錯誤,數據]'而不是'任何' –

+0

@Łukasz:如果只有兩個可能的返回類型,就像這個例子中的任何一個都可以工作。而且要麼看起來不那麼幹淨*並且對我來說是可讀的,尤其是對於匹配中的'左(blah)'情況。或者當使用'Either'時真正的優勢是什麼? – Wolfsblvt

回答

2

這是一個語義學問題:

生存型T[_]意味着還有一類/類型爲_對此我完全不關心,但它必須在那裏的位置。

T[Any]表示必須存在子類Any

當您想要序列化底層類時,區別就在於此。 如果你只使用_而沒有任何類型的綁定,你將無法使用一些Scala JSON庫。

+0

謝謝,這有助於我更多地理解。'_'意思是我不在乎,「Any」意味着我在乎,但它可能是一切。所以在我的例子中,它會是什麼?我想任何會更正確? (哦,有點偏離主題,但你的最後一段,這是否意味着你可以序列化任何?) – Wolfsblvt

+1

另一個嘗試說明它:'T [Any]'意味着「在編譯時,我們確信在運行時,價值可能是任何東西「。 'T [_]'的意思是「也許我們在這裏有一些編譯時的知識,也許我們不這樣做,沒關係。」 –

+0

是的。如果有疑問,我會選擇「任何」。 –

相關問題