Xin chào, Thế giới!
Bây giờ bạn đã cài đặt Rust, đã đến lúc viết chương trình Rust đầu tiên của bạn.
Theo truyền thống khi học một ngôn ngữ mới, chúng ta thường viết một chương
trình nhỏ in ra dòng chữ Hello, world!
lên màn hình, vì vậy chúng ta sẽ làm
điều tương tự ở đây!
Lưu ý: Cuốn sách này giả định bạn đã có kiến thức cơ bản về dòng lệnh. Rust không đưa ra yêu cầu cụ thể nào về công cụ soạn thảo hoặc nơi lưu trữ mã của bạn, vì vậy nếu bạn thích sử dụng môi trường phát triển tích hợp (IDE) thay vì dòng lệnh, hãy tự nhiên sử dụng IDE yêu thích của bạn. Nhiều IDE hiện nay có một số mức độ hỗ trợ Rust; hãy kiểm tra tài liệu của IDE để biết chi tiết. Đội ngũ Rust đã tập trung vào việc hỗ trợ IDE thông qua
rust-analyzer
. Xem Phụ lục D để biết thêm chi tiết.
Tạo thư mục dự án
Bạn sẽ bắt đầu bằng việc tạo một thư mục để lưu trữ mã Rust của bạn. Đối với Rust, nơi lưu trữ mã của bạn không quan trọng, nhưng đối với các bài tập và dự án trong sách này, chúng tôi gợi ý tạo một thư mục projects trong thư mục home của bạn và lưu giữ tất cả các dự án của bạn ở đó.
Mở một terminal và nhập các lệnh sau để tạo một thư mục projects và một thư mục cho dự án “Hello, world!” trong thư mục projects.
Đối với Linux, macOS và PowerShell trên Windows, nhập:
$ mkdir ~/projects
$ cd ~/projects
$ mkdir hello_world
$ cd hello_world
Đối với Windows CMD, nhập:
> mkdir "%USERPROFILE%\projects"
> cd /d "%USERPROFILE%\projects"
> mkdir hello_world
> cd hello_world
Viết và chạy một chương trình Rust
Tiếp theo, tạo một tệp nguồn mới và gọi nó là main.rs. Các tệp Rust luôn kết thúc bằng phần mở rộng .rs. Nếu bạn sử dụng nhiều hơn một từ trong tên tệp của mình, quy ước là sử dụng dấu gạch dưới để tách chúng. Ví dụ, sử dụng hello_world.rs thay vì helloworld.rs.
Bây giờ mở tệp main.rs mà bạn vừa tạo và nhập mã trong Listing 1-1.
fn main() { println!("Hello, world!"); }
Lưu tệp và quay lại cửa sổ terminal của bạn trong thư mục ~/projects/hello_world. Trên Linux hoặc macOS, nhập các lệnh sau để biên dịch và chạy tệp:
$ rustc main.rs
$ ./main
Hello, world!
Trên Windows, nhập lệnh .\main
thay vì ./main
:
> rustc main.rs
> .\main
Hello, world!
Bất kể hệ điều hành của bạn là gì, chuỗi Hello, world!
sẽ được in ra terminal.
Nếu bạn không thấy đầu ra này, hãy tham khảo lại phần “Khắc phục sự
cố” của phần Cài đặt để biết cách nhận trợ
giúp.
Nếu Hello, world!
đã được in ra, chúc mừng bạn! Bạn đã chính thức viết một
chương trình Rust. Điều đó làm cho bạn trở thành một lập trình viên Rust — chào
mừng!
Cấu trúc của một chương trình Rust
Hãy xem xét chi tiết chương trình “Hello, world!” này. Đây là mảnh ghép đầu tiên:
fn main() { }
Những dòng này định nghĩa một hàm tên là main
. Hàm main
là một hàm đặc biệt:
nó luôn là mã đầu tiên chạy trong mọi chương trình Rust thực thi. Ở đây, dòng
đầu tiên khai báo một hàm tên là main
không có tham số và không trả về gì. Nếu
có tham số, chúng sẽ nằm trong dấu ngoặc đơn ()
.
Thân hàm được bao bọc trong {}
. Rust yêu cầu dấu ngoặc nhọn xung quanh tất cả
thân hàm. Đó là phong cách tốt để đặt dấu ngoặc nhọn mở trên cùng một dòng với
khai báo hàm, thêm một khoảng trắng ở giữa.
Lưu ý: Nếu bạn muốn tuân theo một phong cách chuẩn trong các dự án Rust, bạn có thể sử dụng công cụ định dạng tự động gọi là
rustfmt
để định dạng mã của bạn theo một phong cách cụ thể (đọc thêm vềrustfmt
trong Phụ lục D). Đội ngũ phát triển Rust đã bao gồm công cụ này trong bản phân phối Rust tiêu chuẩn, giống nhưrustc
, vì vậy nó có thể đã được cài đặt trên máy tính của bạn!
Thân hàm main
chứa mã sau:
#![allow(unused)] fn main() { println!("Hello, world!"); }
Dòng này thực hiện tất cả công việc trong chương trình nhỏ này: nó in văn bản lên màn hình. Có ba chi tiết quan trọng cần chú ý ở đây.
Đầu tiên, println!
là một macro của Rust. Thay vì nếu nó được gọi là một hàm,
nó sẽ được nhập là println
(không có !
). Các macro của Rust là một cách để
viết mã tạo ra mã để mở rộng cú pháp Rust, và chúng ta sẽ thảo luận chi tiết hơn
về chúng trong Chương 20. Hiện tại, bạn chỉ cần
biết rằng việc sử dụng !
có nghĩa là bạn đang gọi một macro thay vì một hàm
bình thường và các macro không luôn tuân theo các quy tắc giống như các hàm.
Thứ hai, bạn thấy chuỗi "Hello, world!"
. Chúng ta truyền chuỗi này làm đối số
cho println!
, và chuỗi được in ra màn hình.
Thứ ba, chúng ta kết thúc dòng bằng dấu chấm phẩy (;
), điều này cho biết rằng
biểu thức này đã kết thúc và biểu thức tiếp theo đã sẵn sàng để bắt đầu. Hầu hết
các dòng mã Rust kết thúc bằng dấu chấm phẩy.
Biên dịch và chạy là các bước riêng biệt
Bạn vừa chạy một chương trình mới tạo, vì vậy hãy xem xét từng bước trong quá trình.
Trước khi chạy một chương trình Rust, bạn phải biên dịch nó bằng trình biên dịch
Rust bằng cách nhập lệnh rustc
và truyền cho nó tên tệp nguồn của bạn, như thế
này:
$ rustc main.rs
Nếu bạn có nền tảng C hoặc C++, bạn sẽ nhận thấy điều này tương tự như gcc
hoặc clang
. Sau khi biên dịch thành công, Rust xuất ra một tệp thực thi nhị
phân.
Trên Linux, macOS và PowerShell trên Windows, bạn có thể thấy tệp thực thi bằng
cách nhập lệnh ls
trong shell của bạn:
$ ls
main main.rs
Trên Linux và macOS, bạn sẽ thấy hai tệp. Với PowerShell trên Windows, bạn sẽ thấy ba tệp giống như bạn sẽ thấy khi sử dụng CMD. Với CMD trên Windows, bạn sẽ nhập lệnh sau:
> dir /B %= tùy chọn /B chỉ hiển thị tên tệp =%
main.exe
main.pdb
main.rs
Điều này hiển thị tệp mã nguồn với phần mở rộng .rs, tệp thực thi (main.exe trên Windows, nhưng main trên tất cả các nền tảng khác), và, khi sử dụng Windows, một tệp chứa thông tin gỡ lỗi với phần mở rộng .pdb. Từ đây, bạn chạy tệp main hoặc main.exe, như sau:
$ ./main # hoặc .\main trên Windows
Nếu main.rs của bạn là chương trình “Hello, world!” của bạn, dòng này sẽ in
Hello, world!
lên terminal của bạn.
Nếu bạn quen thuộc hơn với một ngôn ngữ động, chẳng hạn như Ruby, Python hoặc JavaScript, bạn có thể không quen với việc biên dịch và chạy một chương trình như các bước riêng biệt. Rust là một ngôn ngữ biên dịch trước (ahead-of-time compiled), có nghĩa là bạn có thể biên dịch một chương trình và đưa tệp thực thi cho người khác, và họ có thể chạy nó ngay cả khi không cài đặt Rust. Nếu bạn đưa cho ai đó một tệp .rb, .py hoặc .js, họ cần phải có một triển khai Ruby, Python hoặc JavaScript tương ứng được cài đặt. Nhưng trong những ngôn ngữ đó, bạn chỉ cần một lệnh để biên dịch và chạy chương trình của bạn. Mọi thứ đều là sự đánh đổi trong thiết kế ngôn ngữ.
Chỉ biên dịch với rustc
là đủ cho các chương trình đơn giản, nhưng khi dự án
của bạn phát triển, bạn sẽ muốn quản lý tất cả các tùy chọn và làm cho việc chia
sẻ mã của bạn trở nên dễ dàng. Tiếp theo, chúng tôi sẽ giới thiệu cho bạn công
cụ Cargo, công cụ sẽ giúp bạn viết các chương trình Rust thực tế.