Scala – Kiểu dữ liệu

scala

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

 

You May Also Like

About the Author: Nguyen Dinh Thuc

Leave a Reply

Your email address will not be published.