generated from HaQadosch/RustBook
189 lines
4.1 KiB
Org Mode
189 lines
4.1 KiB
Org Mode
|
:PROPERTIES:
|
||
|
:header-args:shell: :results output
|
||
|
:END:
|
||
|
#+title: RustBook
|
||
|
#+author: HaQadosch Berraka
|
||
|
#+date: [2024-02-09 Fri]
|
||
|
#+startup: indent
|
||
|
|
||
|
#+link: ch01 https://rust-book.cs.brown.edu/ch01-00-getting-started.html
|
||
|
|
||
|
* Getting Started
|
||
|
|
||
|
** Chapter 01: Installation
|
||
|
Recommendation is to use *rustup* using the command:
|
||
|
#+name: install rustup
|
||
|
#+begin_src shell
|
||
|
curl --proto '=https' --tlsv1.2 https://sh.rustup.rs -sSf | sh
|
||
|
#+end_src
|
||
|
|
||
|
To confirm it's installed:
|
||
|
#+name: confirm rustup installed
|
||
|
#+begin_src shell
|
||
|
rustup --version
|
||
|
#+end_src
|
||
|
|
||
|
#+RESULTS: confirm rustup installed
|
||
|
: rustup 1.26.0 (5af9b9484 2023-04-05)
|
||
|
*** Update
|
||
|
To update *rustup* and please do regularly
|
||
|
#+name: update rustup
|
||
|
#+begin_src shell :results output
|
||
|
rustup update
|
||
|
#+end_src
|
||
|
(
|
||
|
#+RESULTS: update rustup
|
||
|
: stable-x86_64-unknown-linux-gnu unchanged - rustc 1.76.0 (07dca489a 2024-02-04)
|
||
|
*** Documentation
|
||
|
*rustup* comes with documentation, just type
|
||
|
#+begin_src shell
|
||
|
rustup doc
|
||
|
#+end_src
|
||
|
|
||
|
and the browser will open a page with links toward lots of docs.
|
||
|
|
||
|
** Chapter 02: Hello, World!
|
||
|
Basically done in 3 steps:
|
||
|
- Edit the rs file
|
||
|
- Compile using ~rustc~
|
||
|
- Call the executable
|
||
|
|
||
|
|
||
|
Work folder is =Projects/01_HelloWorld=, where we create the file =main.rs=
|
||
|
#+name: hello_world main.rs
|
||
|
#+begin_src rust
|
||
|
fn main() {
|
||
|
println!("Hello, World!");
|
||
|
}
|
||
|
#+end_src
|
||
|
|
||
|
To execute this program:
|
||
|
#+name: 0102 call main
|
||
|
#+begin_src shell :results output
|
||
|
cd Projects/01_HelloWorld/
|
||
|
rustc main.rs
|
||
|
./main
|
||
|
#+end_src
|
||
|
|
||
|
#+RESULTS: 0102 call main
|
||
|
: Hello, World!
|
||
|
|
||
|
The program works, I'm now done.
|
||
|
|
||
|
*** Note
|
||
|
All rust program starts by calling the function ~main~.
|
||
|
Functions with ~!~ appended to their name, like ~println!~, are macros.
|
||
|
|
||
|
** Chapter 03: Hello, Cargo!
|
||
|
:PROPERTIES:
|
||
|
:header-args:shell: :dir ./Projects/hello_cargo :results output
|
||
|
:END:
|
||
|
|
||
|
Make sure *Cargo* is installed
|
||
|
#+name: cargo version
|
||
|
#+begin_src shell
|
||
|
cargo --version
|
||
|
#+end_src
|
||
|
|
||
|
#+RESULTS: cargo version
|
||
|
: cargo 1.76.0 (c84b36747 2024-01-18)
|
||
|
|
||
|
*** New project with *Cargo*
|
||
|
#+name: new cargo
|
||
|
#+begin_src shell
|
||
|
cargo new Projects/hello_cargo
|
||
|
tree Projects/hello_cargo
|
||
|
#+end_src
|
||
|
|
||
|
#+RESULTS: new cargo
|
||
|
: Projects/hello_cargo
|
||
|
: ├── Cargo.toml
|
||
|
: └── src
|
||
|
: └── main.rs
|
||
|
:
|
||
|
: 2 directories, 2 files
|
||
|
|
||
|
*Cargo* creates:
|
||
|
- a directory with the project name given,
|
||
|
- and a project with the same name
|
||
|
|
||
|
The *Cargo* configuration file =Cargo.toml= in the root folder and
|
||
|
the projcet code in the =src/= directiory is what makes it a *Rust* project.
|
||
|
|
||
|
*** Building with Cargo
|
||
|
From the root folder, run
|
||
|
#+name: buiild cargo
|
||
|
#+begin_src shell
|
||
|
cargo build
|
||
|
#+end_src
|
||
|
|
||
|
#+RESULTS: buiild cargo
|
||
|
|
||
|
This will create a =Cargo.lock= file in the root directory, and
|
||
|
an executable in =src/target/debug/hello_cargo=.
|
||
|
Which means you can display the text "hello, World!" by calling directly the file
|
||
|
#+name: direct call
|
||
|
#+begin_src shell
|
||
|
./target/debug/hello_cargo
|
||
|
#+end_src
|
||
|
|
||
|
#+RESULTS: direct call
|
||
|
: Hello, world!
|
||
|
|
||
|
*** Running a cargo
|
||
|
You can both build and run the program with
|
||
|
#+name: run hello_cargo
|
||
|
#+begin_src shell
|
||
|
cargo run
|
||
|
#+end_src
|
||
|
|
||
|
#+RESULTS: run hello_cargo
|
||
|
: Hello, world!
|
||
|
|
||
|
*** Checking a cargo
|
||
|
*Cargo* can check if the program can compile. It doesn't execute it.
|
||
|
#+name: check hello_cargo
|
||
|
#+begin_src shell
|
||
|
cargo check
|
||
|
#+end_src
|
||
|
|
||
|
#+RESULTS: check hello_cargo
|
||
|
: Finished dev [unoptimized + debuginfo] target(s) in 0.01s
|
||
|
: [ Babel evaluation exited with code 0 ]
|
||
|
|
||
|
*** Releasing a cargo
|
||
|
To build a cargo with an optimised build, run
|
||
|
|
||
|
#+name: release hello_cargo
|
||
|
#+begin_src shell
|
||
|
cargo build --release
|
||
|
tree
|
||
|
#+end_src
|
||
|
|
||
|
#+RESULTS: release hello_cargo
|
||
|
#+begin_example
|
||
|
.
|
||
|
├── Cargo.lock
|
||
|
├── Cargo.toml
|
||
|
├── src
|
||
|
│ └── main.rs
|
||
|
└── target
|
||
|
├── CACHEDIR.TAG
|
||
|
└── release
|
||
|
├── build
|
||
|
├── deps
|
||
|
│ ├── hello_cargo-ac6d8d77e18d4d6b
|
||
|
│ └── hello_cargo-ac6d8d77e18d4d6b.d
|
||
|
├── examples
|
||
|
├── hello_cargo
|
||
|
├── hello_cargo.d
|
||
|
└── incremental
|
||
|
|
||
|
8 directories, 8 files
|
||
|
#+end_example
|
||
|
|
||
|
The build results are in the folder =target/release/= now.
|
||
|
|
||
|
****
|
||
|
* Programming a guessing game
|