§2024-06-24

¶MacOS/Linux

Just run:

curl -L https://raw.githubusercontent.com/rust-lang/rustlings/main/install.sh | bash

This will create a folder in the current directory called rustlings, so be sure to switch to whatever location you want to use to keep things organized.

Then

$ which rustlings
/home/alexlai/.cargo/bin/rustlings
$ tree ~/rustlings/
/home/alexlai/rustlings/
├── AUTHORS.md
├── Cargo.lock
├── Cargo.toml
├── CHANGELOG.md
├── CONTRIBUTING.md
├── exercises
│   ├── clippy
│   │   ├── clippy1.rs
│   │   ├── clippy2.rs
│   │   ├── clippy3.rs
│   │   └── README.md
│   ├── conversions
│   │   ├── as_ref_mut.rs
│   │   ├── from_into.rs
│   │   ├── from_str.rs
│   │   ├── README.md
│   │   ├── try_from_into.rs
│   │   └── using_as.rs
│   ├── enums
│   │   ├── enums1.rs
│   │   ├── enums2.rs
│   │   ├── enums3.rs
│   │   └── README.md
│   ├── error_handling
│   │   ├── errors1.rs
│   │   ├── errors2.rs
│   │   ├── errors3.rs
│   │   ├── errors4.rs
│   │   ├── errors5.rs
│   │   ├── errors6.rs
│   │   └── README.md
│   ├── functions
│   │   ├── functions1.rs
│   │   ├── functions2.rs
│   │   ├── functions3.rs
│   │   ├── functions4.rs
│   │   ├── functions5.rs
│   │   └── README.md
│   ├── generics
│   │   ├── generics1.rs
│   │   ├── generics2.rs
│   │   └── README.md
│   ├── hashmaps
│   │   ├── hashmaps1.rs
│   │   ├── hashmaps2.rs
│   │   ├── hashmaps3.rs
│   │   └── README.md
│   ├── if
│   │   ├── if1.rs
│   │   ├── if2.rs
│   │   ├── if3.rs
│   │   └── README.md
│   ├── intro
│   │   ├── intro1.rs
│   │   ├── intro2.rs
│   │   └── README.md
│   ├── iterators
│   │   ├── iterators1.rs
│   │   ├── iterators2.rs
│   │   ├── iterators3.rs
│   │   ├── iterators4.rs
│   │   ├── iterators5.rs
│   │   └── README.md
│   ├── lifetimes
│   │   ├── lifetimes1.rs
│   │   ├── lifetimes2.rs
│   │   ├── lifetimes3.rs
│   │   └── README.md
│   ├── macros
│   │   ├── macros1.rs
│   │   ├── macros2.rs
│   │   ├── macros3.rs
│   │   ├── macros4.rs
│   │   └── README.md
│   ├── modules
│   │   ├── modules1.rs
│   │   ├── modules2.rs
│   │   ├── modules3.rs
│   │   └── README.md
│   ├── move_semantics
│   │   ├── move_semantics1.rs
│   │   ├── move_semantics2.rs
│   │   ├── move_semantics3.rs
│   │   ├── move_semantics4.rs
│   │   ├── move_semantics5.rs
│   │   ├── move_semantics6.rs
│   │   └── README.md
│   ├── options
│   │   ├── options1.rs
│   │   ├── options2.rs
│   │   ├── options3.rs
│   │   └── README.md
│   ├── primitive_types
│   │   ├── primitive_types1.rs
│   │   ├── primitive_types2.rs
│   │   ├── primitive_types3.rs
│   │   ├── primitive_types4.rs
│   │   ├── primitive_types5.rs
│   │   ├── primitive_types6.rs
│   │   └── README.md
│   ├── quiz1.rs
│   ├── quiz2.rs
│   ├── quiz3.rs
│   ├── README.md
│   ├── smart_pointers
│   │   ├── arc1.rs
│   │   ├── box1.rs
│   │   ├── cow1.rs
│   │   ├── rc1.rs
│   │   └── README.md
│   ├── strings
│   │   ├── README.md
│   │   ├── strings1.rs
│   │   ├── strings2.rs
│   │   ├── strings3.rs
│   │   └── strings4.rs
│   ├── structs
│   │   ├── README.md
│   │   ├── structs1.rs
│   │   ├── structs2.rs
│   │   └── structs3.rs
│   ├── tests
│   │   ├── README.md
│   │   ├── tests1.rs
│   │   ├── tests2.rs
│   │   ├── tests3.rs
│   │   └── tests4.rs
│   ├── threads
│   │   ├── README.md
│   │   ├── threads1.rs
│   │   ├── threads2.rs
│   │   └── threads3.rs
│   ├── traits
│   │   ├── README.md
│   │   ├── traits1.rs
│   │   ├── traits2.rs
│   │   ├── traits3.rs
│   │   ├── traits4.rs
│   │   └── traits5.rs
│   ├── variables
│   │   ├── README.md
│   │   ├── variables1.rs
│   │   ├── variables2.rs
│   │   ├── variables3.rs
│   │   ├── variables4.rs
│   │   ├── variables5.rs
│   │   └── variables6.rs
│   └── vecs
│       ├── README.md
│       ├── vecs1.rs
│       └── vecs2.rs
├── flake.lock
├── flake.nix
├── info.toml
├── install.ps1
├── install.sh
├── LICENSE
├── oranda.json
├── README.md
├── shell.nix
├── src
│   ├── exercise.rs
│   ├── main.rs
│   ├── project.rs
│   ├── run.rs
│   ├── ui.rs
│   └── verify.rs
├── target
│   ├── CACHEDIR.TAG
│   └── release
│       ├── build
│       │   ├── libc-137edcf4c3fba36d
│       │   │   ├── invoked.timestamp
│       │   │   ├── out
│       │   │   ├── output
│       │   │   ├── root-output
│       │   │   └── stderr
│       │   ├── libc-13dd37895401f1aa
│       │   │   ├── build-script-build
│       │   │   ├── build_script_build-13dd37895401f1aa
│       │   │   └── build_script_build-13dd37895401f1aa.d
│       │   ├── log-ac98eecacd8b2e02
│       │   │   ├── invoked.timestamp
│       │   │   ├── out
│       │   │   ├── output
│       │   │   ├── root-output
│       │   │   └── stderr
│       │   ├── log-edd6d1fe679d3dac
│       │   │   ├── build-script-build
│       │   │   ├── build_script_build-edd6d1fe679d3dac
│       │   │   └── build_script_build-edd6d1fe679d3dac.d
│       │   ├── portable-atomic-16d7c4979bce940e
│       │   │   ├── invoked.timestamp
│       │   │   ├── out
│       │   │   ├── output
│       │   │   ├── root-output
│       │   │   └── stderr
│       │   ├── portable-atomic-24572b3621a419a7
│       │   │   ├── build-script-build
│       │   │   ├── build_script_build-24572b3621a419a7
│       │   │   └── build_script_build-24572b3621a419a7.d
│       │   ├── proc-macro2-2a1c14b579c4994c
│       │   │   ├── invoked.timestamp
│       │   │   ├── out
│       │   │   ├── output
│       │   │   ├── root-output
│       │   │   └── stderr
│       │   ├── proc-macro2-93b164b06d6f8ff9
│       │   │   ├── build-script-build
│       │   │   ├── build_script_build-93b164b06d6f8ff9
│       │   │   └── build_script_build-93b164b06d6f8ff9.d
│       │   ├── quote-23ce6b7dfb4c296d
│       │   │   ├── invoked.timestamp
│       │   │   ├── out
│       │   │   ├── output
│       │   │   ├── root-output
│       │   │   └── stderr
│       │   ├── quote-a5390ff22875e334
│       │   │   ├── build-script-build
│       │   │   ├── build_script_build-a5390ff22875e334
│       │   │   └── build_script_build-a5390ff22875e334.d
│       │   ├── serde-237ccf37e9382a14
│       │   │   ├── build-script-build
│       │   │   ├── build_script_build-237ccf37e9382a14
│       │   │   └── build_script_build-237ccf37e9382a14.d
│       │   ├── serde-b3ebe12921ea63d1
│       │   │   ├── invoked.timestamp
│       │   │   ├── out
│       │   │   ├── output
│       │   │   ├── root-output
│       │   │   └── stderr
│       │   ├── serde_derive-80bc99193515adda
│       │   │   ├── build-script-build
│       │   │   ├── build_script_build-80bc99193515adda
│       │   │   └── build_script_build-80bc99193515adda.d
│       │   ├── serde_derive-fbf8e10b69ef63a7
│       │   │   ├── invoked.timestamp
│       │   │   ├── out
│       │   │   ├── output
│       │   │   ├── root-output
│       │   │   └── stderr
│       │   ├── serde_json-8ef3238e2d705b40
│       │   │   ├── invoked.timestamp
│       │   │   ├── out
│       │   │   ├── output
│       │   │   ├── root-output
│       │   │   └── stderr
│       │   ├── serde_json-b4495d3405e5320f
│       │   │   ├── build-script-build
│       │   │   ├── build_script_build-b4495d3405e5320f
│       │   │   └── build_script_build-b4495d3405e5320f.d
│       │   ├── slab-5788ba0e9685763a
│       │   │   ├── invoked.timestamp
│       │   │   ├── out
│       │   │   │   └── probe0.ll
│       │   │   ├── output
│       │   │   ├── root-output
│       │   │   └── stderr
│       │   └── slab-debc6a4c64ca38cc
│       │       ├── build-script-build
│       │       ├── build_script_build-debc6a4c64ca38cc
│       │       └── build_script_build-debc6a4c64ca38cc.d
│       ├── deps
│       │   ├── aho_corasick-96d237fb3c287d7a.d
│       │   ├── anstream-20bf192ff1bed530.d
│       │   ├── anstyle-4a78f7c1d1b08568.d
│       │   ├── anstyle_parse-52a9067d4c942508.d
│       │   ├── anstyle_query-25c9f99a0f7b5652.d
│       │   ├── autocfg-831d4ca292eee5d6.d
│       │   ├── bitflags-c9f49548e3c37de9.d
│       │   ├── cfg_if-22ef46fe85ecc493.d
│       │   ├── cfg_if-c743cf0a66dac05b.d
│       │   ├── clap-07fe5e10df3d7bd7.d
│       │   ├── clap_builder-2d5aa0d5cbb38f61.d
│       │   ├── clap_derive-ce5ad98c71dc3498.d
│       │   ├── clap_lex-bf65de938a07239f.d
│       │   ├── colorchoice-865d7838a50de6b6.d
│       │   ├── console-06f277a3ee2ad3dc.d
│       │   ├── equivalent-3e6ecf7ab8d4a815.d
│       │   ├── filetime-bf4857c9cf72815c.d
│       │   ├── glob-a6590f7181374bb3.d
│       │   ├── hashbrown-2ea9692c85d8ec7c.d
│       │   ├── heck-ce8a5f2220bf6de9.d
│       │   ├── home-655975e49dfb49c7.d
│       │   ├── indexmap-b0063f11b34a6962.d
│       │   ├── indicatif-4117be1dd7450cfb.d
│       │   ├── inotify-1d1237b997b98b7c.d
│       │   ├── inotify_sys-2b0e08c7eb935fa1.d
│       │   ├── iovec-9601b0749a32fec2.d
│       │   ├── itoa-a39a3fffd9d4fb52.d
│       │   ├── lazycell-be6f84df06a41827.d
│       │   ├── lazy_static-567380670d619c3c.d
│       │   ├── libaho_corasick-96d237fb3c287d7a.rlib
│       │   ├── libaho_corasick-96d237fb3c287d7a.rmeta
│       │   ├── libanstream-20bf192ff1bed530.rlib
│       │   ├── libanstream-20bf192ff1bed530.rmeta
│       │   ├── libanstyle-4a78f7c1d1b08568.rlib
│       │   ├── libanstyle-4a78f7c1d1b08568.rmeta
│       │   ├── libanstyle_parse-52a9067d4c942508.rlib
│       │   ├── libanstyle_parse-52a9067d4c942508.rmeta
│       │   ├── libanstyle_query-25c9f99a0f7b5652.rlib
│       │   ├── libanstyle_query-25c9f99a0f7b5652.rmeta
│       │   ├── libautocfg-831d4ca292eee5d6.rlib
│       │   ├── libautocfg-831d4ca292eee5d6.rmeta
│       │   ├── libbitflags-c9f49548e3c37de9.rlib
│       │   ├── libbitflags-c9f49548e3c37de9.rmeta
│       │   ├── libc-beb1ac36a781759c.d
│       │   ├── libcfg_if-22ef46fe85ecc493.rlib
│       │   ├── libcfg_if-22ef46fe85ecc493.rmeta
│       │   ├── libcfg_if-c743cf0a66dac05b.rlib
│       │   ├── libcfg_if-c743cf0a66dac05b.rmeta
│       │   ├── libclap-07fe5e10df3d7bd7.rlib
│       │   ├── libclap-07fe5e10df3d7bd7.rmeta
│       │   ├── libclap_builder-2d5aa0d5cbb38f61.rlib
│       │   ├── libclap_builder-2d5aa0d5cbb38f61.rmeta
│       │   ├── libclap_derive-ce5ad98c71dc3498.so
│       │   ├── libclap_lex-bf65de938a07239f.rlib
│       │   ├── libclap_lex-bf65de938a07239f.rmeta
│       │   ├── libcolorchoice-865d7838a50de6b6.rlib
│       │   ├── libcolorchoice-865d7838a50de6b6.rmeta
│       │   ├── libconsole-06f277a3ee2ad3dc.rlib
│       │   ├── libconsole-06f277a3ee2ad3dc.rmeta
│       │   ├── libequivalent-3e6ecf7ab8d4a815.rlib
│       │   ├── libequivalent-3e6ecf7ab8d4a815.rmeta
│       │   ├── libfiletime-bf4857c9cf72815c.rlib
│       │   ├── libfiletime-bf4857c9cf72815c.rmeta
│       │   ├── libglob-a6590f7181374bb3.rlib
│       │   ├── libglob-a6590f7181374bb3.rmeta
│       │   ├── libhashbrown-2ea9692c85d8ec7c.rlib
│       │   ├── libhashbrown-2ea9692c85d8ec7c.rmeta
│       │   ├── libheck-ce8a5f2220bf6de9.rlib
│       │   ├── libheck-ce8a5f2220bf6de9.rmeta
│       │   ├── libhome-655975e49dfb49c7.rlib
│       │   ├── libhome-655975e49dfb49c7.rmeta
│       │   ├── libindexmap-b0063f11b34a6962.rlib
│       │   ├── libindexmap-b0063f11b34a6962.rmeta
│       │   ├── libindicatif-4117be1dd7450cfb.rlib
│       │   ├── libindicatif-4117be1dd7450cfb.rmeta
│       │   ├── libinotify-1d1237b997b98b7c.rlib
│       │   ├── libinotify-1d1237b997b98b7c.rmeta
│       │   ├── libinotify_sys-2b0e08c7eb935fa1.rlib
│       │   ├── libinotify_sys-2b0e08c7eb935fa1.rmeta
│       │   ├── libiovec-9601b0749a32fec2.rlib
│       │   ├── libiovec-9601b0749a32fec2.rmeta
│       │   ├── libitoa-a39a3fffd9d4fb52.rlib
│       │   ├── libitoa-a39a3fffd9d4fb52.rmeta
│       │   ├── liblazycell-be6f84df06a41827.rlib
│       │   ├── liblazycell-be6f84df06a41827.rmeta
│       │   ├── liblazy_static-567380670d619c3c.rlib
│       │   ├── liblazy_static-567380670d619c3c.rmeta
│       │   ├── liblibc-beb1ac36a781759c.rlib
│       │   ├── liblibc-beb1ac36a781759c.rmeta
│       │   ├── liblog-71eb742e7d074743.rlib
│       │   ├── liblog-71eb742e7d074743.rmeta
│       │   ├── libmemchr-3381c97883e9e6cb.rlib
│       │   ├── libmemchr-3381c97883e9e6cb.rmeta
│       │   ├── libmio-d8e4c3bf5345ab4a.rlib
│       │   ├── libmio-d8e4c3bf5345ab4a.rmeta
│       │   ├── libmio_extras-f40585c6e3cffe91.rlib
│       │   ├── libmio_extras-f40585c6e3cffe91.rmeta
│       │   ├── libnet2-e5debbf2235aabd4.rlib
│       │   ├── libnet2-e5debbf2235aabd4.rmeta
│       │   ├── libnotify-ccbd2c9fa44f14ee.rlib
│       │   ├── libnotify-ccbd2c9fa44f14ee.rmeta
│       │   ├── libnumber_prefix-3ebe005462406dc0.rlib
│       │   ├── libnumber_prefix-3ebe005462406dc0.rmeta
│       │   ├── libportable_atomic-a1cb6be183ff64ca.rlib
│       │   ├── libportable_atomic-a1cb6be183ff64ca.rmeta
│       │   ├── libproc_macro2-42d5e56e18539f61.rlib
│       │   ├── libproc_macro2-42d5e56e18539f61.rmeta
│       │   ├── libquote-cf1b0d624952025a.rlib
│       │   ├── libquote-cf1b0d624952025a.rmeta
│       │   ├── libregex-6f2bede5d0b06e23.rlib
│       │   ├── libregex-6f2bede5d0b06e23.rmeta
│       │   ├── libregex_syntax-5fb1cd753e21b1f1.rlib
│       │   ├── libregex_syntax-5fb1cd753e21b1f1.rmeta
│       │   ├── libryu-62d671ac47bc7e87.rlib
│       │   ├── libryu-62d671ac47bc7e87.rmeta
│       │   ├── libsame_file-9bf1eaa85ad1aa05.rlib
│       │   ├── libsame_file-9bf1eaa85ad1aa05.rmeta
│       │   ├── libserde-12d4a95e4eb2c629.rlib
│       │   ├── libserde-12d4a95e4eb2c629.rmeta
│       │   ├── libserde_derive-502321eca877b28f.so
│       │   ├── libserde_json-2a6a9657b1189bf8.rlib
│       │   ├── libserde_json-2a6a9657b1189bf8.rmeta
│       │   ├── libserde_spanned-1aa3f99ba50200cc.rlib
│       │   ├── libserde_spanned-1aa3f99ba50200cc.rmeta
│       │   ├── libslab-167b61c8873b5898.rlib
│       │   ├── libslab-167b61c8873b5898.rmeta
│       │   ├── libstrsim-9db86cfcff58645e.rlib
│       │   ├── libstrsim-9db86cfcff58645e.rmeta
│       │   ├── libsyn-2e3a064a7fc2ef46.rlib
│       │   ├── libsyn-2e3a064a7fc2ef46.rmeta
│       │   ├── libtoml-3e7ada6e5eb54b87.rlib
│       │   ├── libtoml-3e7ada6e5eb54b87.rmeta
│       │   ├── libtoml_datetime-1e8c63529cd67bce.rlib
│       │   ├── libtoml_datetime-1e8c63529cd67bce.rmeta
│       │   ├── libtoml_edit-c44867638b852d4f.rlib
│       │   ├── libtoml_edit-c44867638b852d4f.rmeta
│       │   ├── libunicode_ident-8e941f04cb61c5a0.rlib
│       │   ├── libunicode_ident-8e941f04cb61c5a0.rmeta
│       │   ├── libunicode_width-23769a1791f03f14.rlib
│       │   ├── libunicode_width-23769a1791f03f14.rmeta
│       │   ├── libutf8parse-12769b3a5f1af50c.rlib
│       │   ├── libutf8parse-12769b3a5f1af50c.rmeta
│       │   ├── libwalkdir-2ac8e2aa58550628.rlib
│       │   ├── libwalkdir-2ac8e2aa58550628.rmeta
│       │   ├── libwinnow-5dc301566856e0ab.rlib
│       │   ├── libwinnow-5dc301566856e0ab.rmeta
│       │   ├── log-71eb742e7d074743.d
│       │   ├── memchr-3381c97883e9e6cb.d
│       │   ├── mio-d8e4c3bf5345ab4a.d
│       │   ├── mio_extras-f40585c6e3cffe91.d
│       │   ├── net2-e5debbf2235aabd4.d
│       │   ├── notify-ccbd2c9fa44f14ee.d
│       │   ├── number_prefix-3ebe005462406dc0.d
│       │   ├── portable_atomic-a1cb6be183ff64ca.d
│       │   ├── proc_macro2-42d5e56e18539f61.d
│       │   ├── quote-cf1b0d624952025a.d
│       │   ├── regex-6f2bede5d0b06e23.d
│       │   ├── regex_syntax-5fb1cd753e21b1f1.d
│       │   ├── rustlings-a082df77458a5a4a
│       │   ├── rustlings-a082df77458a5a4a.d
│       │   ├── ryu-62d671ac47bc7e87.d
│       │   ├── same_file-9bf1eaa85ad1aa05.d
│       │   ├── serde-12d4a95e4eb2c629.d
│       │   ├── serde_derive-502321eca877b28f.d
│       │   ├── serde_json-2a6a9657b1189bf8.d
│       │   ├── serde_spanned-1aa3f99ba50200cc.d
│       │   ├── slab-167b61c8873b5898.d
│       │   ├── strsim-9db86cfcff58645e.d
│       │   ├── syn-2e3a064a7fc2ef46.d
│       │   ├── toml-3e7ada6e5eb54b87.d
│       │   ├── toml_datetime-1e8c63529cd67bce.d
│       │   ├── toml_edit-c44867638b852d4f.d
│       │   ├── unicode_ident-8e941f04cb61c5a0.d
│       │   ├── unicode_width-23769a1791f03f14.d
│       │   ├── utf8parse-12769b3a5f1af50c.d
│       │   ├── walkdir-2ac8e2aa58550628.d
│       │   └── winnow-5dc301566856e0ab.d
│       ├── examples
│       ├── incremental
│       ├── rustlings
│       └── rustlings.d
└── tests
    ├── fixture
    │   ├── failure
    │   │   ├── compFailure.rs
    │   │   ├── compNoExercise.rs
    │   │   ├── info.toml
    │   │   ├── testFailure.rs
    │   │   └── testNotPassed.rs
    │   ├── state
    │   │   ├── finished_exercise.rs
    │   │   ├── info.toml
    │   │   ├── pending_exercise.rs
    │   │   └── pending_test_exercise.rs
    │   └── success
    │       ├── compSuccess.rs
    │       ├── info.toml
    │       └── testSuccess.rs
    └── integration_tests.rs

64 directories, 398 files

This will create a folder in the current directory called rustlings, so be sure to switch to whatever location you want to use to keep things organized.

curl -L https://raw.githubusercontent.com/rust-lang/rustlings/main/install.sh | bash

Now you can run cd rustlings to be transported straight to the folder containing the exercises at ./exercises . These are ordered in the Readme following the Book on Rust, so let’s do the intro, follow the recommended route, and start learning Rust.

$ cat rustlings/exercises/README.md 
# Exercise to Book Chapter mapping

| Exercise               | Book Chapter        |
| ---------------------- | ------------------- |
| variables              | §3.1                |
| functions              | §3.3                |
| if                     | §3.5                |
| primitive_types        | §3.2, §4.3          |
| vecs                   | §8.1                |
| move_semantics         | §4.1-2              |
| structs                | §5.1, §5.3          |
| enums                  | §6, §18.3           |
| strings                | §8.2                |
| modules                | §7                  |
| hashmaps               | §8.3                |
| options                | §10.1               |
| error_handling         | §9                  |
| generics               | §10                 |
| traits                 | §10.2               |
| tests                  | §11.1               |
| lifetimes              | §10.3               |
| iterators              | §13.2-4             |
| threads                | §16.1-3             |
| smart_pointers         | §15, §16.3          |
| macros                 | §19.6               |
| clippy                 | §21.4               |
| conversions            | n/a                 |