Từ khóa public
Thuộc phần Lập trình hướng đối tượng trong hành trình Rust của Coddy. Bài học 9 trên 61.
Trong bài học trước, bạn đã học cách sắp xếp code vào các tệp module riêng biệt. Tuy nhiên, nếu bạn thử dùng struct Player từ main.rs, bạn sẽ gặp lỗi biên dịch. Đó là vì mọi thứ trong module Rust đều mặc định là riêng tư.
Để có thể truy cập các mục từ bên ngoài mô-đun, bạn phải đánh dấu rõ ràng chúng bằng từ khóa pub:
// player.rs
pub struct Player {
pub name: String,
pub score: u32,
}
impl Player {
pub fn new(name: String) -> Player {
Player { name, score: 0 }
}
}
Hãy chú ý rằng pub xuất hiện ở nhiều chỗ: trên chính struct, trên từng trường và trên phương thức. Mỗi mục cần có khai báo phạm vi truy cập riêng.
Nếu không có pub trên struct, các tệp khác thậm chí không thể gọi tên kiểu này. Nếu các trường không có pub, chúng không thể truy cập trực tiếp vào dữ liệu. Nếu các phương thức không có pub, chúng không thể gọi các phương thức đó.
Bây giờ trong main.rs, bạn có thể dùng các mục công khai của module:
// main.rs
mod player;
use player::Player;
fn main() {
let p = Player::new(String::from("Alice"));
println!("{}", p.name);
}
Câu lệnh use đưa Player vào phạm vi để bạn không phải viết player::Player mỗi lần. Cách tiếp cận mặc định bảo vệ quyền riêng tư này là có chủ ý. Nó khuyến khích bạn cân nhắc kỹ phần nào trong code nên được công khai với thế giới bên ngoài.
Thử thách
DễHãy tạo một danh mục sản phẩm đơn giản bằng cách sắp xếp code vào hai tệp và đặt đúng các mục ở chế độ công khai để chương trình chính có thể sử dụng chúng.
Bạn sẽ tạo hai tệp:
product.rs: Định nghĩa một structProductcó hai trường:name(String) vàprice(f64). Thêm một hàm liên kết có tênnew, nhận tên và giá rồi trả về mộtProductmới. Hãy nhớ đặt struct, các trường và phương thức ở chế độ công khai để có thể truy cập chúng từ bên ngoài module.main.rs: Khai báo module product, đưaProductvào phạm vi bằng câu lệnhuse, sau đó tạo một sản phẩm và in thông tin chi tiết của sản phẩm.
Hãy cân nhắc kỹ nơi cần dùng từ khóa pub: bản thân struct cần hiển thị, các trường cần có thể đọc được và phương thức khởi tạo cần có thể được gọi từ main.rs.
Đầu ra phải theo đúng định dạng này:
Product: {name}, Price: ${price}Ví dụ, nếu bạn tạo một sản phẩm có tên "Laptop" và giá 999.99, đầu ra sẽ là:
Product: Laptop, Price: $999.99Bạn sẽ nhận hai đầu vào: tên sản phẩm và giá.
Tự làm thử
// Khai báo module product
mod product;
// TODO: Đưa Product vào phạm vi (scope) bằng câu lệnh use
fn main() {
// Đọc đầu vào (input)
let mut name = String::new();
std::io::stdin().read_line(&mut name).expect("Failed to read line");
let name = name.trim().to_string();
let mut price_input = String::new();
std::io::stdin().read_line(&mut price_input).expect("Failed to read line");
let price: f64 = price_input.trim().parse().expect("Failed to parse price");
// TODO: Tạo Product mới bằng hàm (function) Product::new
// TODO: In ra (print) thông tin sản phẩm theo định dạng:
// Product: {name}, Price: ${price}
}
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 Lập trình hướng đối tượng
1Phương thức và hành vi
Nhập môn khối triển khaiTham số selfPhương thức có thể thay đổiHàm liên kếtNhiều khối triển khaiNối chuỗi phương thứcÔn tập: thao tác với hình chữ nhật4Dự án: Thú cưng ảo
Định nghĩa thú cưngCho thú cưng ăn7Các trait tiêu chuẩn
Trait DebugTrait DisplayClone và CopyCác trait so sánh bằngÔn tập: Điểm có thể in ra2Tính đóng gói và module
Kiến thức cơ bản về moduleTừ khóa publicTrường riêng tưHàm lấy giá trịHàm thiết lập giá trịÔn tập: tủ khóa an toàn5Kiểu tổng quát
Cấu trúc tổng quátPhương thức tổng quátNhiều kiểu tổng quátHàm tổng quátÔn tập: điểm tọa độTự luyện tập: Trình biên dịch Rust online