✅ Checkpoint: Rust core cho fintech

By Everwise Intern

Quiz

  1. Trong Rust, tại một thời điểm một giá trị có thể có bao nhiêu owner?
    • Hai owner: một cho đọc và một cho ghi.
    • Không giới hạn, compiler chỉ kiểm tra lúc runtime.
    • Nhiều owner, miễn là tất cả đều là immutable.
    • Đúng một owner; khi owner ra khỏi scope thì value bị drop.
  2. Vì sao đoạn code sau không compile? fn transfer(from: &mut Account, to: &mut Account, amount: i64) { /* ... */ } transfer(&mut a, &mut a, 100);
    • Vì Account không derive PartialEq nên không so sánh được hai tham số.
    • Vì có hai mutable borrow độc quyền trên cùng một giá trị, lỗi E0499.
    • Vì hàm transfer thiếu lifetime annotation.
    • Vì i64 không implement Copy nên bị move hai lần.
  3. Bạn đang giữ một immutable borrow tới field acc.id rồi gọi acc.deposit(100_000). Cách sửa nào được bài học khuyến nghị là đúng nhất về ngữ nghĩa?
    • Thêm .clone() cho toàn bộ Account trước khi deposit.
    • Thêm lifetime 'static cho biến id.
    • Đảo thứ tự: dùng id (ví dụ println!) trước rồi mới deposit.
    • Đổi deposit thành nhận &self để không cần mutable borrow.
  4. Khi nào bắt buộc phải viết lifetime annotation?
    • Bất cứ khi nào compiler gợi ý "consider using 'static".
    • Mọi function nhận tham số &T, kể cả khi chỉ có một input reference.
    • Mọi struct có field kiểu String hoặc i64.
    • Khi struct hoặc enum chứa reference, hoặc khi function có nhiều input reference và trả về reference.
  5. Theo bài học, domain model tài chính nên được thiết kế mặc định như thế nào?
    • Dùng owned type (String, AccountId, Money); reference chỉ dành cho view đọc tạm trong một scope.
    • Dùng self-referential struct để entity vừa sở hữu vừa tham chiếu dữ liệu của chính nó.
    • Dùng 'static cho mọi field để khỏi phải nghĩ về lifetime.
    • Dùng reference khắp nơi để tránh clone, kể cả trong entity lưu DB.
  6. Vì sao nên dùng Box<dyn FeeRule> trong FeeSchedule thay vì generic T: FeeRule?
    • Vì Box<dyn Trait> tránh được orphan rule.
    • Vì generic không cho phép gọi method của trait.
    • Vì dyn Trait nhanh hơn static dispatch nhờ inline.
    • Vì tập luật phí được cấu hình lúc chạy và có nhiều kiểu khác nhau, generic chỉ ứng với một kiểu cụ thể mỗi lần gọi.
  7. Trong trait Validatable, khai báo type Error; là một ____: mỗi impl chọn đúng một kiểu lỗi và compiler ép nhất quán.
  8. Quy tắc ngón tay khi xử lý tiền: nếu hàm không giữ lại dữ liệu sau khi return thì hãy ____; nếu nó lưu vào struct khác hoặc đẩy sang task khác thì hãy move.
  9. Rust chặn việc impl trait ngoại cho type ngoại bằng quy tắc gọi là ____ rule. Giải pháp thường dùng là newtype, ví dụ struct Vnd(Money).
  10. Hãy tự đánh giá: bạn có đủ tự tin đọc và sửa một hàm tính số dư trong codebase tài chính mà không lạm dụng clone hay panic không? Viết ra một đoạn code nhỏ (hàm deposit hoặc transfer) và tự kiểm theo rubric.

Sign in to submit answers.