Tản mạn một chút về case ... when với ngôn ngữ lập trình Ruby

we are vareal

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 ...
...

Hi vọng rằng bài chia sẻ về cú pháp  sẽ giúp ích được các bạn trong quá trình tự học, cũng như áp dụng thực tế trong công việc hàng ngày.

Nếu bạn có bất kỳ câu hỏi hoặc thắc mắc nào, đừng ngần ngại hãy để lại comment trong phần bình luận.

Và hãy tiếp tục đón chờ các bài chia sẻ tiếp theo của chúng mình nhé!

 

Bình luận

Your email address will not be published. Required fields are marked *

Liên hệ

0982 894 859

contact@vareal.vn

Địa chỉ

Tầng 14, tòa Richy, tổ 44, phường Yên Hòa, Cầu Giấy, Hà Nội

© 2021 Vareal Vietnam Co., Ltd. All rights reserved.