31.05.2022
Tác giả: Nguyễn Trung Hiếu
Như chúng ta đã biết, case...when
là một trong những cú pháp rất phổ biến khi lập trình với ngôn ngữ Ruby.
Tuy nhiên cách sử dụng cú pháp này rất đa dạng và dễ khiến bạn có thể cảm thấy hoang mang khi chưa nắm được bản chất cách thức hoạt động của nó.
Ở bài viết này, chúng mình sẽ chia sẻ ngắn gọn về bản chất hoạt động của case…when, cũng như các cách ứng dụng để có thể tận dụng cú pháp này theo cách riêng của mình.
1. Các trường hợp sử dụng phổ biến bao gồm:
1.1. Loại đầy đủ
case grade
when 'A'
p 'Good'
when 'B'
p 'Good'
when 'C'
p 'OK'
else
p 'Try harder'
end
1.2. Khuyết giá trị
case
when weather == 'rain'
p 'I love that'
when bank_amount > 99999999999999999999999999999999999
p "I'm rich"
else
p 'Hmmm'
end
1.3. Dạng multiple-value
case grade
when 'A', 'B'
p 'Good'
when 'C'
p 'OK'
else
p 'Try harder'
end
1.4. Các dạng đặc biệt
Bắt đầu những dạng lạ mắt hơn nhé!
case 'hello'
when /ello/
p 'Oh hi'
when /\\d*/
p 'I am sorry'
end
object = Staff.new ....
case object
when Customer
p 'Hello customer'
when Staff
p 'Hello staff'
else
p 'Hello'
end
case 4
when 1..5
p 'Low'
when 6..10
p 'Good'
else
p 'Hmmm...'
end
2. Bản chất về cách hoạt động
Nếu nhìn các ví dụ mục 1.4 bạn sẽ thấy case...when
không dùng phép so sánh bình thường.
Lý giải cho điều này là vì case…when sẽ sử dụng case-equality (Sử dụng bởi toán tử ===).
Đơn giản hơn bạn có thể hình dung ví dụ đầu tiên sẽ được hiểu thành:
case grade
if 'A' === grade
p 'Good'
elsif 'B' === grade
p 'Good'
elsif 'C' === grade
p 'OK'
else
p 'Try harder'
end
case-equality mang ý nghĩa gì?
Thực tế tùy vào loại object thì sẽ có cách implement khác nhau, tuy nhiên phần lớn chúng sẽ được implement theo ý nghĩa như sau:
Ví dụ a === b
có thể hiểu một cách đơn giản là “Coi như a là một set, thì b liệu có phải là 1 member trong đó không”.
Cụ thể:
(1..5) === 2 #true
(1..5) === 3 #true
(1..5) === 6 #false
Integer === 100 #true
Integer === 'hello' #false
/ello/ === 'hello' #true
Khi bạn đã hiểu được case...when
hoạt động bằng cách sử dụng ===
để kiểm tra các điều kiện, nó sẽ làm sáng tỏ hơn những ví dụ đặc biệt chúng mình đã đề cập ở trên.
3. Ứng dụng thực tế
Và với bất kỳ một cú pháp nào, để thực sự nắm chắc cách thức hoạt động của nó, chúng ta cần ứng dụng nó vào thực tế.
Có rất nhiều cách khác nhau để bạn ứng dụng vào thực tế, đặc biệt là những trường hợp mà chúng ta cần kiểm tra điều kiện mà phần tử thỏa mãn một tập các giá trị khác nhau.
Trong ví dụ dưới đây, chúng mình sẽ lấy một ví dụ về kiểm tra một HTTP response là thành công hay không dựa vào status code.
class SuccessRequest
def self.=== response
200 <= response.status < 300
end
end
case http_response
when SuccessRequest
p 'Nice'
when ...
...