2012-11-11 20 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 
       ^

Có thể ai đó có thể giải thích cho tôi cách khớp mẫu ở đây?Đối sánh mẫu trong Scala

Trả lời

10

match là cụ thể hơn sự bình đẳng; bạn không thể bằng nhau, bạn cũng phải có cùng loại.

Trong trường hợp này, BigInt không phải là lớp vỏ và không có phương thức unapply trong đối tượng đồng hành của nó, vì vậy bạn không thể trực tiếp khớp với nó. Điều tốt nhất bạn có thể làm là

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

hoặc một số biến thể của chúng (ví dụ: case ab if (ab == (1,5)) =>).

Ngoài ra, bạn có thể tạo ra một đối tượng với một phương pháp unapply loại thích hợp:

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

Ràng buộc với biến và bảo vệ là những gì tôi đã làm. Tôi chỉ thaught nó có lẽ có thể được thực hiện tốt hơn một chút. Cảm ơn bạn. – marcus

1

Vấn đề là 15 trả về bởi /%BigInt s và do đó, không phù hợp với nghĩa đen Int s mặc dù equals phương pháp (gọi bằng ==) trả về true. Này hoạt động nhưng là một chút thanh nha:

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

15Int loại. Khớp mẫu khớp với giá trị scala.math.BigInt. Vì vậy, cho nó bằng cách tuyên bố một vài vals cho một và năm.

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

Điều này không hoạt động! 'oneBig' và' fiveBig' trong mẫu là các biến mới không liên quan đến các biến được xác định trước đó. Điều này có thể được thay đổi bằng cách đặt tên chúng với một chữ cái viết hoa ('OneBig' và' FiveBig') hoặc bằng cách bao quanh các tên trong backticks. –

+0

Cảm ơn. Quên chuyện đó đi. Đối với những người quan tâm, hãy xem http://stackoverflow.com/questions/4479474/scala-pattern-matching-with-lowercase-variable-name hoặc trang 317 của cuốn sách cầu thang. – Brian