2012-11-11 23 views
5
scala> (1,5) == BigInt(12) /% 7 
res3: Boolean = true 

scala> BigInt(12) /% 7 match { 
| case (1,5) => true 
| } 

<console>:9: error: type mismatch; 
found : Int(1) 
required: scala.math.BigInt 
      case (1,5) => true 
       ^

Birisi bana modelin burada nasıl eşleştiğini açıklayabilir mi?Scalada eşleşen desen

cevap

10

match eşitlik daha spesifiktir; Sen sadece eşit olamazsın, aynı tipte olmalısın.

Bu durumda, BigInt, örnek bir nesne sınıfı değildir ve eşlik eden nesnesinde unapply yöntemine sahip değildir, dolayısıyla doğrudan eşleştiremezsiniz. yapabileceği en iyi bunların (örneğin case ab if (ab == (1,5)) =>)

BigInt(12) /% 7 match { 
    case (a: BigInt,b: BigInt) if (a==1 && b==5) => true 
    case _ => false 
    } 

ya da varyantıdır.

Alternatif olarak, uygun tür bir uygulamasını kaldırma yöntemi ile bir nesne oluşturmak olabilir:

object IntBig { def unapply(b: BigInt) = Option(b.toInt) } 

scala> BigInt(12) /% 7 match { case (IntBig(1), IntBig(5)) => true; case _ => false } 
res1: Boolean = true 
+0

Değişkenlere ve korumaya bağlanmak benim yaptığım şeydir. Sadece, belki biraz daha iyi yapılabilirdi. Teşekkür ederim. – marcus

1

sorun 1 ve /% tarafından döndürülen 5BigInt ler ve böylece Int (== tarafından çağrılan) equals yöntemi true döndürür halde s değişmez maç kalmamasıdır. Bu inelegant biraz çalışır ama geçerli:

scala> BigInt(12) /% 7 match { case (x, y) if x == 1 && y == 5 => true } 
res3: Boolean = true 
2

1 ve 5Int türleridir. Desen eşleşmesi, bir scala.math.BigInt bekleniyor. Yani, bir ve beş için bir çift vals ilan ederek bunu verin.

scala> val OneBig = BigInt(1) 
oneBig: scala.math.BigInt = 1 

scala> val FiveBig = BigInt(5) 
fiveBig: scala.math.BigInt = 5 

scala> BigInt(12) /% 7 match { 
    | case (OneBig, FiveBig) => true 
    | } 
res0: Boolean = true 
+3

Bu işe yaramıyor! Desendeki "BirBig" ve "BeşBig", önceden tanımlanmış olanlarla ilgisi olmayan yeni değişkenlerdir. Bu, büyük harflerle ("OneBig" ve "FiveBig") adlandırılarak veya adların arka kısımda çevrilmesiyle değiştirilebilir. –

+0

Teşekkürler. Bunu unuttun. İlgilenenler için http://stackoverflow.com/questions/4479474/scala-pattern-matching-with-lowercase-variable-name veya merdiven kitabının 317. sayfasına bakınız. – Brian