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

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問題,去搜搜看,總會(huì)有你想問的

Scala中的CASE對(duì)象與數(shù)字

Scala中的CASE對(duì)象與數(shù)字

Scala中的CASE對(duì)象與數(shù)字是否有關(guān)于何時(shí)使用的最佳實(shí)踐指南?案例類(或case對(duì)象)VS擴(kuò)展Scala中的枚舉?他們似乎提供了一些同樣的好處。
查看完整描述

3 回答

?
慕尼黑8549860

TA貢獻(xiàn)1818條經(jīng)驗(yàn) 獲得超11個(gè)贊

一個(gè)很大的區(qū)別是Enumeration我們支持從name繩子。例如:

object Currency extends Enumeration {
   val GBP = Value("GBP")
   val EUR = Value("EUR") //etc.}

然后你就可以:

val ccy = Currency.withName("EUR")

當(dāng)希望持久化枚舉(例如,到數(shù)據(jù)庫)或從駐留在文件中的數(shù)據(jù)創(chuàng)建枚舉時(shí),這是非常有用的。但是,總的來說,我發(fā)現(xiàn)Scala中的枚舉有點(diǎn)笨拙,而且感覺上有點(diǎn)笨拙,所以我現(xiàn)在傾向于使用case object斯甲case object比枚舉更靈活:

sealed trait Currency { def name: String }case object EUR extends Currency { val name = "EUR" }
 //etc.case class UnknownCurrency(name: String) extends Currency

所以現(xiàn)在我的優(yōu)勢(shì)是.。

trade.ccy match {
  case EUR                   =>
  case UnknownCurrency(code) =>}

@chaotic3quilibrium指出(并作了一些更正以方便閱讀):

關(guān)于“未知數(shù)(代碼)”模式,除了“破壞”封閉集屬性之外,還有其他方法可以處理不查找貨幣代碼字符串的問題。Currency類型。UnknownCurrency類型存在Currency現(xiàn)在可以潛入API的其他部分。

把那個(gè)箱子推到外面是明智的Enumeration并讓客戶處理Option[Currency]類型將清楚地表明確實(shí)存在匹配問題,并“鼓勵(lì)”API的用戶自己解決這個(gè)問題。

為了跟進(jìn)這里的其他答案,主要的缺點(diǎn)是case objectS結(jié)束Enumerations如下:

  1. 不能遍歷“枚舉”的所有實(shí)例..當(dāng)然是這樣,但我發(fā)現(xiàn)在實(shí)踐中這是非常罕見的。

  2. 無法從持久化值輕松實(shí)例化..這也是正確的,但是,除了大量枚舉(例如,所有貨幣)之外,這并不會(huì)帶來很大的開銷。


查看完整回答
反對(duì) 回復(fù) 2019-07-15
?
qq_花開花謝_0

TA貢獻(xiàn)1835條經(jīng)驗(yàn) 獲得超7個(gè)贊

case對(duì)象已經(jīng)為它們的toString方法返回了它們的名稱,因此沒有必要單獨(dú)傳遞它。這里有一個(gè)類似于Jho的版本(為了簡(jiǎn)潔起見省略了方便的方法):

trait Enum[A] {
  trait Value { self: A => }
  val values: List[A]}sealed trait Currency extends Currency.Valueobject Currency extends Enum[Currency] {
  case object EUR extends Currency
  case object GBP extends Currency
  val values = List(EUR, GBP)}

對(duì)象很懶;通過使用VALL,我們可以刪除列表,但必須重復(fù)名稱:

trait Enum[A <: {def name: String}] {
  trait Value { self: A =>
    _values :+= this
  }
  private var _values = List.empty[A]
  def values = _values}sealed abstract class Currency(val name: String) extends Currency.Valueobject Currency extends Enum[Currency] {
  val EUR = new Currency("EUR") {}
  val GBP = new Currency("GBP") {}}

如果您不介意一些欺騙,您可以使用反射API或類似GoogleReflets之類的工具預(yù)加載枚舉值。非惰性的CASE對(duì)象為您提供了最干凈的語法:

trait Enum[A] {
  trait Value { self: A =>
    _values :+= this
  }
  private var _values = List.empty[A]
  def values = _values}sealed trait Currency extends Currency.Valueobject Currency extends Enum[Currency] {
  case object EUR extends Currency
  case object GBP extends Currency}

很好,很干凈,具有CASE類和Java枚舉的所有優(yōu)點(diǎn)。就個(gè)人而言,我定義了對(duì)象外部的枚舉值,以便更好地匹配慣用Scala代碼:

object Currency extends Enum[Currency]sealed trait Currency extends Currency.Valuecase object EUR extends Currencycase object GBP
 extends Currency


查看完整回答
反對(duì) 回復(fù) 2019-07-15
  • 3 回答
  • 0 關(guān)注
  • 834 瀏覽

添加回答

舉報(bào)

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)