Compare commits

..

318 Commits

Author SHA1 Message Date
liv 06f865307f
Merge pull request #1683 from rust-lang/all-contributors/add-OfirLauber
docs: add OfirLauber as a contributor for content
2023-09-21 12:12:36 +02:00
allcontributors[bot] f86a3c5ddc
docs: update .all-contributorsrc [skip ci] 2023-09-21 10:01:31 +00:00
allcontributors[bot] 666857dc4e
docs: update AUTHORS.md [skip ci] 2023-09-21 10:01:30 +00:00
liv 1552822404
Merge pull request #1682 from OfirLauber/main
chore: fix comment in enums3.rs
2023-09-21 12:01:16 +02:00
Ofir Lauber 83ac243c00 chore: fix comment in enums3.rs 2023-09-21 01:54:11 +03:00
liv 9a743f80c5 release: 5.6.1 2023-09-18 10:16:05 +02:00
liv 170aaabe9b
Merge pull request #1673 from husjon/fix-enums3-formatting
Fixed formatting of `enums3` with rustfmt
2023-09-18 10:07:39 +02:00
liv ef122c9973
Merge pull request #1681 from rust-lang/all-contributors/add-jurglic
docs: add jurglic as a contributor for content
2023-09-18 10:06:13 +02:00
allcontributors[bot] 8e8c74c6c0
docs: update .all-contributorsrc [skip ci] 2023-09-18 08:05:52 +00:00
allcontributors[bot] a38840ae92
docs: update AUTHORS.md [skip ci] 2023-09-18 08:05:51 +00:00
liv 2e48fe9cc7
Merge pull request #1675 from jurglic/fix-rand-typo
fix: test name typo
2023-09-18 10:05:37 +02:00
liv 3b451e4ab1
Merge pull request #1680 from rust-lang/all-contributors/add-krmpotic
docs: add krmpotic as a contributor for content
2023-09-18 10:03:57 +02:00
allcontributors[bot] 746180b153
docs: update .all-contributorsrc [skip ci] 2023-09-18 08:03:49 +00:00
allcontributors[bot] 62415f758b
docs: update AUTHORS.md [skip ci] 2023-09-18 08:03:48 +00:00
liv 0807353bf0
Merge pull request #1678 from krmpotic/main
remove hint comments when no hint exists
2023-09-18 10:03:35 +02:00
liv a808cf71a3
Merge pull request #1679 from rust-lang/revert-1620-fix_1611
Revert "Fix 1611"
2023-09-18 09:54:20 +02:00
liv 8716558696
Revert "Fix 1611" 2023-09-18 09:54:08 +02:00
Luka Krmpotic eb84eaf151 remove hint comments when no hint exists 2023-09-15 22:29:55 +02:00
Jurglic a0699bd917 fix: test name typo 2023-09-14 17:10:06 +02:00
Jon Erling Hustadnes 0ee9c5b776 Fixed formatting with rust-analyzer 2023-09-13 20:26:47 +02:00
liv 51c8da06b0
Merge pull request #1672 from rust-lang/all-contributors/add-CobaltCause
docs: add CobaltCause as a contributor for infra
2023-09-12 10:57:20 +02:00
allcontributors[bot] 95640cba23
docs: update .all-contributorsrc [skip ci] 2023-09-12 08:57:12 +00:00
allcontributors[bot] 241889159a
docs: update AUTHORS.md [skip ci] 2023-09-12 08:57:11 +00:00
liv edb8813cc7
Merge pull request #1671 from CobaltCause/nix-flake-update
chore: update flake.lock
2023-09-12 10:56:54 +02:00
Charles Hall 4a1290cb66
chore: update flake.lock
Flake lock file updates:

• Updated input 'flake-compat':
    'github:edolstra/flake-compat/b4a34015c698c7793d592d66adbab377907a2be8' (2022-04-19)
  → 'github:edolstra/flake-compat/35bb57c0c8d8b62bbfd284272c928ceb64ddbde9' (2023-01-17)
• Updated input 'flake-utils':
    'github:numtide/flake-utils/c0e246b9b83f637f4681389ecabcb2681b4f3af0' (2022-08-07)
  → 'github:numtide/flake-utils/f9e7cf818399d17d347f847525c5a5a8032e4e44' (2023-08-23)
• Added input 'flake-utils/systems':
    'github:nix-systems/default/da67096a3b9bf56a91d16901293e51ba5b49a27e' (2023-04-09)
• Updated input 'nixpkgs':
    'github:nixos/nixpkgs/b39fd6e4edef83cb4a135ebef98751ce23becc33' (2022-10-24)
  → 'github:nixos/nixpkgs/db9208ab987cdeeedf78ad9b4cf3c55f5ebd269b' (2023-09-08)
2023-09-11 20:04:37 -07:00
liv d52ce2d354
Merge pull request #1670 from rust-lang/all-contributors/add-husjon
docs: add husjon as a contributor for content
2023-09-09 14:58:45 +02:00
allcontributors[bot] b33ef03ac6
docs: update .all-contributorsrc [skip ci] 2023-09-09 12:58:36 +00:00
allcontributors[bot] dceba07e82
docs: update AUTHORS.md [skip ci] 2023-09-09 12:58:35 +00:00
liv e12504a61d
Merge pull request #1667 from husjon/update-primitive_types3-requirement
Make `primitive_types3` require at least 100 elements
2023-09-09 14:58:14 +02:00
liv 9de22c9afa
Merge pull request #1669 from rust-lang/all-contributors/add-ob
docs: add ob as a contributor for content
2023-09-09 01:23:54 +02:00
allcontributors[bot] e17d603201
docs: update .all-contributorsrc [skip ci] 2023-09-08 23:23:32 +00:00
allcontributors[bot] 47fbd6d160
docs: update AUTHORS.md [skip ci] 2023-09-08 23:23:31 +00:00
liv 9dc8f13925
Merge pull request #1668 from ob/ob/fix-bug
Fix compiler error and clarify instructions
2023-09-09 01:23:15 +02:00
Oscar Bonilla 33a4f4e454 Fix compiler error and clarify instructions 2023-09-08 09:49:11 -07:00
Jon Erling Hustadnes a5e4133516
Make primitive_types3 require at least 100 elements
Made the function panic if it's not long enough
2023-09-08 16:42:16 +02:00
liv 4d04aad890
Merge pull request #1641 from mo8it/move-semantics5-test
Convert exercises with assertions to tests
2023-09-06 09:31:46 +02:00
liv 847b57423f update for page build 2023-09-04 15:26:22 +02:00
liv 58cabf2ebd release: 5.6.0 2023-09-04 15:23:04 +02:00
liv ae28d2fa2d
Merge pull request #1665 from rust-lang/chore/better-ci
chore: consolidate CI workflows
2023-09-04 15:02:14 +02:00
liv de45998f69 chore: remove argh 2023-09-04 15:02:02 +02:00
liv 0d36050b36 chore: remove link checker 2023-09-04 14:58:13 +02:00
liv f31a18429b chore: consolidate CI workflows 2023-09-04 14:57:16 +02:00
liv 3ad30308ec feat: add oranda deploy workflow 2023-09-04 14:50:31 +02:00
liv 6c0c397507 fix: absolut-ize readme links 2023-09-04 14:49:52 +02:00
liv 42da308140
Merge pull request #1664 from rust-lang/all-contributors/add-Jak-Ch-ll
docs: add Jak-Ch-ll as a contributor for content
2023-09-04 14:39:54 +02:00
allcontributors[bot] 680a32a85c
docs: update .all-contributorsrc [skip ci] 2023-09-04 12:39:46 +00:00
allcontributors[bot] 951dde4e94
docs: update AUTHORS.md [skip ci] 2023-09-04 12:39:45 +00:00
liv 14fbdd20ac
Merge pull request #1473 from Jak-Ch-ll/update-hints-for-vecs2
docs(vecs2): update hints
2023-09-04 14:39:28 +02:00
liv ad0fad4218
Merge branch 'main' into update-hints-for-vecs2 2023-09-04 14:39:16 +02:00
liv a5fe578e79
Merge pull request #1663 from rust-lang/all-contributors/add-pksadiq
docs: add pksadiq as a contributor for content
2023-09-04 14:38:06 +02:00
allcontributors[bot] d5525794f8
docs: update .all-contributorsrc [skip ci] 2023-09-04 12:37:58 +00:00
allcontributors[bot] 3f7ef6fe33
docs: update AUTHORS.md [skip ci] 2023-09-04 12:37:56 +00:00
liv 992e5163d3
Merge pull request #1565 from pksadiq/fix-enum3-message-modification
fix(enums3): modify message string in test
2023-09-04 14:37:44 +02:00
liv d03f624357
Merge pull request #1662 from rust-lang/all-contributors/add-bean5
docs: add bean5 as a contributor for content
2023-09-04 14:35:42 +02:00
allcontributors[bot] b547321868
docs: update .all-contributorsrc [skip ci] 2023-09-04 12:35:35 +00:00
allcontributors[bot] 9a0e5bd003
docs: update AUTHORS.md [skip ci] 2023-09-04 12:35:34 +00:00
liv c57ad35e5b
Merge pull request #1477 from bean5/main
small changes to a few README files
2023-09-04 14:35:15 +02:00
liv f7ef198e3a
Merge pull request #1661 from rust-lang/all-contributors/add-willhack
docs: add willhack as a contributor for content
2023-09-04 14:34:46 +02:00
allcontributors[bot] fcac2b553c
docs: update .all-contributorsrc [skip ci] 2023-09-04 12:34:38 +00:00
allcontributors[bot] e8c2d27b4a
docs: update AUTHORS.md [skip ci] 2023-09-04 12:34:37 +00:00
liv 630cbf8f85
Merge pull request #1587 from willhack/chore/update-hints
chore: update line reference in strings2 hint
2023-09-04 14:34:20 +02:00
liv 0aa9418736
Merge branch 'main' into chore/update-hints 2023-09-04 14:34:13 +02:00
liv abc3013096
Merge pull request #1660 from rust-lang/fix/move-semantics-tests
fix: refactor move semantics 1-4 into tests
2023-09-04 14:32:01 +02:00
liv 51e237d5f9 fix: refactor move semantics 1-4 into tests 2023-09-04 14:29:06 +02:00
liv 6eb9bde786
Merge pull request #1659 from rust-lang/all-contributors/add-yamila-moreno
docs: add yamila-moreno as a contributor for content
2023-09-04 13:58:37 +02:00
allcontributors[bot] dce89aefb9
docs: update .all-contributorsrc [skip ci] 2023-09-04 11:58:25 +00:00
allcontributors[bot] 47e14cff8d
docs: update AUTHORS.md [skip ci] 2023-09-04 11:58:24 +00:00
liv 4d9b68b377
Merge pull request #1598 from yamila-moreno/fix/hint-in-primitives-4
fix(primitives-4.rs): update hint so it's less confusing
2023-09-04 13:58:05 +02:00
liv a8f4994935
Merge pull request #1658 from rust-lang/all-contributors/add-szabgab
docs: add szabgab as a contributor for content
2023-09-04 13:55:38 +02:00
allcontributors[bot] 8ca60f2cbb
docs: update .all-contributorsrc [skip ci] 2023-09-04 11:55:28 +00:00
allcontributors[bot] bb550497d5
docs: update AUTHORS.md [skip ci] 2023-09-04 11:55:27 +00:00
liv 849e4a3647
Merge pull request #1599 from szabgab/if1-test-case
add test-case to if/if1 to check equal values
2023-09-04 13:55:10 +02:00
liv c177507db3
Merge pull request #1610 from jrcarl624/patch-1
Updated if3.rs: Added a note that states that the test does not need to be changed.
2023-09-04 13:54:20 +02:00
liv a09a0c47ae fix: add extra line in if3 comment 2023-09-04 13:53:54 +02:00
liv a26c396335
Merge pull request #1657 from rust-lang/all-contributors/add-mkovaxx
docs: add mkovaxx as a contributor for content
2023-09-04 13:52:22 +02:00
allcontributors[bot] 4aa5ca2818
docs: update .all-contributorsrc [skip ci] 2023-09-04 11:52:13 +00:00
allcontributors[bot] 27881a83d4
docs: update AUTHORS.md [skip ci] 2023-09-04 11:52:11 +00:00
liv 6378c2a81f
Merge pull request #1620 from mkovaxx/fix_1611
Fix 1611
2023-09-04 13:51:57 +02:00
liv 45cadcf020
Merge pull request #1656 from rust-lang/all-contributors/add-gabay
docs: add gabay as a contributor for content
2023-09-04 13:46:50 +02:00
allcontributors[bot] 7d53abdb0a
docs: update .all-contributorsrc [skip ci] 2023-09-04 11:46:42 +00:00
allcontributors[bot] a059ded709
docs: update AUTHORS.md [skip ci] 2023-09-04 11:46:41 +00:00
liv 4de3b4a635
Merge pull request #1630 from gabay/chore/threads2-text
info.toml: update threads2 text.
2023-09-04 13:46:28 +02:00
liv 64162d3a24
Merge pull request #1649 from x10an14/main
improvement(development): Add nix-direnv integration
2023-09-04 13:42:52 +02:00
liv 626e2749a6
Merge pull request #1650 from x10an14/fork/add-flake-outputs
feat(flake): Add defaults to commands in flake
2023-09-04 13:41:37 +02:00
liv b39d896db7
Merge pull request #1655 from rust-lang/all-contributors/add-x10an14
docs: add x10an14 as a contributor for infra
2023-09-04 13:37:20 +02:00
allcontributors[bot] 4a9699226a
docs: update .all-contributorsrc [skip ci] 2023-09-04 11:37:10 +00:00
allcontributors[bot] 11f4ec93ac
docs: update AUTHORS.md [skip ci] 2023-09-04 11:37:09 +00:00
liv e57797a8ff
Merge pull request #1653 from x10an14/fork/fix-nix-build-of-reset-test
fix(nix/tests): Add `git` to Nix's rust build/test sandbox
2023-09-04 13:36:24 +02:00
liv 0b7975b195
Merge pull request #1633 from mo8it/clap
Port to Clap
2023-09-04 13:35:33 +02:00
mo8it 362318a6e0 Adapt tests 2023-09-04 13:30:49 +02:00
mo8it 5a93f2a4f1 Port to Clap 2023-09-04 13:30:46 +02:00
x10an14 e7bdc83a8f
fix(nix/tests): Add `git` to Nix's rust build/test sandbox
The integration test `reset_single_exercise` depends on Git...
2023-08-30 19:41:29 +02:00
x10an14 60b8487600
feat(flake): Add defaults to commands in flake
So that:
- `nix build .#`, and
- `nix run .#` both work.
2023-08-30 18:09:41 +02:00
x10an14 013f22c89c
improvement(development): Add nix-direnv integration
So as to automatically open a nix devShell for those who use direnv/want to use direnv to make their lives more automated.
2023-08-30 18:03:45 +02:00
liv 2d1da2ab57
Merge pull request #1645 from mo8it/prober-types-structs3
Use u32 instead of i32
2023-08-29 10:20:36 +02:00
mo8it 9c0581bc0f Use u32 instead of i32 2023-08-29 00:52:11 +02:00
liv d79984dbda
Merge pull request #1637 from mo8it/fix-warnings
Run clippy --fix
2023-08-28 13:38:21 +02:00
liv c2eaa8f019
Merge pull request #1638 from mo8it/fix-line-numbers
Avoid line numbers in hints
2023-08-28 13:38:02 +02:00
liv 6c517199bf
Merge pull request #1644 from rust-lang/all-contributors/add-mo8it
docs: add mo8it as a contributor for code
2023-08-28 13:37:42 +02:00
allcontributors[bot] d258c30406
docs: update .all-contributorsrc [skip ci] 2023-08-28 11:37:34 +00:00
allcontributors[bot] 7bb69f8641
docs: update AUTHORS.md [skip ci] 2023-08-28 11:37:33 +00:00
liv c1051f3f52
Merge pull request #1639 from mo8it/update-deps
Update deps
2023-08-28 13:37:20 +02:00
mo8it 193b600382 Convert other exercises that have assertions to test mode 2023-08-27 01:06:01 +02:00
mo8it 16936d95d1 Fix typo 2023-08-27 00:50:35 +02:00
mo8it 64224d3918 Make move_semantics5 a test 2023-08-27 00:48:19 +02:00
mo8it c0b8af2c42 Fix indicatif 2023-08-26 23:35:07 +02:00
mo8it c655612d2d Update deps 2023-08-26 23:34:40 +02:00
mo8it 3cc9be0d11 Avoid line numbers in hints 2023-08-26 23:25:12 +02:00
mo8it 571bab20c1 Run clippy --fix 2023-08-26 23:07:20 +02:00
liv c663f06669
Merge pull request #1636 from rust-lang/all-contributors/add-eLVas
docs: add eLVas as a contributor for content
2023-08-26 22:27:41 +02:00
allcontributors[bot] 77f0e177e6
docs: update .all-contributorsrc [skip ci] 2023-08-26 20:27:33 +00:00
allcontributors[bot] e7ad540618
docs: update AUTHORS.md [skip ci] 2023-08-26 20:27:32 +00:00
liv 38b4327f41
Merge pull request #1632 from eLVas/main
fix(errors1): change Result to Option in exersise description
2023-08-26 22:27:18 +02:00
Ivan Vasiunyk fa0463b3b2
fix(errors1): change Result to Option in exersise description 2023-08-25 21:49:22 +02:00
Roi Gabay af76794627 info.toml: update threads2 text.
the previous text does not appear in the provided link (https://doc.rust-lang.org/book/ch16-03-shared-state.html#atomic-reference-counting-with-arct).
2023-08-21 16:19:30 +03:00
liv 464cb5566d
Merge pull request #1625 from rust-lang/all-contributors/add-shirts
docs: add shirts as a contributor for content
2023-08-15 11:20:10 +02:00
allcontributors[bot] d670847308
docs: update .all-contributorsrc [skip ci] 2023-08-15 09:20:02 +00:00
allcontributors[bot] 33a45d0f89
docs: update AUTHORS.md [skip ci] 2023-08-15 09:20:01 +00:00
liv da395fed20
Merge pull request #1624 from shirts/shirts/errors-2-comments
Fix comment in errors2
2023-08-15 11:19:43 +02:00
Kevin C ad1c29c512 Fix comment in errors2 2023-08-14 12:49:28 -07:00
Mate Kovacs 720f33eee6 add .to_mut() in test owned_mutation() 2023-08-10 19:56:47 +09:00
liv 64035f766f
Merge pull request #1618 from rust-lang/all-contributors/add-barlevalon
docs: add barlevalon as a contributor for content
2023-08-07 17:40:45 +02:00
allcontributors[bot] 1ace9795f7
docs: update .all-contributorsrc [skip ci] 2023-08-07 15:38:52 +00:00
allcontributors[bot] 24c838bc0b
docs: update AUTHORS.md [skip ci] 2023-08-07 15:38:51 +00:00
liv b64aa9993b
Merge pull request #1617 from barlevalon/from_into_tests_fix
fix(conversions/from_into.rs): test_trailing_comma() and test_trailing_comma_and_some_string()
2023-08-07 17:38:37 +02:00
Alon Hearter 2691a35102
Fix from_into.rs tests 2023-08-07 18:22:49 +03:00
Joshua Carlson 828e724659
Added note related to tests. 2023-08-01 13:33:32 -04:00
liv 11d8aea96f
Merge pull request #1609 from rust-lang/all-contributors/add-softarn
docs: add softarn as a contributor for content
2023-08-01 10:50:22 +02:00
allcontributors[bot] 62adbdf7f2
docs: update .all-contributorsrc [skip ci] 2023-08-01 08:50:14 +00:00
allcontributors[bot] f39df76215
docs: update AUTHORS.md [skip ci] 2023-08-01 08:50:13 +00:00
liv 4d26307cfc
Merge pull request #1607 from softarn/main
chore(errors4): improved comment
2023-08-01 10:49:55 +02:00
Marcus Höjvall be8d1df8b9
chore(errors4): improved comment 2023-07-28 23:05:01 +02:00
liv 4592b4c409
Merge pull request #1603 from rust-lang/all-contributors/add-alexfertel
docs: add alexfertel as a contributor for content
2023-07-24 10:29:34 +02:00
allcontributors[bot] bb5fa3f1e8
docs: update .all-contributorsrc [skip ci] 2023-07-24 08:29:18 +00:00
allcontributors[bot] 8283ae8c4c
docs: update AUTHORS.md [skip ci] 2023-07-24 08:29:17 +00:00
liv 478e9d67df
Merge pull request #1601 from alexfertel/patch-1
docs: dedup repeated sentence
2023-07-24 10:29:00 +02:00
Alexander González ef8f1f108b
docs: dedup repeated sentence 2023-07-21 14:42:19 +02:00
Gabor Szabo 7f9f897945 add test-case to if/if1 to check equal values 2023-07-20 08:28:18 +03:00
Yamila Moreno 662e5bddd7 fix(primitives-4.rs): update hint so it's less confusing 2023-07-17 15:58:29 +02:00
liv b949422d46
Merge pull request #1597 from rust-lang/all-contributors/add-johnDeSilencio
docs: add johnDeSilencio as a contributor for code
2023-07-17 12:31:25 +02:00
allcontributors[bot] 2c7dec7327
docs: update .all-contributorsrc [skip ci] 2023-07-17 10:31:16 +00:00
allcontributors[bot] f4d86f384c
docs: update AUTHORS.md [skip ci] 2023-07-17 10:31:15 +00:00
liv 13bbe9c07d
Merge pull request #1594 from johnDeSilencio/bugfix/proc-macro2-cargo-update
fix: building rustlings on nightly
2023-07-17 12:30:48 +02:00
Nicholas R. Smith 2934d062a3 fix: run cargo update to build proc-macro2 on nightly 2023-07-14 12:12:05 -07:00
Will Hack 37cdea9183 Merge branch 'main' into chore/update-hints 2023-07-04 12:05:19 -04:00
liv a7300da78d
Merge pull request #1590 from rust-lang/all-contributors/add-jrcarl624
docs: add jrcarl624 as a contributor for content
2023-07-04 11:57:39 +02:00
allcontributors[bot] 176fb7c447
docs: update .all-contributorsrc [skip ci] 2023-07-04 09:57:31 +00:00
allcontributors[bot] 0e0c5dfe99
docs: update AUTHORS.md [skip ci] 2023-07-04 09:57:30 +00:00
liv 6cc34fa1f7
Merge pull request #1588 from jrcarl624/main
added if3 based on: `Using if in a let Statement`
2023-07-04 11:57:11 +02:00
Joshua Carlson 287172698a added if3 based on: `Using if in a let Statement` 2023-07-03 14:52:13 -04:00
Will Hack 0ab781c7a7 chore: remove line reference from strings2 hint 2023-07-03 14:20:38 -04:00
liv c5b0627180 chore: update oranda config for 0.1.0 2023-07-03 18:50:50 +02:00
Will Hack b99c7b8c37 chore: update line reference in strings2 hint 2023-07-02 13:46:59 -04:00
liv a6b562b8e4
Merge pull request #1580 from rust-lang/all-contributors/add-vnprc
docs: add vnprc as a contributor for content
2023-06-26 15:20:06 +02:00
allcontributors[bot] a46d42f45e
docs: update .all-contributorsrc [skip ci] 2023-06-26 13:19:53 +00:00
allcontributors[bot] 47b3a53132
docs: update AUTHORS.md [skip ci] 2023-06-26 13:19:52 +00:00
liv a470500a43
Merge pull request #1579 from vnprc/docs
chore: use correct line number in strings2.rs hint
2023-06-26 15:19:37 +02:00
vnprc 405b32e77a
chore: use correct line number in strings2.rs hint 2023-06-26 09:17:39 -04:00
liv 2584ff0440
Merge pull request #1577 from rust-lang/all-contributors/add-novanish
docs: add novanish as a contributor for content
2023-06-26 09:58:32 +02:00
allcontributors[bot] 2e4022dd73
docs: update .all-contributorsrc [skip ci] 2023-06-26 07:58:24 +00:00
allcontributors[bot] f03a915c75
docs: update AUTHORS.md [skip ci] 2023-06-26 07:58:23 +00:00
liv 9379d06275
Merge pull request #1573 from novanish/refactor-error-1-comment
refactor: Update comment to use correct construct name 'Result' inste…
2023-06-26 09:58:08 +02:00
Anish eacf7db6f3
refactor: Update comment to use correct construct name 'Result' instead of 'Option'
Refactor the comment in the code to provide a more accurate description of the construct being used. Replace the mention of Option with Result.
2023-06-23 17:18:17 +05:45
liv adc7ca5690 fix(move_semantics2): change type back to compile 2023-06-22 10:10:44 +02:00
Mohammed Sadiq c5231f0ce3 fix(enums3): modify message string in test
Otherwise it won't actually test the change of state.message and
it would fail to check if the user missed changing state.message

This happened to me as I had a catch-all line in `match`
2023-06-16 13:50:54 +05:30
liv c2264cabae
fix: install into $home on windows for now
Stopgap measure so that people stop installing into System32 (since that's the default Powershell elevated prompt directory for some reason).
2023-06-15 10:56:53 +02:00
liv f3d0ba2f51
Merge pull request #1563 from rust-lang/all-contributors/add-tajo48
docs: add tajo48 as a contributor for content
2023-06-15 10:42:10 +02:00
allcontributors[bot] 0cb63cdd01
docs: update .all-contributorsrc [skip ci] 2023-06-15 08:42:02 +00:00
allcontributors[bot] c236a80a37
docs: update AUTHORS.md [skip ci] 2023-06-15 08:42:01 +00:00
liv 4b9e77d2ef
Merge pull request #1562 from tajo48/main
chore: update hint for vecs2
2023-06-15 10:41:46 +02:00
tajo48 e1704a2f1b
Merge branch 'main' into main 2023-06-15 00:46:45 +02:00
liv 0282da6881
Merge pull request #1559 from rust-lang/all-contributors/add-robertefry
docs: add robertefry as a contributor for content
2023-06-12 12:39:41 +02:00
allcontributors[bot] 846e68e1aa
docs: update .all-contributorsrc [skip ci] 2023-06-12 10:39:27 +00:00
allcontributors[bot] 33cf4f7eca
docs: update AUTHORS.md [skip ci] 2023-06-12 10:39:26 +00:00
liv 132d5ca943
Merge pull request #1535 from robertefry/comment_cleanup
docs: cleanup the explanation paragraphs at the start of each exercise.
2023-06-12 12:39:09 +02:00
liv b44472b237
Merge branch 'main' into comment_cleanup 2023-06-12 12:39:02 +02:00
liv 4cfcf2ccd7
Merge pull request #1558 from rust-lang/all-contributors/add-Frosthage
docs: add Frosthage as a contributor for content
2023-06-12 12:36:40 +02:00
allcontributors[bot] a2f99ad00d
docs: update .all-contributorsrc [skip ci] 2023-06-12 10:36:23 +00:00
allcontributors[bot] eb3c9658b1
docs: update AUTHORS.md [skip ci] 2023-06-12 10:36:22 +00:00
liv 06ddcfb0bb
Merge pull request #1113 from Frosthage/main
Improve hint for as_ref_mut
2023-06-12 12:36:06 +02:00
liv d6bb8547b3
Merge pull request #1557 from rust-lang/all-contributors/add-luhem7
docs: add luhem7 as a contributor for content
2023-06-12 12:33:53 +02:00
allcontributors[bot] 5219621595
docs: update .all-contributorsrc [skip ci] 2023-06-12 10:33:45 +00:00
allcontributors[bot] a14f0c3f55
docs: update AUTHORS.md [skip ci] 2023-06-12 10:33:44 +00:00
liv 44f706a5e7
Merge pull request #1542 from luhem7/main
fix(threads, smart pointers): Swap order of threads and smart pointers exercises
2023-06-12 12:33:29 +02:00
liv 55636e6978
Merge pull request #1556 from rust-lang/all-contributors/add-FWDekker
docs: add FWDekker as a contributor for content
2023-06-12 12:33:01 +02:00
allcontributors[bot] 5921948de8
docs: update .all-contributorsrc [skip ci] 2023-06-12 10:32:26 +00:00
allcontributors[bot] bd05bab4bf
docs: update AUTHORS.md [skip ci] 2023-06-12 10:32:25 +00:00
liv c6c7dd2fce
Merge pull request #1544 from FWDekker/main
fix(vecs): rename outdated variable name in hint
2023-06-12 12:32:10 +02:00
liv 171d20ce3e
Merge pull request #1546 from b-apperlo/b-apperlo-patch-1
feat: added test function to hashmaps2.rs
2023-06-12 12:20:36 +02:00
liv c2bb9ebd8e
Merge pull request #1555 from rust-lang/all-contributors/add-b-apperlo
docs: add b-apperlo as a contributor for content
2023-06-12 12:19:02 +02:00
allcontributors[bot] d35a352fe6
docs: update .all-contributorsrc [skip ci] 2023-06-12 10:18:55 +00:00
allcontributors[bot] 4fd52390ee
docs: update AUTHORS.md [skip ci] 2023-06-12 10:18:54 +00:00
liv 974717ca11
Merge pull request #1547 from b-apperlo/b-apperlo-patch-2
fix: update hashmaps3.rs
2023-06-12 12:18:36 +02:00
liv d77e6c0d05
Merge pull request #1553 from rust-lang/all-contributors/add-IVIURRAY
docs: add IVIURRAY as a contributor for content
2023-06-12 12:17:30 +02:00
allcontributors[bot] 47fcab1e60
docs: update .all-contributorsrc [skip ci] 2023-06-12 10:17:22 +00:00
allcontributors[bot] a1188ca0ee
docs: update AUTHORS.md [skip ci] 2023-06-12 10:17:21 +00:00
liv 0d2a1bdef1
Merge pull request #1549 from IVIURRAY/enums3-message-test
fix(enums3): add test for message
2023-06-12 12:17:07 +02:00
liv 369ae2e63d feat(move_semantics2): rewrite hint 2023-06-12 12:07:18 +02:00
liv 1ce9d93e94
Merge pull request #1552 from rust-lang/all-contributors/add-proofconstruction
docs: add proofconstruction as a contributor for infra
2023-06-12 11:50:10 +02:00
allcontributors[bot] e0ea03dc56
docs: update .all-contributorsrc [skip ci] 2023-06-12 09:50:03 +00:00
allcontributors[bot] 3cced07c13
docs: update AUTHORS.md [skip ci] 2023-06-12 09:50:02 +00:00
liv dca6e869df
Merge pull request #1550 from proofconstruction/check-lockfile-sync
chore(ci): add action step to check if lockfile is synced
2023-06-12 11:49:21 +02:00
alex f30f0bf148 chore(ci): add action step to check if lockfile is synced 2023-06-11 16:30:01 -05:00
IVIURARY d0a1783083 fix(enums3): add test for message
closes #1548
2023-06-08 22:14:25 +01:00
Bert Apperlo a4fe3602b2
fix: updated comment for struct 2023-06-08 16:46:45 +02:00
Bert Apperlo 8974e33f69
fix: update hashmaps3.rs 2023-06-08 16:44:39 +02:00
Bert Apperlo bbfb4c7e63
feat: added test function to hashmaps2.rs
The existing test functions only check if a kind of fruit exists in the hashmap, but not if the amount of fruits is higher than zero. This new test function solves this.
2023-06-08 15:49:07 +02:00
Florine W. Dekker 479574e88e
fix(vecs): rename outdated variable name in hint 2023-06-07 16:58:02 +02:00
luhem7 a96bbcd967 fix(threads, smart pointers): Swap order of threads and smart pointers exercises
closes #1541
2023-06-03 10:20:29 -04:00
tajo48 1e02f194fd update hint for vecs2 to match with exercise as it was updated to fix clarity 2023-05-31 16:37:41 +02:00
Robert Fry 7eef5d15ee
docs: cleanup the explanation paragraphs at the start of each exercise. 2023-05-29 18:41:51 +01:00
liv 30291a3c25
Merge pull request #1527 from rust-lang/all-contributors/add-lazywalker
docs: add lazywalker as a contributor for content
2023-05-23 11:06:10 +02:00
allcontributors[bot] 33224370eb
docs: update .all-contributorsrc [skip ci] 2023-05-23 09:05:59 +00:00
allcontributors[bot] b9cb931167
docs: update AUTHORS.md [skip ci] 2023-05-23 09:05:58 +00:00
liv 10d8357876
Merge pull request #1526 from lazywalker/fix-iterators5
fix(exercises): use snake_case variables to avoid warning
2023-05-23 11:05:43 +02:00
lazywalker 9604ab6621 fix(exercises): use snake_case variables 2023-05-23 15:00:55 +08:00
liv e35a84fcb3 chore(oranda): don't generate changelog pages 2023-05-22 11:09:57 +02:00
liv e910205c19
Merge pull request #1524 from rust-lang/all-contributors/add-b1ue64
docs: add b1ue64 as a contributor for content
2023-05-21 11:39:36 +02:00
allcontributors[bot] 15ad02c984
docs: update .all-contributorsrc [skip ci] 2023-05-21 09:39:26 +00:00
allcontributors[bot] 8e62346f86
docs: update AUTHORS.md [skip ci] 2023-05-21 09:39:25 +00:00
liv 59344c679d
Merge pull request #1523 from b1ue64/b1ue64-patch-1
feat(iterators5): remove outdated part of hint
2023-05-21 11:39:12 +02:00
b1ue64 a7257a1d1e
feat(iterators5): remove outdated part of hint 2023-05-20 16:38:33 -04:00
liv f2de12aa34 release: 5.5.1 2023-05-17 21:05:51 +02:00
liv 2d544f18b5 fix: revert back to using relative paths 2023-05-17 21:04:32 +02:00
liv 0667ee7c4d fix: add oranda-hide class to readme 2023-05-17 17:11:49 +02:00
liv 19cee73209 chore: set up oranda
Sets up oranda so we can get nice website things for free. Some caveats we have right now:

- Absolutely manual, I have to do `oranda build` and the deploy manually right now
- I had to pop the Readme into a new Markdown file because the first header in there was looking very strange
2023-05-17 16:56:01 +02:00
liv 4c638e365f Merge branch 'main' of github.com:rust-lang/rustlings 2023-05-17 16:30:31 +02:00
liv f452fd7bb0 release: 5.5.0 2023-05-17 16:30:22 +02:00
liv 6d1f8c5111
Merge pull request #1520 from rust-lang/all-contributors/add-Ben2917
docs: add Ben2917 as a contributor for content
2023-05-17 16:14:54 +02:00
allcontributors[bot] ab61a0d5c7
docs: update .all-contributorsrc [skip ci] 2023-05-17 14:14:44 +00:00
allcontributors[bot] af52fce275
docs: update AUTHORS.md [skip ci] 2023-05-17 14:14:43 +00:00
liv 656140d9e6
Merge pull request #1478 from Ben2917/improved_tests_for_iterators5
fix: Added some extra tests to validate iterators5 solution
2023-05-17 16:14:29 +02:00
liv 9508e97914 feat: write absolute root module paths for lsp 2023-05-17 16:14:10 +02:00
liv a6f99645c6 chore: rustfmt 2023-05-17 16:02:39 +02:00
liv fd84c2d8f7
Merge pull request #1519 from rust-lang/all-contributors/add-lionel-rowe
docs: add lionel-rowe as a contributor for content
2023-05-17 15:57:26 +02:00
allcontributors[bot] eeb439eaf9
docs: update .all-contributorsrc [skip ci] 2023-05-17 13:57:11 +00:00
allcontributors[bot] 58cbdd71b6
docs: update AUTHORS.md [skip ci] 2023-05-17 13:57:10 +00:00
liv 81cd97902a
Merge pull request #1487 from lionel-rowe/patch-1
feat(options2): better test for layered_option
2023-05-17 15:56:55 +02:00
liv ccf4a78f5d
Merge pull request #1518 from rust-lang/all-contributors/add-deedy5
docs: add deedy5 as a contributor for content
2023-05-17 15:56:10 +02:00
allcontributors[bot] 6abff39549
docs: update .all-contributorsrc [skip ci] 2023-05-17 13:55:29 +00:00
allcontributors[bot] 94c6131c59
docs: update AUTHORS.md [skip ci] 2023-05-17 13:55:28 +00:00
liv 05fcc246ae
Merge pull request #1490 from deedy5/main
modules2.rs: add more information to hint
2023-05-17 15:55:13 +02:00
liv 9bfb7055e2
Merge pull request #1517 from rust-lang/all-contributors/add-rb5014
docs: add rb5014 as a contributor for content
2023-05-17 15:54:49 +02:00
allcontributors[bot] c5fe42089d
docs: update .all-contributorsrc [skip ci] 2023-05-17 13:54:40 +00:00
allcontributors[bot] 70cf7698ac
docs: update AUTHORS.md [skip ci] 2023-05-17 13:54:39 +00:00
liv b07680108b
Merge pull request #1504 from rb5014/success-hints-feature
feat(main, verify): Show hint(s) after exercise completion
2023-05-17 15:54:24 +02:00
liv d45ec21b3c
Merge pull request #1513 from rust-lang/all-contributors/add-nmay231
docs: add nmay231 as a contributor for content
2023-05-10 10:50:01 +02:00
allcontributors[bot] 0d252636be
docs: update .all-contributorsrc [skip ci] 2023-05-10 08:49:45 +00:00
allcontributors[bot] 70da26f649
docs: update AUTHORS.md [skip ci] 2023-05-10 08:49:44 +00:00
liv b882da1ad4
Merge pull request #1512 from nmay231/main
fix(options3): panic when not matching to avoid false positives
2023-05-10 10:49:36 +02:00
Noah May 3ecb47ff2c fix(options3): panic when not matching to avoid false positives
Closes #1503
2023-05-09 15:13:18 -05:00
Romain Bayle c44e3025f9 option success_hints added to the struct Watchargs instead of Args 2023-05-02 22:46:41 +02:00
liv 9ffcab07bf
Merge pull request #1506 from rust-lang/all-contributors/add-az0977776
docs: add az0977776 as a contributor for content
2023-05-02 11:15:57 +00:00
allcontributors[bot] 583925c085
docs: update .all-contributorsrc [skip ci] 2023-05-02 11:15:49 +00:00
allcontributors[bot] e631f3c78b
docs: update AUTHORS.md [skip ci] 2023-05-02 11:15:48 +00:00
liv 9a6e57eec9
Merge pull request #1471 from az0977776/patch-2
docs: update line numbers in move_semantics2
2023-05-02 11:15:33 +00:00
Aaron Wang d3fea5f15a
Merge branch 'main' into patch-2 2023-05-01 19:10:56 -04:00
Romain Bayle 5d3696a9e6 feat(cli): added success-hints option for the rustlings command
closes #1373
2023-05-01 03:04:06 +02:00
liv b75d2aa3f4
Merge pull request #1499 from rust-lang/all-contributors/add-esotuvaka
docs: add esotuvaka as a contributor for content
2023-04-28 08:40:25 +00:00
allcontributors[bot] eb4079c674
docs: update .all-contributorsrc [skip ci] 2023-04-28 08:40:18 +00:00
allcontributors[bot] 72d0c53b33
docs: update AUTHORS.md [skip ci] 2023-04-28 08:40:17 +00:00
liv 6ae0525f7a
Merge pull request #1498 from esotuvaka/main
chore: clarified cow owned_no_mutation comments
2023-04-28 08:39:59 +00:00
PiqqiDesigns c4627e7112 chore: clarified cow owned_no_mutation comments 2023-04-27 15:49:40 -07:00
liv 6d4a980b04
Merge pull request #1491 from rust-lang/all-contributors/add-akgerber
docs: add akgerber as a contributor for content
2023-04-22 13:48:59 +00:00
allcontributors[bot] 545a726252
docs: update .all-contributorsrc [skip ci] 2023-04-22 13:48:42 +00:00
allcontributors[bot] 065cd0170e
docs: update AUTHORS.md [skip ci] 2023-04-22 13:48:41 +00:00
liv a7eeaa3a4b
Merge pull request #1484 from akgerber/move2_comment_fix
fix(move_semantics2): fix line number comment
2023-04-22 13:48:23 +00:00
deedy5 e2da663628
Update info.toml
modules2.rs: add more information to hint
2023-04-21 15:51:52 +00:00
lionel-rowe 836134202e
feat(options2): better tests for layered_option
The existing test can be solved with the following:

```rs
        while let Some(integer) = optional_integers.pop() {
            assert_eq!(integer.unwrap(), range);
```

Similarly with `expect(...)`, `unwrap_or(0)`, `unwrap_or_default()`, etc. However, none of these solutions use the learning point of stacking `Option<T>`s.

The updated test can _only_ be solved by stacking `Option<T>`s:

```rs
        while let Some(Some(integer)) = optional_integers.pop() {
            assert_eq!(integer, cursor);
```

With the updated test, using `unwrap` or `expect` will panic when it hits the `None` value, and using `unwrap_or` or `unwrap_or_default` will cause the final `assert_eq!(cursor, 0)`  to panic.
2023-04-21 06:05:25 +01:00
Alan Gerber 319a8253ba fix(move_semantics2): fix line number comment
Commit fef8314 added three lines of comments, which left the line
numbers expected to stay unchanged mentioned on line 2 out of date.
2023-04-20 12:15:31 -04:00
liv fc81bb15fe
Merge pull request #1482 from rust-lang/all-contributors/add-smlavine
docs: add smlavine as a contributor for code
2023-04-18 15:54:06 +00:00
allcontributors[bot] 6209e7004e
docs: update .all-contributorsrc [skip ci] 2023-04-18 15:51:25 +00:00
allcontributors[bot] 4944488287
docs: update AUTHORS.md [skip ci] 2023-04-18 15:51:24 +00:00
liv 0dc9c33b01
Merge pull request #1480 from smlavine/main
feat: Add "!" command to `rustlings watch`
2023-04-18 15:51:06 +00:00
Sebastian LaVine a4a5691a7b
feat: Add "!" command to `rustlings watch` 2023-04-16 21:44:08 -04:00
Your Name 352267871c fix: Added some extra tests to validate iterators5 solution
closes: #1387
2023-04-15 17:34:52 +01:00
bean5 15ae83f868 docs: Replace apostrophe (for consistency with other README files) 2023-04-13 20:32:18 -06:00
bean5 e6b1ef2049 docs: Apply fixes that linter noticed 2023-04-13 20:31:59 -06:00
Aaron Wang 8ed2cf7ef5
Update move_semantics2.rs 2023-04-10 22:36:21 -04:00
J.c 8cb5cba775 docs(vecs2): update hints 2023-04-08 10:50:50 +02:00
Aaron Wang c74e0bfd18
docs: update line numbers in move_semantics2 2023-04-07 01:56:20 -04:00
liv 9fc336c7f7
Merge pull request #1469 from rust-lang/all-contributors/add-stornquist
docs: add stornquist as a contributor for content
2023-04-05 13:11:24 +00:00
allcontributors[bot] 5de7124eee
docs: update .all-contributorsrc [skip ci] 2023-04-05 13:11:15 +00:00
allcontributors[bot] 2f33826063
docs: update AUTHORS.md [skip ci] 2023-04-05 13:11:14 +00:00
liv 087e076ec0
Merge pull request #1384 from stornquist/patch-1
fix(move_semantics2): add expected output comment
2023-04-05 13:10:57 +00:00
liv b39b819725
Merge pull request #1468 from rust-lang/all-contributors/add-alexwh
docs: add alexwh as a contributor for content
2023-04-05 13:10:02 +00:00
allcontributors[bot] d544bfcd6d
docs: update .all-contributorsrc [skip ci] 2023-04-05 13:09:51 +00:00
allcontributors[bot] c7adaa7d14
docs: update AUTHORS.md [skip ci] 2023-04-05 13:09:50 +00:00
liv f86fa1e909
Merge pull request #1385 from alexwh/patch-1
chore: update move_semantics4.rs' hint
2023-04-05 13:09:20 +00:00
liv 2285b89aea
Merge pull request #1467 from rust-lang/all-contributors/add-ktheory
docs: add ktheory as a contributor for content
2023-04-05 13:07:58 +00:00
allcontributors[bot] 16ca871544
docs: update .all-contributorsrc [skip ci] 2023-04-05 13:06:59 +00:00
allcontributors[bot] 722c7910e4
docs: update AUTHORS.md [skip ci] 2023-04-05 13:06:58 +00:00
liv ab6aa23cec
Merge pull request #1391 from ktheory/ktheory/iter5
docs: clarify instructions on iterators5.rs
2023-04-05 13:06:43 +00:00
liv 5fd3dfe01b
Merge pull request #1452 from guoard/markdown-linter
feat(docs): add markdown linter for exercises README.md files
2023-04-05 13:06:17 +00:00
liv 8a7f437641
Merge pull request #1466 from rust-lang/all-contributors/add-poneciak57
docs: add poneciak57 as a contributor for content
2023-04-05 13:05:38 +00:00
allcontributors[bot] 63a467af31
docs: update .all-contributorsrc [skip ci] 2023-04-05 13:05:30 +00:00
allcontributors[bot] af365f444f
docs: update AUTHORS.md [skip ci] 2023-04-05 13:05:29 +00:00
liv 9a9b487abd
Merge pull request #1463 from poneciak57/feature/test4_panic
feat: add tests4.rs exercise
2023-04-05 13:05:14 +00:00
poneciak 102d7f3d0e changed comments in tests
also fixed small logical issue in `Rectangle::new()` where u could create rectangle with width or height equals 0
2023-04-05 13:24:14 +02:00
poneciak c4974ac782 added required changes
- fixed grammar in hint and added more specific link
- added comments in test functions
- changed introduction paragraph
2023-04-05 13:09:13 +02:00
poneciak 27b7579566 created task 2023-04-05 08:18:51 +02:00
liv 01fa21f160
Merge pull request #1461 from rust-lang/all-contributors/add-sagarvora
docs: add sagarvora as a contributor for content
2023-04-02 10:46:50 +00:00
allcontributors[bot] 54d21dc7c1
docs: update .all-contributorsrc [skip ci] 2023-04-02 10:45:43 +00:00
allcontributors[bot] 2f2fd43771
docs: update AUTHORS.md [skip ci] 2023-04-02 10:45:42 +00:00
liv 2ca4ee2a54
Merge pull request #1460 from sagarvora/lifetimes-first
fix: move lifetimes above tests in recommended order
2023-04-02 10:45:28 +00:00
Sagar Vora b1fb38e73c fix: move lifetimes above tests in recommended order 2023-04-02 12:25:24 +05:30
liv 09dc7058c9
Merge pull request #1456 from rust-lang/all-contributors/add-ahresse
docs: add ahresse as a contributor for content
2023-03-31 13:31:47 +00:00
allcontributors[bot] 75f0ab65d1
docs: update .all-contributorsrc [skip ci] 2023-03-31 13:31:33 +00:00
allcontributors[bot] 391e5d121a
docs: update AUTHORS.md [skip ci] 2023-03-31 13:31:32 +00:00
liv 6f84887f60
Merge pull request #1454 from ahresse/ahresse/remove_trailing_spaces
fix: remove trailing spaces
2023-03-31 13:31:16 +00:00
liv 3e44060b5b
Merge pull request #1455 from rust-lang/all-contributors/add-keogami
docs: add keogami as a contributor for doc
2023-03-31 13:29:40 +00:00
Alexandre ESSE d7111cb4a3 fix(main.rs): remove trailing spaces 2023-03-31 11:58:15 +02:00
Alexandre ESSE 22bb662d3e fix(exercises): remove trailing spaces 2023-03-31 11:58:15 +02:00
Ali Afsharzadeh 382e16eb7e feat(docs): add markdown linter for exercises README.md files 2023-03-30 19:53:22 +03:30
Aaron Suggs 1ac66f372b docs: clarify instructions on iterators5.rs
I changed the sentence that referenced the imperative implementation in iterators5.rs.

That implementation was already removed and replaced with `todo!()`
2023-02-21 09:45:59 -05:00
Alex 89069f78b1
chore: update move_semantics4.rs' hint
after #144, the signature doesn't need changing anymore
2023-02-18 19:26:40 +00:00
Sebastian Törnquist fef8314d3d
fix(move_semantics2): add expected output comment
You can easily get this to compile with `vec0` being `[]` and `vec1` being `[22, 44, 66, 88]`
2023-02-18 18:43:34 +01:00
Mikael Frosthage 5ff23a2861 Improve hint for as_ref_mut 2022-07-26 22:02:50 +02:00
126 changed files with 2303 additions and 850 deletions

View File

@ -1983,6 +1983,456 @@
"contributions": [
"doc"
]
},
{
"login": "ahresse",
"name": "Alexandre Esse",
"avatar_url": "https://avatars.githubusercontent.com/u/28402488?v=4",
"profile": "https://github.com/ahresse",
"contributions": [
"content"
]
},
{
"login": "sagarvora",
"name": "Sagar Vora",
"avatar_url": "https://avatars.githubusercontent.com/u/16315650?v=4",
"profile": "https://resilient.tech",
"contributions": [
"content"
]
},
{
"login": "poneciak57",
"name": "Kacper Poneta",
"avatar_url": "https://avatars.githubusercontent.com/u/94321164?v=4",
"profile": "https://github.com/poneciak57",
"contributions": [
"content"
]
},
{
"login": "ktheory",
"name": "Aaron Suggs",
"avatar_url": "https://avatars.githubusercontent.com/u/975?v=4",
"profile": "https://ktheory.com/",
"contributions": [
"content"
]
},
{
"login": "alexwh",
"name": "Alex",
"avatar_url": "https://avatars.githubusercontent.com/u/1723612?v=4",
"profile": "https://github.com/alexwh",
"contributions": [
"content"
]
},
{
"login": "stornquist",
"name": "Sebastian Törnquist",
"avatar_url": "https://avatars.githubusercontent.com/u/42915664?v=4",
"profile": "https://github.com/stornquist",
"contributions": [
"content"
]
},
{
"login": "smlavine",
"name": "Sebastian LaVine",
"avatar_url": "https://avatars.githubusercontent.com/u/33563640?v=4",
"profile": "http://smlavine.com",
"contributions": [
"code"
]
},
{
"login": "akgerber",
"name": "Alan Gerber",
"avatar_url": "https://avatars.githubusercontent.com/u/201313?v=4",
"profile": "http://www.alangerber.us",
"contributions": [
"content"
]
},
{
"login": "esotuvaka",
"name": "Eric",
"avatar_url": "https://avatars.githubusercontent.com/u/104941850?v=4",
"profile": "http://esotuvaka.github.io",
"contributions": [
"content"
]
},
{
"login": "az0977776",
"name": "Aaron Wang",
"avatar_url": "https://avatars.githubusercontent.com/u/9172038?v=4",
"profile": "https://github.com/az0977776",
"contributions": [
"content"
]
},
{
"login": "nmay231",
"name": "Noah",
"avatar_url": "https://avatars.githubusercontent.com/u/35386821?v=4",
"profile": "https://github.com/nmay231",
"contributions": [
"content"
]
},
{
"login": "rb5014",
"name": "rb5014",
"avatar_url": "https://avatars.githubusercontent.com/u/105397317?v=4",
"profile": "https://github.com/rb5014",
"contributions": [
"content"
]
},
{
"login": "deedy5",
"name": "deedy5",
"avatar_url": "https://avatars.githubusercontent.com/u/65482418?v=4",
"profile": "https://github.com/deedy5",
"contributions": [
"content"
]
},
{
"login": "lionel-rowe",
"name": "lionel-rowe",
"avatar_url": "https://avatars.githubusercontent.com/u/26078826?v=4",
"profile": "https://github.com/lionel-rowe",
"contributions": [
"content"
]
},
{
"login": "Ben2917",
"name": "Ben",
"avatar_url": "https://avatars.githubusercontent.com/u/10279994?v=4",
"profile": "https://github.com/Ben2917",
"contributions": [
"content"
]
},
{
"login": "b1ue64",
"name": "b1ue64",
"avatar_url": "https://avatars.githubusercontent.com/u/77976308?v=4",
"profile": "https://github.com/b1ue64",
"contributions": [
"content"
]
},
{
"login": "lazywalker",
"name": "lazywalker",
"avatar_url": "https://avatars.githubusercontent.com/u/53956?v=4",
"profile": "https://github.com/lazywalker",
"contributions": [
"content"
]
},
{
"login": "proofconstruction",
"name": "proofconstruction",
"avatar_url": "https://avatars.githubusercontent.com/u/74747193?v=4",
"profile": "https://github.com/proofconstruction",
"contributions": [
"infra"
]
},
{
"login": "IVIURRAY",
"name": "IVIURRAY",
"avatar_url": "https://avatars.githubusercontent.com/u/16007179?v=4",
"profile": "https://www.youtube.com/channel/UCQCjA6qUutAtWqkCA4Z36CQ",
"contributions": [
"content"
]
},
{
"login": "b-apperlo",
"name": "Bert Apperlo",
"avatar_url": "https://avatars.githubusercontent.com/u/91734527?v=4",
"profile": "https://github.com/b-apperlo",
"contributions": [
"content"
]
},
{
"login": "FWDekker",
"name": "Florine W. Dekker",
"avatar_url": "https://avatars.githubusercontent.com/u/13442533?v=4",
"profile": "https://fwdekker.com/",
"contributions": [
"content"
]
},
{
"login": "luhem7",
"name": "Mehul Gangavelli",
"avatar_url": "https://avatars.githubusercontent.com/u/4008215?v=4",
"profile": "https://github.com/luhem7",
"contributions": [
"content"
]
},
{
"login": "Frosthage",
"name": "Mikael Frosthage",
"avatar_url": "https://avatars.githubusercontent.com/u/14823314?v=4",
"profile": "https://github.com/Frosthage",
"contributions": [
"content"
]
},
{
"login": "robertefry",
"name": "Robert Fry",
"avatar_url": "https://avatars.githubusercontent.com/u/43712054?v=4",
"profile": "https://robertfry.xyz",
"contributions": [
"content"
]
},
{
"login": "tajo48",
"name": "tajo48",
"avatar_url": "https://avatars.githubusercontent.com/u/55502906?v=4",
"profile": "https://github.com/tajo48",
"contributions": [
"content"
]
},
{
"login": "novanish",
"name": "Anish",
"avatar_url": "https://avatars.githubusercontent.com/u/98446102?v=4",
"profile": "https://anishchhetri.com.np",
"contributions": [
"content"
]
},
{
"login": "vnprc",
"name": "vnprc",
"avatar_url": "https://avatars.githubusercontent.com/u/9425366?v=4",
"profile": "https://github.com/vnprc",
"contributions": [
"content"
]
},
{
"login": "jrcarl624",
"name": "Joshua Carlson",
"avatar_url": "https://avatars.githubusercontent.com/u/61999256?v=4",
"profile": "http://androecia.net",
"contributions": [
"content"
]
},
{
"login": "johnDeSilencio",
"name": "Nicholas R. Smith",
"avatar_url": "https://avatars.githubusercontent.com/u/20136554?v=4",
"profile": "https://johndesilencio.me",
"contributions": [
"code"
]
},
{
"login": "alexfertel",
"name": "Alexander González",
"avatar_url": "https://avatars.githubusercontent.com/u/22298999?v=4",
"profile": "https://alexfertel.me",
"contributions": [
"content"
]
},
{
"login": "softarn",
"name": "Marcus Höjvall",
"avatar_url": "https://avatars.githubusercontent.com/u/517619?v=4",
"profile": "https://github.com/softarn",
"contributions": [
"content"
]
},
{
"login": "barlevalon",
"name": "Alon Hearter",
"avatar_url": "https://avatars.githubusercontent.com/u/3397911?v=4",
"profile": "https://github.com/barlevalon",
"contributions": [
"content"
]
},
{
"login": "shirts",
"name": "shirts",
"avatar_url": "https://avatars.githubusercontent.com/u/4952151?v=4",
"profile": "https://github.com/shirts",
"contributions": [
"content"
]
},
{
"login": "eLVas",
"name": "Ivan Vasiunyk",
"avatar_url": "https://avatars.githubusercontent.com/u/6797156?v=4",
"profile": "https://github.com/eLVas",
"contributions": [
"content"
]
},
{
"login": "mo8it",
"name": "Mo",
"avatar_url": "https://avatars.githubusercontent.com/u/76752051?v=4",
"profile": "https://mo8it.com",
"contributions": [
"code"
]
},
{
"login": "x10an14",
"name": "x10an14",
"avatar_url": "https://avatars.githubusercontent.com/u/710608?v=4",
"profile": "https://github.com/x10an14",
"contributions": [
"infra"
]
},
{
"login": "gabay",
"name": "Roi Gabay",
"avatar_url": "https://avatars.githubusercontent.com/u/5773610?v=4",
"profile": "https://github.com/gabay",
"contributions": [
"content"
]
},
{
"login": "mkovaxx",
"name": "Máté Kovács",
"avatar_url": "https://avatars.githubusercontent.com/u/481354?v=4",
"profile": "https://github.com/mkovaxx",
"contributions": [
"content"
]
},
{
"login": "szabgab",
"name": "Gábor Szabó",
"avatar_url": "https://avatars.githubusercontent.com/u/48833?v=4",
"profile": "https://szabgab.com/",
"contributions": [
"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,
@ -1991,5 +2441,6 @@
"repoType": "github",
"repoHost": "https://github.com",
"skipCi": true,
"commitConvention": "angular"
"commitConvention": "angular",
"commitType": "docs"
}

4
.envrc Normal file
View File

@ -0,0 +1,4 @@
#!/usr/bin/env bash
# Automatically Load nix devShell w/dotenv
use flake

View File

@ -10,11 +10,28 @@ env:
CARGO_TERM_COLOR: always
jobs:
build:
fmt:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- name: Build
run: cargo build --verbose
- name: Run tests
run: cargo test --verbose
- uses: dtolnay/rust-toolchain@stable
with:
components: rustfmt
- uses: DavidAnson/markdownlint-cli2-action@v9
with:
globs: "exercises/**/*.md"
- 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

88
.github/workflows/web.yml vendored Normal file
View File

@ -0,0 +1,88 @@
# 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

5
.gitignore vendored
View File

@ -11,3 +11,8 @@ rust-project.json
!.vscode/extensions.json
*.iml
*.o
public/
.direnv/
# Local Netlify folder
.netlify

2
.markdownlint.yml Normal file
View File

@ -0,0 +1,2 @@
# MD013/line-length Line length, Expected: 80
MD013: false

View File

@ -282,6 +282,68 @@ authors.
</tr>
<tr>
<td align="center" valign="top" width="12.5%"><a href="http://keogami.ml"><img src="https://avatars.githubusercontent.com/u/41939011?v=4?s=100" width="100px;" alt="Keogami"/><br /><sub><b>Keogami</b></sub></a><br /><a href="https://github.com/rust-lang/rustlings/commits?author=keogami" title="Documentation">📖</a></td>
<td align="center" valign="top" width="12.5%"><a href="https://github.com/ahresse"><img src="https://avatars.githubusercontent.com/u/28402488?v=4?s=100" width="100px;" alt="Alexandre Esse"/><br /><sub><b>Alexandre Esse</b></sub></a><br /><a href="#content-ahresse" title="Content">🖋</a></td>
<td align="center" valign="top" width="12.5%"><a href="https://resilient.tech"><img src="https://avatars.githubusercontent.com/u/16315650?v=4?s=100" width="100px;" alt="Sagar Vora"/><br /><sub><b>Sagar Vora</b></sub></a><br /><a href="#content-sagarvora" title="Content">🖋</a></td>
<td align="center" valign="top" width="12.5%"><a href="https://github.com/poneciak57"><img src="https://avatars.githubusercontent.com/u/94321164?v=4?s=100" width="100px;" alt="Kacper Poneta"/><br /><sub><b>Kacper Poneta</b></sub></a><br /><a href="#content-poneciak57" title="Content">🖋</a></td>
<td align="center" valign="top" width="12.5%"><a href="https://ktheory.com/"><img src="https://avatars.githubusercontent.com/u/975?v=4?s=100" width="100px;" alt="Aaron Suggs"/><br /><sub><b>Aaron Suggs</b></sub></a><br /><a href="#content-ktheory" title="Content">🖋</a></td>
<td align="center" valign="top" width="12.5%"><a href="https://github.com/alexwh"><img src="https://avatars.githubusercontent.com/u/1723612?v=4?s=100" width="100px;" alt="Alex"/><br /><sub><b>Alex</b></sub></a><br /><a href="#content-alexwh" title="Content">🖋</a></td>
<td align="center" valign="top" width="12.5%"><a href="https://github.com/stornquist"><img src="https://avatars.githubusercontent.com/u/42915664?v=4?s=100" width="100px;" alt="Sebastian Törnquist"/><br /><sub><b>Sebastian Törnquist</b></sub></a><br /><a href="#content-stornquist" title="Content">🖋</a></td>
<td align="center" valign="top" width="12.5%"><a href="http://smlavine.com"><img src="https://avatars.githubusercontent.com/u/33563640?v=4?s=100" width="100px;" alt="Sebastian LaVine"/><br /><sub><b>Sebastian LaVine</b></sub></a><br /><a href="https://github.com/rust-lang/rustlings/commits?author=smlavine" title="Code">💻</a></td>
</tr>
<tr>
<td align="center" valign="top" width="12.5%"><a href="http://www.alangerber.us"><img src="https://avatars.githubusercontent.com/u/201313?v=4?s=100" width="100px;" alt="Alan Gerber"/><br /><sub><b>Alan Gerber</b></sub></a><br /><a href="#content-akgerber" title="Content">🖋</a></td>
<td align="center" valign="top" width="12.5%"><a href="http://esotuvaka.github.io"><img src="https://avatars.githubusercontent.com/u/104941850?v=4?s=100" width="100px;" alt="Eric"/><br /><sub><b>Eric</b></sub></a><br /><a href="#content-esotuvaka" title="Content">🖋</a></td>
<td align="center" valign="top" width="12.5%"><a href="https://github.com/az0977776"><img src="https://avatars.githubusercontent.com/u/9172038?v=4?s=100" width="100px;" alt="Aaron Wang"/><br /><sub><b>Aaron Wang</b></sub></a><br /><a href="#content-az0977776" title="Content">🖋</a></td>
<td align="center" valign="top" width="12.5%"><a href="https://github.com/nmay231"><img src="https://avatars.githubusercontent.com/u/35386821?v=4?s=100" width="100px;" alt="Noah"/><br /><sub><b>Noah</b></sub></a><br /><a href="#content-nmay231" title="Content">🖋</a></td>
<td align="center" valign="top" width="12.5%"><a href="https://github.com/rb5014"><img src="https://avatars.githubusercontent.com/u/105397317?v=4?s=100" width="100px;" alt="rb5014"/><br /><sub><b>rb5014</b></sub></a><br /><a href="#content-rb5014" title="Content">🖋</a></td>
<td align="center" valign="top" width="12.5%"><a href="https://github.com/deedy5"><img src="https://avatars.githubusercontent.com/u/65482418?v=4?s=100" width="100px;" alt="deedy5"/><br /><sub><b>deedy5</b></sub></a><br /><a href="#content-deedy5" title="Content">🖋</a></td>
<td align="center" valign="top" width="12.5%"><a href="https://github.com/lionel-rowe"><img src="https://avatars.githubusercontent.com/u/26078826?v=4?s=100" width="100px;" alt="lionel-rowe"/><br /><sub><b>lionel-rowe</b></sub></a><br /><a href="#content-lionel-rowe" title="Content">🖋</a></td>
<td align="center" valign="top" width="12.5%"><a href="https://github.com/Ben2917"><img src="https://avatars.githubusercontent.com/u/10279994?v=4?s=100" width="100px;" alt="Ben"/><br /><sub><b>Ben</b></sub></a><br /><a href="#content-Ben2917" title="Content">🖋</a></td>
</tr>
<tr>
<td align="center" valign="top" width="12.5%"><a href="https://github.com/b1ue64"><img src="https://avatars.githubusercontent.com/u/77976308?v=4?s=100" width="100px;" alt="b1ue64"/><br /><sub><b>b1ue64</b></sub></a><br /><a href="#content-b1ue64" title="Content">🖋</a></td>
<td align="center" valign="top" width="12.5%"><a href="https://github.com/lazywalker"><img src="https://avatars.githubusercontent.com/u/53956?v=4?s=100" width="100px;" alt="lazywalker"/><br /><sub><b>lazywalker</b></sub></a><br /><a href="#content-lazywalker" title="Content">🖋</a></td>
<td align="center" valign="top" width="12.5%"><a href="https://github.com/proofconstruction"><img src="https://avatars.githubusercontent.com/u/74747193?v=4?s=100" width="100px;" alt="proofconstruction"/><br /><sub><b>proofconstruction</b></sub></a><br /><a href="#infra-proofconstruction" title="Infrastructure (Hosting, Build-Tools, etc)">🚇</a></td>
<td align="center" valign="top" width="12.5%"><a href="https://www.youtube.com/channel/UCQCjA6qUutAtWqkCA4Z36CQ"><img src="https://avatars.githubusercontent.com/u/16007179?v=4?s=100" width="100px;" alt="IVIURRAY"/><br /><sub><b>IVIURRAY</b></sub></a><br /><a href="#content-IVIURRAY" title="Content">🖋</a></td>
<td align="center" valign="top" width="12.5%"><a href="https://github.com/b-apperlo"><img src="https://avatars.githubusercontent.com/u/91734527?v=4?s=100" width="100px;" alt="Bert Apperlo"/><br /><sub><b>Bert Apperlo</b></sub></a><br /><a href="#content-b-apperlo" title="Content">🖋</a></td>
<td align="center" valign="top" width="12.5%"><a href="https://fwdekker.com/"><img src="https://avatars.githubusercontent.com/u/13442533?v=4?s=100" width="100px;" alt="Florine W. Dekker"/><br /><sub><b>Florine W. Dekker</b></sub></a><br /><a href="#content-FWDekker" title="Content">🖋</a></td>
<td align="center" valign="top" width="12.5%"><a href="https://github.com/luhem7"><img src="https://avatars.githubusercontent.com/u/4008215?v=4?s=100" width="100px;" alt="Mehul Gangavelli"/><br /><sub><b>Mehul Gangavelli</b></sub></a><br /><a href="#content-luhem7" title="Content">🖋</a></td>
<td align="center" valign="top" width="12.5%"><a href="https://github.com/Frosthage"><img src="https://avatars.githubusercontent.com/u/14823314?v=4?s=100" width="100px;" alt="Mikael Frosthage"/><br /><sub><b>Mikael Frosthage</b></sub></a><br /><a href="#content-Frosthage" title="Content">🖋</a></td>
</tr>
<tr>
<td align="center" valign="top" width="12.5%"><a href="https://robertfry.xyz"><img src="https://avatars.githubusercontent.com/u/43712054?v=4?s=100" width="100px;" alt="Robert Fry"/><br /><sub><b>Robert Fry</b></sub></a><br /><a href="#content-robertefry" title="Content">🖋</a></td>
<td align="center" valign="top" width="12.5%"><a href="https://github.com/tajo48"><img src="https://avatars.githubusercontent.com/u/55502906?v=4?s=100" width="100px;" alt="tajo48"/><br /><sub><b>tajo48</b></sub></a><br /><a href="#content-tajo48" title="Content">🖋</a></td>
<td align="center" valign="top" width="12.5%"><a href="https://anishchhetri.com.np"><img src="https://avatars.githubusercontent.com/u/98446102?v=4?s=100" width="100px;" alt="Anish"/><br /><sub><b>Anish</b></sub></a><br /><a href="#content-novanish" title="Content">🖋</a></td>
<td align="center" valign="top" width="12.5%"><a href="https://github.com/vnprc"><img src="https://avatars.githubusercontent.com/u/9425366?v=4?s=100" width="100px;" alt="vnprc"/><br /><sub><b>vnprc</b></sub></a><br /><a href="#content-vnprc" title="Content">🖋</a></td>
<td align="center" valign="top" width="12.5%"><a href="http://androecia.net"><img src="https://avatars.githubusercontent.com/u/61999256?v=4?s=100" width="100px;" alt="Joshua Carlson"/><br /><sub><b>Joshua Carlson</b></sub></a><br /><a href="#content-jrcarl624" title="Content">🖋</a></td>
<td align="center" valign="top" width="12.5%"><a href="https://johndesilencio.me"><img src="https://avatars.githubusercontent.com/u/20136554?v=4?s=100" width="100px;" alt="Nicholas R. Smith"/><br /><sub><b>Nicholas R. Smith</b></sub></a><br /><a href="https://github.com/rust-lang/rustlings/commits?author=johnDeSilencio" title="Code">💻</a></td>
<td align="center" valign="top" width="12.5%"><a href="https://alexfertel.me"><img src="https://avatars.githubusercontent.com/u/22298999?v=4?s=100" width="100px;" alt="Alexander González"/><br /><sub><b>Alexander González</b></sub></a><br /><a href="#content-alexfertel" title="Content">🖋</a></td>
<td align="center" valign="top" width="12.5%"><a href="https://github.com/softarn"><img src="https://avatars.githubusercontent.com/u/517619?v=4?s=100" width="100px;" alt="Marcus Höjvall"/><br /><sub><b>Marcus Höjvall</b></sub></a><br /><a href="#content-softarn" title="Content">🖋</a></td>
</tr>
<tr>
<td align="center" valign="top" width="12.5%"><a href="https://github.com/barlevalon"><img src="https://avatars.githubusercontent.com/u/3397911?v=4?s=100" width="100px;" alt="Alon Hearter"/><br /><sub><b>Alon Hearter</b></sub></a><br /><a href="#content-barlevalon" title="Content">🖋</a></td>
<td align="center" valign="top" width="12.5%"><a href="https://github.com/shirts"><img src="https://avatars.githubusercontent.com/u/4952151?v=4?s=100" width="100px;" alt="shirts"/><br /><sub><b>shirts</b></sub></a><br /><a href="#content-shirts" title="Content">🖋</a></td>
<td align="center" valign="top" width="12.5%"><a href="https://github.com/eLVas"><img src="https://avatars.githubusercontent.com/u/6797156?v=4?s=100" width="100px;" alt="Ivan Vasiunyk"/><br /><sub><b>Ivan Vasiunyk</b></sub></a><br /><a href="#content-eLVas" title="Content">🖋</a></td>
<td align="center" valign="top" width="12.5%"><a href="https://mo8it.com"><img src="https://avatars.githubusercontent.com/u/76752051?v=4?s=100" width="100px;" alt="Mo"/><br /><sub><b>Mo</b></sub></a><br /><a href="https://github.com/rust-lang/rustlings/commits?author=mo8it" title="Code">💻</a></td>
<td align="center" valign="top" width="12.5%"><a href="https://github.com/x10an14"><img src="https://avatars.githubusercontent.com/u/710608?v=4?s=100" width="100px;" alt="x10an14"/><br /><sub><b>x10an14</b></sub></a><br /><a href="#infra-x10an14" title="Infrastructure (Hosting, Build-Tools, etc)">🚇</a></td>
<td align="center" valign="top" width="12.5%"><a href="https://github.com/gabay"><img src="https://avatars.githubusercontent.com/u/5773610?v=4?s=100" width="100px;" alt="Roi Gabay"/><br /><sub><b>Roi Gabay</b></sub></a><br /><a href="#content-gabay" 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>
</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>
</table>

View File

@ -1,3 +1,101 @@
<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>
## 5.5.1 (2023-05-17)
#### Fixed
- Reverted `rust-project.json` path generation due to an upstream `rust-analyzer` fix.
<a name="5.5.0"></a>
## 5.5.0 (2023-05-17)
#### Added
- `strings2`: Added a reference to the book chapter for reference conversion
- `lifetimes`: Added a link to the lifetimekata project
- Added a new `tests4` exercises, which teaches about testing for panics
- Added a `!` prefix command to watch mode that runs an external command
- Added a `--success-hints` option to watch mode that shows hints on exercise success
#### Changed
- `vecs2`: Renamed iterator variable bindings for clarify
- `lifetimes`: Changed order of book references
- `hashmaps2`: Clarified instructions in the todo block
- Moved lifetime exercises before test exercises (via the recommended book ordering)
- `options2`: Improved tests for layering options
- `modules2`: Added more information to the hint
#### Fixed
- `errors2`: Corrected a comment wording
- `iterators2`: Fixed a spelling mistake in the hint text
- `variables`: Wrapped the mut keyword with backticks for readability
- `move_semantics2`: Removed references to line numbers
- `cow1`: Clarified the `owned_no_mutation` comments
- `options3`: Changed exercise to panic when no match is found
- `rustlings lsp` now generates absolute paths, which should fix VSCode `rust-analyzer` usage on Windows
#### Housekeeping
- Added a markdown linter to run on GitHub actions
- Split quick installation section into two code blocks
<a name="5.4.1"></a>
## 5.4.1 (2023-03-10)

402
Cargo.lock generated
View File

@ -12,43 +12,66 @@ dependencies = [
]
[[package]]
name = "argh"
version = "0.1.10"
name = "anstream"
version = "0.5.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "ab257697eb9496bf75526f0217b5ed64636a9cfafa78b8365c71bd283fcef93e"
checksum = "b1f58811cfac344940f1a400b6e6231ce35171f614f26439e80f8c1465c5cc0c"
dependencies = [
"argh_derive",
"argh_shared",
"anstyle",
"anstyle-parse",
"anstyle-query",
"anstyle-wincon",
"colorchoice",
"utf8parse",
]
[[package]]
name = "argh_derive"
version = "0.1.10"
name = "anstyle"
version = "1.0.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "b382dbd3288e053331f03399e1db106c9fb0d8562ad62cb04859ae926f324fa6"
checksum = "b84bf0a05bbb2a83e5eb6fa36bb6e87baa08193c35ff52bbf6b38d8af2890e46"
[[package]]
name = "anstyle-parse"
version = "0.2.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "938874ff5980b03a87c5524b3ae5b59cf99b1d6bc836848df7bc5ada9643c333"
dependencies = [
"argh_shared",
"proc-macro2",
"quote",
"syn 1.0.109",
"utf8parse",
]
[[package]]
name = "argh_shared"
version = "0.1.10"
name = "anstyle-query"
version = "1.0.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "64cb94155d965e3d37ffbbe7cc5b82c3dd79dd33bd48e536f73d2cfb8d85506f"
checksum = "5ca11d4be1bab0c8bc8734a9aa7bf4ee8316d462a08c6ac5052f888fef5b494b"
dependencies = [
"windows-sys 0.48.0",
]
[[package]]
name = "anstyle-wincon"
version = "2.1.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "58f54d10c6dfa51283a066ceab3ec1ab78d13fae00aa49243a45e4571fb79dfd"
dependencies = [
"anstyle",
"windows-sys 0.48.0",
]
[[package]]
name = "assert_cmd"
version = "0.11.1"
version = "2.0.12"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "2dc477793bd82ec39799b6f6b3df64938532fdf2ab0d49ef817eac65856a5a1e"
checksum = "88903cb14723e4d4003335bb7f8a14f27691649105346a0f0957466c096adfe6"
dependencies = [
"escargot",
"anstyle",
"bstr",
"doc-comment",
"predicates",
"predicates-core",
"predicates-tree",
"wait-timeout",
]
[[package]]
@ -63,6 +86,17 @@ version = "1.3.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a"
[[package]]
name = "bstr"
version = "1.6.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "4c2f7349907b712260e64b0afe2f84692af14a454be26187d9df565c7f69266a"
dependencies = [
"memchr",
"regex-automata",
"serde",
]
[[package]]
name = "cfg-if"
version = "0.1.10"
@ -75,6 +109,52 @@ version = "1.0.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd"
[[package]]
name = "clap"
version = "4.4.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "84ed82781cea27b43c9b106a979fe450a13a31aab0500595fb3fc06616de08e6"
dependencies = [
"clap_builder",
"clap_derive",
]
[[package]]
name = "clap_builder"
version = "4.4.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "2bb9faaa7c2ef94b2743a21f5a29e6f0010dff4caa69ac8e9d6cf8b6fa74da08"
dependencies = [
"anstream",
"anstyle",
"clap_lex",
"strsim",
]
[[package]]
name = "clap_derive"
version = "4.4.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "0862016ff20d69b84ef8247369fabf5c008a7417002411897d40ee1f4532b873"
dependencies = [
"heck",
"proc-macro2",
"quote",
"syn",
]
[[package]]
name = "clap_lex"
version = "0.5.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "cd7cc57abe963c6d3b9d8be5b06ba7c8957a930305ca90304f24ef040aa6f961"
[[package]]
name = "colorchoice"
version = "1.0.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "acbf1af155f9b9ef647e42cdc158db4b64a1b61f743629225fde6f3e0be2a7c7"
[[package]]
name = "console"
version = "0.15.5"
@ -89,10 +169,22 @@ dependencies = [
]
[[package]]
name = "difference"
version = "2.0.0"
name = "difflib"
version = "0.4.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "524cbf6897b527295dff137cec09ecf3a05f4fddffd7dfcd1585403449e74198"
checksum = "6184e33543162437515c2e2b48714794e37845ec9851711914eec9d308f6ebe8"
[[package]]
name = "doc-comment"
version = "0.3.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "fea41bba32d969b513997752735605054bc0dfa92b4c56bf1189f2e174be7a10"
[[package]]
name = "either"
version = "1.9.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "a26ae43d7bcc3b814de94796a5e736d4029efb0ee900c12e2d54c993ad1a1e07"
[[package]]
name = "encode_unicode"
@ -101,16 +193,10 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "a357d28ed41a50f9c765dbfe56cbc04a64e53e5fc58ba79fbc34c10ef3df831f"
[[package]]
name = "escargot"
version = "0.4.0"
name = "equivalent"
version = "1.0.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "ceb9adbf9874d5d028b5e4c5739d22b71988252b25c9c98fe7cf9738bee84597"
dependencies = [
"lazy_static",
"log",
"serde",
"serde_json",
]
checksum = "5443807d6dff69373d433ab9ef5378ad8df50ca6298caf15de6e52e24aaf54d5"
[[package]]
name = "filetime"
@ -126,9 +212,9 @@ dependencies = [
[[package]]
name = "float-cmp"
version = "0.8.0"
version = "0.9.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "e1267f4ac4f343772758f7b1bdcbe767c218bbab93bb432acbf5162bbf85a6c4"
checksum = "98de4bbd547a563b716d8dfa9aad1cb19bfab00f4fa09a6a4ed21dbcf44ce9c4"
dependencies = [
"num-traits",
]
@ -174,6 +260,18 @@ version = "0.3.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "d2fabcfbdc87f4758337ca535fb41a6d701b65693ce38287d856d1674551ec9b"
[[package]]
name = "hashbrown"
version = "0.14.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "2c6201b9ff9fd90a5a3bac2e56a830d0caa509576f0e503818ee82c181b3437a"
[[package]]
name = "heck"
version = "0.4.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "95505c38b4572b2d910cecb0281560f54b440a19336cbbcb27bf6ce6adc6f5a8"
[[package]]
name = "home"
version = "0.5.4"
@ -184,15 +282,26 @@ dependencies = [
]
[[package]]
name = "indicatif"
version = "0.16.2"
name = "indexmap"
version = "2.0.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "2d207dc617c7a380ab07ff572a6e52fa202a2a8f355860ac9c38e23f8196be1b"
checksum = "d5477fe2230a79769d8dc68e0eabf5437907c0457a5614a9e8dddb67f65eb65d"
dependencies = [
"equivalent",
"hashbrown",
]
[[package]]
name = "indicatif"
version = "0.17.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "0b297dc40733f23a0e52728a58fa9489a5b7638a324932de16b41adc3ef80730"
dependencies = [
"console",
"lazy_static",
"instant",
"number_prefix",
"regex",
"portable-atomic",
"unicode-width",
]
[[package]]
@ -215,6 +324,15 @@ dependencies = [
"libc",
]
[[package]]
name = "instant"
version = "0.1.12"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "7a5bbe824c507c5da5956355e86a746d82e0e1464f65d862cc5e71da70e94b2c"
dependencies = [
"cfg-if 1.0.0",
]
[[package]]
name = "iovec"
version = "0.1.4"
@ -224,6 +342,15 @@ dependencies = [
"libc",
]
[[package]]
name = "itertools"
version = "0.10.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "b0fd2260e829bddf4cb6ea802289de2f86d6a7a690192fbe91b3f46e0f2c8473"
dependencies = [
"either",
]
[[package]]
name = "itoa"
version = "1.0.6"
@ -269,9 +396,9 @@ dependencies = [
[[package]]
name = "memchr"
version = "2.5.0"
version = "2.6.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "2dffe52ecf27772e601905b7522cb4ef790d2cc203488bbd0e2fe85fcb74566d"
checksum = "8f232d6ef707e1956a43342693d2a31e72989554d58299d7a88738cc95b0d35c"
[[package]]
name = "mio"
@ -367,13 +494,21 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "830b246a0e5f20af87141b25c173cd1b609bd7779a4617d6ec582abaf90870f3"
[[package]]
name = "predicates"
version = "1.0.8"
name = "portable-atomic"
version = "1.4.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "f49cfaf7fdaa3bfacc6fa3e7054e65148878354a5cfddcf661df4c851f8021df"
checksum = "31114a898e107c51bb1609ffaf55a0e011cf6a4d7f1170d0015a165082c0338b"
[[package]]
name = "predicates"
version = "3.0.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "09963355b9f467184c04017ced4a2ba2d75cbcb4e7462690d388233253d4b1a9"
dependencies = [
"difference",
"anstyle",
"difflib",
"float-cmp",
"itertools",
"normalize-line-endings",
"predicates-core",
"regex",
@ -433,6 +568,12 @@ dependencies = [
"regex-syntax",
]
[[package]]
name = "regex-automata"
version = "0.3.8"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "c2f401f4955220693b56f8ec66ee9c78abffd8d1c4f23dc41a23839eb88f0795"
[[package]]
name = "regex-syntax"
version = "0.6.29"
@ -441,10 +582,10 @@ checksum = "f162c6dd7b008981e4d40210aca20b4bd0f9b60ca9271061b07f78537722f2e1"
[[package]]
name = "rustlings"
version = "5.4.1"
version = "5.6.1"
dependencies = [
"argh",
"assert_cmd",
"clap",
"console",
"glob",
"home",
@ -489,7 +630,7 @@ checksum = "e801c1712f48475582b7696ac71e0ca34ebb30e09338425384269d9717c62cad"
dependencies = [
"proc-macro2",
"quote",
"syn 2.0.8",
"syn",
]
[[package]]
@ -503,6 +644,15 @@ dependencies = [
"serde",
]
[[package]]
name = "serde_spanned"
version = "0.6.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "96426c9936fd7a0124915f9185ea1d20aa9445cc9821142f0a73bc9207a2e186"
dependencies = [
"serde",
]
[[package]]
name = "slab"
version = "0.4.8"
@ -513,15 +663,10 @@ dependencies = [
]
[[package]]
name = "syn"
version = "1.0.109"
name = "strsim"
version = "0.10.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "72b64191b275b66ffe2469e8af2c1cfe3bafa67b529ead792a6d0160888b4237"
dependencies = [
"proc-macro2",
"quote",
"unicode-ident",
]
checksum = "73473c0e59e6d5812c5dfe2a064a6444949f089e20eec9a2e5506596494e4623"
[[package]]
name = "syn"
@ -542,11 +687,36 @@ checksum = "3369f5ac52d5eb6ab48c6b4ffdc8efbcad6b89c765749064ba298f2c68a16a76"
[[package]]
name = "toml"
version = "0.5.11"
version = "0.7.8"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "f4f7f0dd8d50a853a531c426359045b1998f04219d88799810762cd4ad314234"
checksum = "dd79e69d3b627db300ff956027cc6c3798cef26d22526befdfcd12feeb6d2257"
dependencies = [
"serde",
"serde_spanned",
"toml_datetime",
"toml_edit",
]
[[package]]
name = "toml_datetime"
version = "0.6.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "7cda73e2f1397b1262d6dfdcef8aafae14d1de7748d66822d3bfeeb6d03e5e4b"
dependencies = [
"serde",
]
[[package]]
name = "toml_edit"
version = "0.19.15"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "1b5bb770da30e5cbfde35a2d7b9b8a2c4b8ef89548a7a6aeab5c9a576e3e7421"
dependencies = [
"indexmap",
"serde",
"serde_spanned",
"toml_datetime",
"winnow",
]
[[package]]
@ -561,6 +731,21 @@ version = "0.1.10"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "c0edd1e5b14653f783770bce4a4dabb4a5108a5370a5f5d8cfe8710c361f6c8b"
[[package]]
name = "utf8parse"
version = "0.2.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "711b9620af191e0cdc7468a8d14e709c3dcdb115b36f838e601583af800a370a"
[[package]]
name = "wait-timeout"
version = "0.2.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "9f200f5b12eb75f8c1ed65abd4b2db8a6e1b138a20de009dacee265a2498f3f6"
dependencies = [
"libc",
]
[[package]]
name = "walkdir"
version = "2.3.3"
@ -620,13 +805,13 @@ version = "0.42.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "5a3e1820f08b8513f676f7ab6c1f99ff312fb97b553d30ff4dd86f9f15728aa7"
dependencies = [
"windows_aarch64_gnullvm",
"windows_aarch64_msvc",
"windows_i686_gnu",
"windows_i686_msvc",
"windows_x86_64_gnu",
"windows_x86_64_gnullvm",
"windows_x86_64_msvc",
"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]]
@ -635,7 +820,16 @@ version = "0.45.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "75283be5efb2831d37ea142365f009c02ec203cd29a3ebecbc093d52315b66d0"
dependencies = [
"windows-targets",
"windows-targets 0.42.2",
]
[[package]]
name = "windows-sys"
version = "0.48.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "677d2418bec65e3338edb076e806bc1ec15693c5d0104683f2efe857f61056a9"
dependencies = [
"windows-targets 0.48.5",
]
[[package]]
@ -644,13 +838,28 @@ version = "0.42.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "8e5180c00cd44c9b1c88adb3693291f1cd93605ded80c250a75d472756b4d071"
dependencies = [
"windows_aarch64_gnullvm",
"windows_aarch64_msvc",
"windows_i686_gnu",
"windows_i686_msvc",
"windows_x86_64_gnu",
"windows_x86_64_gnullvm",
"windows_x86_64_msvc",
"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]]
name = "windows-targets"
version = "0.48.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "9a2fa6e2155d7247be68c096456083145c183cbbbc2764150dda45a87197940c"
dependencies = [
"windows_aarch64_gnullvm 0.48.5",
"windows_aarch64_msvc 0.48.5",
"windows_i686_gnu 0.48.5",
"windows_i686_msvc 0.48.5",
"windows_x86_64_gnu 0.48.5",
"windows_x86_64_gnullvm 0.48.5",
"windows_x86_64_msvc 0.48.5",
]
[[package]]
@ -659,42 +868,93 @@ version = "0.42.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "597a5118570b68bc08d8d59125332c54f1ba9d9adeedeef5b99b02ba2b0698f8"
[[package]]
name = "windows_aarch64_gnullvm"
version = "0.48.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "2b38e32f0abccf9987a4e3079dfb67dcd799fb61361e53e2882c3cbaf0d905d8"
[[package]]
name = "windows_aarch64_msvc"
version = "0.42.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "e08e8864a60f06ef0d0ff4ba04124db8b0fb3be5776a5cd47641e942e58c4d43"
[[package]]
name = "windows_aarch64_msvc"
version = "0.48.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "dc35310971f3b2dbbf3f0690a219f40e2d9afcf64f9ab7cc1be722937c26b4bc"
[[package]]
name = "windows_i686_gnu"
version = "0.42.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "c61d927d8da41da96a81f029489353e68739737d3beca43145c8afec9a31a84f"
[[package]]
name = "windows_i686_gnu"
version = "0.48.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "a75915e7def60c94dcef72200b9a8e58e5091744960da64ec734a6c6e9b3743e"
[[package]]
name = "windows_i686_msvc"
version = "0.42.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "44d840b6ec649f480a41c8d80f9c65108b92d89345dd94027bfe06ac444d1060"
[[package]]
name = "windows_i686_msvc"
version = "0.48.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "8f55c233f70c4b27f66c523580f78f1004e8b5a8b659e05a4eb49d4166cca406"
[[package]]
name = "windows_x86_64_gnu"
version = "0.42.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "8de912b8b8feb55c064867cf047dda097f92d51efad5b491dfb98f6bbb70cb36"
[[package]]
name = "windows_x86_64_gnu"
version = "0.48.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "53d40abd2583d23e4718fddf1ebec84dbff8381c07cae67ff7768bbf19c6718e"
[[package]]
name = "windows_x86_64_gnullvm"
version = "0.42.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "26d41b46a36d453748aedef1486d5c7a85db22e56aff34643984ea85514e94a3"
[[package]]
name = "windows_x86_64_gnullvm"
version = "0.48.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "0b7b52767868a23d5bab768e390dc5f5c55825b6d30b86c844ff2dc7414044cc"
[[package]]
name = "windows_x86_64_msvc"
version = "0.42.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "9aec5da331524158c6d1a4ac0ab1541149c0b9505fde06423b02f5ef0106b9f0"
[[package]]
name = "windows_x86_64_msvc"
version = "0.48.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "ed94fce61571a4006852b7389a063ab983c02eb1bb37b47f8272ce92d06d9538"
[[package]]
name = "winnow"
version = "0.5.15"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "7c2e3184b9c4e92ad5167ca73039d0c42476302ab603e2fec4487511f38ccefc"
dependencies = [
"memchr",
]
[[package]]
name = "ws2_32-sys"
version = "0.2.1"

View File

@ -1,6 +1,7 @@
[package]
name = "rustlings"
version = "5.4.1"
description = "Small exercises to get you used to reading and writing Rust code!"
version = "5.6.1"
authors = [
"Liv <mokou@fastmail.com>",
"Carol (Nichols || Goulding) <carol.nichols@gmail.com>",
@ -8,22 +9,22 @@ authors = [
edition = "2021"
[dependencies]
argh = "0.1"
indicatif = "0.16"
indicatif = "0.17.6"
console = "0.15"
notify = "4.0"
toml = "0.5"
toml = "0.7.6"
regex = "1.5"
serde = { version = "1.0", features = ["derive"] }
serde_json = "1.0.81"
home = "0.5.3"
glob = "0.3.0"
clap = { version = "4.4.0", features = ["derive"] }
[[bin]]
name = "rustlings"
path = "src/main.rs"
[dev-dependencies]
assert_cmd = "0.11.0"
predicates = "1.0.1"
assert_cmd = "2.0.12"
predicates = "3.0.3"
glob = "0.3.0"

View File

@ -1,5 +1,9 @@
<div class="oranda-hide">
# rustlings 🦀❤️
</div>
Greetings and welcome to `rustlings`. This project contains small exercises to get you used to reading and writing Rust code. This includes reading and responding to compiler messages!
_...looking for the old, web-based version of Rustlings? Try [here](https://github.com/rust-lang/rustlings/tree/rustlings-1)_
@ -14,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 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
@ -23,6 +27,7 @@ Just run:
```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:
```bash
@ -36,8 +41,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`.
```bash
# find out the latest version at https://github.com/rust-lang/rustlings/releases/latest (on edit 5.4.1)
git clone -b 5.4.1 --depth 1 https://github.com/rust-lang/rustlings
# find out the latest version at https://github.com/rust-lang/rustlings/releases/latest (on edit 5.6.1)
git clone -b 5.6.1 --depth 1 https://github.com/rust-lang/rustlings
cd rustlings
# if nix version > 2.3
nix develop
@ -74,8 +79,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 .`.
```bash
# find out the latest version at https://github.com/rust-lang/rustlings/releases/latest (on edit 5.4.1)
git clone -b 5.4.1 --depth 1 https://github.com/rust-lang/rustlings
# find out the latest version at https://github.com/rust-lang/rustlings/releases/latest (on edit 5.6.1)
git clone -b 5.6.1 --depth 1 https://github.com/rust-lang/rustlings
cd rustlings
cargo install --force --path .
```
@ -168,12 +173,8 @@ Now you should be done!
## Contributing
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!
See [CONTRIBUTING.md](https://github.com/rust-lang/rustlings/blob/main/CONTRIBUTING.md).
## Contributors ✨
Thanks goes to the wonderful people listed in [AUTHORS.md](./AUTHORS.md) 🎉
Thanks goes to the wonderful people listed in [AUTHORS.md](https://github.com/rust-lang/rustlings/blob/main/AUTHORS.md) 🎉

View File

@ -1,10 +1,13 @@
// clippy1.rs
// The Clippy tool is a collection of lints to analyze your code
// so you can catch common mistakes and improve your Rust code.
//
// For these exercises the code will fail to compile when there are clippy warnings
// check clippy's suggestions from the output to solve the exercise.
// Execute `rustlings hint clippy1` or use the `hint` watch subcommand for a hint.
// The Clippy tool is a collection of lints to analyze your code so you can
// catch common mistakes and improve your Rust code.
//
// For these exercises the code will fail to compile when there are clippy
// warnings check clippy's suggestions from the output to solve the exercise.
//
// Execute `rustlings hint clippy1` or use the `hint` watch subcommand for a
// hint.
// I AM NOT DONE

View File

@ -1,5 +1,7 @@
// clippy2.rs
// Execute `rustlings hint clippy2` or use the `hint` watch subcommand for a hint.
//
// Execute `rustlings hint clippy2` or use the `hint` watch subcommand for a
// hint.
// I AM NOT DONE

View File

@ -1,5 +1,7 @@
// clippy3.rs
//
// Here's a couple more easy Clippy fixes, so you can see its utility.
// No hints.
// I AM NOT DONE

View File

@ -6,6 +6,7 @@ The simplest form of type conversion is a type cast expression. It is denoted wi
Rust also offers traits that facilitate type conversions upon implementation. These traits can be found under the [`convert`](https://doc.rust-lang.org/std/convert/index.html) module.
The traits are the following:
- `From` and `Into` covered in [`from_into`](from_into.rs)
- `TryFrom` and `TryInto` covered in [`try_from_into`](try_from_into.rs)
- `AsRef` and `AsMut` covered in [`as_ref_mut`](as_ref_mut.rs)
@ -17,5 +18,6 @@ These should be the main ways ***within the standard library*** to convert data
## Further information
These are not directly covered in the book, but the standard library has a great documentation for it.
- [conversions](https://doc.rust-lang.org/std/convert/index.html)
- [`FromStr` trait](https://doc.rust-lang.org/std/str/trait.FromStr.html)

View File

@ -1,7 +1,11 @@
// AsRef and AsMut allow for cheap reference-to-reference conversions.
// Read more about them at https://doc.rust-lang.org/std/convert/trait.AsRef.html
// and https://doc.rust-lang.org/std/convert/trait.AsMut.html, respectively.
// Execute `rustlings hint as_ref_mut` or use the `hint` watch subcommand for a hint.
// as_ref_mut.rs
//
// AsRef and AsMut allow for cheap reference-to-reference conversions. Read more
// about them at https://doc.rust-lang.org/std/convert/trait.AsRef.html and
// https://doc.rust-lang.org/std/convert/trait.AsMut.html, respectively.
//
// Execute `rustlings hint as_ref_mut` or use the `hint` watch subcommand for a
// hint.
// I AM NOT DONE
@ -53,7 +57,7 @@ mod tests {
}
#[test]
fn mult_box() {
fn mut_box() {
let mut num: Box<u32> = Box::new(3);
num_sq(&mut num);
assert_eq!(*num, 9);

View File

@ -1,7 +1,11 @@
// The From trait is used for value-to-value conversions.
// If From is implemented correctly for a type, the Into trait should work conversely.
// You can read more about it at https://doc.rust-lang.org/std/convert/trait.From.html
// Execute `rustlings hint from_into` or use the `hint` watch subcommand for a hint.
// from_into.rs
//
// The From trait is used for value-to-value conversions. If From is implemented
// correctly for a type, the Into trait should work conversely. You can read
// more about it at https://doc.rust-lang.org/std/convert/trait.From.html
//
// Execute `rustlings hint from_into` or use the `hint` watch subcommand for a
// hint.
#[derive(Debug)]
struct Person {
@ -20,20 +24,21 @@ impl Default for Person {
}
}
// Your task is to complete this implementation
// in order for the line `let p = Person::from("Mark,20")` to compile
// Please note that you'll need to parse the age component into a `usize`
// with something like `"4".parse::<usize>()`. The outcome of this needs to
// be handled appropriately.
// Your task is to complete this implementation in order for the line `let p =
// Person::from("Mark,20")` to compile Please note that you'll need to parse the
// age component into a `usize` with something like `"4".parse::<usize>()`. The
// outcome of this needs to be handled appropriately.
//
// Steps:
// 1. If the length of the provided string is 0, then return the default of Person
// 2. Split the given string on the commas present in it
// 3. Extract the first element from the split operation and use it as the name
// 4. If the name is empty, then return the default of Person
// 5. Extract the other element from the split operation and parse it into a `usize` as the age
// If while parsing the age, something goes wrong, then return the default of Person
// Otherwise, then return an instantiated Person object with the results
// 1. If the length of the provided string is 0, then return the default of
// Person.
// 2. Split the given string on the commas present in it.
// 3. Extract the first element from the split operation and use it as the name.
// 4. If the name is empty, then return the default of Person.
// 5. Extract the other element from the split operation and parse it into a
// `usize` as the age.
// If while parsing the age, something goes wrong, then return the default of
// Person Otherwise, then return an instantiated Person object with the results
// I AM NOT DONE
@ -77,7 +82,8 @@ mod tests {
}
#[test]
fn test_bad_age() {
// Test that "Mark,twenty" will return the default person due to an error in parsing age
// Test that "Mark,twenty" will return the default person due to an
// error in parsing age
let p = Person::from("Mark,twenty");
assert_eq!(p.name, "John");
assert_eq!(p.age, 30);
@ -121,14 +127,14 @@ mod tests {
#[test]
fn test_trailing_comma() {
let p: Person = Person::from("Mike,32,");
assert_eq!(p.name, "John");
assert_eq!(p.age, 30);
assert_eq!(p.name, "Mike");
assert_eq!(p.age, 32);
}
#[test]
fn test_trailing_comma_and_some_string() {
let p: Person = Person::from("Mike,32,man");
assert_eq!(p.name, "John");
assert_eq!(p.age, 30);
assert_eq!(p.name, "Mike");
assert_eq!(p.age, 32);
}
}

View File

@ -1,10 +1,13 @@
// from_str.rs
// This is similar to from_into.rs, but this time we'll implement `FromStr`
// and return errors instead of falling back to a default value.
// Additionally, upon implementing FromStr, you can use the `parse` method
// on strings to generate an object of the implementor type.
// You can read more about it at https://doc.rust-lang.org/std/str/trait.FromStr.html
// Execute `rustlings hint from_str` or use the `hint` watch subcommand for a hint.
//
// This is similar to from_into.rs, but this time we'll implement `FromStr` and
// return errors instead of falling back to a default value. Additionally, upon
// implementing FromStr, you can use the `parse` method on strings to generate
// an object of the implementor type. You can read more about it at
// https://doc.rust-lang.org/std/str/trait.FromStr.html
//
// Execute `rustlings hint from_str` or use the `hint` watch subcommand for a
// hint.
use std::num::ParseIntError;
use std::str::FromStr;
@ -33,15 +36,18 @@ enum ParsePersonError {
// Steps:
// 1. If the length of the provided string is 0, an error should be returned
// 2. Split the given string on the commas present in it
// 3. Only 2 elements should be returned from the split, otherwise return an error
// 3. Only 2 elements should be returned from the split, otherwise return an
// error
// 4. Extract the first element from the split operation and use it as the name
// 5. Extract the other element from the split operation and parse it into a `usize` as the age
// with something like `"4".parse::<usize>()`
// 6. If while extracting the name and the age something goes wrong, an error should be returned
// 5. Extract the other element from the split operation and parse it into a
// `usize` as the age with something like `"4".parse::<usize>()`
// 6. If while extracting the name and the age something goes wrong, an error
// should be returned
// If everything goes well, then return a Result of a Person object
//
// As an aside: `Box<dyn Error>` implements `From<&'_ str>`. This means that if you want to return a
// string error message, you can do so via just using return `Err("my error message".into())`.
// As an aside: `Box<dyn Error>` implements `From<&'_ str>`. This means that if
// you want to return a string error message, you can do so via just using
// return `Err("my error message".into())`.
impl FromStr for Person {
type Err = ParsePersonError;

View File

@ -1,9 +1,13 @@
// try_from_into.rs
// TryFrom is a simple and safe type conversion that may fail in a controlled way under some circumstances.
// Basically, this is the same as From. The main difference is that this should return a Result type
// instead of the target type itself.
// You can read more about it at https://doc.rust-lang.org/std/convert/trait.TryFrom.html
// Execute `rustlings hint try_from_into` or use the `hint` watch subcommand for a hint.
//
// TryFrom is a simple and safe type conversion that may fail in a controlled
// way under some circumstances. Basically, this is the same as From. The main
// difference is that this should return a Result type instead of the target
// type itself. You can read more about it at
// https://doc.rust-lang.org/std/convert/trait.TryFrom.html
//
// Execute `rustlings hint try_from_into` or use the `hint` watch subcommand for
// a hint.
use std::convert::{TryFrom, TryInto};
@ -25,14 +29,13 @@ enum IntoColorError {
// I AM NOT DONE
// Your task is to complete this implementation
// and return an Ok result of inner type Color.
// You need to create an implementation for a tuple of three integers,
// an array of three integers, and a slice of integers.
// Your task is to complete this implementation and return an Ok result of inner
// type Color. You need to create an implementation for a tuple of three
// integers, an array of three integers, and a slice of integers.
//
// Note that the implementation for tuple and array will be checked at compile time,
// but the slice implementation needs to check the slice length!
// Also note that correct RGB color values must be integers in the 0..=255 range.
// Note that the implementation for tuple and array will be checked at compile
// time, but the slice implementation needs to check the slice length! Also note
// that correct RGB color values must be integers in the 0..=255 range.
// Tuple implementation
impl TryFrom<(i16, i16, i16)> for Color {

View File

@ -1,10 +1,14 @@
// Type casting in Rust is done via the usage of the `as` operator.
// Please note that the `as` operator is not only used when type casting.
// It also helps with renaming imports.
// using_as.rs
//
// The goal is to make sure that the division does not fail to compile
// and returns the proper type.
// Execute `rustlings hint using_as` or use the `hint` watch subcommand for a hint.
// Type casting in Rust is done via the usage of the `as` operator. Please note
// that the `as` operator is not only used when type casting. It also helps with
// renaming imports.
//
// The goal is to make sure that the division does not fail to compile and
// returns the proper type.
//
// Execute `rustlings hint using_as` or use the `hint` watch subcommand for a
// hint.
// I AM NOT DONE

View File

@ -1,4 +1,5 @@
// enums1.rs
//
// No hints this time! ;)
// I AM NOT DONE

View File

@ -1,5 +1,7 @@
// enums2.rs
// Execute `rustlings hint enums2` or use the `hint` watch subcommand for a hint.
//
// Execute `rustlings hint enums2` or use the `hint` watch subcommand for a
// hint.
// I AM NOT DONE

View File

@ -1,6 +1,9 @@
// enums3.rs
//
// Address all the TODOs to make the tests pass!
// Execute `rustlings hint enums3` or use the `hint` watch subcommand for a hint.
//
// Execute `rustlings hint enums3` or use the `hint` watch subcommand for a
// hint.
// I AM NOT DONE
@ -17,6 +20,7 @@ struct State {
color: (u8, u8, u8),
position: Point,
quit: bool,
message: String,
}
impl State {
@ -28,8 +32,8 @@ impl State {
self.quit = true;
}
fn echo(&self, s: String) {
println!("{}", s);
fn echo(&mut self, s: String) {
self.message = s
}
fn move_position(&mut self, p: Point) {
@ -38,7 +42,8 @@ impl State {
fn process(&mut self, message: Message) {
// TODO: create a match expression to process the different message variants
// Remember: When passing a tuple as a function argument, you'll need extra parentheses: 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))
}
}
@ -52,9 +57,10 @@ mod tests {
quit: false,
position: Point { x: 0, y: 0 },
color: (0, 0, 0),
message: "hello world".to_string(),
};
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::Quit);
@ -62,5 +68,6 @@ mod tests {
assert_eq!(state.position.x, 10);
assert_eq!(state.position.y, 15);
assert_eq!(state.quit, true);
assert_eq!(state.message, "Hello world!");
}
}

View File

@ -1,9 +1,13 @@
// errors1.rs
// This function refuses to generate text to be printed on a nametag if
// you pass it an empty string. It'd be nicer if it explained what the problem
// was, instead of just sometimes returning `None`. Thankfully, Rust has a similar
// construct to `Option` that can be used to express error conditions. Let's use it!
// Execute `rustlings hint errors1` or use the `hint` watch subcommand for a hint.
//
// This function refuses to generate text to be printed on a nametag if you pass
// it an empty string. It'd be nicer if it explained what the problem was,
// instead of just sometimes returning `None`. Thankfully, Rust has a similar
// construct to `Option` that can be used to express error conditions. Let's use
// it!
//
// Execute `rustlings hint errors1` or use the `hint` watch subcommand for a
// hint.
// I AM NOT DONE

View File

@ -1,21 +1,23 @@
// errors2.rs
//
// Say we're writing a game where you can buy items with tokens. All items cost
// 5 tokens, and whenever you purchase items there is a processing fee of 1
// token. A player of the game will type in how many items they want to buy,
// and the `total_cost` function will calculate the total cost of the tokens.
// Since the player typed in the quantity, though, we get it as a string-- and
// they might have typed anything, not just numbers!
// token. A player of the game will type in how many items they want to buy, and
// the `total_cost` function will calculate the total cost of the tokens. Since
// the player typed in the quantity, though, we get it as a string-- and they
// might have typed anything, not just numbers!
//
// Right now, this function isn't handling the error case at all (and isn't
// handling the success case properly either). What we want to do is:
// if we call the `parse` function on a string that is not a number, that
// function will return a `ParseIntError`, and in that case, we want to
// immediately return that error from our function and not try to multiply
// and add.
// There are at least two ways to implement this that are both correct-- but
// one is a lot shorter!
// Execute `rustlings hint errors2` or use the `hint` watch subcommand for a hint.
// handling the success case properly either). What we want to do is: if we call
// the `total_cost` function on a string that is not a number, that function
// will return a `ParseIntError`, and in that case, we want to immediately
// return that error from our function and not try to multiply and add.
//
// There are at least two ways to implement this that are both correct-- but one
// is a lot shorter!
//
// Execute `rustlings hint errors2` or use the `hint` watch subcommand for a
// hint.
// I AM NOT DONE

View File

@ -1,8 +1,11 @@
// errors3.rs
//
// This is a program that is trying to use a completed version of the
// `total_cost` function from the previous exercise. It's not working though!
// Why not? What should we do to fix it?
// Execute `rustlings hint errors3` or use the `hint` watch subcommand for a hint.
//
// Execute `rustlings hint errors3` or use the `hint` watch subcommand for a
// hint.
// I AM NOT DONE

View File

@ -1,5 +1,7 @@
// errors4.rs
// Execute `rustlings hint errors4` or use the `hint` watch subcommand for a hint.
//
// Execute `rustlings hint errors4` or use the `hint` watch subcommand for a
// hint.
// I AM NOT DONE
@ -14,7 +16,7 @@ enum CreationError {
impl PositiveNonzeroInteger {
fn new(value: i64) -> Result<PositiveNonzeroInteger, CreationError> {
// Hmm...? Why is this only returning an Ok value?
// Hmm... Why is this always returning an Ok value?
Ok(PositiveNonzeroInteger(value as u64))
}
}

View File

@ -1,20 +1,26 @@
// errors5.rs
//
// This program uses an altered version of the code from errors4.
// This exercise uses some concepts that we won't get to until later in the course, like `Box` and the
// `From` trait. It's not important to understand them in detail right now, but you can read ahead if you like.
// For now, think of the `Box<dyn ???>` type as an "I want anything that does ???" type, which, given
// Rust's usual standards for runtime safety, should strike you as somewhat lenient!
// In short, this particular use case for boxes is for when you want to own a value and you care only that it is a
// type which implements a particular trait. To do so, The Box is declared as of type Box<dyn Trait> where Trait is the trait
// the compiler looks for on any value used in that context. For this exercise, that context is the potential errors
// which can be returned in a Result.
// What can we use to describe both errors? In other words, is there a trait which both errors implement?
// Execute `rustlings hint errors5` or use the `hint` watch subcommand for a hint.
//
// This exercise uses some concepts that we won't get to until later in the
// course, like `Box` and the `From` trait. It's not important to understand
// them in detail right now, but you can read ahead if you like. For now, think
// of the `Box<dyn ???>` type as an "I want anything that does ???" type, which,
// given Rust's usual standards for runtime safety, should strike you as
// somewhat lenient!
//
// In short, this particular use case for boxes is for when you want to own a
// value and you care only that it is a type which implements a particular
// trait. To do so, The Box is declared as of type Box<dyn Trait> where Trait is
// the trait the compiler looks for on any value used in that context. For this
// exercise, that context is the potential errors which can be returned in a
// Result.
//
// What can we use to describe both errors? In other words, is there a trait
// which both errors implement?
//
// Execute `rustlings hint errors5` or use the `hint` watch subcommand for a
// hint.
// I AM NOT DONE

View File

@ -1,12 +1,13 @@
// errors6.rs
//
// Using catch-all error types like `Box<dyn error::Error>` isn't recommended
// for library code, where callers might want to make decisions based on the
// error content, instead of printing it out or propagating it further. Here,
// we define a custom error type to make it possible for callers to decide
// what to do next when our function returns an error.
// Execute `rustlings hint errors6` or use the `hint` watch subcommand for a hint.
// error content, instead of printing it out or propagating it further. Here, we
// define a custom error type to make it possible for callers to decide what to
// do next when our function returns an error.
//
// Execute `rustlings hint errors6` or use the `hint` watch subcommand for a
// hint.
// I AM NOT DONE

View File

@ -1,5 +1,7 @@
// functions1.rs
// Execute `rustlings hint functions1` or use the `hint` watch subcommand for a hint.
//
// Execute `rustlings hint functions1` or use the `hint` watch subcommand for a
// hint.
// I AM NOT DONE

View File

@ -1,5 +1,7 @@
// functions2.rs
// Execute `rustlings hint functions2` or use the `hint` watch subcommand for a hint.
//
// Execute `rustlings hint functions2` or use the `hint` watch subcommand for a
// hint.
// I AM NOT DONE

View File

@ -1,5 +1,7 @@
// functions3.rs
// Execute `rustlings hint functions3` or use the `hint` watch subcommand for a hint.
//
// Execute `rustlings hint functions3` or use the `hint` watch subcommand for a
// hint.
// I AM NOT DONE

View File

@ -1,11 +1,12 @@
// functions4.rs
// Execute `rustlings hint functions4` or use the `hint` watch subcommand for a hint.
// This store is having a sale where if the price is an even number, you get
// 10 Rustbucks off, but if it's an odd number, it's 3 Rustbucks off.
// (Don't worry about the function bodies themselves, we're only interested
// in the signatures for now. If anything, this is a good way to peek ahead
// to future exercises!)
//
// This store is having a sale where if the price is an even number, you get 10
// Rustbucks off, but if it's an odd number, it's 3 Rustbucks off. (Don't worry
// about the function bodies themselves, we're only interested in the signatures
// for now. If anything, this is a good way to peek ahead to future exercises!)
//
// Execute `rustlings hint functions4` or use the `hint` watch subcommand for a
// hint.
// I AM NOT DONE

View File

@ -1,5 +1,7 @@
// functions5.rs
// Execute `rustlings hint functions5` or use the `hint` watch subcommand for a hint.
//
// Execute `rustlings hint functions5` or use the `hint` watch subcommand for a
// hint.
// I AM NOT DONE

View File

@ -1,7 +1,10 @@
// This shopping list program isn't compiling!
// Use your knowledge of generics to fix it.
// Execute `rustlings hint generics1` or use the `hint` watch subcommand for a hint.
// generics1.rs
//
// This shopping list program isn't compiling! Use your knowledge of generics to
// fix it.
//
// Execute `rustlings hint generics1` or use the `hint` watch subcommand for a
// hint.
// I AM NOT DONE

View File

@ -1,7 +1,10 @@
// generics2.rs
//
// This powerful wrapper provides the ability to store a positive integer value.
// Rewrite it using generics so that it supports wrapping ANY type.
// Execute `rustlings hint generics2` or use the `hint` watch subcommand for a hint.
//
// Execute `rustlings hint generics2` or use the `hint` watch subcommand for a
// hint.
// I AM NOT DONE

View File

@ -1,4 +1,5 @@
# Hashmaps
A *hash map* allows you to associate a value with a particular key.
You may also know this by the names [*unordered map* in C++](https://en.cppreference.com/w/cpp/container/unordered_map),
[*dictionary* in Python](https://docs.python.org/3/tutorial/datastructures.html#dictionaries) or an *associative array* in other languages.

View File

@ -1,14 +1,15 @@
// hashmaps1.rs
// A basket of fruits in the form of a hash map needs to be defined.
// The key represents the name of the fruit and the value represents
// how many of that particular fruit is in the basket. You have to put
// at least three different types of fruits (e.g apple, banana, mango)
// in the basket and the total count of all the fruits should be at
// least five.
//
// A basket of fruits in the form of a hash map needs to be defined. The key
// represents the name of the fruit and the value represents how many of that
// particular fruit is in the basket. You have to put at least three different
// types of fruits (e.g apple, banana, mango) in the basket and the total count
// of all the fruits should be at least five.
//
// Make me compile and pass the tests!
//
// Execute `rustlings hint hashmaps1` or use the `hint` watch subcommand for a hint.
// Execute `rustlings hint hashmaps1` or use the `hint` watch subcommand for a
// hint.
// I AM NOT DONE

View File

@ -1,17 +1,18 @@
// hashmaps2.rs
// We're collecting different fruits to bake a delicious fruit cake.
// For this, we have a basket, which we'll represent in the form of a hash
// map. The key represents the name of each fruit we collect and the value
// represents how many of that particular fruit we have collected.
// Three types of fruits - Apple (4), Mango (2) and Lychee (5) are already
// in the basket hash map.
// You must add fruit to the basket so that there is at least
// one of each kind and more than 11 in total - we have a lot of mouths to feed.
// You are not allowed to insert any more of these fruits!
//
// We're collecting different fruits to bake a delicious fruit cake. For this,
// we have a basket, which we'll represent in the form of a hash map. The key
// represents the name of each fruit we collect and the value represents how
// many of that particular fruit we have collected. Three types of fruits -
// Apple (4), Mango (2) and Lychee (5) are already in the basket hash map. You
// must add fruit to the basket so that there is at least one of each kind and
// more than 11 in total - we have a lot of mouths to feed. You are not allowed
// to insert any more of these fruits!
//
// Make me pass the tests!
//
// Execute `rustlings hint hashmaps2` or use the `hint` watch subcommand for a hint.
// Execute `rustlings hint hashmaps2` or use the `hint` watch subcommand for a
// hint.
// I AM NOT DONE
@ -36,9 +37,9 @@ fn fruit_basket(basket: &mut HashMap<Fruit, u32>) {
];
for fruit in fruit_kinds {
// TODO: Insert new fruits if they are not already present in the basket.
// Note that you are not allowed to put any type of fruit that's already
// present!
// TODO: Insert new fruits if they are not already present in the
// basket. Note that you are not allowed to put any type of fruit that's
// already present!
}
}
@ -80,4 +81,13 @@ mod tests {
let count = basket.values().sum::<u32>();
assert!(count > 11);
}
#[test]
fn all_fruit_types_in_basket() {
let mut basket = get_fruit_basket();
fruit_basket(&mut basket);
for amount in basket.values() {
assert_ne!(amount, &0);
}
}
}

View File

@ -1,26 +1,25 @@
// hashmaps3.rs
// A list of scores (one per line) of a soccer match is given. Each line
// is of the form :
// <team_1_name>,<team_2_name>,<team_1_goals>,<team_2_goals>
//
// A list of scores (one per line) of a soccer match is given. Each line is of
// the form : "<team_1_name>,<team_2_name>,<team_1_goals>,<team_2_goals>"
// Example: England,France,4,2 (England scored 4 goals, France 2).
// You have to build a scores table containing the name of the team, goals
// the team scored, and goals the team conceded. One approach to build
// the scores table is to use a Hashmap. The solution is partially
// written to use a Hashmap, complete it to pass the test.
//
// You have to build a scores table containing the name of the team, goals the
// team scored, and goals the team conceded. One approach to build the scores
// table is to use a Hashmap. The solution is partially written to use a
// Hashmap, complete it to pass the test.
//
// Make me pass the tests!
// Execute `rustlings hint hashmaps3` or use the `hint` watch subcommand for a hint.
//
// Execute `rustlings hint hashmaps3` or use the `hint` watch subcommand for a
// hint.
// I AM NOT DONE
use std::collections::HashMap;
// A structure to store team name and its goal details.
// A structure to store the goal details of a team.
struct Team {
name: String,
goals_scored: u8,
goals_conceded: u8,
}

View File

@ -1,4 +1,5 @@
// if1.rs
//
// Execute `rustlings hint if1` or use the `hint` watch subcommand for a hint.
// I AM NOT DONE
@ -24,4 +25,9 @@ mod tests {
fn fortytwo_is_bigger_than_thirtytwo() {
assert_eq!(42, bigger(32, 42));
}
#[test]
fn equal_numbers() {
assert_eq!(42, bigger(42, 42));
}
}

View File

@ -1,7 +1,8 @@
// if2.rs
//
// Step 1: Make me compile!
// Step 2: Get the bar_for_fuzz and default_to_baz tests passing!
//
// Execute `rustlings hint if2` or use the `hint` watch subcommand for a hint.
// I AM NOT DONE

56
exercises/if/if3.rs Normal file
View File

@ -0,0 +1,56 @@
// if3.rs
//
// Execute `rustlings hint if3` or use the `hint` watch subcommand for a hint.
// I AM NOT DONE
pub fn animal_habitat(animal: &str) -> &'static str {
let identifier = if animal == "crab" {
1
} else if animal == "gopher" {
2.0
} else if animal == "snake" {
3
} else {
"Unknown"
};
// DO NOT CHANGE THIS STATEMENT BELOW
let habitat = if identifier == 1 {
"Beach"
} else if identifier == 2 {
"Burrow"
} else if identifier == 3 {
"Desert"
} else {
"Unknown"
};
habitat
}
// No test changes needed.
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn gopher_lives_in_burrow() {
assert_eq!(animal_habitat("gopher"), "Burrow")
}
#[test]
fn snake_lives_in_desert() {
assert_eq!(animal_habitat("snake"), "Desert")
}
#[test]
fn crab_lives_on_beach() {
assert_eq!(animal_habitat("crab"), "Beach")
}
#[test]
fn unknown_animal() {
assert_eq!(animal_habitat("dinosaur"), "Unknown")
}
}

View File

@ -1,13 +1,17 @@
// intro1.rs
//
// About this `I AM NOT DONE` thing:
// We sometimes encourage you to keep trying things on a given exercise, even
// after you already figured it out. If you got everything working and feel
// ready for the next exercise, remove the `I AM NOT DONE` comment below.
// Execute `rustlings hint intro1` or use the `hint` watch subcommand for a hint.
//
// If you're running this using `rustlings watch`: The exercise file will be reloaded
// when you change one of the lines below! Try adding a `println!` line, or try changing
// what it outputs in your terminal. Try removing a semicolon and see what happens!
// If you're running this using `rustlings watch`: The exercise file will be
// reloaded when you change one of the lines below! Try adding a `println!`
// line, or try changing what it outputs in your terminal. Try removing a
// semicolon and see what happens!
//
// Execute `rustlings hint intro1` or use the `hint` watch subcommand for a
// hint.
// I AM NOT DONE

View File

@ -1,6 +1,9 @@
// intro2.rs
//
// Make the code print a greeting to the world.
// Execute `rustlings hint intro2` or use the `hint` watch subcommand for a hint.
//
// Execute `rustlings hint intro2` or use the `hint` watch subcommand for a
// hint.
// I AM NOT DONE

View File

@ -1,15 +1,17 @@
// iterators1.rs
//
// When performing operations on elements within a collection, iterators are
// essential. This module helps you get familiar with the structure of using an
// iterator and how to go through elements within an iterable collection.
//
// Make me compile by filling in the `???`s
//
// When performing operations on elements within a collection, iterators are essential.
// This module helps you get familiar with the structure of using an iterator and
// how to go through elements within an iterable collection.
//
// Execute `rustlings hint iterators1` or use the `hint` watch subcommand for a hint.
// Execute `rustlings hint iterators1` or use the `hint` watch subcommand for a
// hint.
// I AM NOT DONE
#[test]
fn main() {
let my_fav_fruits = vec!["banana", "custard apple", "avocado", "peach", "raspberry"];

View File

@ -1,7 +1,10 @@
// iterators2.rs
//
// In this exercise, you'll learn some of the unique advantages that iterators
// can offer. Follow the steps to complete the exercise.
// Execute `rustlings hint iterators2` or use the `hint` watch subcommand for a hint.
//
// Execute `rustlings hint iterators2` or use the `hint` watch subcommand for a
// hint.
// I AM NOT DONE

View File

@ -1,10 +1,13 @@
// iterators3.rs
// This is a bigger exercise than most of the others! You can do it!
// Here is your mission, should you choose to accept it:
//
// This is a bigger exercise than most of the others! You can do it! Here is
// your mission, should you choose to accept it:
// 1. Complete the divide function to get the first four tests to pass.
// 2. Get the remaining tests to pass by completing the result_with_list and
// list_of_results functions.
// Execute `rustlings hint iterators3` or use the `hint` watch subcommand for a hint.
//
// Execute `rustlings hint iterators3` or use the `hint` watch subcommand for a
// hint.
// I AM NOT DONE
@ -26,14 +29,16 @@ pub fn divide(a: i32, b: i32) -> Result<i32, DivisionError> {
todo!();
}
// Complete the function and return a value of the correct type so the test passes.
// Complete the function and return a value of the correct type so the test
// passes.
// Desired output: Ok([1, 11, 1426, 3])
fn result_with_list() -> () {
let numbers = vec![27, 297, 38502, 81];
let division_results = numbers.into_iter().map(|n| divide(n, 27));
}
// Complete the function and return a value of the correct type so the test passes.
// Complete the function and return a value of the correct type so the test
// passes.
// Desired output: [Ok(1), Ok(11), Ok(1426), Ok(3)]
fn list_of_results() -> () {
let numbers = vec![27, 297, 38502, 81];

View File

@ -1,5 +1,7 @@
// iterators4.rs
// Execute `rustlings hint iterators4` or use the `hint` watch subcommand for a hint.
//
// Execute `rustlings hint iterators4` or use the `hint` watch subcommand for a
// hint.
// I AM NOT DONE

View File

@ -1,14 +1,15 @@
// iterators5.rs
//
// Let's define a simple model to track Rustlings exercise progress. Progress
// will be modelled using a hash map. The name of the exercise is the key and
// the progress is the value. Two counting functions were created to count the
// number of exercises with a given progress. These counting functions use
// imperative style for loops. Recreate this counting functionality using
// iterators. Only the two iterator methods (count_iterator and
// count_collection_iterator) need to be modified.
// Execute `rustlings hint iterators5` or use the `hint` watch subcommand for a hint.
// number of exercises with a given progress. Recreate this counting
// functionality using iterators. Try not to use imperative loops (for, while).
// Only the two iterator methods (count_iterator and count_collection_iterator)
// need to be modified.
//
// Make the code compile and the tests pass.
// Execute `rustlings hint iterators5` or use the `hint` watch subcommand for a
// hint.
// I AM NOT DONE
@ -67,13 +68,28 @@ mod tests {
}
#[test]
fn count_equals_for() {
fn count_some() {
let map = get_map();
assert_eq!(1, count_iterator(&map, Progress::Some));
}
#[test]
fn count_none() {
let map = get_map();
assert_eq!(2, count_iterator(&map, Progress::None));
}
#[test]
fn count_complete_equals_for() {
let map = get_map();
let progress_states = vec![Progress::Complete, Progress::Some, Progress::None];
for progress_state in progress_states {
assert_eq!(
count_for(&map, Progress::Complete),
count_iterator(&map, Progress::Complete)
count_for(&map, progress_state),
count_iterator(&map, progress_state)
);
}
}
#[test]
fn count_collection_complete() {
@ -85,13 +101,29 @@ mod tests {
}
#[test]
fn count_collection_equals_for() {
fn count_collection_some() {
let collection = get_vec_map();
assert_eq!(1, count_collection_iterator(&collection, Progress::Some));
}
#[test]
fn count_collection_none() {
let collection = get_vec_map();
assert_eq!(4, count_collection_iterator(&collection, Progress::None));
}
#[test]
fn count_collection_equals_for() {
let progress_states = vec![Progress::Complete, Progress::Some, Progress::None];
let collection = get_vec_map();
for progress_state in progress_states {
assert_eq!(
count_collection_for(&collection, Progress::Complete),
count_collection_iterator(&collection, Progress::Complete)
count_collection_for(&collection, progress_state),
count_collection_iterator(&collection, progress_state)
);
}
}
fn get_map() -> HashMap<String, Progress> {
use Progress::*;

View File

@ -1,11 +1,12 @@
// lifetimes1.rs
//
// The Rust compiler needs to know how to check whether supplied references are
// valid, so that it can let the programmer know if a reference is at risk
// of going out of scope before it is used. Remember, references are borrows
// and do not own their own data. What if their owner goes out of scope?
// valid, so that it can let the programmer know if a reference is at risk of
// going out of scope before it is used. Remember, references are borrows and do
// not own their own data. What if their owner goes out of scope?
//
// Execute `rustlings hint lifetimes1` or use the `hint` watch subcommand for a hint.
// Execute `rustlings hint lifetimes1` or use the `hint` watch subcommand for a
// hint.
// I AM NOT DONE

View File

@ -1,10 +1,10 @@
// lifetimes2.rs
//
// So if the compiler is just validating the references passed
// to the annotated parameters and the return type, what do
// we need to change?
// So if the compiler is just validating the references passed to the annotated
// parameters and the return type, what do we need to change?
//
// Execute `rustlings hint lifetimes2` or use the `hint` watch subcommand for a hint.
// Execute `rustlings hint lifetimes2` or use the `hint` watch subcommand for a
// hint.
// I AM NOT DONE

View File

@ -2,7 +2,8 @@
//
// Lifetimes are also needed when structs hold references.
//
// Execute `rustlings hint lifetimes3` or use the `hint` watch subcommand for a hint.
// Execute `rustlings hint lifetimes3` or use the `hint` watch subcommand for a
// hint.
// I AM NOT DONE

View File

@ -1,5 +1,7 @@
// macros1.rs
// Execute `rustlings hint macros1` or use the `hint` watch subcommand for a hint.
//
// Execute `rustlings hint macros1` or use the `hint` watch subcommand for a
// hint.
// I AM NOT DONE

View File

@ -1,5 +1,7 @@
// macros2.rs
// Execute `rustlings hint macros2` or use the `hint` watch subcommand for a hint.
//
// Execute `rustlings hint macros2` or use the `hint` watch subcommand for a
// hint.
// I AM NOT DONE

View File

@ -1,6 +1,9 @@
// macros3.rs
//
// Make me compile, without taking the macro out of the module!
// Execute `rustlings hint macros3` or use the `hint` watch subcommand for a hint.
//
// Execute `rustlings hint macros3` or use the `hint` watch subcommand for a
// hint.
// I AM NOT DONE

View File

@ -1,5 +1,7 @@
// macros4.rs
// Execute `rustlings hint macros4` or use the `hint` watch subcommand for a hint.
//
// Execute `rustlings hint macros4` or use the `hint` watch subcommand for a
// hint.
// I AM NOT DONE

View File

@ -1,5 +1,7 @@
// modules1.rs
// Execute `rustlings hint modules1` or use the `hint` watch subcommand for a hint.
//
// Execute `rustlings hint modules1` or use the `hint` watch subcommand for a
// hint.
// I AM NOT DONE

View File

@ -1,7 +1,11 @@
// modules2.rs
// You can bring module paths into scopes and provide new names for them with the
// 'use' and 'as' keywords. Fix these 'use' statements to make the code compile.
// Execute `rustlings hint modules2` or use the `hint` watch subcommand for a hint.
//
// You can bring module paths into scopes and provide new names for them with
// the 'use' and 'as' keywords. Fix these 'use' statements to make the code
// compile.
//
// Execute `rustlings hint modules2` or use the `hint` watch subcommand for a
// hint.
// I AM NOT DONE

View File

@ -1,9 +1,12 @@
// modules3.rs
// You can use the 'use' keyword to bring module paths from modules from anywhere
// and especially from the Rust standard library into your scope.
// Bring SystemTime and UNIX_EPOCH
// from the std::time module. Bonus style points if you can do it with one line!
// Execute `rustlings hint modules3` or use the `hint` watch subcommand for a hint.
//
// You can use the 'use' keyword to bring module paths from modules from
// anywhere and especially from the Rust standard library into your scope. Bring
// SystemTime and UNIX_EPOCH from the std::time module. Bonus style points if
// you can do it with one line!
//
// Execute `rustlings hint modules3` or use the `hint` watch subcommand for a
// hint.
// I AM NOT DONE

View File

@ -1,26 +1,23 @@
// move_semantics1.rs
// Execute `rustlings hint move_semantics1` or use the `hint` watch subcommand for a hint.
//
// Execute `rustlings hint move_semantics1` or use the `hint` watch subcommand
// for a hint.
// I AM NOT DONE
#[test]
fn main() {
let vec0 = Vec::new();
let vec0 = vec![22, 44, 66];
let vec1 = fill_vec(vec0);
println!("{} has length {} content `{:?}`", "vec1", vec1.len(), vec1);
vec1.push(88);
println!("{} has length {} content `{:?}`", "vec1", vec1.len(), vec1);
assert_eq!(vec1, vec![22, 44, 66, 88]);
}
fn fill_vec(vec: Vec<i32>) -> Vec<i32> {
let mut vec = vec;
let vec = vec;
vec.push(22);
vec.push(44);
vec.push(66);
vec.push(88);
vec
}

View File

@ -1,28 +1,26 @@
// move_semantics2.rs
// Make me compile without changing line 13 or moving line 10!
// Execute `rustlings hint move_semantics2` or use the `hint` watch subcommand for a hint.
//
// Make the test pass by finding a way to keep both Vecs separate!
//
// Execute `rustlings hint move_semantics2` or use the `hint` watch subcommand
// for a hint.
// I AM NOT DONE
#[test]
fn main() {
let vec0 = Vec::new();
let vec0 = vec![22, 44, 66];
let mut vec1 = fill_vec(vec0);
// Do not change the following line!
println!("{} has length {} content `{:?}`", "vec0", vec0.len(), vec0);
vec1.push(88);
println!("{} has length {} content `{:?}`", "vec1", vec1.len(), vec1);
assert_eq!(vec0, vec![22, 44, 66]);
assert_eq!(vec1, vec![22, 44, 66, 88]);
}
fn fill_vec(vec: Vec<i32>) -> Vec<i32> {
let mut vec = vec;
vec.push(22);
vec.push(44);
vec.push(66);
vec.push(88);
vec
}

View File

@ -1,26 +1,24 @@
// move_semantics3.rs
// Make me compile without adding new lines-- just changing existing lines!
// (no lines with multiple semicolons necessary!)
// Execute `rustlings hint move_semantics3` or use the `hint` watch subcommand for a hint.
//
// Make me compile without adding new lines -- just changing existing lines! (no
// lines with multiple semicolons necessary!)
//
// Execute `rustlings hint move_semantics3` or use the `hint` watch subcommand
// for a hint.
// I AM NOT DONE
#[test]
fn main() {
let vec0 = Vec::new();
let vec0 = vec![22, 44, 66];
let mut vec1 = fill_vec(vec0);
println!("{} has length {} content `{:?}`", "vec1", vec1.len(), vec1);
vec1.push(88);
println!("{} has length {} content `{:?}`", "vec1", vec1.len(), vec1);
assert_eq!(vec1, vec![22, 44, 66, 88]);
}
fn fill_vec(vec: Vec<i32>) -> Vec<i32> {
vec.push(22);
vec.push(44);
vec.push(66);
vec.push(88);
vec
}

View File

@ -1,30 +1,29 @@
// move_semantics4.rs
// Refactor this code so that instead of passing `vec0` into the `fill_vec` function,
// the Vector gets created in the function itself and passed back to the main
// function.
// Execute `rustlings hint move_semantics4` or use the `hint` watch subcommand for a hint.
//
// Refactor this code so that instead of passing `vec0` into the `fill_vec`
// function, the Vector gets created in the function itself and passed back to
// the main function.
//
// Execute `rustlings hint move_semantics4` or use the `hint` watch subcommand
// for a hint.
// I AM NOT DONE
#[test]
fn main() {
let vec0 = Vec::new();
let vec0 = vec![22, 44, 66];
let mut vec1 = fill_vec(vec0);
println!("{} has length {} content `{:?}`", "vec1", vec1.len(), vec1);
vec1.push(88);
println!("{} has length {} content `{:?}`", "vec1", vec1.len(), vec1);
assert_eq!(vec1, vec![22, 44, 66, 88]);
}
// `fill_vec()` no longer takes `vec: Vec<i32>` as argument
// `fill_vec()` no longer takes `vec: Vec<i32>` as argument - don't change this!
fn fill_vec() -> Vec<i32> {
// Instead, let's create and fill the Vec in here - how do you do that?
let mut vec = vec;
vec.push(22);
vec.push(44);
vec.push(66);
vec.push(88);
vec
}

View File

@ -1,10 +1,14 @@
// move_semantics5.rs
// Make me compile only by reordering the lines in `main()`, but without
// adding, changing or removing any of them.
// Execute `rustlings hint move_semantics5` or use the `hint` watch subcommand for a hint.
//
// Make me compile only by reordering the lines in `main()`, but without adding,
// changing or removing any of them.
//
// Execute `rustlings hint move_semantics5` or use the `hint` watch subcommand
// for a hint.
// I AM NOT DONE
#[test]
fn main() {
let mut x = 100;
let y = &mut x;

View File

@ -1,6 +1,9 @@
// move_semantics6.rs
// Execute `rustlings hint move_semantics6` or use the `hint` watch subcommand for a hint.
//
// You can't change anything except adding or removing references.
//
// Execute `rustlings hint move_semantics6` or use the `hint` watch subcommand
// for a hint.
// I AM NOT DONE

View File

@ -2,6 +2,7 @@
Type Option represents an optional value: every Option is either Some and contains a value, or None, and does not.
Option types are very common in Rust code, as they have a number of uses:
- Initial values
- Return values for functions that are not defined over their entire input range (partial functions)
- Return value for otherwise reporting simple errors, where None is returned on error

View File

@ -1,5 +1,7 @@
// options1.rs
// Execute `rustlings hint options1` or use the `hint` watch subcommand for a hint.
//
// Execute `rustlings hint options1` or use the `hint` watch subcommand for a
// hint.
// I AM NOT DONE
@ -7,8 +9,9 @@
// If it's before 10PM, there's 5 pieces left. At 10PM, someone eats them
// all, so there'll be no more left :(
fn maybe_icecream(time_of_day: u16) -> Option<u16> {
// We use the 24-hour system here, so 10PM is a value of 22 and 12AM is a value of 0
// The Option output should gracefully handle cases where time_of_day > 23.
// We use the 24-hour system here, so 10PM is a value of 22 and 12AM is a
// value of 0 The Option output should gracefully handle cases where
// time_of_day > 23.
// TODO: Complete the function body - remember to return an Option!
???
}
@ -28,7 +31,8 @@ mod tests {
#[test]
fn raw_value() {
// TODO: Fix this test. How do you get at the value contained in the Option?
// TODO: Fix this test. How do you get at the value contained in the
// Option?
let icecreams = maybe_icecream(12);
assert_eq!(icecreams, 5);
}

View File

@ -1,5 +1,7 @@
// options2.rs
// Execute `rustlings hint options2` or use the `hint` watch subcommand for a hint.
//
// Execute `rustlings hint options2` or use the `hint` watch subcommand for a
// hint.
// I AM NOT DONE
@ -18,17 +20,23 @@ mod tests {
#[test]
fn layered_option() {
let mut range = 10;
let mut optional_integers: Vec<Option<i8>> = Vec::new();
for i in 0..(range + 1) {
let range = 10;
let mut optional_integers: Vec<Option<i8>> = vec![None];
for i in 1..(range + 1) {
optional_integers.push(Some(i));
}
// TODO: make this a while let statement - remember that vector.pop also adds another layer of Option<T>
// You can stack `Option<T>`'s into while let and if let
let mut cursor = range;
// TODO: make this a while let statement - remember that vector.pop also
// adds another layer of Option<T>. You can stack `Option<T>`s into
// while let and if let.
integer = optional_integers.pop() {
assert_eq!(integer, range);
range -= 1;
assert_eq!(integer, cursor);
cursor -= 1;
}
assert_eq!(cursor, 0);
}
}

View File

@ -1,5 +1,7 @@
// options3.rs
// Execute `rustlings hint options3` or use the `hint` watch subcommand for a hint.
//
// Execute `rustlings hint options3` or use the `hint` watch subcommand for a
// hint.
// I AM NOT DONE
@ -13,7 +15,7 @@ fn main() {
match y {
Some(p) => println!("Co-ordinates are {},{} ", p.x, p.y),
_ => println!("no match"),
_ => panic!("no match!"),
}
y; // Fix without deleting this line.
}

View File

@ -1,6 +1,7 @@
// primitive_types1.rs
// Fill in the rest of the line that has code missing!
// No hints, there's no tricks, just get used to typing these :)
//
// Fill in the rest of the line that has code missing! No hints, there's no
// tricks, just get used to typing these :)
// I AM NOT DONE

View File

@ -1,6 +1,7 @@
// primitive_types2.rs
// Fill in the rest of the line that has code missing!
// No hints, there's no tricks, just get used to typing these :)
//
// Fill in the rest of the line that has code missing! No hints, there's no
// tricks, just get used to typing these :)
// I AM NOT DONE

View File

@ -1,6 +1,9 @@
// primitive_types3.rs
//
// Create an array with at least 100 elements in it where the ??? is.
// Execute `rustlings hint primitive_types3` or use the `hint` watch subcommand for a hint.
//
// Execute `rustlings hint primitive_types3` or use the `hint` watch subcommand
// for a hint.
// I AM NOT DONE
@ -11,5 +14,6 @@ fn main() {
println!("Wow, that's a big array!");
} else {
println!("Meh, I eat arrays like that for breakfast.");
panic!("Array not big enough, more elements needed")
}
}

View File

@ -1,6 +1,9 @@
// primitive_types4.rs
//
// Get a slice out of Array a where the ??? is so that the test passes.
// Execute `rustlings hint primitive_types4` or use the `hint` watch subcommand for a hint.
//
// Execute `rustlings hint primitive_types4` or use the `hint` watch subcommand
// for a hint.
// I AM NOT DONE

View File

@ -1,6 +1,9 @@
// primitive_types5.rs
//
// Destructure the `cat` tuple so that the println will work.
// Execute `rustlings hint primitive_types5` or use the `hint` watch subcommand for a hint.
//
// Execute `rustlings hint primitive_types5` or use the `hint` watch subcommand
// for a hint.
// I AM NOT DONE

View File

@ -1,7 +1,10 @@
// primitive_types6.rs
// Use a tuple index to access the second element of `numbers`.
// You can put the expression for the second element where ??? is so that the test passes.
// Execute `rustlings hint primitive_types6` or use the `hint` watch subcommand for a hint.
//
// Use a tuple index to access the second element of `numbers`. You can put the
// expression for the second element where ??? is so that the test passes.
//
// Execute `rustlings hint primitive_types6` or use the `hint` watch subcommand
// for a hint.
// I AM NOT DONE

View File

@ -1,14 +1,17 @@
// quiz1.rs
//
// This is a quiz for the following sections:
// - Variables
// - Functions
// - If
//
// Mary is buying apples. The price of an apple is calculated as follows:
// - An apple costs 2 rustbucks.
// - If Mary buys more than 40 apples, each apple only costs 1 rustbuck!
// Write a function that calculates the price of an order of apples given
// the quantity bought. No hints this time!
// Write a function that calculates the price of an order of apples given the
// quantity bought.
//
// No hints this time ;)
// I AM NOT DONE

View File

@ -1,14 +1,15 @@
// quiz2.rs
//
// This is a quiz for the following sections:
// - Strings
// - Vecs
// - Move semantics
// - Modules
// - Enums
// Let's build a little machine in the form of a function.
// As input, we're going to give a list of strings and commands. These commands
// determine what action is going to be applied to the string. It can either be:
//
// Let's build a little machine in the form of a function. As input, we're going
// to give a list of strings and commands. These commands determine what action
// is going to be applied to the string. It can either be:
// - Uppercase the string
// - Trim the string
// - Append "bar" to the string a specified amount of times
@ -16,6 +17,7 @@
// - The input is going to be a Vector of a 2-length tuple,
// the first element is the string, the second one is the command.
// - The output element is going to be a Vector of strings.
//
// No hints this time!
// I AM NOT DONE

View File

@ -1,17 +1,19 @@
// quiz3.rs
//
// This quiz tests:
// - Generics
// - Traits
// An imaginary magical school has a new report card generation system written in Rust!
// Currently the system only supports creating report cards where the student's grade
// is represented numerically (e.g. 1.0 -> 5.5).
// However, the school also issues alphabetical grades (A+ -> F-) and needs
// to be able to print both types of report card!
//
// An imaginary magical school has a new report card generation system written
// in Rust! Currently the system only supports creating report cards where the
// student's grade is represented numerically (e.g. 1.0 -> 5.5). However, the
// school also issues alphabetical grades (A+ -> F-) and needs to be able to
// print both types of report card!
//
// Make the necessary code changes in the struct ReportCard and the impl block
// to support alphabetical report cards. Change the Grade in the second test to "A+"
// to show that your changes allow alphabetical grades.
// to support alphabetical report cards. Change the Grade in the second test to
// "A+" to show that your changes allow alphabetical grades.
//
// Execute `rustlings hint quiz3` or use the `hint` watch subcommand for a hint.
// I AM NOT DONE

View File

@ -1,4 +1,5 @@
# Smart Pointers
In Rust, smart pointers are variables that contain an address in memory and reference some other data, but they also have additional metadata and capabilities.
Smart pointers in Rust often own the data they point to, while references only borrow data.

View File

@ -1,21 +1,24 @@
// arc1.rs
// In this exercise, we are given a Vec of u32 called "numbers" with values ranging
// from 0 to 99 -- [ 0, 1, 2, ..., 98, 99 ]
// We would like to use this set of numbers within 8 different threads simultaneously.
// Each thread is going to get the sum of every eighth value, with an offset.
//
// In this exercise, we are given a Vec of u32 called "numbers" with values
// ranging from 0 to 99 -- [ 0, 1, 2, ..., 98, 99 ] We would like to use this
// set of numbers within 8 different threads simultaneously. Each thread is
// going to get the sum of every eighth value, with an offset.
//
// The first thread (offset 0), will sum 0, 8, 16, ...
// The second thread (offset 1), will sum 1, 9, 17, ...
// The third thread (offset 2), will sum 2, 10, 18, ...
// ...
// The eighth thread (offset 7), will sum 7, 15, 23, ...
//
// Because we are using threads, our values need to be thread-safe. Therefore,
// we are using Arc. We need to make a change in each of the two TODOs.
//
// Make this code compile by filling in a value for `shared_numbers` where the
// first TODO comment is, and create an initial binding for `child_numbers`
// where the second TODO comment is. Try not to create any copies of the `numbers` Vec!
// where the second TODO comment is. Try not to create any copies of the
// `numbers` Vec!
//
// Execute `rustlings hint arc1` or use the `hint` watch subcommand for a hint.
// I AM NOT DONE

View File

@ -1,13 +1,15 @@
// box1.rs
//
// At compile time, Rust needs to know how much space a type takes up. This becomes problematic
// for recursive types, where a value can have as part of itself another value of the same type.
// To get around the issue, we can use a `Box` - a smart pointer used to store data on the heap,
// which also allows us to wrap a recursive type.
// At compile time, Rust needs to know how much space a type takes up. This
// becomes problematic for recursive types, where a value can have as part of
// itself another value of the same type. To get around the issue, we can use a
// `Box` - a smart pointer used to store data on the heap, which also allows us
// to wrap a recursive type.
//
// The recursive type we're implementing in this exercise is the `cons list` - a data structure
// frequently found in functional programming languages. Each item in a cons list contains two
// elements: the value of the current item and the next item. The last item is a value called `Nil`.
// The recursive type we're implementing in this exercise is the `cons list` - a
// data structure frequently found in functional programming languages. Each
// item in a cons list contains two elements: the value of the current item and
// the next item. The last item is a value called `Nil`.
//
// Step 1: use a `Box` in the enum definition to make the code compile
// Step 2: create both empty and non-empty cons lists by replacing `todo!()`

View File

@ -1,12 +1,16 @@
// cow1.rs
// This exercise explores the Cow, or Clone-On-Write type.
// Cow is a clone-on-write smart pointer.
// It can enclose and provide immutable access to borrowed data, and clone the data lazily when mutation or ownership is required.
// The type is designed to work with general borrowed data via the Borrow trait.
//
// This exercise explores the Cow, or Clone-On-Write type. Cow is a
// clone-on-write smart pointer. It can enclose and provide immutable access to
// borrowed data, and clone the data lazily when mutation or ownership is
// required. The type is designed to work with general borrowed data via the
// Borrow trait.
//
// This exercise is meant to show you what to expect when passing data to Cow.
// Fix the unit tests by checking for Cow::Owned(_) and Cow::Borrowed(_) at the TODO markers.
// Fix the unit tests by checking for Cow::Owned(_) and Cow::Borrowed(_) at the
// TODO markers.
//
// Execute `rustlings hint cow1` or use the `hint` watch subcommand for a hint.
// I AM NOT DONE
@ -50,9 +54,9 @@ mod tests {
#[test]
fn owned_no_mutation() -> Result<(), &'static str> {
// We can also pass `slice` without `&` so Cow owns it directly.
// In this case no mutation occurs and thus also no clone,
// but the result is still owned because it always was.
// We can also pass `slice` without `&` so Cow owns it directly. In this
// case no mutation occurs and thus also no clone, but the result is
// still owned because it was never borrowed or mutated.
let slice = vec![0, 1, 2];
let mut input = Cow::from(slice);
match abs_all(&mut input) {
@ -62,9 +66,9 @@ mod tests {
#[test]
fn owned_mutation() -> Result<(), &'static str> {
// Of course this is also the case if a mutation does occur.
// In this case the call to `to_mut()` returns a reference to
// the same data as before.
// 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
// reference to the same data as before.
let slice = vec![-1, 0, 1];
let mut input = Cow::from(slice);
match abs_all(&mut input) {

View File

@ -1,9 +1,14 @@
// rc1.rs
// In this exercise, we want to express the concept of multiple owners via the Rc<T> type.
// This is a model of our solar system - there is a Sun type and multiple Planets.
// The Planets take ownership of the sun, indicating that they revolve around the sun.
// Make this code compile by using the proper Rc primitives to express that the sun has multiple owners.
//
// In this exercise, we want to express the concept of multiple owners via the
// Rc<T> type. This is a model of our solar system - there is a Sun type and
// multiple Planets. The Planets take ownership of the sun, indicating that they
// revolve around the sun.
//
// Make this code compile by using the proper Rc primitives to express that the
// sun has multiple owners.
//
// Execute `rustlings hint rc1` or use the `hint` watch subcommand for a hint.
// I AM NOT DONE
@ -30,6 +35,7 @@ impl Planet {
}
}
#[test]
fn main() {
let sun = Rc::new(Sun {});
println!("reference count = {}", Rc::strong_count(&sun)); // 1 reference

View File

@ -1,6 +1,9 @@
// strings1.rs
//
// Make me compile without changing the function signature!
// Execute `rustlings hint strings1` or use the `hint` watch subcommand for a hint.
//
// Execute `rustlings hint strings1` or use the `hint` watch subcommand for a
// hint.
// I AM NOT DONE

View File

@ -1,6 +1,9 @@
// strings2.rs
//
// Make me compile without changing the function signature!
// Execute `rustlings hint strings2` or use the `hint` watch subcommand for a hint.
//
// Execute `rustlings hint strings2` or use the `hint` watch subcommand for a
// hint.
// I AM NOT DONE

View File

@ -1,5 +1,7 @@
// strings3.rs
// Execute `rustlings hint strings3` or use the `hint` watch subcommand for a hint.
//
// Execute `rustlings hint strings3` or use the `hint` watch subcommand for a
// hint.
// I AM NOT DONE

View File

@ -1,9 +1,10 @@
// strings4.rs
//
// Ok, here are a bunch of values-- some are `String`s, some are `&str`s. Your
// task is to call one of these two functions on each value depending on what
// you think each value is. That is, add either `string_slice` or `string`
// before the parentheses on each line. If you're right, it will compile!
//
// No hints this time!
// I AM NOT DONE

View File

@ -1,6 +1,9 @@
// structs1.rs
//
// Address all the TODOs to make the tests pass!
// Execute `rustlings hint structs1` or use the `hint` watch subcommand for a hint.
//
// Execute `rustlings hint structs1` or use the `hint` watch subcommand for a
// hint.
// I AM NOT DONE

View File

@ -1,6 +1,9 @@
// structs2.rs
//
// Address all the TODOs to make the tests pass!
// Execute `rustlings hint structs2` or use the `hint` watch subcommand for a hint.
//
// Execute `rustlings hint structs2` or use the `hint` watch subcommand for a
// hint.
// I AM NOT DONE

View File

@ -1,8 +1,11 @@
// structs3.rs
//
// Structs contain data, but can also have logic. In this exercise we have
// defined the Package struct and we want to test some logic attached to it.
// Make the code compile and the tests pass!
// Execute `rustlings hint structs3` or use the `hint` watch subcommand for a hint.
//
// Execute `rustlings hint structs3` or use the `hint` watch subcommand for a
// hint.
// I AM NOT DONE
@ -10,13 +13,15 @@
struct Package {
sender_country: String,
recipient_country: String,
weight_in_grams: i32,
weight_in_grams: u32,
}
impl Package {
fn new(sender_country: String, recipient_country: String, weight_in_grams: i32) -> Package {
if weight_in_grams <= 0 {
panic!("Can not ship a weightless package.")
fn new(sender_country: String, recipient_country: String, weight_in_grams: u32) -> Package {
if weight_in_grams < 10 {
// This is not how you should handle errors in Rust,
// but we will learn about error handling later.
panic!("Can not ship a package with weight below 10 grams.")
} else {
Package {
sender_country,
@ -30,7 +35,7 @@ impl Package {
// Something goes here...
}
fn get_fees(&self, cents_per_gram: i32) -> ??? {
fn get_fees(&self, cents_per_gram: u32) -> ??? {
// Something goes here...
}
}
@ -45,7 +50,7 @@ mod tests {
let sender_country = String::from("Spain");
let recipient_country = String::from("Austria");
Package::new(sender_country, recipient_country, -2210);
Package::new(sender_country, recipient_country, 5);
}
#[test]

View File

@ -1,11 +1,14 @@
// tests1.rs
// Tests are important to ensure that your code does what you think it should do.
// Tests can be run on this file with the following command:
// rustlings run tests1
// This test has a problem with it -- make the test compile! Make the test
// pass! Make the test fail!
// Execute `rustlings hint tests1` or use the `hint` watch subcommand for a hint.
//
// Tests are important to ensure that your code does what you think it should
// do. Tests can be run on this file with the following command: rustlings run
// tests1
//
// This test has a problem with it -- make the test compile! Make the test pass!
// Make the test fail!
//
// Execute `rustlings hint tests1` or use the `hint` watch subcommand for a
// hint.
// I AM NOT DONE

View File

@ -1,7 +1,10 @@
// tests2.rs
// This test has a problem with it -- make the test compile! Make the test
// pass! Make the test fail!
// Execute `rustlings hint tests2` or use the `hint` watch subcommand for a hint.
//
// This test has a problem with it -- make the test compile! Make the test pass!
// Make the test fail!
//
// Execute `rustlings hint tests2` or use the `hint` watch subcommand for a
// hint.
// I AM NOT DONE

View File

@ -1,8 +1,11 @@
// tests3.rs
//
// This test isn't testing our function -- make it do that in such a way that
// the test passes. Then write a second test that tests whether we get the result
// we expect to get when we call `is_even(5)`.
// Execute `rustlings hint tests3` or use the `hint` watch subcommand for a hint.
// the test passes. Then write a second test that tests whether we get the
// result we expect to get when we call `is_even(5)`.
//
// Execute `rustlings hint tests3` or use the `hint` watch subcommand for a
// hint.
// I AM NOT DONE

48
exercises/tests/tests4.rs Normal file
View File

@ -0,0 +1,48 @@
// tests4.rs
//
// Make sure that we're testing for the correct conditions!
//
// Execute `rustlings hint tests4` or use the `hint` watch subcommand for a
// hint.
// I AM NOT DONE
struct Rectangle {
width: i32,
height: i32
}
impl Rectangle {
// Only change the test functions themselves
pub fn new(width: i32, height: i32) -> Self {
if width <= 0 || height <= 0 {
panic!("Rectangle width and height cannot be negative!")
}
Rectangle {width, height}
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn correct_width_and_height() {
// This test should check if the rectangle is the size that we pass into its constructor
let rect = Rectangle::new(10, 20);
assert_eq!(???, 10); // check width
assert_eq!(???, 20); // check height
}
#[test]
fn negative_width() {
// This test should check if program panics when we try to create rectangle with negative width
let _rect = Rectangle::new(-10, 10);
}
#[test]
fn negative_height() {
// This test should check if program panics when we try to create rectangle with negative height
let _rect = Rectangle::new(10, -10);
}
}

View File

@ -1,6 +1,6 @@
# Threads
In most current operating systems, an executed programs 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.
## Further information

View File

@ -1,10 +1,12 @@
// threads1.rs
// Execute `rustlings hint threads1` or use the `hint` watch subcommand for a hint.
// This program spawns multiple threads that each run for at least 250ms,
// and each thread returns how much time they took to complete.
// The program should wait until all the spawned threads have finished and
// should collect their return values into a vector.
//
// This program spawns multiple threads that each run for at least 250ms, and
// each thread returns how much time they took to complete. The program should
// wait until all the spawned threads have finished and should collect their
// return values into a vector.
//
// Execute `rustlings hint threads1` or use the `hint` watch subcommand for a
// hint.
// I AM NOT DONE

View File

@ -1,7 +1,11 @@
// threads2.rs
// Execute `rustlings hint threads2` or use the `hint` watch subcommand for a hint.
// Building on the last exercise, we want all of the threads to complete their work but this time
// the spawned threads need to be in charge of updating a shared value: JobStatus.jobs_completed
//
// Building on the last exercise, we want all of the threads to complete their
// work but this time the spawned threads need to be in charge of updating a
// shared value: JobStatus.jobs_completed
//
// Execute `rustlings hint threads2` or use the `hint` watch subcommand for a
// hint.
// I AM NOT DONE
@ -27,8 +31,9 @@ fn main() {
}
for handle in handles {
handle.join().unwrap();
// TODO: Print the value of the JobStatus.jobs_completed. Did you notice anything
// interesting in the output? Do you have to 'join' on all the handles?
// TODO: Print the value of the JobStatus.jobs_completed. Did you notice
// anything interesting in the output? Do you have to 'join' on all the
// handles?
println!("jobs completed {}", ???);
}
}

View File

@ -1,5 +1,7 @@
// threads3.rs
// Execute `rustlings hint threads3` or use the `hint` watch subcommand for a hint.
//
// Execute `rustlings hint threads3` or use the `hint` watch subcommand for a
// hint.
// I AM NOT DONE
@ -46,6 +48,7 @@ fn send_tx(q: Queue, tx: mpsc::Sender<u32>) -> () {
});
}
#[test]
fn main() {
let (tx, rx) = mpsc::channel();
let queue = Queue::new();

View File

@ -7,13 +7,13 @@ Data types can implement traits. To do so, the methods making up the trait are d
In this way, traits are somewhat similar to Java interfaces and C++ abstract classes.
Some additional common Rust traits include:
- `Clone` (the `clone` method)
- `Display` (which allows formatted display via `{}`)
- `Debug` (which allows formatted display via `{:?}`)
Because traits indicate shared behavior between data types, they are useful when writing generics.
## Further information
- [Traits](https://doc.rust-lang.org/book/ch10-02-traits.html)

Some files were not shown because too many files have changed in this diff Show More