Kotlin range
1. Giới thiệu
Biểu thức range(phạm vi) .. là một dạng của function rangeTo và sử dụng với toán tử in hoặc !in. Range được định nghĩa cho bất kỳ kiểu dữ liệu có thể so sánh nào. Tuy nhiên, nó được tối ưu với kiểu dữ liệu kiểu nguyên:
Toàn bộ kiểu phạm vi (IntRange , LongRange , CharRange) có thể được dùng để duyệt bằng cách sử dụng vòng lặp for:
Để duyệt ngược, ta sử dụng function downTo() được định nghĩa trong thư viện chuẩn
Java
Kotlin
Để duyệt với bước nhảy k phải là 1, ta sử dụng function step()
Java
Kotlin
Để duyệt và ngoại trừ phần tử cuối cùng, ta sử dụng function until
Java
Kotlin
2. Cách hoạt động
Ranges implement một interface trong thư viện: ClosedRange<T>
ClosedRange<T> biểu thị một khoảng kín với các kiểu dữ liệu có thể so sánh được. Nó có 2 endpoint: start và endInclusive, cái mà được bao gồm trong khoảng đó. Function sử dụng chính là contains, thường được sử dụng dưới dạng toán tử in hoặc !in.
Progression với các dữ liệu kiểu nguyên (IntProgression , LongProgression , CharProgression) biểu thị một tiến trình số học. Progression được định nghĩa bởi phần tử first, phần tử last và một step khác 0. Phần tử đầu tiên là first, phần tử tiếp theo là first + step.
Progression là lớp con của Iterable<N>, với N là kiểu Int , Long , Char. Bởi vậy chúng có thể được dùng với vòng lặp for và các function như map , filter, ... Việc duyệt qua Progressiontương tự như vòng lặp for có chỉ số trong Java hoặc JavaScript:
Với kiểu dữ liệu kiểu nguyên, toán tử .. tạo một đối tượng cả ClosedRange<T> và *Progression. VD: IntRange implement ClosedRange<Int> và kế thừa IntProgression, do đó các toán tử được định nghĩa cho IntProgression cũng có thể hiệu lực với IntRange. Kết quả của các function downTo() và step() luôn luôn là một *Progression.
Progression được tạo ra bởi function fromClosedRange được định nghĩa bên trong companion object.
Phần tử last của progression được tính toán để tìm được giá trị lớn nhất không lớn hơn giá trị end với step >0 hoặc không nhỏ hơn giá trị end với step < 0 : (last - first) % step == 0
3. Các function hữu ích
rangeTo()
Toán tử rangeTo() với kiểu dữ liệu nguyên đơn giản sẽ gọi hàm tạo của các class *Range
Các số thực (Double , Float) không định nghĩa các toán tử rangeTo() mà được cung cấp bởi thư viện chuẩn cho kiểu Comparable
Bởi vậy, không thể duyệt với các số thực.
downTo()
Extension function downTo() được định nghĩa với kiểu số nguyên
reversed()
Extension function reversed() được định nghĩa cho các lớp *Progression và chúng trả về các progression ngược:
step()
Các extension function step() được định nghĩa cho các lớp *Progression, tất cả chúng trả về một progression với giá trị step được truyền vào. Giá trị của step cần là một số dương để function không bao giờ có thể thay đổi được hướng duyệt
Lưu ý rằng giá trị last của progression trả về có thể khác so với giá trị last của progression ban đầu để giữ lại sự bất biến: