Home » Functional Programming » Pattern Matching trong Scala

Pattern Matching trong Scala

Blog này viết về Pattern Matching, một nội dung khá là thú vị trong Scala

Vấn đề:
Bạn cần chọn ra một hoặc nhiều pattern phù hợp trong một biểu thức.
(Pattern đó có thể là hằng, là biến, là tuple,….)
Giải pháp:
Xác định trường hợp cho mỗi pattern mà bạn mong muốn.
Thông thường, khi sử dụng pattern matching, các phương thức của bạn sẽ thể hiện các kế thừa từ một base class hoặc trait. Và sau đó nó sẽ match vào các trường hợp cụ thể.


Hàm makeRandomNoise() khai báo biến t kiểu RandomThing và sau đó, nó sẽ match t với các kiểu có RandomFile và RandomString. Nếu là RandomFile thì sẽ gọi hàm playSoundFile(), nếu là RandomString sẽ gọi hàm speak().


Phân loại Patterns:
Chúng ta có các loại patterns như sau
Constant patterns: là một pattern chỉ có thể match với chính nó. Ví dụ


Variable patterns: là một pattern được thể hiện bởi dấu _ , hoặc một tên biến bất kỳ. Variable patterns đại diện cho các trường hợp còn lại của phép toán match và thường nằm ở case cuối cùng.


Constructor patterns: Constructor patterns cho phép bạn match một constructor với một case cụ thể.


Sequence patterns: cho phép match pattern với các sequences như List, Array, Vector,…. Ngoài việc sử dụng _ như ở Variable Patterns, bạn có thể sử dụng _ * . Toán tử này được hiểu là nhiều hơn hoặc bằng 0 các element


Tuple patterns: cho phép match tuple patterns và truy cập giá trị các phần tử thuộc tuple. Bạn cũng có thể sử dung _ nếu không muốn lấy giá trị của phần tử đó.


Type patterns: Xem ví dụ bên dưới,


Thêm biến vào patterns:

Chúng ta theo dõi pattern sau:


Nếu muốn x là List có phần tử đầu tiên là 0 thì làm thế nào?
* Sửa lại thành case List(0,*)? Nhưng tôi vẫn muốn trả về một String của List đó.
* Sửa lại thành case l: List(0,
*)? Trông có vẻ đúng, biên dịch xem sao nhé.


Để giải quyết vấn đề này, chúng ta có thể dùng như sau:


Ngoài ra, ta cũng có thể sử dụng một variable-binding pattern
Cú pháp:


Cụ thể với trường hợp trên:


Hẹn gặp lại các bạn trong những blog sau.

Tham khảo: How to use Pattern matching scala match case expressions- Alvinalexander