2016-03-29 19 views
0

ile uyumlu Opsiyon paterni ile case Some(x) => x.id ile eşleşir. Bu, Some türüne göre değerlendirilmemelidir. Scala Opsiyon kalıbı

case class UserDbEntry(id: Int, username: String) 

val users = List() 
val lastTableIds = "user.1::paypal.1" 
val lastUserId = lastTableIds.split("::")(0).split("\\.")(1) 

//This does not compile 
val id = users.lastOption match { 
    case Some(x) => x.id 
    case None => lastUserId 
} 

//This compiles 
def getLastFetchId(x: Option[UserDbEntry]) = x match { 
    case Some(user) => user 
    case None => 1 
} 

Ama List[UserDbEntry] bunun açık bir türüyle tanımlanmış List

derleyici başarıyla infers bu durumda, gayet iyi. Derleyici çıkarımı ile ilgili olması gerekiyor sanırım; Eğer yanılmıyorsam. Sadece bir tür uyuşmazlığı varsa, ben String türünde bir üye olmama ile bir hata bekledim.

Tam olarak burada neler oluyor?

cevap

4

Gümrüğe zaman:

val users = List() 

derleyici infers:

val users: List[Nothing] = List() 

Nothing

bir kimlik özelliği yoktur. Ancak, bu kullanıcıların bir List[UserDbEntry] olduğunu ve lastOption numaralı telefonu belirttiğinizde, derleyici, Seçenek içindeki öğenin, bir kimlik özelliğine sahip, dolayısıyla iyi bir şekilde derleme olan bir UserDbEntry olduğunu anlayabilir. Boş bir Listenin Option[Nothing] olan None'u döndüreceğini hesaba katın. Bunu açıklayan

+0

; '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' teşekkürler –

+0

Temel olarak her zaman 'type' belirtilmelidir. Bence kod yazmayı pratiği denemeliyiz “val users = List()'. Türlerimizi derleme zamanında almalıyız. –