2016-01-20 150 views
1

在斯卡拉(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類型簽名的權威性指南嗎?

+0

您的問題太長,無法做出完整答案,但是,我可以告訴您的一件事是「不要太信任IDE」,特別是在您編寫Scala時。對於'beSome',有兩個聲明需要一個段而沒有段。 http://etorreborre.github.io/specs2/api/SPECS2-2.3.12/index.html#org.specs2.matcher.OptionMatchers – ymonad

+0

所以_ ==「text/html」是一個帶泛型參數「_ 」。這個函數被傳遞給「which」,它是SomeMatcher [T]中的一個字段,它是調用no參數「beSome」函數後的返回類型。該函數在{}中使用此匿名函數並返回一個OptionLikeCheckedMatcher [Option,String,String]或OptionLikeCheckedMatcher [F,Nothing,String](我無法真正知道),但匿名函數中的「_」是串。 –

回答

2

我想你對函數值參數和名稱調用參數之間的區別有點困惑。他們是相似的,但不完全相同。在第一個例子中,你發佈了def equalTo[T](t: => T): BeEqualTo,:=>符號意味着該參數不是立即計算的(因爲它會是隻用冒號聲明的),但每次在表達式中使用。此鏈接可能澄清事情有點給你:https://tpolecat.github.io/2014/06/26/call-by-name.html

在你張貼另一個例子,def which[R: AsResult](f: (U) => R): OptionCheckedLikeMatcher[F, Nothing, U]發生在所謂的F函數參數,它接受一個ü作爲參數,並返回一個T.周圍的U中的括號確實是不必要的,但是如果(例如)f是一個帶有2個U型參數的函數,那麼它們就是必需的 - 我們會將它寫爲f: (U, U) => Rwhich的返回值將是一個OptionCheckedMatcher。假設這是Matcher的一個子類型(這似乎是合理的),這是傳遞給must的值。

+0

哦,我明白了。 「whenTrue:=> Type」意味着「whenTrue:(=> Type)」not「whenTrue:(_ => Type)」「。 –

+0

通用參數R是「AsResult」類型。爲什麼他們在這種情況下調用泛型參數「R」而不是「T」? Scala中的「U」和「F」類的實際名稱是?我以前見過抽象類型,但只在類體內部,從來沒有類型簽名。 –

+0

我懷疑他的意思是「接受一個U作爲它的論點並返回一個R」。 –