Toán Tử Ba Ngõ Trong Ruby Là Gì?
Toán tử ba ngõ gồm ba phần, đó là nguồn gốc của từ "ternary". Các phần này bao gồm một câu lệnh điều kiện & hai kết quả có thể.
Nói cách khác, ternary cho bạn cách viết biểu thức if/else gọn gàng chỉ trong một dòng code.
Ví dụ:
if apple_stock > 1 :eat_apple else :buy_apple end
Có thể trở thành:
apple_stock > 1 ? :eat_apple : :buy_apple
Nhờ toán tử ba ngõ!
Câu hỏi... Cái này hoạt động như thế nào chính xác & cú pháp đúng là gì? Hãy cùng tìm hiểu.
Khuôn Mẫu Viết Ternary Của Riêng Bạn
Nếu chúng ta tổng quát cú pháp cho toán tử ba ngõ, bạn nhận được một khuôn mẫu "điền vào chỗ trống".
Trông như sau:
condition ? true : false
Phần đầu tiên của ternary là điều kiện, tức điều kiện bạn muốn kiểm tra xem đúng hay sai.
Sau đó, chúng ta có dấu hỏi (?). Đó là một phần của cú pháp! Đó là cách Ruby biết bạn đang viết toán tử ba ngõ.
Tiếp theo: Chúng ta có code bạn muốn chạy nếu điều kiện ra true, kết quả đầu tiên có thể.
Sau đó là dấu hai chấm (:), một yếu tố cú pháp khác.
Cuối cùng, chúng ta có code bạn muốn chạy nếu điều kiện là false, kết quả thứ hai có thể.
Ví dụ:
"chocolate".size > 4 ? "More than four characters" : "Less than four characters"
- Điều kiện =>
"chocolate".size > 4 - Nếu True =>
"More than four characters" - Else =>
"Less than four characters"
Ba phần này là thành phần của mọi biểu thức ternary. Đừng quên ? giữa điều kiện & kết quả, ngay cả khi tên phương thức kết thúc bằng dấu hỏi.
Ví dụ:
"".empty? ? "Yes" : "No"
Đây là điều dễ bỏ qua, hãy chú ý khi viết loại code này.
Toán Tử Ba Ngõ Phức Tạp
Toán tử ba ngõ có thể dùng sai. Nó trở thành ý tưởng tồi khi bạn muốn làm điều phức tạp với nó.
Ví dụ: Bạn có thể gán kết quả biểu thức ternary cho biến.
a = 10 > 5 ? "yes" : "no"
Điều này ổn. Nhưng bắt đầu phức tạp khi kết quả có thể có khoảng trắng.
Ví dụ:
10 > 5 ? (puts "yes") : (puts "no")
Chúng ta phải dùng dấu ngoặc ở đây. Tại sao? Vì nếu không, bạn nhận được SyntaxError.
Những dấu ngoặc này làm code hơi khó hiểu, làm giảm lợi ích độ dễ đọc & phong cách của ternary. Hãy nhớ điều này khi quyết định dùng ternary hay không.
Toán Tử Ba Ngõ & Độ Ưu Tiên Toán Tử
Vấn đề khác xuất hiện với biểu thức ternary là độ ưu tiên toán tử.
Ví dụ:
[].tap { |a| a << "ccccc".size == 0 ? "empty" : "not empty" } # [5]
Tôi mong đợi "empty" hoặc "not empty", hai kết quả có thể cho ternary, nhưng nhận được 5.
Đang xảy ra gì? Ruby và hầu hết ngôn ngữ xử lý biểu thức với các mức ưu tiên khác nhau. Giống như nhân chia ưu tiên hơn cộng trừ trong số học, trong Ruby, lời gọi phương thức (<< & size) ưu tiên hơn toán tử ba ngõ, giải thích hành vi trên.
Bạn có thể giải quyết bằng dấu ngoặc:
[].tap { |a| a << ("bbbbb".size == 0 ? "empty" : "not empty") } # ["not empty"]
Điều khác cần nhớ khi viết ternary!
Video Hướng Dẫn
Tóm Tắt
Bạn đã học về toán tử điều kiện ba ngõ trong Ruby, cho phép viết câu lệnh điều kiện gọn gàng, có thể làm code dễ đọc hơn hoặc khó đọc hơn tùy tình huống.
Bây giờ đến lượt bạn! Hãy thực hành để cài đặt kiến thức này vào não bộ. Cảm ơn bạn đã đọc 🙂