簡體   English   中英

如何在Scala中使用不帶案例類的模式匹配?

[英]how to use pattern matching without case classes in scala?

聽說我們可以在Scala中應用模式匹配,而無需使用案例類。 另外,我不僅意味着識別實際的實現類,而且還從對象中提取各種值。 真的有可能嗎? 我們怎樣才能做到這一點?

在先前針對類似主題發布的任何問題中,我都找不到指向我的解決方案的可接受答案。 因此,我決定提出一個新問題。

案例類不是神奇的,在幕后他們要做的是生成大量樣板代碼。
在這兩者之間,是對類的伴隨對象的apply (工廠構造函數)unapply (提取程序)方法。
當您嘗試對對象進行模式匹配時 ,編譯器嘗試執行的操作是調用伴隨對象的extractor方法 -因此,您只需要實現自己的extractor對象。

例如

class User(val id: Int, val name: String)

object User {
  def apply(id: Int, name: String): User = new User(id, name)

  def unapply(user: User): Option[(Int, String)] =
    Some(user.id, user.name)
}

現在,您可以通過這種方式創建匹配用戶。

val user = User(3, "Luis")
def getId(user: User): Int = user match {
  case User(id, name) => id
}
getId(user) // 3

作為參考,請參閱

Arnon和Luis解決方案結合用於演示目的:

class A(val a: Int, val b: String, val c: Int)

// Handmade companion object for demonstration purpose only.
object A {
   def unapply(u: A): Option[(Int, String, Int)] =
    Some(u.a, u.b, u.c)
}

// No factory method found, so 'new' keyword is necessary.
val a = new A(1, "hello", 3)

/* With real case class the right side expression
    calls the unapply of the Object
   otherwise call must be explicitly.
*/
val Some((b, _, c)) = A.unapply(a)
// b: Int = 1
// c: Int = 3

def getId(user: A): Int = user match {
  case A(_, _, id) => id
}

getId(a) // 3

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM