[英]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.