Hello, World!

Bây giờ bạn đã cài đặt Rust, hãy viết chương trình Rust đầu tiên của bạn.Truyền thống khi học một ngôn ngữ mới là viết một chương trình nhỏ in dòng chữ Hello, world! ra màn hình, vì vậy chúng ta cũng sẽ làm như vậy ở đây!

Ghi chú: Cuốn sách này giả định rằng bạn đã biết cơ bản với command line. Rust không đưa ra yêu cầu cụ thể về chỉnh sửa hoặc công cụ của bạn hoặc nơi bạn code, 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ì command line, hãy sử dụng IDE yêu thích của bạn.

Tạo thư mục project

Bạn sẽ bắt đầu bằng cách tạo một thư mục để lưu trữ mã Rust của mình. Rust không quan trọng bạn lưu code ở đâu, nhưng đối với các bài tập và dự án trong cuốn sách này, chúng tôi khuyên bạn nên tạo một thư mục projects trong thư mục chính và 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 thư mục projects và thư mục cho project “Hello, world!” nằm trong thư mục projects.

Cho Linux, macOS, và PowerShell trên Windows, nhập vào:

$ mkdir ~/projects
$ cd ~/projects
$ mkdir hello_world
$ cd hello_world

Cho Windows CMD, nhập vào:

> 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 đang sử dụng nhiều từ trong tên tệp của mình, hãy sử dụng dấu gạch dưới để phân tách chúng. Ví dụ: sử dụng hello_world.rs thay vì helloworld.rs.

Bây giờ, hãy mở tệp main.rs bạn vừa tạo và nhập mã trong Listing 1-1.

Filename: main.rs

fn main() {
    println!("Hello, world!");
}

Listing 1-1: Một chương trình in Hello, world!

Lưu tệp và quay lại cửa sổ terminal của bạn. Trên Linux hoặc macOS, hãy 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.exe thay vì ./main:

> rustc main.rs
> .\main.exe
Hello, world!

Bất kể hệ điều hành của bạn là gì, chuỗi Hello, world! sẽ được in ra trên terminal. Nếu bạn không thấy output này, hãy quay lại mục “Troubleshooting” của phần Installation để biết cách nhận trợ giúp.

Nếu dòng chữ Hello, world! được in, xin chúc mừng! Bạn đã chính thức viết một chương trình Rust. Điều đó khiến bạn trở thành một lập trình viên Rust — xin chào mừng!

Cấu trúc của một chương trình Rust

Hãy cùng xem xét chi tiết những gì vừa xảy ra trong chương trình “Hello, world!” của bạn. Đây là phần đầu tiên của câu đố:

fn main() {

}

Các dòng này xác định một hàm trong Rust. Hàm main rất đặc biệt: nó luôn là mã đầu tiên chạy trong mọi chương trình Rust. Dòng đầu tiên khai báo một hàm có tên là main không có tham số và không trả về gì. Nếu có các tham số, chúng sẽ nằm trong dấu ngoặc đơn, ().

Ngoài ra, hãy lưu ý rằng thân hàm được bọc trong dấu ngoặc nhọn, {}. Rust yêu cầu chúng bao quanh tất cả thân hàm. Bạn nên đặt dấu ngoặc nhọn mở trên cùng dòng với khai báo hàm, thêm một khoảng trắng ở giữa.

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 có tên là rustfmt để định dạng mã của bạn theo một phong cách cụ thể. Nhóm Rust đã bao gồm công cụ này với bản phân phối Rust tiêu chuẩn, giống như rustc, vì vậy nó đã được cài đặt trên máy tính của bạn! Kiểm tra tài liệu trực tuyến để biết thêm chi tiết.

Bên trong hàm main là đoạn 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 ra màn hình. Có bốn chi tiết quan trọng cần lưu ý ở đây.

Đầu tiên, kiểu Rust là thụt lề với bốn dấu cách, không phải là một tab.

Thứ hai, println! gọi một macro Rust. Nếu nó được gọi là một hàm thay vào đó, nó sẽ được nhập là println (không có dấu!). Chúng ta sẽ thảo luận chi tiết hơn về macro Rust trong Chương 19. Hiện tại, bạn chỉ cần biết rằng việc sử dụng dấu ! có nghĩa là bạn đang gọi một macro thay vì một hàm bình thường và macro không phải lúc nào cũng tuân theo các quy tắc tương tự như các hàm.

Thứ ba, bạn thấy chuỗi "Hello, world!". Chúng tôi chuyển chuỗi này làm đối số cho println!, và chuỗi được in ra màn hình.

Thứ tư, chúng ta kết thúc dòng bằng dấu chấm phẩ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 đều 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 được tạo, vì vậy hãy kiểm tra từng bước trong quy trình.

Trước khi chạy 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à chuyển cho nó tên tệp nguồn của bạn, như sau:

$ rustc main.rs

Nếu bạn có nền tảng C hoặc C++, bạn sẽ nhận thấy rằng đ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ể xem tệp thực thi bằng cách nhập lệnh ls vào trình shell của mình. 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 nhau mà bạn sẽ thấy khi sử dụng CMD.

$ ls
main  main.rs

Với CMD trên Windows, bạn sẽ nhập như sau:

> dir /B %= the /B option says to only show the file names =%
main.exe
main.pdb
main.rs

Điều này hiển thị tệp mã nguồn có phần mở rộng .rs, tệp thực thi (main.exe trên Windows, và main trên tất cả các nền tảng khác) và khi sử dụng Windows, tệp chứa thông tin gỡ lỗi có phần mở rộng .pdb. Từ đây, bạn chạy tệp main hoặc main.exe, như sau:

$ ./main # or .\main.exe on Windows

Nếu main.rs là chương trình “Hello, world!”, dòng này sẽ in Hello, world! vào terminal của bạn.

Nếu bạn quen thuộc hơn với một ngôn ngữ động (dynamic), 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 chương trình dưới dạng các bước riêng biệt. Rust là một ngôn ngữ ahead-of-time compiled, có nghĩa là bạn có thể biên dịch một chương trình và cung cấp chương trình thực thi cho người khác và họ có thể chạy nó ngay cả khi chưa cài đặt Rust. Nếu bạn cung cấp cho ai đó tệp .rb, .py hoặc .js, họ cần cài đặt triển khai Ruby, Python hoặc JavaScript (tương ứng). Nhưng trong các 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 mình. Mọi thứ đều là sự đánh đổi trong thiết kế ngôn ngữ.

Chỉ cần biên dịch với rustc là tốt 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à giúp bạn dễ dàng chia sẻ mã của mình. Tiếp theo, chúng tôi sẽ giới thiệu cho bạn công cụ Cargo, công cụ này sẽ giúp bạn viết các chương trình Rust thực tế.