簡體   English   中英

在case類中重載unapply方法:scala

[英]overloading unapply method in case classes: scala

考慮以下代碼:

case class User(id: Int, name: String)
object User{
  def unapply(str: String) = Some(User(0, str))
}

Scala抱怨“錯誤:無法解決重載unapply;案例類User(id:Int,str:String)”是否無法重載unapply?

更新:取消應用更大的元組大小。

case class User(id: Int, str: String)
object User{
  def unapply(s: String) = Some((User(0, s), s, 1234))
}

編譯器仍然抱怨“無法解決重載unapply”

您的unapply方法無法用於模式匹配

它適用於

def unapply(arg: <type to match>) : Option[(<matched fields types>)]

(如果只有一個字段,則沒有元組,如果沒有字段,則為布爾而不是選項)。

用戶的標准不適用(Scala語言規范第67頁)

def unapply(u: User) = 
  if (u eq null) None 
  else Some((u.id, u.name))

它你想要的是匹配一個零id的用戶,如

user match {case User(name) => ....}

那會是

def unapply(u: User): Option[String] = 
  if(u eq null || u.id != 0) None 
  else Some(u.name)

如果你想要一個字符串可以作為用戶匹配(這將是相當奇怪的)

def unapply(s: String): Option[User] = Some(User(0, s))

它可以使用

"john" match case User(u) => ... // u is User(0, john)

我猜你想要前者。 在這種情況下,您的apply和標准的兩個方法都具有相同的參數列表(一個User參數),因此它們不兼容。 這可能被視為有點不幸,因為當方法被稱為提取器時,區分元素實際上是結果元組的大小,而不是參數的類型。

但是,您的方法雖然不能作為提取器使用,但不會導致沖突。 我在規范中找不到禁止它的東西。 盡管如此,它仍然是無用的,並且正確的方法是不允許的。

您無法覆蓋unapply(特別是)的原因很可能是它與case類的companiation對象自動創建的簽名相同。 記住函數的簽名沒有考慮到覆蓋的覆蓋率的返回值。

暫無
暫無

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

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