亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

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

Scala中的CASE對象與數字

Scala中的CASE對象與數字

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

3 回答

?
慕尼黑8549860

TA貢獻1818條經驗 獲得超11個贊

一個很大的區別是Enumeration我們支持從name繩子。例如:

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

然后你就可以:

val ccy = Currency.withName("EUR")

當希望持久化枚舉(例如,到數據庫)或從駐留在文件中的數據創建枚舉時,這是非常有用的。但是,總的來說,我發現Scala中的枚舉有點笨拙,而且感覺上有點笨拙,所以我現在傾向于使用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

所以現在我的優勢是.。

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

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

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

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

為了跟進這里的其他答案,主要的缺點是case objectS結束Enumerations如下:

  1. 不能遍歷“枚舉”的所有實例..當然是這樣,但我發現在實踐中這是非常罕見的。

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


查看完整回答
反對 回復 2019-07-15
?
qq_花開花謝_0

TA貢獻1835條經驗 獲得超7個贊

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

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)}

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

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之類的工具預加載枚舉值。非惰性的CASE對象為您提供了最干凈的語法:

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枚舉的所有優點。就個人而言,我定義了對象外部的枚舉值,以便更好地匹配慣用Scala代碼:

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


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

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號