Trường hợp với lớp và Regex
Thuộc phần Logic và luồng xử lý trong hành trình Ruby của Coddy. Bài học 38 trên 56.
Bạn đã dùng case với các phạm vi. Câu lệnh này cũng đối chiếu với các lớp và biểu thức chính quy: cả hai đều thông qua toán tử === mà when gọi ngầm.
Dựa vào lớp để rẽ nhánh theo loại giá trị bạn nhận được:
def describe(value)
case value
when Integer then "a whole number"
when Float then "a decimal"
when String then "some text"
else "something else"
end
end
puts describe(42) # một số nguyên
puts describe(3.14) # một số thập phân
puts describe("hi") # một đoạn văn bảnDùng regex để rẽ nhánh dựa trên hình dạng của chuỗi, chẳng hạn như số điện thoại, email hoặc ngày tháng:
def kind_of(text)
case text
when /^\d+$/ then "all digits"
when /@/ then "looks like an email"
when /^[A-Z]/ then "starts with a capital"
else "other"
end
endCách này gọn gàng hơn nhiều so với việc nối các lời gọi is_a? hoặc match? trong if/elsif.
Thử thách
DễĐọc một dòng đầu vào. Dùng câu lệnh case để in ra một trong các nhãn sau, dựa trên hình thức của đầu vào:
- Chỉ gồm các chữ số,
number - Có chứa
@:email - Bắt đầu bằng chữ cái viết hoa,
name - Các trường hợp khác,
unknown
Kiểm tra các quy tắc theo thứ tự đã liệt kê (vì vậy 123 là number, không phải unknown; kevin@coddy.tech là email; Alice là name).
Với đầu vào kevin@coddy.tech, đầu ra là email.
Tự làm thử
input = gets.chomp
# TODO: case input ... when /^\d+$/, /@/, /^[A-Z]/ ... else ... end
Bài học này có một bài trắc nghiệm ngắn. Bắt đầu bài học để trả lời và theo dõi tiến độ.
Tất cả bài học trong Logic và luồng xử lý
1Tìm hiểu sâu về chuỗi
Tổng quan về phương thức chuỗiNội suy chuỗiDuyệt qua chuỗiTách và nối chuỗiÔn tập: Đan chuỗi4Khối lệnh, Proc và lambda
Khối lệnh là gì?do..end và dấu ngoặc nhọnTừ khóa yieldTham số của khối lệnhProc và lambdaÔn tập: bộ lặp tùy chỉnh7Hash, phần 2
Hash.new với giá trị mặc địnhLặp qua HashHash lồng nhauGộp và chuyển đổiÔn tập: Bộ đếm tần suất10Dự án: Hồ sơ học sinh
Tổng quan dự ánThêm học sinh2Phạm vi
Phạm vi là gì?Các phương thức của phạm viPhạm vi trong case / whenÔn tập: luyện tập với phạm vi5Sức mạnh của Enumerable
select và rejectNối chuỗi mapreduce / injectcount, all?, any?, none?group_by và partitionsort_by, min_by, max_byÔn tập: quy trình dữ liệu8Ra quyết định nâng cao
Trường hợp với lớp và Regexwhen với nhiều giá trịToán tử ba ngôiif / unless nội tuyếnÔn tập: bộ phân loại điểmTự luyện tập: Trình biên dịch Ruby online