在斯卡拉(Play Framework)中,即使我讀完了here中的所有符號,我仍無法理解類型簽名。斯卡拉了解簽名
例如:
/* matches if a == b */
def equalTo[T](t: => T): BeEqualTo
class BeEqualTo(t: => Any)
extends BeTypedEqualTo[Any]
在地球上做這些類型的簽名甚至是什麼意思?
例如,文檔中的「a」和「b」究竟是什麼?我看到的全是「t」。是否等於一個函數接受返回一個泛型類型T的值的函數?
另一個例子......
說我有這條線......
status(home).must(equalTo(OK))
按照IDE,OK是一個int類型的圖案或符號。那麼確定是一個Int?你可以猴子補丁一個int給它一個像「must」這樣的函數,但是Int如何進入「equalTo」的內部,一個接受函數的函數?
現在一些類型簽名是有意義的。例如...
def status(of: Future[Result])(implicit timeout: Timeout): Int
^這是一個咖喱功能,在未來的返回類型結果的東西,並從某處(斯卡拉魔法)型超時的隱含參數,吸取並返回一個int。 「家」是類型「未來[結果]」,因此它適合「狀態」。
但是其他的東西......
contentType(home).must(beSome.which(_ == "text/html"))
^我的IDE說beSome是
型def beSome[T](check: ValueCheck[T]): SomeCheckedMatcher[T]
^所以 「beSome」 是一個功能。如果是這樣的話,那麼我怎麼可以在它上面添加「.which()」作爲另一個函數,就像它是一個對象一樣?
另一個例子......
def which[R : AsResult](f: (U) => R): OptionLikeCheckedMatcher[F, Nothing, U]
^如何在地球上你閱讀這些類型的簽名? 「哪個」取入「f:(U)」,還是我們稱之爲「f」的變量爲「(U)」?爲什麼圍繞「(U)」的不必要的括號?難道你不能只說「f:U」並且如果R是一個字符串就把U作爲一個字符串?
「必須」是這樣的......
def must(m: => Matcher[T]): MatchResult[T]
^所以「必須」在返回匹配器的功能需要。但是「哪個」傳入OptionLikeCheckedMatcher。 「m:=> Matcher [T]」是一個接收「m」並返回「Matcher [T]」的函數。這與OptionLikeCheckedMatcher類型的對象是如何相同的?
有人可以提供關於如何閱讀Scala類型簽名的權威性指南嗎?
您的問題太長,無法做出完整答案,但是,我可以告訴您的一件事是「不要太信任IDE」,特別是在您編寫Scala時。對於'beSome',有兩個聲明需要一個段而沒有段。 http://etorreborre.github.io/specs2/api/SPECS2-2.3.12/index.html#org.specs2.matcher.OptionMatchers – ymonad
所以_ ==「text/html」是一個帶泛型參數「_ 」。這個函數被傳遞給「which」,它是SomeMatcher [T]中的一個字段,它是調用no參數「beSome」函數後的返回類型。該函數在{}中使用此匿名函數並返回一個OptionLikeCheckedMatcher [Option,String,String]或OptionLikeCheckedMatcher [F,Nothing,String](我無法真正知道),但匿名函數中的「_」是串。 –