Một vài điều thú vị về Product class trong scala
Scala
50
White

huydx viết ngày 17/09/2015

Lưu ý: Product ở đây không có nghĩa là "sản phẩm" mà có nghĩa là "tích" :)

Trong scala chúng ta có một số class khác đặc biệt gọi tên là Product, Product2, ... , Product22 (Trong scala con số 22 có thể gọi là một magic number, chuyên dùng để implement các cấu trúc dữ liệu nhận một lúc nhiều đầu vào là các class khác nhau mà điển hình là Tuple).

Nếu bạn vào scala doc thì sẽ thấy định nghĩa rất ngắn gọn.

Product2 is a cartesian product of 2 components.

What the hell, định nghĩa gì mà ngắn gọn dễ hiểu vậy?

Chắc bạn nào học đại số tuyến tính ở đại học sẽ nhớ mang máng có cái gọi là Catersian product. Tìm kiếm trong wiki chúng ta sẽ thấy định nghĩa bằng tiếng Việt cho catersian product:

Trong toán học, đặc biệt là trong lý thuyết tập hợp, tích Descartes (hay tích Đềcác) của hai tập hợp A và B, ký hiệu là A×B, là một tập hợp chứa tất cả các bộ có dạng (a, b) với a là một phần tử của A và b là một phần tử của B.

Như vậy từ định nghĩa trên chúng ta có thể hiểu class Product2một tập hợp chứa tất cả các bộ có dạng (a, b) với a là một phần tử của A và b là một phần tử của B..
Vậy A, B ở đây là gì? Chính là 2 class mà Product2 nhận vào dưới dạng type parameter.

Tóm tắt lại thì Product2 là class mà mỗi phần tử (a,b) sẽ có dạng là a thuộc class A, và b thuộc class B.
Không dễ hiểu hơn tẹo nào cả!

Vậy nếu tôi chỉ cần nói: Tuple2 là một subclass của Product2 chắc là bạn sẽ hiểu ra ngay đúng không, bạn rất thông minh mà :).

Vậy một người thông minh như bạn sẽ tự hỏi class Product này có ý nghĩa là gì, tại sao lại cần nó? Tất cả đều bắt nguồn từ việc: là software engineer , chúng ta sẽ muốn mô tả những thứ càng trừu tượng càng tốt. Với một định nghĩa rất trừu tượng :

Product2 là class mà mỗi phần tử (a,b) sẽ có dạng là a thuộc class A, và b thuộc class B.

Chúng ta sẽ thấy rằng từ định nghĩa trên Product2 có thể mô ta một lúc Tuple2, Either hay là List với 2 phần tử! Tôi đoán chắc bạn sẽ ồ lên, là Product2 sẽ rất có ích khi chúng ta muốn mô tả một class có 2 phần tử, nhận 2 class đầu vào, mà không biết chắc nó sẽ la Tuple, List hay là Either.

Ví dụ sử dụng class Product

scala> val product : Product = (1,'2',3)
product: Product = (1,2,3)
scala> product.productIterator.foreach {println _}
1
2
3

scala> product.productArity                       
res1: Int = 3

scala> product.productElement(2)
res2: Any = 3

scala> product.productPrefix    
res3: java.lang.String = Tuple3

scala> product.toString
res4: java.lang.String = (1,2,3)

scala> val product3 = product.asInstanceOf[Product3[Int,Char,Int]]
product3: Product3[Int,Char,Int] = (1,2,3)

scala> product3._2
res5: Char = 2

scala> product3._3
res6: Int = 3

scala> case class Test(name:String, passed:Boolean, error:String)
defined class Test

scala> Test("Chicken Little", false, "the sky is falling")
res7: Test = Test(Chicken Little,false,the sky is falling)

scala> res7.productArity
res8: Int = 3

scala> res7.productIterator mkString ", "   
res9: String = Chicken Little, false, the sky is falling

Bạn có thể tìm thấy cách sử dụng trong thực tế bằng việc:
Tìm trong source code của spark

Scala rất thú vị đúng không :smile:

Bình luận


White
{{ comment.user.name }}
Bỏ hay Hay
{{comment.like_count}}
Male avatar
{{ comment_error }}
Hủy
   

Hiển thị thử

Chỉnh sửa

White

huydx

118 bài viết.
1051 người follow
Kipalog
{{userFollowed ? 'Following' : 'Follow'}}
Cùng một tác giả
White
164 15
Introduction (Link) là một cuộc thi ở Nhật, và cũng chỉ có riêng ở Nhật. Đây là một cuộc thi khá đặc trưng bởi sự thú vị của cách thi của nó, những...
huydx viết 2 năm trước
164 15
White
149 15
Một ngày đẹp trời, bạn quyết định viết một dịch vụ web dự định sẽ làm thay đổi cả thế giới. Dịch vụ của bạn sẽ kết nối tất cả các thiết bị di động ...
huydx viết 2 tháng trước
149 15
White
133 15
Happy programmer là gì nhỉ, chắc ai đọc xong title của bài post này cũng không hiểu ý mình định nói đến là gì :D. Đầu tiên với cá nhân mình thì hap...
huydx viết hơn 3 năm trước
133 15
Bài viết liên quan
White
10 0
Kí tự Regex cơ bản Về cơ bản thì các sử lý matching của scala.util.matching.Regex sẽ được "phó thác" (delegate) cho java Regex. Bạn có thể tạo một ...
huydx viết hơn 3 năm trước
10 0
White
7 1
Trong scala kí tự _ được dùng với khá nhiều mục đích .. không liên quan đến nhau. Tạm note lại cái đã khi nào có time sẽ quay lại viết cẩn thận sa...
huydx viết hơn 3 năm trước
7 1
White
1 0
(Bài viết hơi khó hiểu, dành cho bạn nào có hứng thú với type programming trong scala với các thư viện như shapeless chẳng hạn) Thông thường với m...
huydx viết hơn 2 năm trước
1 0
{{like_count}}

kipalog

{{ comment_count }}

bình luận

{{liked ? "Đã kipalog" : "Kipalog"}}


White
{{userFollowed ? 'Following' : 'Follow'}}
118 bài viết.
1051 người follow

 Đầu mục bài viết

Vẫn còn nữa! x

Kipalog vẫn còn rất nhiều bài viết hay và chủ đề thú vị chờ bạn khám phá!