Compare commits
No commits in common. "main" and "all-contributors/add-szabgab" have entirely different histories.
main
...
all-contri
|
@ -2334,105 +2334,6 @@
|
||||||
"contributions": [
|
"contributions": [
|
||||||
"content"
|
"content"
|
||||||
]
|
]
|
||||||
},
|
|
||||||
{
|
|
||||||
"login": "yamila-moreno",
|
|
||||||
"name": "Yamila Moreno",
|
|
||||||
"avatar_url": "https://avatars.githubusercontent.com/u/3340793?v=4",
|
|
||||||
"profile": "https://moduslaborandi.net",
|
|
||||||
"contributions": [
|
|
||||||
"content"
|
|
||||||
]
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"login": "willhack",
|
|
||||||
"name": "Will Hack",
|
|
||||||
"avatar_url": "https://avatars.githubusercontent.com/u/18036720?v=4",
|
|
||||||
"profile": "https://github.com/willhack",
|
|
||||||
"contributions": [
|
|
||||||
"content"
|
|
||||||
]
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"login": "bean5",
|
|
||||||
"name": "Michael",
|
|
||||||
"avatar_url": "https://avatars.githubusercontent.com/u/2052646?v=4",
|
|
||||||
"profile": "http://cancompute.tech",
|
|
||||||
"contributions": [
|
|
||||||
"content"
|
|
||||||
]
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"login": "pksadiq",
|
|
||||||
"name": "Mohammed Sadiq",
|
|
||||||
"avatar_url": "https://avatars.githubusercontent.com/u/1289514?v=4",
|
|
||||||
"profile": "https://www.sadiqpk.org",
|
|
||||||
"contributions": [
|
|
||||||
"content"
|
|
||||||
]
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"login": "Jak-Ch-ll",
|
|
||||||
"name": "Jakob",
|
|
||||||
"avatar_url": "https://avatars.githubusercontent.com/u/56225668?v=4",
|
|
||||||
"profile": "https://github.com/Jak-Ch-ll",
|
|
||||||
"contributions": [
|
|
||||||
"content"
|
|
||||||
]
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"login": "ob",
|
|
||||||
"name": "Oscar Bonilla",
|
|
||||||
"avatar_url": "https://avatars.githubusercontent.com/u/4950?v=4",
|
|
||||||
"profile": "http://oscarbonilla.com",
|
|
||||||
"contributions": [
|
|
||||||
"content"
|
|
||||||
]
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"login": "husjon",
|
|
||||||
"name": "Jon Erling Hustadnes",
|
|
||||||
"avatar_url": "https://avatars.githubusercontent.com/u/554229?v=4",
|
|
||||||
"profile": "https://github.com/husjon",
|
|
||||||
"contributions": [
|
|
||||||
"content"
|
|
||||||
]
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"login": "CobaltCause",
|
|
||||||
"name": "Charles Hall",
|
|
||||||
"avatar_url": "https://avatars.githubusercontent.com/u/7003738?v=4",
|
|
||||||
"profile": "https://github.com/CobaltCause",
|
|
||||||
"contributions": [
|
|
||||||
"infra"
|
|
||||||
]
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"login": "krmpotic",
|
|
||||||
"name": "Luka Krmpotić",
|
|
||||||
"avatar_url": "https://avatars.githubusercontent.com/u/10350645?v=4",
|
|
||||||
"profile": "https://github.com/krmpotic",
|
|
||||||
"contributions": [
|
|
||||||
"content"
|
|
||||||
]
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"login": "jurglic",
|
|
||||||
"name": "Jurglic",
|
|
||||||
"avatar_url": "https://avatars.githubusercontent.com/u/112600?v=4",
|
|
||||||
"profile": "https://github.com/jurglic",
|
|
||||||
"contributions": [
|
|
||||||
"content"
|
|
||||||
]
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"login": "OfirLauber",
|
|
||||||
"name": "Ofir Lauber",
|
|
||||||
"avatar_url": "https://avatars.githubusercontent.com/u/5631030?v=4",
|
|
||||||
"profile": "https://github.com/OfirLauber",
|
|
||||||
"contributions": [
|
|
||||||
"content"
|
|
||||||
]
|
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"contributorsPerLine": 8,
|
"contributorsPerLine": 8,
|
||||||
|
|
|
@ -0,0 +1,18 @@
|
||||||
|
name: Lint
|
||||||
|
|
||||||
|
on:
|
||||||
|
push:
|
||||||
|
branches:
|
||||||
|
- main
|
||||||
|
pull_request:
|
||||||
|
branches:
|
||||||
|
- main
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
lint:
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@v3
|
||||||
|
- uses: DavidAnson/markdownlint-cli2-action@v9
|
||||||
|
with:
|
||||||
|
globs: "exercises/**/*.md"
|
|
@ -10,28 +10,13 @@ env:
|
||||||
CARGO_TERM_COLOR: always
|
CARGO_TERM_COLOR: always
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
fmt:
|
build:
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v3
|
- uses: actions/checkout@v3
|
||||||
- uses: dtolnay/rust-toolchain@stable
|
- name: Fetch & maybe update Cargo.lock
|
||||||
with:
|
run: cargo fetch --locked
|
||||||
components: rustfmt
|
- name: Build
|
||||||
- uses: DavidAnson/markdownlint-cli2-action@v9
|
run: cargo build --verbose
|
||||||
with:
|
- name: Run tests
|
||||||
globs: "exercises/**/*.md"
|
run: cargo test --verbose
|
||||||
- name: Run cargo fmt
|
|
||||||
run: |
|
|
||||||
cargo fmt --all -- --check
|
|
||||||
test:
|
|
||||||
runs-on: ${{ matrix.os }}
|
|
||||||
strategy:
|
|
||||||
matrix:
|
|
||||||
os: [ubuntu-latest, windows-latest, macOS-latest]
|
|
||||||
steps:
|
|
||||||
- uses: actions/checkout@v3
|
|
||||||
- uses: dtolnay/rust-toolchain@stable
|
|
||||||
- uses: swatinem/rust-cache@v2
|
|
||||||
- name: Run cargo test
|
|
||||||
run: |
|
|
||||||
cargo test
|
|
||||||
|
|
|
@ -1,88 +0,0 @@
|
||||||
# Workflow to build your docs with oranda (and mdbook)
|
|
||||||
# and deploy them to Github Pages
|
|
||||||
name: Web
|
|
||||||
|
|
||||||
# We're going to push to the gh-pages branch, so we need that permission
|
|
||||||
permissions:
|
|
||||||
contents: write
|
|
||||||
|
|
||||||
# What situations do we want to build docs in?
|
|
||||||
# All of these work independently and can be removed / commented out
|
|
||||||
# if you don't want oranda/mdbook running in that situation
|
|
||||||
on:
|
|
||||||
# Check that a PR didn't break docs!
|
|
||||||
#
|
|
||||||
# Note that the "Deploy to Github Pages" step won't run in this mode,
|
|
||||||
# so this won't have any side-effects. But it will tell you if a PR
|
|
||||||
# completely broke oranda/mdbook. Sadly we don't provide previews (yet)!
|
|
||||||
pull_request:
|
|
||||||
|
|
||||||
# Whenever something gets pushed to main, update the docs!
|
|
||||||
# This is great for getting docs changes live without cutting a full release.
|
|
||||||
#
|
|
||||||
# Note that if you're using cargo-dist, this will "race" the Release workflow
|
|
||||||
# that actually builds the Github Release that oranda tries to read (and
|
|
||||||
# this will almost certainly complete first). As a result you will publish
|
|
||||||
# docs for the latest commit but the oranda landing page won't know about
|
|
||||||
# the latest release. The workflow_run trigger below will properly wait for
|
|
||||||
# cargo-dist, and so this half-published state will only last for ~10 minutes.
|
|
||||||
#
|
|
||||||
# If you only want docs to update with releases, disable this, or change it to
|
|
||||||
# a "release" branch. You can, of course, also manually trigger a workflow run
|
|
||||||
# when you want the docs to update.
|
|
||||||
push:
|
|
||||||
branches:
|
|
||||||
- main
|
|
||||||
|
|
||||||
# Whenever a workflow called "Release" completes, update the docs!
|
|
||||||
#
|
|
||||||
# If you're using cargo-dist, this is recommended, as it will ensure that
|
|
||||||
# oranda always sees the latest release right when it's available. Note
|
|
||||||
# however that Github's UI is wonky when you use workflow_run, and won't
|
|
||||||
# show this workflow as part of any commit. You have to go to the "actions"
|
|
||||||
# tab for your repo to see this one running (the gh-pages deploy will also
|
|
||||||
# only show up there).
|
|
||||||
workflow_run:
|
|
||||||
workflows: [ "Release" ]
|
|
||||||
types:
|
|
||||||
- completed
|
|
||||||
|
|
||||||
# Alright, let's do it!
|
|
||||||
jobs:
|
|
||||||
web:
|
|
||||||
name: Build and deploy site and docs
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
steps:
|
|
||||||
# Setup
|
|
||||||
- uses: actions/checkout@v3
|
|
||||||
with:
|
|
||||||
fetch-depth: 0
|
|
||||||
- uses: dtolnay/rust-toolchain@stable
|
|
||||||
- uses: swatinem/rust-cache@v2
|
|
||||||
|
|
||||||
# If you use any mdbook plugins, here's the place to install them!
|
|
||||||
|
|
||||||
# Install and run oranda (and mdbook)
|
|
||||||
# This will write all output to ./public/ (including copying mdbook's output to there)
|
|
||||||
- name: Install and run oranda
|
|
||||||
run: |
|
|
||||||
curl --proto '=https' --tlsv1.2 -LsSf https://github.com/axodotdev/oranda/releases/download/v0.3.1/oranda-installer.sh | sh
|
|
||||||
oranda build
|
|
||||||
|
|
||||||
# Deploy to our gh-pages branch (creating it if it doesn't exist)
|
|
||||||
# the "public" dir that oranda made above will become the root dir
|
|
||||||
# of this branch.
|
|
||||||
#
|
|
||||||
# Note that once the gh-pages branch exists, you must
|
|
||||||
# go into repo's settings > pages and set "deploy from branch: gh-pages"
|
|
||||||
# the other defaults work fine.
|
|
||||||
- name: Deploy to Github Pages
|
|
||||||
uses: JamesIves/github-pages-deploy-action@v4.4.1
|
|
||||||
# ONLY if we're on main (so no PRs or feature branches allowed!)
|
|
||||||
if: ${{ github.ref == 'refs/heads/main' }}
|
|
||||||
with:
|
|
||||||
branch: gh-pages
|
|
||||||
# Gotta tell the action where to find oranda's output
|
|
||||||
folder: public
|
|
||||||
token: ${{ secrets.GITHUB_TOKEN }}
|
|
||||||
single-commit: true
|
|
15
AUTHORS.md
15
AUTHORS.md
|
@ -330,21 +330,6 @@ authors.
|
||||||
<td align="center" valign="top" width="12.5%"><a href="https://github.com/mkovaxx"><img src="https://avatars.githubusercontent.com/u/481354?v=4?s=100" width="100px;" alt="Máté Kovács"/><br /><sub><b>Máté Kovács</b></sub></a><br /><a href="#content-mkovaxx" title="Content">🖋</a></td>
|
<td align="center" valign="top" width="12.5%"><a href="https://github.com/mkovaxx"><img src="https://avatars.githubusercontent.com/u/481354?v=4?s=100" width="100px;" alt="Máté Kovács"/><br /><sub><b>Máté Kovács</b></sub></a><br /><a href="#content-mkovaxx" title="Content">🖋</a></td>
|
||||||
<td align="center" valign="top" width="12.5%"><a href="https://szabgab.com/"><img src="https://avatars.githubusercontent.com/u/48833?v=4?s=100" width="100px;" alt="Gábor Szabó"/><br /><sub><b>Gábor Szabó</b></sub></a><br /><a href="#content-szabgab" title="Content">🖋</a></td>
|
<td align="center" valign="top" width="12.5%"><a href="https://szabgab.com/"><img src="https://avatars.githubusercontent.com/u/48833?v=4?s=100" width="100px;" alt="Gábor Szabó"/><br /><sub><b>Gábor Szabó</b></sub></a><br /><a href="#content-szabgab" title="Content">🖋</a></td>
|
||||||
</tr>
|
</tr>
|
||||||
<tr>
|
|
||||||
<td align="center" valign="top" width="12.5%"><a href="https://moduslaborandi.net"><img src="https://avatars.githubusercontent.com/u/3340793?v=4?s=100" width="100px;" alt="Yamila Moreno"/><br /><sub><b>Yamila Moreno</b></sub></a><br /><a href="#content-yamila-moreno" title="Content">🖋</a></td>
|
|
||||||
<td align="center" valign="top" width="12.5%"><a href="https://github.com/willhack"><img src="https://avatars.githubusercontent.com/u/18036720?v=4?s=100" width="100px;" alt="Will Hack"/><br /><sub><b>Will Hack</b></sub></a><br /><a href="#content-willhack" title="Content">🖋</a></td>
|
|
||||||
<td align="center" valign="top" width="12.5%"><a href="http://cancompute.tech"><img src="https://avatars.githubusercontent.com/u/2052646?v=4?s=100" width="100px;" alt="Michael"/><br /><sub><b>Michael</b></sub></a><br /><a href="#content-bean5" title="Content">🖋</a></td>
|
|
||||||
<td align="center" valign="top" width="12.5%"><a href="https://www.sadiqpk.org"><img src="https://avatars.githubusercontent.com/u/1289514?v=4?s=100" width="100px;" alt="Mohammed Sadiq"/><br /><sub><b>Mohammed Sadiq</b></sub></a><br /><a href="#content-pksadiq" title="Content">🖋</a></td>
|
|
||||||
<td align="center" valign="top" width="12.5%"><a href="https://github.com/Jak-Ch-ll"><img src="https://avatars.githubusercontent.com/u/56225668?v=4?s=100" width="100px;" alt="Jakob"/><br /><sub><b>Jakob</b></sub></a><br /><a href="#content-Jak-Ch-ll" title="Content">🖋</a></td>
|
|
||||||
<td align="center" valign="top" width="12.5%"><a href="http://oscarbonilla.com"><img src="https://avatars.githubusercontent.com/u/4950?v=4?s=100" width="100px;" alt="Oscar Bonilla"/><br /><sub><b>Oscar Bonilla</b></sub></a><br /><a href="#content-ob" title="Content">🖋</a></td>
|
|
||||||
<td align="center" valign="top" width="12.5%"><a href="https://github.com/husjon"><img src="https://avatars.githubusercontent.com/u/554229?v=4?s=100" width="100px;" alt="Jon Erling Hustadnes"/><br /><sub><b>Jon Erling Hustadnes</b></sub></a><br /><a href="#content-husjon" title="Content">🖋</a></td>
|
|
||||||
<td align="center" valign="top" width="12.5%"><a href="https://github.com/CobaltCause"><img src="https://avatars.githubusercontent.com/u/7003738?v=4?s=100" width="100px;" alt="Charles Hall"/><br /><sub><b>Charles Hall</b></sub></a><br /><a href="#infra-CobaltCause" title="Infrastructure (Hosting, Build-Tools, etc)">🚇</a></td>
|
|
||||||
</tr>
|
|
||||||
<tr>
|
|
||||||
<td align="center" valign="top" width="12.5%"><a href="https://github.com/krmpotic"><img src="https://avatars.githubusercontent.com/u/10350645?v=4?s=100" width="100px;" alt="Luka Krmpotić"/><br /><sub><b>Luka Krmpotić</b></sub></a><br /><a href="#content-krmpotic" title="Content">🖋</a></td>
|
|
||||||
<td align="center" valign="top" width="12.5%"><a href="https://github.com/jurglic"><img src="https://avatars.githubusercontent.com/u/112600?v=4?s=100" width="100px;" alt="Jurglic"/><br /><sub><b>Jurglic</b></sub></a><br /><a href="#content-jurglic" title="Content">🖋</a></td>
|
|
||||||
<td align="center" valign="top" width="12.5%"><a href="https://github.com/OfirLauber"><img src="https://avatars.githubusercontent.com/u/5631030?v=4?s=100" width="100px;" alt="Ofir Lauber"/><br /><sub><b>Ofir Lauber</b></sub></a><br /><a href="#content-OfirLauber" title="Content">🖋</a></td>
|
|
||||||
</tr>
|
|
||||||
</tbody>
|
</tbody>
|
||||||
</table>
|
</table>
|
||||||
|
|
||||||
|
|
56
CHANGELOG.md
56
CHANGELOG.md
|
@ -1,59 +1,3 @@
|
||||||
<a name="5.6.1"></a>
|
|
||||||
## 5.6.1 (2023-09-18)
|
|
||||||
|
|
||||||
#### Changed
|
|
||||||
|
|
||||||
- Converted all exercises with assertions to test mode.
|
|
||||||
|
|
||||||
#### Fixed
|
|
||||||
|
|
||||||
- `cow1`: Reverted regression introduced by calling `to_mut` where it
|
|
||||||
shouldn't have been called, and clarified comment.
|
|
||||||
- `primitive_types3`: Require at least an array of 100 elements.
|
|
||||||
- Removed hint comments when no hint exists for the exercise.
|
|
||||||
- `as_ref_mut`: Fixed a typo in a test function name.
|
|
||||||
- `enums3`: Fixed formatting with `rustfmt`.
|
|
||||||
|
|
||||||
<a name="5.6.0"></a>
|
|
||||||
## 5.6.0 (2023-09-04)
|
|
||||||
|
|
||||||
#### Added
|
|
||||||
|
|
||||||
- New exercise: `if3`, teaching the user about `if let` statements.
|
|
||||||
- `hashmaps2`: Added an extra test function to check if the amount of fruits is higher than zero.
|
|
||||||
- `enums3`: Added a test for `Message`.
|
|
||||||
- `if1`: Added a test case to check equal values.
|
|
||||||
- `if3`: Added a note specifying that there are no test changes needed.
|
|
||||||
|
|
||||||
#### Changed
|
|
||||||
|
|
||||||
- Swapped the order of threads and smart pointer exercises.
|
|
||||||
- Rewrote the CLI to use `clap` - it's matured much since we switched to `argh` :)
|
|
||||||
- `structs3`: Switched from i32 to u32.
|
|
||||||
- `move_semantics`: Switched 1-4 to tests, and rewrote them to be way simpler, while still teaching about the same
|
|
||||||
concepts.
|
|
||||||
|
|
||||||
#### Fixed
|
|
||||||
|
|
||||||
- `iterators5`:
|
|
||||||
- Removed an outdated part of the hint.
|
|
||||||
- Renamed variables to use snake_case.
|
|
||||||
- `vecs2`: Updated the hint to reference the renamed loop variable.
|
|
||||||
- `enums3`: Changed message string in test so that it gets properly tested.
|
|
||||||
- `strings2`: Corrected line number in hint, then removed it (this both happened as part of this release cycle).
|
|
||||||
- `primitive_types4`: Updated hint to the correct ending index.
|
|
||||||
- `quiz1`: Removed duplicated sentence from exercise comments.
|
|
||||||
- `errors4`: Improved comment.
|
|
||||||
- `from_into`: Fixed test values.
|
|
||||||
- `cow1`: Added `.to_mut()` to distinguish from the previous test case.
|
|
||||||
- `threads2`: Updated hint text to reference the correct book heading.
|
|
||||||
|
|
||||||
#### Housekeeping
|
|
||||||
|
|
||||||
- Cleaned up the explanation paragraphs at the start of each exercise.
|
|
||||||
- Lots of Nix housekeeping that I don't feel qualified to write about!
|
|
||||||
- Improved CI workflows, we're now testing on multiple platforms at once.
|
|
||||||
|
|
||||||
<a name="5.5.1"></a>
|
<a name="5.5.1"></a>
|
||||||
## 5.5.1 (2023-05-17)
|
## 5.5.1 (2023-05-17)
|
||||||
|
|
||||||
|
|
|
@ -4,9 +4,9 @@ version = 3
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "aho-corasick"
|
name = "aho-corasick"
|
||||||
version = "0.7.20"
|
version = "1.0.5"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "cc936419f96fa211c1b9166887b38e5e40b19958e5b895be7c1f93adec7071ac"
|
checksum = "0c378d78423fdad8089616f827526ee33c19f2fddbd5de1629152c9593ba4783"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"memchr",
|
"memchr",
|
||||||
]
|
]
|
||||||
|
@ -27,9 +27,9 @@ dependencies = [
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "anstyle"
|
name = "anstyle"
|
||||||
version = "1.0.3"
|
version = "1.0.2"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "b84bf0a05bbb2a83e5eb6fa36bb6e87baa08193c35ff52bbf6b38d8af2890e46"
|
checksum = "15c4c2c83f81532e5845a733998b6971faca23490340a418e9b72a3ec9de12ea"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "anstyle-parse"
|
name = "anstyle-parse"
|
||||||
|
@ -59,6 +59,37 @@ dependencies = [
|
||||||
"windows-sys 0.48.0",
|
"windows-sys 0.48.0",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "argh"
|
||||||
|
version = "0.1.12"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "7af5ba06967ff7214ce4c7419c7d185be7ecd6cc4965a8f6e1d8ce0398aad219"
|
||||||
|
dependencies = [
|
||||||
|
"argh_derive",
|
||||||
|
"argh_shared",
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "argh_derive"
|
||||||
|
version = "0.1.12"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "56df0aeedf6b7a2fc67d06db35b09684c3e8da0c95f8f27685cb17e08413d87a"
|
||||||
|
dependencies = [
|
||||||
|
"argh_shared",
|
||||||
|
"proc-macro2",
|
||||||
|
"quote",
|
||||||
|
"syn",
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "argh_shared"
|
||||||
|
version = "0.1.12"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "5693f39141bda5760ecc4111ab08da40565d1771038c4a0250f03457ec707531"
|
||||||
|
dependencies = [
|
||||||
|
"serde",
|
||||||
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "assert_cmd"
|
name = "assert_cmd"
|
||||||
version = "2.0.12"
|
version = "2.0.12"
|
||||||
|
@ -111,9 +142,9 @@ checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "clap"
|
name = "clap"
|
||||||
version = "4.4.3"
|
version = "4.4.2"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "84ed82781cea27b43c9b106a979fe450a13a31aab0500595fb3fc06616de08e6"
|
checksum = "6a13b88d2c62ff462f88e4a121f17a82c1af05693a2f192b5c38d14de73c19f6"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"clap_builder",
|
"clap_builder",
|
||||||
"clap_derive",
|
"clap_derive",
|
||||||
|
@ -157,15 +188,15 @@ checksum = "acbf1af155f9b9ef647e42cdc158db4b64a1b61f743629225fde6f3e0be2a7c7"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "console"
|
name = "console"
|
||||||
version = "0.15.5"
|
version = "0.15.7"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "c3d79fbe8970a77e3e34151cc13d3b3e248aa0faaecb9f6091fa07ebefe5ad60"
|
checksum = "c926e00cc70edefdc64d3a5ff31cc65bb97a3460097762bd23afb4d8145fccf8"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"encode_unicode",
|
"encode_unicode",
|
||||||
"lazy_static",
|
"lazy_static",
|
||||||
"libc",
|
"libc",
|
||||||
"unicode-width",
|
"unicode-width",
|
||||||
"windows-sys 0.42.0",
|
"windows-sys 0.45.0",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
|
@ -200,14 +231,14 @@ checksum = "5443807d6dff69373d433ab9ef5378ad8df50ca6298caf15de6e52e24aaf54d5"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "filetime"
|
name = "filetime"
|
||||||
version = "0.2.20"
|
version = "0.2.22"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "8a3de6e8d11b22ff9edc6d916f890800597d60f8b2da1caf2955c274638d6412"
|
checksum = "d4029edd3e734da6fe05b6cd7bd2960760a616bd2ddd0d59a0124746d6272af0"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"cfg-if 1.0.0",
|
"cfg-if 1.0.0",
|
||||||
"libc",
|
"libc",
|
||||||
"redox_syscall",
|
"redox_syscall",
|
||||||
"windows-sys 0.45.0",
|
"windows-sys 0.48.0",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
|
@ -274,11 +305,11 @@ checksum = "95505c38b4572b2d910cecb0281560f54b440a19336cbbcb27bf6ce6adc6f5a8"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "home"
|
name = "home"
|
||||||
version = "0.5.4"
|
version = "0.5.5"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "747309b4b440c06d57b0b25f2aee03ee9b5e5397d288c60e21fc709bb98a7408"
|
checksum = "5444c27eef6923071f7ebcc33e3444508466a76f7a2b93da00ed6e19f30c1ddb"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"winapi 0.3.9",
|
"windows-sys 0.48.0",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
|
@ -353,9 +384,9 @@ dependencies = [
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "itoa"
|
name = "itoa"
|
||||||
version = "1.0.6"
|
version = "1.0.9"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "453ad9f582a441959e5f0d088b02ce04cfe8d51a8eaf077f12ac6d3e94164ca6"
|
checksum = "af150ab688ff2122fcef229be89cb50dd66af9e01a4ff320cc137eecc9bacc38"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "kernel32-sys"
|
name = "kernel32-sys"
|
||||||
|
@ -381,18 +412,15 @@ checksum = "830d08ce1d1d941e6b30645f1a0eb5643013d835ce3779a5fc208261dbe10f55"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "libc"
|
name = "libc"
|
||||||
version = "0.2.140"
|
version = "0.2.147"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "99227334921fae1a979cf0bfdfcc6b3e5ce376ef57e16fb6fb3ea2ed6095f80c"
|
checksum = "b4668fb0ea861c1df094127ac5f1da3409a82116a4ba74fca2e58ef927159bb3"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "log"
|
name = "log"
|
||||||
version = "0.4.17"
|
version = "0.4.20"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "abb12e687cfb44aa40f41fc3978ef76448f9b6038cad6aef4259d3c095a2382e"
|
checksum = "b5e6163cb8c49088c2c36f57875e58ccd8c87c7427f7fbd50ea6710b2f3f2e8f"
|
||||||
dependencies = [
|
|
||||||
"cfg-if 1.0.0",
|
|
||||||
]
|
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "memchr"
|
name = "memchr"
|
||||||
|
@ -445,9 +473,9 @@ dependencies = [
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "net2"
|
name = "net2"
|
||||||
version = "0.2.38"
|
version = "0.2.39"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "74d0df99cfcd2530b2e694f6e17e7f37b8e26bb23983ac530c0c97408837c631"
|
checksum = "b13b648036a2339d06de780866fbdfda0dde886de7b3af2ddeba8b14f4ee34ac"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"cfg-if 0.1.10",
|
"cfg-if 0.1.10",
|
||||||
"libc",
|
"libc",
|
||||||
|
@ -480,9 +508,9 @@ dependencies = [
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "num-traits"
|
name = "num-traits"
|
||||||
version = "0.2.15"
|
version = "0.2.16"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "578ede34cf02f8924ab9447f50c28075b4d3e5b269972345e7e0372b38c6cdcd"
|
checksum = "f30b0abd723be7e2ffca1272140fac1a2f084c77ec3e123c192b66af1ee9e6c2"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"autocfg",
|
"autocfg",
|
||||||
]
|
]
|
||||||
|
@ -532,39 +560,40 @@ dependencies = [
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "proc-macro2"
|
name = "proc-macro2"
|
||||||
version = "1.0.53"
|
version = "1.0.66"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "ba466839c78239c09faf015484e5cc04860f88242cff4d03eb038f04b4699b73"
|
checksum = "18fb31db3f9bddb2ea821cde30a9f70117e3f119938b5ee630b7403aa6e2ead9"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"unicode-ident",
|
"unicode-ident",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "quote"
|
name = "quote"
|
||||||
version = "1.0.26"
|
version = "1.0.33"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "4424af4bf778aae2051a77b60283332f386554255d722233d09fbfc7e30da2fc"
|
checksum = "5267fca4496028628a95160fc423a33e8b2e6af8a5302579e322e4b520293cae"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"proc-macro2",
|
"proc-macro2",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "redox_syscall"
|
name = "redox_syscall"
|
||||||
version = "0.2.16"
|
version = "0.3.5"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "fb5a58c1855b4b6819d59012155603f0b22ad30cad752600aadfcb695265519a"
|
checksum = "567664f262709473930a4bf9e51bf2ebf3348f2e748ccc50dea20646858f8f29"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"bitflags",
|
"bitflags",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "regex"
|
name = "regex"
|
||||||
version = "1.7.2"
|
version = "1.9.5"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "cce168fea28d3e05f158bda4576cf0c844d5045bc2cc3620fa0292ed5bb5814c"
|
checksum = "697061221ea1b4a94a624f67d0ae2bfe4e22b8a17b6a192afb11046542cc8c47"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"aho-corasick",
|
"aho-corasick",
|
||||||
"memchr",
|
"memchr",
|
||||||
|
"regex-automata",
|
||||||
"regex-syntax",
|
"regex-syntax",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
@ -573,17 +602,23 @@ name = "regex-automata"
|
||||||
version = "0.3.8"
|
version = "0.3.8"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "c2f401f4955220693b56f8ec66ee9c78abffd8d1c4f23dc41a23839eb88f0795"
|
checksum = "c2f401f4955220693b56f8ec66ee9c78abffd8d1c4f23dc41a23839eb88f0795"
|
||||||
|
dependencies = [
|
||||||
|
"aho-corasick",
|
||||||
|
"memchr",
|
||||||
|
"regex-syntax",
|
||||||
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "regex-syntax"
|
name = "regex-syntax"
|
||||||
version = "0.6.29"
|
version = "0.7.5"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "f162c6dd7b008981e4d40210aca20b4bd0f9b60ca9271061b07f78537722f2e1"
|
checksum = "dbb5fb1acd8a1a18b3dd5be62d25485eb770e05afb408a9627d14d451bae12da"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "rustlings"
|
name = "rustlings"
|
||||||
version = "5.6.1"
|
version = "5.5.1"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
|
"argh",
|
||||||
"assert_cmd",
|
"assert_cmd",
|
||||||
"clap",
|
"clap",
|
||||||
"console",
|
"console",
|
||||||
|
@ -600,9 +635,9 @@ dependencies = [
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "ryu"
|
name = "ryu"
|
||||||
version = "1.0.13"
|
version = "1.0.15"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "f91339c0467de62360649f8d3e185ca8de4224ff281f66000de5eb2a77a79041"
|
checksum = "1ad4cc8da4ef723ed60bced201181d83791ad433213d8c24efffda1eec85d741"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "same-file"
|
name = "same-file"
|
||||||
|
@ -615,18 +650,18 @@ dependencies = [
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "serde"
|
name = "serde"
|
||||||
version = "1.0.158"
|
version = "1.0.188"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "771d4d9c4163ee138805e12c710dd365e4f44be8be0503cb1bb9eb989425d9c9"
|
checksum = "cf9e0fcba69a370eed61bcf2b728575f726b50b55cba78064753d708ddc7549e"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"serde_derive",
|
"serde_derive",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "serde_derive"
|
name = "serde_derive"
|
||||||
version = "1.0.158"
|
version = "1.0.188"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "e801c1712f48475582b7696ac71e0ca34ebb30e09338425384269d9717c62cad"
|
checksum = "4eca7ac642d82aa35b60049a6eccb4be6be75e599bd2e9adb5f875a737654af2"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"proc-macro2",
|
"proc-macro2",
|
||||||
"quote",
|
"quote",
|
||||||
|
@ -635,9 +670,9 @@ dependencies = [
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "serde_json"
|
name = "serde_json"
|
||||||
version = "1.0.94"
|
version = "1.0.105"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "1c533a59c9d8a93a09c6ab31f0fd5e5f4dd1b8fc9434804029839884765d04ea"
|
checksum = "693151e1ac27563d6dbcec9dee9fbd5da8539b20fa14ad3752b2e6d363ace360"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"itoa",
|
"itoa",
|
||||||
"ryu",
|
"ryu",
|
||||||
|
@ -655,9 +690,9 @@ dependencies = [
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "slab"
|
name = "slab"
|
||||||
version = "0.4.8"
|
version = "0.4.9"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "6528351c9bc8ab22353f9d776db39a20288e8d6c37ef8cfe3317cf875eecfc2d"
|
checksum = "8f92a496fb766b417c996b9c5e57daf2f7ad3b0bebe1ccfca4856390e3d3bb67"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"autocfg",
|
"autocfg",
|
||||||
]
|
]
|
||||||
|
@ -670,9 +705,9 @@ checksum = "73473c0e59e6d5812c5dfe2a064a6444949f089e20eec9a2e5506596494e4623"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "syn"
|
name = "syn"
|
||||||
version = "2.0.8"
|
version = "2.0.31"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "bcc02725fd69ab9f26eab07fad303e2497fad6fb9eba4f96c4d1687bdf704ad9"
|
checksum = "718fa2415bcb8d8bd775917a1bf12a7931b6dfa890753378538118181e0cb398"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"proc-macro2",
|
"proc-macro2",
|
||||||
"quote",
|
"quote",
|
||||||
|
@ -687,9 +722,9 @@ checksum = "3369f5ac52d5eb6ab48c6b4ffdc8efbcad6b89c765749064ba298f2c68a16a76"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "toml"
|
name = "toml"
|
||||||
version = "0.7.8"
|
version = "0.7.6"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "dd79e69d3b627db300ff956027cc6c3798cef26d22526befdfcd12feeb6d2257"
|
checksum = "c17e963a819c331dcacd7ab957d80bc2b9a9c1e71c804826d2f283dd65306542"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"serde",
|
"serde",
|
||||||
"serde_spanned",
|
"serde_spanned",
|
||||||
|
@ -708,9 +743,9 @@ dependencies = [
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "toml_edit"
|
name = "toml_edit"
|
||||||
version = "0.19.15"
|
version = "0.19.14"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "1b5bb770da30e5cbfde35a2d7b9b8a2c4b8ef89548a7a6aeab5c9a576e3e7421"
|
checksum = "f8123f27e969974a3dfba720fdb560be359f57b44302d280ba72e76a74480e8a"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"indexmap",
|
"indexmap",
|
||||||
"serde",
|
"serde",
|
||||||
|
@ -721,9 +756,9 @@ dependencies = [
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "unicode-ident"
|
name = "unicode-ident"
|
||||||
version = "1.0.8"
|
version = "1.0.11"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "e5464a87b239f13a63a501f2701565754bae92d243d4bb7eb12f6d57d2269bf4"
|
checksum = "301abaae475aa91687eb82514b328ab47a211a533026cb25fc3e519b86adfc3c"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "unicode-width"
|
name = "unicode-width"
|
||||||
|
@ -799,21 +834,6 @@ version = "0.4.0"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f"
|
checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f"
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "windows-sys"
|
|
||||||
version = "0.42.0"
|
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
checksum = "5a3e1820f08b8513f676f7ab6c1f99ff312fb97b553d30ff4dd86f9f15728aa7"
|
|
||||||
dependencies = [
|
|
||||||
"windows_aarch64_gnullvm 0.42.2",
|
|
||||||
"windows_aarch64_msvc 0.42.2",
|
|
||||||
"windows_i686_gnu 0.42.2",
|
|
||||||
"windows_i686_msvc 0.42.2",
|
|
||||||
"windows_x86_64_gnu 0.42.2",
|
|
||||||
"windows_x86_64_gnullvm 0.42.2",
|
|
||||||
"windows_x86_64_msvc 0.42.2",
|
|
||||||
]
|
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "windows-sys"
|
name = "windows-sys"
|
||||||
version = "0.45.0"
|
version = "0.45.0"
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
[package]
|
[package]
|
||||||
name = "rustlings"
|
name = "rustlings"
|
||||||
description = "Small exercises to get you used to reading and writing Rust code!"
|
description = "Small exercises to get you used to reading and writing Rust code!"
|
||||||
version = "5.6.1"
|
version = "5.5.1"
|
||||||
authors = [
|
authors = [
|
||||||
"Liv <mokou@fastmail.com>",
|
"Liv <mokou@fastmail.com>",
|
||||||
"Carol (Nichols || Goulding) <carol.nichols@gmail.com>",
|
"Carol (Nichols || Goulding) <carol.nichols@gmail.com>",
|
||||||
|
@ -9,6 +9,7 @@ authors = [
|
||||||
edition = "2021"
|
edition = "2021"
|
||||||
|
|
||||||
[dependencies]
|
[dependencies]
|
||||||
|
argh = "0.1"
|
||||||
indicatif = "0.17.6"
|
indicatif = "0.17.6"
|
||||||
console = "0.15"
|
console = "0.15"
|
||||||
notify = "4.0"
|
notify = "4.0"
|
||||||
|
|
19
README.md
19
README.md
|
@ -18,7 +18,7 @@ Alternatively, for a first-time Rust learner, there are several other resources:
|
||||||
_Note: If you're on MacOS, make sure you've installed Xcode and its developer tools by typing `xcode-select --install`._
|
_Note: If you're on MacOS, make sure you've installed Xcode and its developer tools by typing `xcode-select --install`._
|
||||||
_Note: If you're on Linux, make sure you've installed gcc. Deb: `sudo apt install gcc`. Yum: `sudo yum -y install gcc`._
|
_Note: If you're on Linux, make sure you've installed gcc. Deb: `sudo apt install gcc`. Yum: `sudo yum -y install gcc`._
|
||||||
|
|
||||||
You will need to have Rust installed. You can get it by visiting <https://rustup.rs>. This'll also install Cargo, Rust's package/project manager.
|
You will need to have Rust installed. You can get it by visiting https://rustup.rs. This'll also install Cargo, Rust's package/project manager.
|
||||||
|
|
||||||
## MacOS/Linux
|
## MacOS/Linux
|
||||||
|
|
||||||
|
@ -27,7 +27,6 @@ Just run:
|
||||||
```bash
|
```bash
|
||||||
curl -L https://raw.githubusercontent.com/rust-lang/rustlings/main/install.sh | bash
|
curl -L https://raw.githubusercontent.com/rust-lang/rustlings/main/install.sh | bash
|
||||||
```
|
```
|
||||||
|
|
||||||
Or if you want it to be installed to a different path:
|
Or if you want it to be installed to a different path:
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
|
@ -41,8 +40,8 @@ This will install Rustlings and give you access to the `rustlings` command. Run
|
||||||
Basically: Clone the repository at the latest tag, finally run `nix develop` or `nix-shell`.
|
Basically: Clone the repository at the latest tag, finally run `nix develop` or `nix-shell`.
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
# find out the latest version at https://github.com/rust-lang/rustlings/releases/latest (on edit 5.6.1)
|
# find out the latest version at https://github.com/rust-lang/rustlings/releases/latest (on edit 5.5.1)
|
||||||
git clone -b 5.6.1 --depth 1 https://github.com/rust-lang/rustlings
|
git clone -b 5.5.1 --depth 1 https://github.com/rust-lang/rustlings
|
||||||
cd rustlings
|
cd rustlings
|
||||||
# if nix version > 2.3
|
# if nix version > 2.3
|
||||||
nix develop
|
nix develop
|
||||||
|
@ -79,8 +78,8 @@ If you get a permission denied message, you might have to exclude the directory
|
||||||
Basically: Clone the repository at the latest tag, run `cargo install --path .`.
|
Basically: Clone the repository at the latest tag, run `cargo install --path .`.
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
# find out the latest version at https://github.com/rust-lang/rustlings/releases/latest (on edit 5.6.1)
|
# find out the latest version at https://github.com/rust-lang/rustlings/releases/latest (on edit 5.5.1)
|
||||||
git clone -b 5.6.1 --depth 1 https://github.com/rust-lang/rustlings
|
git clone -b 5.5.1 --depth 1 https://github.com/rust-lang/rustlings
|
||||||
cd rustlings
|
cd rustlings
|
||||||
cargo install --force --path .
|
cargo install --force --path .
|
||||||
```
|
```
|
||||||
|
@ -173,8 +172,12 @@ Now you should be done!
|
||||||
|
|
||||||
## Contributing
|
## Contributing
|
||||||
|
|
||||||
See [CONTRIBUTING.md](https://github.com/rust-lang/rustlings/blob/main/CONTRIBUTING.md).
|
See [CONTRIBUTING.md](./CONTRIBUTING.md).
|
||||||
|
|
||||||
|
Development-focused discussion about Rustlings happens in the [**rustlings** stream](https://rust-lang.zulipchat.com/#narrow/stream/334454-rustlings)
|
||||||
|
on the [Rust Project Zulip](https://rust-lang.zulipchat.com). Feel free to start a new thread there
|
||||||
|
if you have ideas or suggestions!
|
||||||
|
|
||||||
## Contributors ✨
|
## Contributors ✨
|
||||||
|
|
||||||
Thanks goes to the wonderful people listed in [AUTHORS.md](https://github.com/rust-lang/rustlings/blob/main/AUTHORS.md) 🎉
|
Thanks goes to the wonderful people listed in [AUTHORS.md](./AUTHORS.md) 🎉
|
||||||
|
|
|
@ -1,7 +1,8 @@
|
||||||
// clippy3.rs
|
// clippy3.rs
|
||||||
//
|
//
|
||||||
// Here's a couple more easy Clippy fixes, so you can see its utility.
|
// Here's a couple more easy Clippy fixes, so you can see its utility.
|
||||||
// No hints.
|
//
|
||||||
|
// Execute `rustlings hint clippy3` or use the `hint` watch subcommand for a hint.
|
||||||
|
|
||||||
// I AM NOT DONE
|
// I AM NOT DONE
|
||||||
|
|
||||||
|
|
|
@ -57,7 +57,7 @@ mod tests {
|
||||||
}
|
}
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn mut_box() {
|
fn mult_box() {
|
||||||
let mut num: Box<u32> = Box::new(3);
|
let mut num: Box<u32> = Box::new(3);
|
||||||
num_sq(&mut num);
|
num_sq(&mut num);
|
||||||
assert_eq!(*num, 9);
|
assert_eq!(*num, 9);
|
||||||
|
|
|
@ -20,7 +20,7 @@ struct State {
|
||||||
color: (u8, u8, u8),
|
color: (u8, u8, u8),
|
||||||
position: Point,
|
position: Point,
|
||||||
quit: bool,
|
quit: bool,
|
||||||
message: String,
|
message: String
|
||||||
}
|
}
|
||||||
|
|
||||||
impl State {
|
impl State {
|
||||||
|
@ -32,18 +32,17 @@ impl State {
|
||||||
self.quit = true;
|
self.quit = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
fn echo(&mut self, s: String) {
|
fn echo(&mut self, s: String) { self.message = s }
|
||||||
self.message = s
|
|
||||||
}
|
|
||||||
|
|
||||||
fn move_position(&mut self, p: Point) {
|
fn move_position(&mut self, p: Point) {
|
||||||
self.position = p;
|
self.position = p;
|
||||||
}
|
}
|
||||||
|
|
||||||
fn process(&mut self, message: Message) {
|
fn process(&mut self, message: Message) {
|
||||||
// TODO: create a match expression to process the different message variants
|
// TODO: create a match expression to process the different message
|
||||||
// Remember: When passing a tuple as a function argument, you'll need extra parentheses:
|
// variants
|
||||||
// fn function((t, u, p, l, e))
|
// Remember: When passing a tuple as a function argument, you'll need
|
||||||
|
// extra parentheses: fn function((t, u, p, l, e))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -60,7 +59,7 @@ mod tests {
|
||||||
message: "hello world".to_string(),
|
message: "hello world".to_string(),
|
||||||
};
|
};
|
||||||
state.process(Message::ChangeColor(255, 0, 255));
|
state.process(Message::ChangeColor(255, 0, 255));
|
||||||
state.process(Message::Echo(String::from("Hello world!")));
|
state.process(Message::Echo(String::from("hello world")));
|
||||||
state.process(Message::Move(Point { x: 10, y: 15 }));
|
state.process(Message::Move(Point { x: 10, y: 15 }));
|
||||||
state.process(Message::Quit);
|
state.process(Message::Quit);
|
||||||
|
|
||||||
|
@ -68,6 +67,6 @@ mod tests {
|
||||||
assert_eq!(state.position.x, 10);
|
assert_eq!(state.position.x, 10);
|
||||||
assert_eq!(state.position.y, 15);
|
assert_eq!(state.position.y, 15);
|
||||||
assert_eq!(state.quit, true);
|
assert_eq!(state.quit, true);
|
||||||
assert_eq!(state.message, "Hello world!");
|
assert_eq!(state.message, "hello world");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -11,7 +11,6 @@
|
||||||
|
|
||||||
// I AM NOT DONE
|
// I AM NOT DONE
|
||||||
|
|
||||||
#[test]
|
|
||||||
fn main() {
|
fn main() {
|
||||||
let my_fav_fruits = vec!["banana", "custard apple", "avocado", "peach", "raspberry"];
|
let my_fav_fruits = vec!["banana", "custard apple", "avocado", "peach", "raspberry"];
|
||||||
|
|
||||||
|
|
|
@ -5,19 +5,24 @@
|
||||||
|
|
||||||
// I AM NOT DONE
|
// I AM NOT DONE
|
||||||
|
|
||||||
#[test]
|
|
||||||
fn main() {
|
fn main() {
|
||||||
let vec0 = vec![22, 44, 66];
|
let vec0 = Vec::new();
|
||||||
|
|
||||||
let vec1 = fill_vec(vec0);
|
let vec1 = fill_vec(vec0);
|
||||||
|
|
||||||
assert_eq!(vec1, vec![22, 44, 66, 88]);
|
println!("{} has length {} content `{:?}`", "vec1", vec1.len(), vec1);
|
||||||
|
|
||||||
|
vec1.push(88);
|
||||||
|
|
||||||
|
println!("{} has length {} content `{:?}`", "vec1", vec1.len(), vec1);
|
||||||
}
|
}
|
||||||
|
|
||||||
fn fill_vec(vec: Vec<i32>) -> Vec<i32> {
|
fn fill_vec(vec: Vec<i32>) -> Vec<i32> {
|
||||||
let vec = vec;
|
let mut vec = vec;
|
||||||
|
|
||||||
vec.push(88);
|
vec.push(22);
|
||||||
|
vec.push(44);
|
||||||
|
vec.push(66);
|
||||||
|
|
||||||
vec
|
vec
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,26 +1,32 @@
|
||||||
// move_semantics2.rs
|
// move_semantics2.rs
|
||||||
//
|
//
|
||||||
// Make the test pass by finding a way to keep both Vecs separate!
|
// Expected output:
|
||||||
|
// vec0 has length 3, with contents `[22, 44, 66]`
|
||||||
|
// vec1 has length 4, with contents `[22, 44, 66, 88]`
|
||||||
//
|
//
|
||||||
// Execute `rustlings hint move_semantics2` or use the `hint` watch subcommand
|
// Execute `rustlings hint move_semantics2` or use the `hint` watch subcommand
|
||||||
// for a hint.
|
// for a hint.
|
||||||
|
|
||||||
// I AM NOT DONE
|
// I AM NOT DONE
|
||||||
|
|
||||||
#[test]
|
|
||||||
fn main() {
|
fn main() {
|
||||||
let vec0 = vec![22, 44, 66];
|
let vec0 = Vec::new();
|
||||||
|
|
||||||
let mut vec1 = fill_vec(vec0);
|
let mut vec1 = fill_vec(vec0);
|
||||||
|
|
||||||
assert_eq!(vec0, vec![22, 44, 66]);
|
println!("{} has length {}, with contents: `{:?}`", "vec0", vec0.len(), vec0);
|
||||||
assert_eq!(vec1, vec![22, 44, 66, 88]);
|
|
||||||
|
vec1.push(88);
|
||||||
|
|
||||||
|
println!("{} has length {}, with contents `{:?}`", "vec1", vec1.len(), vec1);
|
||||||
}
|
}
|
||||||
|
|
||||||
fn fill_vec(vec: Vec<i32>) -> Vec<i32> {
|
fn fill_vec(vec: Vec<i32>) -> Vec<i32> {
|
||||||
let mut vec = vec;
|
let mut vec = vec;
|
||||||
|
|
||||||
vec.push(88);
|
vec.push(22);
|
||||||
|
vec.push(44);
|
||||||
|
vec.push(66);
|
||||||
|
|
||||||
vec
|
vec
|
||||||
}
|
}
|
||||||
|
|
|
@ -8,17 +8,22 @@
|
||||||
|
|
||||||
// I AM NOT DONE
|
// I AM NOT DONE
|
||||||
|
|
||||||
#[test]
|
|
||||||
fn main() {
|
fn main() {
|
||||||
let vec0 = vec![22, 44, 66];
|
let vec0 = Vec::new();
|
||||||
|
|
||||||
let mut vec1 = fill_vec(vec0);
|
let mut vec1 = fill_vec(vec0);
|
||||||
|
|
||||||
assert_eq!(vec1, vec![22, 44, 66, 88]);
|
println!("{} has length {} content `{:?}`", "vec1", vec1.len(), vec1);
|
||||||
|
|
||||||
|
vec1.push(88);
|
||||||
|
|
||||||
|
println!("{} has length {} content `{:?}`", "vec1", vec1.len(), vec1);
|
||||||
}
|
}
|
||||||
|
|
||||||
fn fill_vec(vec: Vec<i32>) -> Vec<i32> {
|
fn fill_vec(vec: Vec<i32>) -> Vec<i32> {
|
||||||
vec.push(88);
|
vec.push(22);
|
||||||
|
vec.push(44);
|
||||||
|
vec.push(66);
|
||||||
|
|
||||||
vec
|
vec
|
||||||
}
|
}
|
||||||
|
|
|
@ -9,21 +9,25 @@
|
||||||
|
|
||||||
// I AM NOT DONE
|
// I AM NOT DONE
|
||||||
|
|
||||||
#[test]
|
|
||||||
fn main() {
|
fn main() {
|
||||||
let vec0 = vec![22, 44, 66];
|
let vec0 = Vec::new();
|
||||||
|
|
||||||
let mut vec1 = fill_vec(vec0);
|
let mut vec1 = fill_vec(vec0);
|
||||||
|
|
||||||
assert_eq!(vec1, vec![22, 44, 66, 88]);
|
println!("{} has length {} content `{:?}`", "vec1", vec1.len(), vec1);
|
||||||
|
|
||||||
|
vec1.push(88);
|
||||||
|
|
||||||
|
println!("{} has length {} content `{:?}`", "vec1", vec1.len(), vec1);
|
||||||
}
|
}
|
||||||
|
|
||||||
// `fill_vec()` no longer takes `vec: Vec<i32>` as argument - don't change this!
|
// `fill_vec()` no longer takes `vec: Vec<i32>` as argument
|
||||||
fn fill_vec() -> Vec<i32> {
|
fn fill_vec() -> Vec<i32> {
|
||||||
// Instead, let's create and fill the Vec in here - how do you do that?
|
|
||||||
let mut vec = vec;
|
let mut vec = vec;
|
||||||
|
|
||||||
vec.push(88);
|
vec.push(22);
|
||||||
|
vec.push(44);
|
||||||
|
vec.push(66);
|
||||||
|
|
||||||
vec
|
vec
|
||||||
}
|
}
|
||||||
|
|
|
@ -8,7 +8,6 @@
|
||||||
|
|
||||||
// I AM NOT DONE
|
// I AM NOT DONE
|
||||||
|
|
||||||
#[test]
|
|
||||||
fn main() {
|
fn main() {
|
||||||
let mut x = 100;
|
let mut x = 100;
|
||||||
let y = &mut x;
|
let y = &mut x;
|
||||||
|
|
|
@ -2,6 +2,9 @@
|
||||||
//
|
//
|
||||||
// Fill in the rest of the line that has code missing! No hints, there's no
|
// Fill in the rest of the line that has code missing! No hints, there's no
|
||||||
// tricks, just get used to typing these :)
|
// tricks, just get used to typing these :)
|
||||||
|
//
|
||||||
|
// Execute `rustlings hint primitive_types1` or use the `hint` watch subcommand
|
||||||
|
// for a hint.
|
||||||
|
|
||||||
// I AM NOT DONE
|
// I AM NOT DONE
|
||||||
|
|
||||||
|
|
|
@ -2,6 +2,9 @@
|
||||||
//
|
//
|
||||||
// Fill in the rest of the line that has code missing! No hints, there's no
|
// Fill in the rest of the line that has code missing! No hints, there's no
|
||||||
// tricks, just get used to typing these :)
|
// tricks, just get used to typing these :)
|
||||||
|
//
|
||||||
|
// Execute `rustlings hint primitive_types2` or use the `hint` watch subcommand
|
||||||
|
// for a hint.
|
||||||
|
|
||||||
// I AM NOT DONE
|
// I AM NOT DONE
|
||||||
|
|
||||||
|
|
|
@ -14,6 +14,5 @@ fn main() {
|
||||||
println!("Wow, that's a big array!");
|
println!("Wow, that's a big array!");
|
||||||
} else {
|
} else {
|
||||||
println!("Meh, I eat arrays like that for breakfast.");
|
println!("Meh, I eat arrays like that for breakfast.");
|
||||||
panic!("Array not big enough, more elements needed")
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -67,10 +67,10 @@ mod tests {
|
||||||
#[test]
|
#[test]
|
||||||
fn owned_mutation() -> Result<(), &'static str> {
|
fn owned_mutation() -> Result<(), &'static str> {
|
||||||
// Of course this is also the case if a mutation does occur. In this
|
// Of course this is also the case if a mutation does occur. In this
|
||||||
// case the call to `to_mut()` in the abs_all() function returns a
|
// case the call to `to_mut()` returns a reference to the same data as
|
||||||
// reference to the same data as before.
|
// before.
|
||||||
let slice = vec![-1, 0, 1];
|
let slice = vec![-1, 0, 1];
|
||||||
let mut input = Cow::from(slice);
|
let mut input = Cow::from(slice).to_mut();
|
||||||
match abs_all(&mut input) {
|
match abs_all(&mut input) {
|
||||||
// TODO
|
// TODO
|
||||||
}
|
}
|
||||||
|
|
|
@ -35,7 +35,6 @@ impl Planet {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#[test]
|
|
||||||
fn main() {
|
fn main() {
|
||||||
let sun = Rc::new(Sun {});
|
let sun = Rc::new(Sun {});
|
||||||
println!("reference count = {}", Rc::strong_count(&sun)); // 1 reference
|
println!("reference count = {}", Rc::strong_count(&sun)); // 1 reference
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
# Threads
|
# Threads
|
||||||
|
|
||||||
In most current operating systems, an executed program's code is run in a process, and the operating system manages multiple processes at once.
|
In most current operating systems, an executed program’s code is run in a process, and the operating system manages multiple processes at once.
|
||||||
Within your program, you can also have independent parts that run simultaneously. The features that run these independent parts are called threads.
|
Within your program, you can also have independent parts that run simultaneously. The features that run these independent parts are called threads.
|
||||||
|
|
||||||
## Further information
|
## Further information
|
||||||
|
|
|
@ -48,7 +48,6 @@ fn send_tx(q: Queue, tx: mpsc::Sender<u32>) -> () {
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
#[test]
|
|
||||||
fn main() {
|
fn main() {
|
||||||
let (tx, rx) = mpsc::channel();
|
let (tx, rx) = mpsc::channel();
|
||||||
let queue = Queue::new();
|
let queue = Queue::new();
|
||||||
|
|
36
flake.lock
36
flake.lock
|
@ -3,11 +3,11 @@
|
||||||
"flake-compat": {
|
"flake-compat": {
|
||||||
"flake": false,
|
"flake": false,
|
||||||
"locked": {
|
"locked": {
|
||||||
"lastModified": 1673956053,
|
"lastModified": 1650374568,
|
||||||
"narHash": "sha256-4gtG9iQuiKITOjNQQeQIpoIB6b16fm+504Ch3sNKLd8=",
|
"narHash": "sha256-Z+s0J8/r907g149rllvwhb4pKi8Wam5ij0st8PwAh+E=",
|
||||||
"owner": "edolstra",
|
"owner": "edolstra",
|
||||||
"repo": "flake-compat",
|
"repo": "flake-compat",
|
||||||
"rev": "35bb57c0c8d8b62bbfd284272c928ceb64ddbde9",
|
"rev": "b4a34015c698c7793d592d66adbab377907a2be8",
|
||||||
"type": "github"
|
"type": "github"
|
||||||
},
|
},
|
||||||
"original": {
|
"original": {
|
||||||
|
@ -17,15 +17,12 @@
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"flake-utils": {
|
"flake-utils": {
|
||||||
"inputs": {
|
|
||||||
"systems": "systems"
|
|
||||||
},
|
|
||||||
"locked": {
|
"locked": {
|
||||||
"lastModified": 1692799911,
|
"lastModified": 1659877975,
|
||||||
"narHash": "sha256-3eihraek4qL744EvQXsK1Ha6C3CR7nnT8X2qWap4RNk=",
|
"narHash": "sha256-zllb8aq3YO3h8B/U0/J1WBgAL8EX5yWf5pMj3G0NAmc=",
|
||||||
"owner": "numtide",
|
"owner": "numtide",
|
||||||
"repo": "flake-utils",
|
"repo": "flake-utils",
|
||||||
"rev": "f9e7cf818399d17d347f847525c5a5a8032e4e44",
|
"rev": "c0e246b9b83f637f4681389ecabcb2681b4f3af0",
|
||||||
"type": "github"
|
"type": "github"
|
||||||
},
|
},
|
||||||
"original": {
|
"original": {
|
||||||
|
@ -36,11 +33,11 @@
|
||||||
},
|
},
|
||||||
"nixpkgs": {
|
"nixpkgs": {
|
||||||
"locked": {
|
"locked": {
|
||||||
"lastModified": 1694183432,
|
"lastModified": 1666629043,
|
||||||
"narHash": "sha256-YyPGNapgZNNj51ylQMw9lAgvxtM2ai1HZVUu3GS8Fng=",
|
"narHash": "sha256-Yoq6Ut2F3Ol73yO9hG93x6ts5c4F5BhKTbcF3DtBEAw=",
|
||||||
"owner": "nixos",
|
"owner": "nixos",
|
||||||
"repo": "nixpkgs",
|
"repo": "nixpkgs",
|
||||||
"rev": "db9208ab987cdeeedf78ad9b4cf3c55f5ebd269b",
|
"rev": "b39fd6e4edef83cb4a135ebef98751ce23becc33",
|
||||||
"type": "github"
|
"type": "github"
|
||||||
},
|
},
|
||||||
"original": {
|
"original": {
|
||||||
|
@ -56,21 +53,6 @@
|
||||||
"flake-utils": "flake-utils",
|
"flake-utils": "flake-utils",
|
||||||
"nixpkgs": "nixpkgs"
|
"nixpkgs": "nixpkgs"
|
||||||
}
|
}
|
||||||
},
|
|
||||||
"systems": {
|
|
||||||
"locked": {
|
|
||||||
"lastModified": 1681028828,
|
|
||||||
"narHash": "sha256-Vy1rq5AaRuLzOxct8nz4T6wlgyUR7zLU309k9mBC768=",
|
|
||||||
"owner": "nix-systems",
|
|
||||||
"repo": "default",
|
|
||||||
"rev": "da67096a3b9bf56a91d16901293e51ba5b49a27e",
|
|
||||||
"type": "github"
|
|
||||||
},
|
|
||||||
"original": {
|
|
||||||
"owner": "nix-systems",
|
|
||||||
"repo": "default",
|
|
||||||
"type": "github"
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"root": "root",
|
"root": "root",
|
||||||
|
|
|
@ -22,7 +22,7 @@
|
||||||
rustlings =
|
rustlings =
|
||||||
pkgs.rustPlatform.buildRustPackage {
|
pkgs.rustPlatform.buildRustPackage {
|
||||||
name = "rustlings";
|
name = "rustlings";
|
||||||
version = "5.6.1";
|
version = "5.5.1";
|
||||||
|
|
||||||
buildInputs = cargoBuildInputs;
|
buildInputs = cargoBuildInputs;
|
||||||
nativeBuildInputs = [pkgs.git];
|
nativeBuildInputs = [pkgs.git];
|
||||||
|
|
42
info.toml
42
info.toml
|
@ -217,7 +217,7 @@ mode = "test"
|
||||||
hint = """
|
hint = """
|
||||||
Take a look at the Understanding Ownership -> Slices -> Other Slices section of the book:
|
Take a look at the Understanding Ownership -> Slices -> Other Slices section of the book:
|
||||||
https://doc.rust-lang.org/book/ch04-03-slices.html
|
https://doc.rust-lang.org/book/ch04-03-slices.html
|
||||||
and use the starting and ending (plus one) indices of the items in the Array
|
and use the starting and ending indices of the items in the Array
|
||||||
that you want to end up in the slice.
|
that you want to end up in the slice.
|
||||||
|
|
||||||
If you're curious why the first argument of `assert_eq!` does not
|
If you're curious why the first argument of `assert_eq!` does not
|
||||||
|
@ -268,14 +268,15 @@ name = "vecs2"
|
||||||
path = "exercises/vecs/vecs2.rs"
|
path = "exercises/vecs/vecs2.rs"
|
||||||
mode = "test"
|
mode = "test"
|
||||||
hint = """
|
hint = """
|
||||||
In the first function we are looping over the Vector and getting a reference to one `element` at a time.
|
Hint 1: In the code, the variable `element` represents an item from the Vec as it is being iterated.
|
||||||
To modify the value of that `element` we need to use the * dereference operator. You can learn more in this chapter of the Rust book:
|
Can you try multiplying this?
|
||||||
https://doc.rust-lang.org/stable/book/ch08-01-vectors.html#iterating-over-the-values-in-a-vector
|
|
||||||
|
|
||||||
In the second function this dereferencing is not necessary, because the map function expects the new value to be returned.
|
Hint 2: For the first function, there's a way to directly access the numbers stored
|
||||||
|
in the Vec, using the * dereference operator. You can both access and write to the
|
||||||
|
number that way.
|
||||||
|
|
||||||
After you've completed both functions, decide for yourself which approach you like better.
|
After you've completed both functions, decide for yourself which approach you like
|
||||||
What do you think is the more commonly used pattern under Rust developers?
|
better. What do you think is the more commonly used pattern under Rust developers?
|
||||||
"""
|
"""
|
||||||
|
|
||||||
# MOVE SEMANTICS
|
# MOVE SEMANTICS
|
||||||
|
@ -283,9 +284,9 @@ What do you think is the more commonly used pattern under Rust developers?
|
||||||
[[exercises]]
|
[[exercises]]
|
||||||
name = "move_semantics1"
|
name = "move_semantics1"
|
||||||
path = "exercises/move_semantics/move_semantics1.rs"
|
path = "exercises/move_semantics/move_semantics1.rs"
|
||||||
mode = "test"
|
mode = "compile"
|
||||||
hint = """
|
hint = """
|
||||||
So you've got the "cannot borrow immutable local variable `vec` as mutable" error on the line
|
So you've got the "cannot borrow immutable local variable `vec1` as mutable" error on the line
|
||||||
where we push an element to the vector, right?
|
where we push an element to the vector, right?
|
||||||
The fix for this is going to be adding one keyword, and the addition is NOT on the line where
|
The fix for this is going to be adding one keyword, and the addition is NOT on the line where
|
||||||
we push to the vector (where the error is).
|
we push to the vector (where the error is).
|
||||||
|
@ -295,7 +296,7 @@ Also: Try accessing `vec0` after having called `fill_vec()`. See what happens!""
|
||||||
[[exercises]]
|
[[exercises]]
|
||||||
name = "move_semantics2"
|
name = "move_semantics2"
|
||||||
path = "exercises/move_semantics/move_semantics2.rs"
|
path = "exercises/move_semantics/move_semantics2.rs"
|
||||||
mode = "test"
|
mode = "compile"
|
||||||
hint = """
|
hint = """
|
||||||
When running this exercise for the first time, you'll notice an error about
|
When running this exercise for the first time, you'll notice an error about
|
||||||
"borrow of moved value". In Rust, when an argument is passed to a function and
|
"borrow of moved value". In Rust, when an argument is passed to a function and
|
||||||
|
@ -308,12 +309,16 @@ Rust provides a couple of different ways to mitigate this issue, feel free to tr
|
||||||
2. Make `fill_vec` borrow its argument instead of taking ownership of it,
|
2. Make `fill_vec` borrow its argument instead of taking ownership of it,
|
||||||
and then copy the data within the function (`vec.clone()`) in order to return an owned
|
and then copy the data within the function (`vec.clone()`) in order to return an owned
|
||||||
`Vec<i32>`.
|
`Vec<i32>`.
|
||||||
|
3. Or, you could make `fill_vec` *mutably* borrow a reference to its argument (which will need to be
|
||||||
|
mutable), modify it directly, then not return anything. This means that `vec0` will change over the
|
||||||
|
course of the function, and makes `vec1` redundant (make sure to change the parameters of the `println!`
|
||||||
|
statements if you go this route)
|
||||||
"""
|
"""
|
||||||
|
|
||||||
[[exercises]]
|
[[exercises]]
|
||||||
name = "move_semantics3"
|
name = "move_semantics3"
|
||||||
path = "exercises/move_semantics/move_semantics3.rs"
|
path = "exercises/move_semantics/move_semantics3.rs"
|
||||||
mode = "test"
|
mode = "compile"
|
||||||
hint = """
|
hint = """
|
||||||
The difference between this one and the previous ones is that the first line
|
The difference between this one and the previous ones is that the first line
|
||||||
of `fn fill_vec` that had `let mut vec = vec;` is no longer there. You can,
|
of `fn fill_vec` that had `let mut vec = vec;` is no longer there. You can,
|
||||||
|
@ -323,7 +328,7 @@ an existing binding to be a mutable binding instead of an immutable one :)"""
|
||||||
[[exercises]]
|
[[exercises]]
|
||||||
name = "move_semantics4"
|
name = "move_semantics4"
|
||||||
path = "exercises/move_semantics/move_semantics4.rs"
|
path = "exercises/move_semantics/move_semantics4.rs"
|
||||||
mode = "test"
|
mode = "compile"
|
||||||
hint = """
|
hint = """
|
||||||
Stop reading whenever you feel like you have enough direction :) Or try
|
Stop reading whenever you feel like you have enough direction :) Or try
|
||||||
doing one step and then fixing the compiler errors that result!
|
doing one step and then fixing the compiler errors that result!
|
||||||
|
@ -332,12 +337,12 @@ So the end goal is to:
|
||||||
- so then `vec0` doesn't exist, so we can't pass it to `fill_vec`
|
- so then `vec0` doesn't exist, so we can't pass it to `fill_vec`
|
||||||
- `fill_vec` has had its signature changed, which our call should reflect
|
- `fill_vec` has had its signature changed, which our call should reflect
|
||||||
- since we're not creating a new vec in `main` anymore, we need to create
|
- since we're not creating a new vec in `main` anymore, we need to create
|
||||||
a new vec in `fill_vec`, and fill it with the expected values"""
|
a new vec in `fill_vec`, similarly to the way we did in `main`"""
|
||||||
|
|
||||||
[[exercises]]
|
[[exercises]]
|
||||||
name = "move_semantics5"
|
name = "move_semantics5"
|
||||||
path = "exercises/move_semantics/move_semantics5.rs"
|
path = "exercises/move_semantics/move_semantics5.rs"
|
||||||
mode = "test"
|
mode = "compile"
|
||||||
hint = """
|
hint = """
|
||||||
Carefully reason about the range in which each mutable reference is in
|
Carefully reason about the range in which each mutable reference is in
|
||||||
scope. Does it help to update the value of referent (x) immediately after
|
scope. Does it help to update the value of referent (x) immediately after
|
||||||
|
@ -443,7 +448,8 @@ mode = "compile"
|
||||||
hint = """
|
hint = """
|
||||||
Yes, it would be really easy to fix this by just changing the value bound to `word` to be a
|
Yes, it would be really easy to fix this by just changing the value bound to `word` to be a
|
||||||
string slice instead of a `String`, wouldn't it?? There is a way to add one character to the
|
string slice instead of a `String`, wouldn't it?? There is a way to add one character to the
|
||||||
if statement, though, that will coerce the `String` into a string slice.
|
line with the function call `is_a_color_word`, though, that will coerce the `String` into a
|
||||||
|
string slice.
|
||||||
|
|
||||||
Side note: If you're interested in learning about how this kind of reference conversion works, you can jump ahead in the book and read this part in the smart pointers chapter: https://doc.rust-lang.org/stable/book/ch15-02-deref.html#implicit-deref-coercions-with-functions-and-methods"""
|
Side note: If you're interested in learning about how this kind of reference conversion works, you can jump ahead in the book and read this part in the smart pointers chapter: https://doc.rust-lang.org/stable/book/ch15-02-deref.html#implicit-deref-coercions-with-functions-and-methods"""
|
||||||
|
|
||||||
|
@ -827,7 +833,7 @@ https://doc.rust-lang.org/stable/book/ch11-01-writing-tests.html#checking-for-pa
|
||||||
[[exercises]]
|
[[exercises]]
|
||||||
name = "iterators1"
|
name = "iterators1"
|
||||||
path = "exercises/iterators/iterators1.rs"
|
path = "exercises/iterators/iterators1.rs"
|
||||||
mode = "test"
|
mode = "compile"
|
||||||
hint = """
|
hint = """
|
||||||
Step 1:
|
Step 1:
|
||||||
We need to apply something to the collection `my_fav_fruits` before we start to go through
|
We need to apply something to the collection `my_fav_fruits` before we start to go through
|
||||||
|
@ -932,7 +938,7 @@ and try other types!
|
||||||
[[exercises]]
|
[[exercises]]
|
||||||
name = "rc1"
|
name = "rc1"
|
||||||
path = "exercises/smart_pointers/rc1.rs"
|
path = "exercises/smart_pointers/rc1.rs"
|
||||||
mode = "test"
|
mode = "compile"
|
||||||
hint = """
|
hint = """
|
||||||
This is a straightforward exercise to use the Rc<T> type. Each Planet has
|
This is a straightforward exercise to use the Rc<T> type. Each Planet has
|
||||||
ownership of the Sun, and uses Rc::clone() to increment the reference count of the Sun.
|
ownership of the Sun, and uses Rc::clone() to increment the reference count of the Sun.
|
||||||
|
@ -1021,7 +1027,7 @@ what you've learned :)"""
|
||||||
[[exercises]]
|
[[exercises]]
|
||||||
name = "threads3"
|
name = "threads3"
|
||||||
path = "exercises/threads/threads3.rs"
|
path = "exercises/threads/threads3.rs"
|
||||||
mode = "test"
|
mode = "compile"
|
||||||
hint = """
|
hint = """
|
||||||
An alternate way to handle concurrency between threads is to use
|
An alternate way to handle concurrency between threads is to use
|
||||||
a mpsc (multiple producer, single consumer) channel to communicate.
|
a mpsc (multiple producer, single consumer) channel to communicate.
|
||||||
|
|
|
@ -12,13 +12,14 @@
|
||||||
},
|
},
|
||||||
"components": {
|
"components": {
|
||||||
"artifacts": {
|
"artifacts": {
|
||||||
"auto": true,
|
"cargo_dist": false,
|
||||||
"package_managers": {
|
"package_managers": {
|
||||||
"preferred": {
|
"preferred": {
|
||||||
"macos/linux/unix": "curl -L https://raw.githubusercontent.com/rust-lang/rustlings/main/install.sh | bash",
|
"macos/linux/unix": "curl -L https://raw.githubusercontent.com/rust-lang/rustlings/main/install.sh | bash",
|
||||||
"windows": "Start-BitsTransfer -Source https://raw.githubusercontent.com/rust-lang/rustlings/main/install.ps1 -Destination $env:TMP/install_rustlings.ps1; Unblock-File $env:TMP/install_rustlings.ps1; Invoke-Expression $env:TMP/install_rustlings.ps1"
|
"windows": "Start-BitsTransfer -Source https://raw.githubusercontent.com/rust-lang/rustlings/main/install.ps1 -Destination $env:TMP/install_rustlings.ps1; Unblock-File $env:TMP/install_rustlings.ps1; Invoke-Expression $env:TMP/install_rustlings.ps1"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
},
|
||||||
|
"changelog": true
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue