第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

<:<、<%<和=Scala2.8中的平均值是什么?

<:<、<%<和=Scala2.8中的平均值是什么?

<:<、<%<和=Scala2.8中的平均值是什么?我可以在api文檔中看到普雷德夫它們是泛型函數(shù)類型(From)=>to的子類,但它只說明了這一點。嗯,什么?也許在某個地方有文檔,但是搜索引擎沒有處理“<:<”之類的“名稱”-非常好,所以我一直找不到它。后續(xù)問題:我什么時候應該使用這些時髦的符號/類,為什么?
查看完整描述

3 回答

?
慕容森

TA貢獻1853條經(jīng)驗 獲得超18個贊

這些叫做廣義類型約束..它們允許您從類型參數(shù)化類或特征中,到進一步約束它的一個類型參數(shù)。下面是一個例子:

case class Foo[A](a:A) { // 'A' can be substituted with any type
    // getStringLength can only be used if this is a Foo[String]
    def getStringLength(implicit evidence: A =:= String) = a.length}

隱式論證evidence由編譯器提供,如果AString..你可以把它想象成證明那,那個AString-爭論本身并不重要,只是知道它的存在。編輯:從技術上講,它實際上很重要,因為它代表了從AString,這就是你可以打電話給a.length不要讓編譯器對你大喊大叫]

現(xiàn)在我可以這樣使用它了:

scala> Foo("blah").getStringLength
res6: Int = 4

但如果我試著用它Foo包含其他東西,而不是String:

scala> Foo(123).getStringLength<console>:9: error: could not find implicit value for parameter evidence: =:=[Int,String]

您可以將該錯誤理解為“無法找到int=string的證據(jù)”.應該是這樣的!getStringLength氣勢磅礴進一步限制關于…的類型A比什么Foo一般需要;也就是說,您只能調(diào)用getStringLength在.上Foo[String]..這個約束是在編譯時強制執(zhí)行的,這很酷!

<:<<%<工作方式類似,但略有變化:

  • A =:= B

    意思是A一定就是B
  • A <:< B

    表示A必須是B的子類型(類似于

    簡約

    類型約束

    <:)

  • A <%< B

    意思是A必須是

    可見

    作為B,可能通過隱式轉(zhuǎn)換(類似于簡單類型約束)。

    <%)

這個片段很好地解釋了這類事情過去是如何完成的,以及廣義類型約束如何使它現(xiàn)在變得更容易。

增編

要回答你的后續(xù)問題,無可否認,我給出的例子是相當人為的,顯然沒有用。但是想象一下使用它來定義類似于List.sumInts方法,該方法將整數(shù)列表相加。您不希望在任何舊方法上調(diào)用此方法List,只是一個List[Int]..但是List類型構(gòu)造函數(shù)不能受到如此的約束;您仍然希望能夠有字符串、foos、條形圖和諸如此類的列表。因此,通過在sumInts,你可以確保就是那種方法有一個附加約束,只能在List[Int]..實際上,你是在為某些類型的列表編寫特例代碼。


查看完整回答
反對 回復 2019-07-11
?
寶慕林4294392

TA貢獻2021條經(jīng)驗 獲得超8個贊

不是一個完整的答案(其他人已經(jīng)回答了這個問題),我只想指出以下幾點,這可能有助于更好地理解語法:您通常使用這些“操作符”的方式,例如在Pelotom的示例中:

def getStringLength(implicit evidence: A =:= String)

利用Scala的選擇類型運算符的infix語法.

所以,A =:= String是相同的=:=[A, String](和=:=只是一個有著花哨名字的類別或特征)。請注意,這個語法也適用于“常規(guī)”類,例如,您可以編寫:

val a: Tuple2[Int, String] = (1, "one")

就像這樣:

val a: Int Tuple2 String = (1, "one")

它類似于方法調(diào)用的兩個語法,即“Normal”.()以及運算符語法。


查看完整回答
反對 回復 2019-07-11
?
慕婉清6462132

TA貢獻1804條經(jīng)驗 獲得超2個贊

閱讀其他答案,了解這些構(gòu)造是什么。這是什么時候你應該用它們。當只需要對特定類型的方法進行約束時,可以使用它們。

下面是一個例子。假設您想定義一個同構(gòu)對,如下所示:

class Pair[T](val first: T, val second: T)

現(xiàn)在要添加一個方法smaller,就像這樣:

def smaller = if (first < second) first else second

只有在T是被命令的。您可以限制整個類:

class Pair[T <: Ordered[T]](val first: T, val second: T)

但這似乎是個恥辱-當T不是命令。使用類型約束,仍然可以定義smaller方法:

def smaller(implicit ev: T <:< Ordered[T]) = if (first < second) first else second

實例化,比如說,Pair[File]只要你不打電話 smaller在上面。

如屬Option,實現(xiàn)者希望orNull方法,盡管它沒有意義Option[Int]..通過使用類型約束,一切都很好。你可以用orNull在.上Option[String],您可以形成一個Option[Int]使用它,只要你不打電話orNull在上面。如果你試著Some(42).orNull,你得到了迷人的信息

 error: Cannot prove that Null <:< Int


查看完整回答
反對 回復 2019-07-11
  • 3 回答
  • 0 關注
  • 6830 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網(wǎng)微信公眾號