§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 |