Trong bài viết này chúng ta sẽ cùng nhau tìm hiểu về kiểu dữ liệu trong scala như là literal, giá trị Escape, typecasting và các ví dụ.
Giới thiệu
Giống như các ngôn ngữ khác, scala có một type cho mọi giá trị. Chúng ta sẽ được biết type này khi trình bày về các biến và giá trị. Ngay cả các hàm cũng có một giá trị. Nào để hiểu rõ hơn, hãy cùng xem hệ thống cấp bậc của kiểu dữ liệu trong Scala
Ở đây chúng ta có thể thấy rằng, supertype cho tất cả các type là Any
. Nó có các phương thức thông dụng như là equas, hashCode và toString.
Lớp Any
cha có 2 subclass là: AnyVal
and AnyRef
AnyVal đại diện cho các kiểu giá trị. 9 loại giá trị được định nghĩa trước và không bị null là: Double, Float, Long, Int, Short, Byte, Char, Unit, and Boolean. Chúng ta sẽ có những miêu tả ngắn gọn về những kiểu dữ liệu này.
AnyRef đại diện cho các kiểu tham chiếu. Kiểu được định nghĩa bởi user là subtype của nó. Và trong bối cảnh của JRE, AnyRef giống java.lang.object.
Các kiểu dữ liệu
Byte
Kích thước: 8-bit
Signed value (cho phép cả số dương và số âm)
Phạm vi: -128 đến 127
Short
Kích thước: 16-bit
Signed value (cho phép cả số dương và số âm)
Phạm vi: -32768 đến 32767
Int
Kích thước: 32-bit
Signed value (cho phép cả số dương và số âm)
Phạm vi: – 2147483648 đến 2147483647
Long
Kích thước: 64-bit
Signed value (cho phép cả số dương và số âm)
Phạm vi: -9223372036854775808 đến 9223372036854775807
Float
Kích thước: 32-bit
Nó theo chuẩn IEEE 754, và là một single-precision float
Double
Kích thước: 32-bit
Nó theo chuẩn IEEE 754, và là một double-precision float
Char
Kích thước: 16-bit
nó là một unsigned Unicode character
Phạm vi: U+0000 đến U+FFFF
String
String là một chuỗi liên tục của các Char.
Boolean
Giá trị Boolean là true hoặc false
Unit
Chỉ có một instance của Unit là ()
. Nó không mang thông tin ý nghĩa. Và vì tất cả các hàm đều phải trả về một các gì đó, nên thỉnh thoảng, chúng ta trả về Unit
Null
Nó được tham chiếu đến các tham chiếu trống và null. Nó là subtype của tất cả tất cả các kiểu tham chiếu. Điều này giúp nó trở thành subtype của tất cả các subtype của AnyRef. Null giúp cho khả năng tương thích với các ngôn ngữ JVM khác, và chúng ta hầu như không bao giờ sử dụng nó.
Nothing
Nothing là subtype của tất cả các subtype khác. Nó không có giá trị gì cả
Bởi vì nó là subtype của tất cả các subtype khác nên chúng ta có thể gọi nó là bottom type. Trên thực tế không có giá trị nào là thuộc kiểu Nothing. Nên chúng ta sẽ sử dụng nó như thế nào? Chúng ta có thể sử dụng nó để báo hiệu non-termination như là đưa ra một Exception, thoát chương trình hoặc vòng lặp vô hạn.
Any
Nó là supertype của tất cả các kiểu khác. Điều này nghĩa ra bất kỳ object nào đều thuộc kiểu Any
AnyVal
Đại diện cho kiểu giá trị
AnyRef
Đại diện cho kiểu tham chiếu
Bởi vì tất cả các kiểu dữ liệu Scala là các object và không phải là các object nguyên thuỷ, có thể gọi các phương thức trên các object.
Literal
Integral
Mặc định chúng thường là Int. Khi chúng ta sử dụng các hậu tố như là l hoặc L, thì những giá trị này là kiểu Long
Sau đây là một vài Integral Literal hợp lệ.
07 7 111 0xFFFFFFFF 0798L
Floating-Point
Chúng ta đã được biết các số Floating-Point như là 7.0 và 7.7 thay vì 7. Khi chúng ta sử dụng các hậu tố như là f hoặc F, thì những giá trị này là kiều Float. Ngoài ra chúng ta thể là kiểu Double.
Sau đây là một vài Floating-Point Literal hợp lệ.
0.0 1e70f 3.24179f 1.0e100 .1
Boolean
Chúng ta có 2 kiểu Boolean Literal là true hoặc false.
Symbol
Scala có Symbol case class
package scala final case class Symbol private (name: String) { override def toString: String = "'" + name }
Nên một ký tự x là tương đương với scala.Symbol(“x”)
Character
Một character đơn được đặt trong nháy đơn. Một Character có thể in ra các ký tự Unicode và có thể được mô tả bởi một escape sequence (ký tự đặc biệt như là \n, \t).
Sau đây là một vài Character Literal hợp lệ.
‘a’ ‘\n’ ‘\u0042’ ‘\t’
String
Là một chuỗi các Character được đặt trong dấu nhau kép.
Sau đây là một vài String Literal hợp lệ.
“Hannah\nMontana” “And then she said, \”Be here now is a dog’s purpose\””
Multi-line String
Giống như Python chúng ta có thể dùng 3 dấu nháy kép để giúp chúng ta biểu diễn một String trong nhiều dòng.
Sau đây là một vài Multi-line String hợp lệ.
“””The first line The second line\n The fourth line”””
Các giá trị Null
Giá trị Null trong Scala có kiểu là Scala.Null. Điều này giúp nó tương thích với từng kiểu tham chiếu. Nhưng những gì nó thực sự biểu thị là một giá trị tham chiếu đang tham chiếu đến một object “Null” đặc biệt
Các giá trị Escape
Giá trị Escape là dấu gạch chéo ngược với một ký tự bỏ qua mà ký tự đó sẽ được dùng cho một chức năng nhất định. Chúng ta có thể sử dụng ký tự này trong Character và string literal. Chúng ta có các giá trị escape sau đây trong Scala.
Ký tự escape | Unicode | Miêu tả |
\b | \u0008 | Backspace BS |
\t | \u0009 | Tab ngang HT |
\n | \u000a | Xuống dòng |
\f | \u000c | Formfeed FF |
\r | \u000d | Carriage Return CR |
\” | \u0022 | Ngoặc kép “ |
\” | \u0027 | Ngoặc đơn ‘ |
\\ | \u005c | Gạch chéo \ |
Chúng ta cũng có thể biểu diễn các ký tự Unicode trong khoảng từ 0 đến 255 với octal escape (sử dụng gạch chéo ngược \). Ví dụ như sau
scala> println("Hey, how \b are you?\n\tI've been\r...\"waiting\"")
Kết quả
Hey, how are you? …”waiting” been
Type Casting
Chúng ta có thể chuyển đổi một kiểu thành kiểu khác.
Ví dụ
scala> val a:Int=7 a: Int = 7 scala> val b:Float=a b: Float = 7.0 Hmm, let’s take another example to make it clear. scala> val c:Char='a' c: Char = a scala> val d:Int=c d: Int = 97 scala> val e:Char='A' e: Char = A scala> val f:Float=e f: Float = 65.0