mirror of
https://github.com/rust-lang/rustlings.git
synced 2025-12-28 14:59:18 +00:00
Compare commits
1640 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
7850a73d95 | ||
|
|
1ebb4d25a6 | ||
|
|
b5d440fdc3 | ||
|
|
4700e8a12c | ||
|
|
8753dd6b2e | ||
|
|
f80fbca12e | ||
|
|
d8f4b06c91 | ||
|
|
1955313362 | ||
|
|
95a597eb82 | ||
|
|
2af9e89ba5 | ||
|
|
6ec2e194ae | ||
|
|
295ad2e4bd | ||
|
|
628ef55337 | ||
|
|
b6b94e3e96 | ||
|
|
6765a0b61a | ||
|
|
436c95f4cc | ||
|
|
c6888685e6 | ||
|
|
208a593216 | ||
|
|
2d1d531550 | ||
|
|
a712e484d0 | ||
|
|
4f9f0907c3 | ||
|
|
3a2fe2c394 | ||
|
|
f24861957a | ||
|
|
1a633e2757 | ||
|
|
9fecdba101 | ||
|
|
7af38e684d | ||
|
|
e8da6869f8 | ||
|
|
57b3727b3e | ||
|
|
278edc0b96 | ||
|
|
cb60c8887c | ||
|
|
46814d397a | ||
|
|
734fc482eb | ||
|
|
520dfdc464 | ||
|
|
2267f99684 | ||
|
|
bf74a3d0a7 | ||
|
|
adf3ddd968 | ||
|
|
f80c2edc3d | ||
|
|
04520ae7ad | ||
|
|
e36dd7a120 | ||
|
|
edc8528dde | ||
|
|
47e490a997 | ||
|
|
596e7f36cc | ||
|
|
512ded81c4 | ||
|
|
69a9e9cafc | ||
|
|
54a74fd638 | ||
|
|
a51d6f1309 | ||
|
|
f6a657a0c3 | ||
|
|
8c24763259 | ||
|
|
dc468882cc | ||
|
|
5fc787f4e4 | ||
|
|
8fa598ae7e | ||
|
|
2f700991f3 | ||
|
|
b4a6b87e24 | ||
|
|
984e9fea7c | ||
|
|
8339007633 | ||
|
|
23b9aa3a15 | ||
|
|
69fe9626da | ||
|
|
f387f4c1d9 | ||
|
|
40fe3aa741 | ||
|
|
b30973afa1 | ||
|
|
3d8bef4bc3 | ||
|
|
2673177b17 | ||
|
|
6d5369d4d0 | ||
|
|
b9d1e636a4 | ||
|
|
7e26418952 | ||
|
|
61c17cb349 | ||
|
|
fda18e8895 | ||
|
|
7ec6986965 | ||
|
|
74ab9924b4 | ||
|
|
a28000acc4 | ||
|
|
08548abcc2 | ||
|
|
5927a781a3 | ||
|
|
e73fff3bd4 | ||
|
|
8dff0df266 | ||
|
|
5ee7dfb5c2 | ||
|
|
9a3586878d | ||
|
|
a99433c62d | ||
|
|
e76ca5e2b9 | ||
|
|
48bab77609 | ||
|
|
a063bcfb4c | ||
|
|
c5f49cfa48 | ||
|
|
9bcd4198c5 | ||
|
|
29dc8ea9fa | ||
|
|
fa91814aa9 | ||
|
|
0b91db2195 | ||
|
|
7b2d42b0f0 | ||
|
|
bd3bdd620b | ||
|
|
8b4562e102 | ||
|
|
63d8986f2a | ||
|
|
ecaecc2f76 | ||
|
|
78194b4441 | ||
|
|
44699e9b1b | ||
|
|
9978c17d5f | ||
|
|
3cc7e0377c | ||
|
|
d2abc359cc | ||
|
|
7c0d269279 | ||
|
|
8db85946af | ||
|
|
7019f4d178 | ||
|
|
fcd77a83cc | ||
|
|
ae444eb3da | ||
|
|
425c9821e0 | ||
|
|
46c6fb2c82 | ||
|
|
374c3874af | ||
|
|
1eb6c1e469 | ||
|
|
06af3ffc99 | ||
|
|
65dc019fa6 | ||
|
|
a56ccb6f4f | ||
|
|
d9872f2615 | ||
|
|
298be671b9 | ||
|
|
fbfd4f25e7 | ||
|
|
d12735a573 | ||
|
|
1aec7c1152 | ||
|
|
0b55809bb9 | ||
|
|
bde6f7470c | ||
|
|
53ec59ed95 | ||
|
|
ed1ee38923 | ||
|
|
26cf4989a2 | ||
|
|
6e60f441e9 | ||
|
|
d07de879a7 | ||
|
|
dd0634c483 | ||
|
|
fc0cd8f0f8 | ||
|
|
d5cae8ff59 | ||
|
|
38016cb2d6 | ||
|
|
e6cb104294 | ||
|
|
410eb69d25 | ||
|
|
243cf5f261 | ||
|
|
eff2ce8a23 | ||
|
|
fd33c29b26 | ||
|
|
f49164e69b | ||
|
|
9bc7bbe4b4 | ||
|
|
46ad25f925 | ||
|
|
2a725fb137 | ||
|
|
449858655d | ||
|
|
e8c2a79516 | ||
|
|
ea85c1b46e | ||
|
|
6bec6f92c4 | ||
|
|
930a0ea73b | ||
|
|
7e2f56f41a | ||
|
|
e90f5f03f3 | ||
|
|
0e090ae112 | ||
|
|
99496706c5 | ||
|
|
f146553dea | ||
|
|
0432e07864 | ||
|
|
f33ba139b4 | ||
|
|
990a722852 | ||
|
|
a675cb5754 | ||
|
|
baeeff389c | ||
|
|
932bc25d88 | ||
|
|
bdc6dad8de | ||
|
|
ea73af9ba3 | ||
|
|
fc5fc0920f | ||
|
|
9705c161b4 | ||
|
|
8cac21511c | ||
|
|
396ee4d618 | ||
|
|
326169a7fa | ||
|
|
685e069c58 | ||
|
|
84a42a2b24 | ||
|
|
ac6e1b7ce5 | ||
|
|
f516da4138 | ||
|
|
e852e60416 | ||
|
|
bf7d171915 | ||
|
|
d3f819f86f | ||
|
|
aa83fd6bc4 | ||
|
|
e2f7734f37 | ||
|
|
5c17abd1bf | ||
|
|
c52867eb8b | ||
|
|
26fd97a209 | ||
|
|
f0a2cdeb18 | ||
|
|
0c79f2ea3e | ||
|
|
0e9eb9e87e | ||
|
|
0d258b9e96 | ||
|
|
d4fa61e435 | ||
|
|
554301b8e9 | ||
|
|
e3ec0abca4 | ||
|
|
a55e848359 | ||
|
|
2653c3c4d4 | ||
|
|
4e4b65711a | ||
|
|
89c40ba256 | ||
|
|
e56ae6d651 | ||
|
|
64b2f18d92 | ||
|
|
2894f3c45c | ||
|
|
1bae2dcb00 | ||
|
|
b540c6df25 | ||
|
|
8b476e678a | ||
|
|
47f8a0cbe5 | ||
|
|
9459eef032 | ||
|
|
5aaa8924a6 | ||
|
|
4ffce1c297 | ||
|
|
0513660b05 | ||
|
|
3947c4de28 | ||
|
|
664228ef8b | ||
|
|
234a61a3ee | ||
|
|
83d1275d72 | ||
|
|
45abd7d59e | ||
|
|
88e10a9e54 | ||
|
|
1f624d4c2a | ||
|
|
9a25309c1c | ||
|
|
2b7caf6fcb | ||
|
|
938500fd2f | ||
|
|
2d26358602 | ||
|
|
9faa5d3aa4 | ||
|
|
bcc2a136c8 | ||
|
|
dcad002057 | ||
|
|
51b8d2ab25 | ||
|
|
aa3eda70e5 | ||
|
|
2d0860fe1b | ||
|
|
17877366b7 | ||
|
|
5eb3dee59c | ||
|
|
247bd19f93 | ||
|
|
e5ed115288 | ||
|
|
03baa471d9 | ||
|
|
da8b3d143a | ||
|
|
20616ff954 | ||
|
|
f463cf8662 | ||
|
|
e9879eac91 | ||
|
|
47148e78a3 | ||
|
|
fea917c8f2 | ||
|
|
948e16e3c7 | ||
|
|
1e7fc46406 | ||
|
|
71494264ca | ||
|
|
3125561474 | ||
|
|
abf1228a0a | ||
|
|
547a9d947b | ||
|
|
f696d98270 | ||
|
|
44ab7f995d | ||
|
|
92a1214dcd | ||
|
|
388f8da97f | ||
|
|
e96623588c | ||
|
|
e1e316b931 | ||
|
|
c4fd29541b | ||
|
|
a8b13f5a82 | ||
|
|
86fc573d7a | ||
|
|
f82e47f2af | ||
|
|
75a38fa38b | ||
|
|
ac62a3713c | ||
|
|
ea52c99560 | ||
|
|
7d4100ed8a | ||
|
|
c8d1d9c51f | ||
|
|
ab2eb3442e | ||
|
|
dbbeb7d4ed | ||
|
|
bfa00ffbdc | ||
|
|
10eb1a3aee | ||
|
|
fd2bf9f6f6 | ||
|
|
fc1f9f0124 | ||
|
|
789492d1a9 | ||
|
|
afc320bed4 | ||
|
|
cba4a6f9c8 | ||
|
|
5556d42b46 | ||
|
|
7d2bc1c7a4 | ||
|
|
c209c874a9 | ||
|
|
dd52e9cd72 | ||
|
|
0f71a150ff | ||
|
|
74388d4bf4 | ||
|
|
e811dd15b5 | ||
|
|
f22700a4ec | ||
|
|
ee25a7d458 | ||
|
|
594e212b8a | ||
|
|
5c355468c1 | ||
|
|
d1571d18f9 | ||
|
|
cb86b44dea | ||
|
|
833e6e0c92 | ||
|
|
159273e532 | ||
|
|
631f2db1a3 | ||
|
|
a1f0eaab54 | ||
|
|
b1898f6d8b | ||
|
|
d29e9e7e07 | ||
|
|
360605e284 | ||
|
|
64772544fa | ||
|
|
5f4875e2ba | ||
|
|
fd2a8c01cb | ||
|
|
b6129ad081 | ||
|
|
28d0b0a21e | ||
|
|
b779c43126 | ||
|
|
4e12725616 | ||
|
|
570bc9f32d | ||
|
|
47976caa69 | ||
|
|
f1abd8577c | ||
|
|
423b50b068 | ||
|
|
bedf0789f2 | ||
|
|
a2d1cb3b22 | ||
|
|
e7ba88f905 | ||
|
|
50f6e5232e | ||
|
|
8854f0a5ed | ||
|
|
13cc3acdfd | ||
|
|
5b7368c46d | ||
|
|
27999f2d26 | ||
|
|
e74f2a4274 | ||
|
|
d141a73493 | ||
|
|
631f44331e | ||
|
|
b01fddef8b | ||
|
|
78a8553f1c | ||
|
|
b70c1abd7c | ||
|
|
71f31d74bc | ||
|
|
72e557b3a9 | ||
|
|
3eaccbb61a | ||
|
|
b678bd8ed2 | ||
|
|
2baa140615 | ||
|
|
e760f07767 | ||
|
|
ca5d5f0a49 | ||
|
|
69b4fd49fc | ||
|
|
36f315c344 | ||
|
|
8016f5ca2d | ||
|
|
8ef2ff1257 | ||
|
|
6ce31defb6 | ||
|
|
0b3ad9141b | ||
|
|
c903db5c53 | ||
|
|
8a038b946c | ||
|
|
ed9740b72c | ||
|
|
ce3dcc9856 | ||
|
|
4472d50eba | ||
|
|
a1d5702ba0 | ||
|
|
52a231ce2f | ||
|
|
16af981772 | ||
|
|
fc141b8dfc | ||
|
|
82ebd29ff6 | ||
|
|
f5737b5a49 | ||
|
|
55e68d2c63 | ||
|
|
479f45da9b | ||
|
|
140c4e4812 | ||
|
|
337460d299 | ||
|
|
e41c3a7c92 | ||
|
|
1b9faa4d61 | ||
|
|
9f9a754a64 | ||
|
|
f7b0cfe8d1 | ||
|
|
4ce8667b9d | ||
|
|
0785b24192 | ||
|
|
34f02cf83d | ||
|
|
8b43d79257 | ||
|
|
dc086c6bf1 | ||
|
|
dc0ffbe16e | ||
|
|
8df66f7991 | ||
|
|
39580381fa | ||
|
|
06a0f278e5 | ||
|
|
fd97470f35 | ||
|
|
11fc3f1e56 | ||
|
|
693bb708b2 | ||
|
|
97719fe8da | ||
|
|
4933ace50b | ||
|
|
81bf0a6430 | ||
|
|
24aed1b14e | ||
|
|
09c3ac02f8 | ||
|
|
45a39585b3 | ||
|
|
286a455fa9 | ||
|
|
bdf4960b6a | ||
|
|
13124aafe3 | ||
|
|
2128be8b28 | ||
|
|
175294fa5d | ||
|
|
5016c7cf7c | ||
|
|
1468206052 | ||
|
|
d1ff4b5cf0 | ||
|
|
700a065abd | ||
|
|
3fc462f90f | ||
|
|
65a8f6bb4b | ||
|
|
e0f0944bff | ||
|
|
c7590dd752 | ||
|
|
33a5680328 | ||
|
|
455d87cadd | ||
|
|
e65ae09789 | ||
|
|
dacdce1ea2 | ||
|
|
766f3c50ec | ||
|
|
802b97b2ed | ||
|
|
2ad408f2b8 | ||
|
|
c8fddd8f62 | ||
|
|
74fab994e2 | ||
|
|
3a99542f73 | ||
|
|
2ae9f3555b | ||
|
|
1937b4bf66 | ||
|
|
8beb290842 | ||
|
|
8fec5155c7 | ||
|
|
3f49decce9 | ||
|
|
e2492f65a0 | ||
|
|
5116a812fb | ||
|
|
82409c060f | ||
|
|
183ed3f88f | ||
|
|
447ac3c40b | ||
|
|
96f96927da | ||
|
|
2c79e29483 | ||
|
|
362473dde0 | ||
|
|
8339682112 | ||
|
|
3f06d767b5 | ||
|
|
2854dc9ab3 | ||
|
|
516fcf9168 | ||
|
|
12d1971b0d | ||
|
|
3e09e509d6 | ||
|
|
99fb11cc72 | ||
|
|
d176ddd27e | ||
|
|
0847b3a4bf | ||
|
|
6d2ea8dae3 | ||
|
|
47ba4502e0 | ||
|
|
6263cb6456 | ||
|
|
d7024d80ce | ||
|
|
59d6b852af | ||
|
|
e512928df5 | ||
|
|
a38029e3e7 | ||
|
|
b12b652a57 | ||
|
|
c793416495 | ||
|
|
01343f187b | ||
|
|
69021e1497 | ||
|
|
08c408aae0 | ||
|
|
bf698659b0 | ||
|
|
2d5d70693a | ||
|
|
a4091ade5c | ||
|
|
a7a881809f | ||
|
|
0f4cb94cfe | ||
|
|
6469e9734b | ||
|
|
5372caefb3 | ||
|
|
9d7b973a62 | ||
|
|
a5f221aa39 | ||
|
|
e764b75aef | ||
|
|
708cfef3f7 | ||
|
|
01b8432d58 | ||
|
|
9b5b652c71 | ||
|
|
981a4778a9 | ||
|
|
5d4363d58d | ||
|
|
48697b8225 | ||
|
|
1652bb67d9 | ||
|
|
1499f681a3 | ||
|
|
a21fa6ff40 | ||
|
|
186dc3c1ab | ||
|
|
6b7a27d080 | ||
|
|
c9017f9f7a | ||
|
|
fdada8b3d4 | ||
|
|
9e2ff7d037 | ||
|
|
65834fc420 | ||
|
|
f5a4965de7 | ||
|
|
db5911eb73 | ||
|
|
2f4e63b443 | ||
|
|
584164a6ff | ||
|
|
e6f6d26d13 | ||
|
|
67d8d5848c | ||
|
|
43d15f09f0 | ||
|
|
7123c7ae3a | ||
|
|
4d9c346a17 | ||
|
|
deed9d3943 | ||
|
|
652f0c7676 | ||
|
|
e479ec8fb6 | ||
|
|
a33501e6a7 | ||
|
|
47f8199a99 | ||
|
|
4bf0ddc0e1 | ||
|
|
4cd0ccce83 | ||
|
|
a3657188b6 | ||
|
|
b8fcd11286 | ||
|
|
4810555038 | ||
|
|
84b291852c | ||
|
|
74831dd88f | ||
|
|
0b220f9fff | ||
|
|
d3cdeed871 | ||
|
|
0524632199 | ||
|
|
30d5b7db92 | ||
|
|
2f60f4d9ea | ||
|
|
b017b87866 | ||
|
|
b87aa98634 | ||
|
|
a4c07ca948 | ||
|
|
b8826dd3b3 | ||
|
|
d54c050985 | ||
|
|
248dd4415e | ||
|
|
dec6772b05 | ||
|
|
b4f4c79ac4 | ||
|
|
c1d5252b87 | ||
|
|
0f71e12235 | ||
|
|
fa6b7d77b2 | ||
|
|
a72c26bdc3 | ||
|
|
fe3292c170 | ||
|
|
ad66fe0074 | ||
|
|
df64893f2b | ||
|
|
e5bc8588e0 | ||
|
|
23bc5d23fe | ||
|
|
28d2bb0432 | ||
|
|
1c010a129e | ||
|
|
f5ce4cf0a5 | ||
|
|
ff3e6c05a5 | ||
|
|
33dfe5331a | ||
|
|
888ad35d10 | ||
|
|
fa452b3a93 | ||
|
|
2f8fa469ac | ||
|
|
d3a0c26999 | ||
|
|
95f10c8068 | ||
|
|
9bb174e96e | ||
|
|
4c5573b09f | ||
|
|
43eb014026 | ||
|
|
2d792651ea | ||
|
|
6cf75d569b | ||
|
|
67ce9b9e56 | ||
|
|
bcebbb9df6 | ||
|
|
bdd76cdf77 | ||
|
|
825637f32c | ||
|
|
8ef5d10da2 | ||
|
|
5217cdc5e2 | ||
|
|
e3c8c457ba | ||
|
|
cddaf4881e | ||
|
|
428d64ffa0 | ||
|
|
09c94bef2d | ||
|
|
a0e810b471 | ||
|
|
78728d5238 | ||
|
|
cc2c0958c9 | ||
|
|
4cb15a4cda | ||
|
|
9845e046de | ||
|
|
cf90364fd7 | ||
|
|
a13e3cd07f | ||
|
|
dfa2b44f71 | ||
|
|
b000164eed | ||
|
|
663a03a17b | ||
|
|
a943f5ba32 | ||
|
|
f3842aa746 | ||
|
|
18a9a2e791 | ||
|
|
61c7eaed62 | ||
|
|
2dcf917fa1 | ||
|
|
f53d458920 | ||
|
|
2af437fd90 | ||
|
|
56a9197f55 | ||
|
|
eddbb97934 | ||
|
|
4f71f74b44 | ||
|
|
cf9041c0e4 | ||
|
|
746cf6863d | ||
|
|
803e32dad2 | ||
|
|
a4f8826301 | ||
|
|
6187216606 | ||
|
|
275a854d6e | ||
|
|
7efccc36b4 | ||
|
|
64c2de95ca | ||
|
|
c170740423 | ||
|
|
45cfe86fb0 | ||
|
|
db4d649e55 | ||
|
|
c0452d160b | ||
|
|
b4b7ae63ad | ||
|
|
c07209b635 | ||
|
|
091e1e7f7a | ||
|
|
92f249a52c | ||
|
|
e6228e92b4 | ||
|
|
3e9c4c8bb8 | ||
|
|
22b650c092 | ||
|
|
f0849447ad | ||
|
|
789223cc9e | ||
|
|
de3f846a53 | ||
|
|
46121b71cf | ||
|
|
b1daea1fe8 | ||
|
|
129884aff7 | ||
|
|
720b280bc1 | ||
|
|
9b7a5c041e | ||
|
|
c46d8bdf95 | ||
|
|
050a23ce67 | ||
|
|
2afe6b38d3 | ||
|
|
097f3c74ea | ||
|
|
25b5686dd2 | ||
|
|
a91888e79e | ||
|
|
c31e15c4cf | ||
|
|
1694682aa4 | ||
|
|
29bcb282da | ||
|
|
f1bd444792 | ||
|
|
fbc226a510 | ||
|
|
5baa503bfc | ||
|
|
0cd96afe63 | ||
|
|
3d540ed946 | ||
|
|
98cd00de63 | ||
|
|
ecbe9b7324 | ||
|
|
879f0cd5c6 | ||
|
|
613ec23f84 | ||
|
|
f574905b8e | ||
|
|
bd63ece47c | ||
|
|
2901d85662 | ||
|
|
020711fa97 | ||
|
|
a2dfbd86da | ||
|
|
d6fd251a73 | ||
|
|
1264510fc0 | ||
|
|
ef842d3a94 | ||
|
|
d768353806 | ||
|
|
e4dbbbf5f5 | ||
|
|
42b5c0a1f7 | ||
|
|
fd558065c7 | ||
|
|
68142aff7f | ||
|
|
946c29679e | ||
|
|
6a79ada7f2 | ||
|
|
835ec72622 | ||
|
|
a9f0c7bf1f | ||
|
|
1ede3a82e9 | ||
|
|
0abcdeed42 | ||
|
|
532c9ebb30 | ||
|
|
2a1bc53771 | ||
|
|
5bf8d1fa1b | ||
|
|
2ff1813746 | ||
|
|
42a3503906 | ||
|
|
98db579014 | ||
|
|
0338b1cbdf | ||
|
|
e1051724c3 | ||
|
|
0e4136d31e | ||
|
|
f8d38320cd | ||
|
|
42bd0b8b75 | ||
|
|
08ac11ff22 | ||
|
|
6ae4a979f4 | ||
|
|
a3ada0eee8 | ||
|
|
50530fa3cf | ||
|
|
611f9d8722 | ||
|
|
8e9c99ae5b | ||
|
|
c324ea10df | ||
|
|
1984a8d38e | ||
|
|
84a818dbda | ||
|
|
d140d49b61 | ||
|
|
beb7b24e8e | ||
|
|
5337620476 | ||
|
|
990c68efcb | ||
|
|
8d4145038d | ||
|
|
f2c3dcab3a | ||
|
|
73e84f8379 | ||
|
|
eafb157d60 | ||
|
|
7cdf6b7942 | ||
|
|
c8ad6c3960 | ||
|
|
3bb71c6b0c | ||
|
|
d0b843d6c4 | ||
|
|
0f4c42d54e | ||
|
|
bde2524c3b | ||
|
|
cf3f6fd6a1 | ||
|
|
c8481d35c1 | ||
|
|
96a44f3dcf | ||
|
|
0ae66d1860 | ||
|
|
700605ff35 | ||
|
|
a67e63cce0 | ||
|
|
d48e86b154 | ||
|
|
39a19f9450 | ||
|
|
2dfc7cdb1a | ||
|
|
0add5ac240 | ||
|
|
5a1d95028c | ||
|
|
e80e91faf2 | ||
|
|
4ae3fcc3ca | ||
|
|
17a2d42ffd | ||
|
|
a7bc6d53a5 | ||
|
|
56eb4a5d65 | ||
|
|
f6cf6c611c | ||
|
|
7a74a72dc8 | ||
|
|
a4da216a5c | ||
|
|
8b2d9ed503 | ||
|
|
d2b5906be2 | ||
|
|
f9e35a4344 | ||
|
|
0525739046 | ||
|
|
11fda5d70f | ||
|
|
c7a18b0781 | ||
|
|
01a78531ad | ||
|
|
c2414b8891 | ||
|
|
f03020a7e2 | ||
|
|
01509a2a84 | ||
|
|
66b3a9cdd7 | ||
|
|
baca8c9667 | ||
|
|
d9df809838 | ||
|
|
da9f97b0e0 | ||
|
|
2d0497bf3b | ||
|
|
5e7afce019 | ||
|
|
74180ba1cc | ||
|
|
d425dbe203 | ||
|
|
32415e1e6c | ||
|
|
8e178ac60d | ||
|
|
3ae6c208b2 | ||
|
|
563727f47f | ||
|
|
2b7ac91505 | ||
|
|
52c0f5b39e | ||
|
|
fef66b80ad | ||
|
|
b6f40f2ec8 | ||
|
|
8c3b8dcec4 | ||
|
|
7f73219041 | ||
|
|
196d3c1a98 | ||
|
|
8c60ac267e | ||
|
|
3c7e7368b2 | ||
|
|
593f0e0916 | ||
|
|
1508938fed | ||
|
|
881d3e9441 | ||
|
|
aedeff8b24 | ||
|
|
75e2804c83 | ||
|
|
c45d2c3255 | ||
|
|
ea40804371 | ||
|
|
ee2b772dd5 | ||
|
|
62a2c1a6d9 | ||
|
|
de0befef9c | ||
|
|
5658998c0c | ||
|
|
89e0f64279 | ||
|
|
edea76b5b9 | ||
|
|
016e6a014e | ||
|
|
cdeb8ce229 | ||
|
|
12504b01e9 | ||
|
|
c3a92b1248 | ||
|
|
181c81f016 | ||
|
|
cb7ce006b5 | ||
|
|
2150d629b1 | ||
|
|
c82c367324 | ||
|
|
dc5c72bc19 | ||
|
|
0ce5d9d4d7 | ||
|
|
37fcbeb596 | ||
|
|
2f071c97b0 | ||
|
|
9664f4357c | ||
|
|
74ae506603 | ||
|
|
2965867338 | ||
|
|
e63e668d86 | ||
|
|
b7289e59aa | ||
|
|
be4dfe8be0 | ||
|
|
e230ffcf03 | ||
|
|
0d7b036137 | ||
|
|
078142c43c | ||
|
|
5920a58e83 | ||
|
|
aaea5b490f | ||
|
|
8d45cdb09d | ||
|
|
a4e623ea94 | ||
|
|
5595e1c397 | ||
|
|
ca41f9e2df | ||
|
|
177e2870c5 | ||
|
|
3ce3235294 | ||
|
|
c51f1b3f31 | ||
|
|
8bf8b19a5d | ||
|
|
6d1d42d2dd | ||
|
|
212c82c6f6 | ||
|
|
fcefa3d614 | ||
|
|
b3b4b7d59c | ||
|
|
29abaee4ec | ||
|
|
c7c8d99680 | ||
|
|
c1d28b502e | ||
|
|
14fe248b4b | ||
|
|
88f27a5377 | ||
|
|
1f1a62d83e | ||
|
|
428998a4cf | ||
|
|
d26f47dddd | ||
|
|
2af0cd9cce | ||
|
|
f92d45fa68 | ||
|
|
67fa017742 | ||
|
|
d8c2ab8349 | ||
|
|
0df0be8352 | ||
|
|
8ebd2f9df2 | ||
|
|
4ef345e706 | ||
|
|
0a2d4dae5a | ||
|
|
71053101c3 | ||
|
|
53fdb9044d | ||
|
|
8a085a0a85 | ||
|
|
edf5762612 | ||
|
|
ef02c6c6ab | ||
|
|
e4ee2cd548 | ||
|
|
b77007887c | ||
|
|
2dac8e509b | ||
|
|
e5a19a4c33 | ||
|
|
5349f0e8d4 | ||
|
|
ad8e544483 | ||
|
|
86684b7fc9 | ||
|
|
4ce2714da1 | ||
|
|
e93a99e19e | ||
|
|
61a84a2c11 | ||
|
|
30040d7778 | ||
|
|
e3b9124b85 | ||
|
|
642c3bd37e | ||
|
|
49e4a1fab0 | ||
|
|
04d36996dd | ||
|
|
f1a60780b9 | ||
|
|
d83c91edc6 | ||
|
|
ea504e6bf1 | ||
|
|
a2be6754bf | ||
|
|
daa090981a | ||
|
|
aaf183142e | ||
|
|
7525ecd8c1 | ||
|
|
09d8bc83ff | ||
|
|
cc35a8431f | ||
|
|
819dea2500 | ||
|
|
01e6732e4d | ||
|
|
f04089b8bc | ||
|
|
2566f9aaf6 | ||
|
|
1eac00e89a | ||
|
|
2e9b9a9f13 | ||
|
|
9f5be60b40 | ||
|
|
d64836f317 | ||
|
|
634e17a5ab | ||
|
|
2f810a4da6 | ||
|
|
cb9f1ac9ce | ||
|
|
d83cc69afe | ||
|
|
d6bb27ec20 | ||
|
|
d42a6e7415 | ||
|
|
b9167e9299 | ||
|
|
28ec0f864a | ||
|
|
7005d8a400 | ||
|
|
7f433ae28f | ||
|
|
a2506f154b | ||
|
|
501b973c25 | ||
|
|
4eec81a113 | ||
|
|
9a13bccd63 | ||
|
|
30636e7cf3 | ||
|
|
67a15ef27f | ||
|
|
d322bcfcec | ||
|
|
0ac5aa7af2 | ||
|
|
f9be652b3b | ||
|
|
932f6b53a9 | ||
|
|
4d9eb35ad7 | ||
|
|
86d716cf8a | ||
|
|
87db9129bc | ||
|
|
6566c5904f | ||
|
|
aa813fbce1 | ||
|
|
d1ebbaa6f6 | ||
|
|
c07cf5bffe | ||
|
|
df448c069c | ||
|
|
25e7696565 | ||
|
|
92777c0a44 | ||
|
|
7ebc260924 | ||
|
|
f5eaa578b9 | ||
|
|
6f04570dd0 | ||
|
|
15ca847c37 | ||
|
|
c613b70363 | ||
|
|
dc02c38a94 | ||
|
|
7526c6b1f9 | ||
|
|
1cbabc3d28 | ||
|
|
bd10b154fe | ||
|
|
070a780d7f | ||
|
|
8aef915ee7 | ||
|
|
3da860927d | ||
|
|
1c90575b9f | ||
|
|
9dcc4b7df5 | ||
|
|
9831cbb139 | ||
|
|
bee62c89de | ||
|
|
5c0073a948 | ||
|
|
2a26dfcb00 | ||
|
|
24539666af | ||
|
|
757723a7e8 | ||
|
|
ff4c752984 | ||
|
|
06d1089714 | ||
|
|
6e827da570 | ||
|
|
279ebdc153 | ||
|
|
9b0eeb815a | ||
|
|
44824718b2 | ||
|
|
8bd03093eb | ||
|
|
d5a6dee1b3 | ||
|
|
a534de0312 | ||
|
|
98c5088a39 | ||
|
|
6807e63c5f | ||
|
|
2a95a3e966 | ||
|
|
1e3745ccdf | ||
|
|
d8160f9113 | ||
|
|
6494a8c50b | ||
|
|
864cfa725b | ||
|
|
e79bc727f0 | ||
|
|
2e1a87d7d3 | ||
|
|
f53a0e8700 | ||
|
|
470dc65956 | ||
|
|
686143100f | ||
|
|
c3933904f6 | ||
|
|
65849629f5 | ||
|
|
fa1f239a70 | ||
|
|
4bb6bda9f6 | ||
|
|
256c4013b7 | ||
|
|
27e9520665 | ||
|
|
b3642b0219 | ||
|
|
193e0a03b2 | ||
|
|
a59acf8835 | ||
|
|
62e92476e6 | ||
|
|
6255efe8b2 | ||
|
|
a46d66134b | ||
|
|
f034899c7f | ||
|
|
c9a5fa6097 | ||
|
|
d1a965f019 | ||
|
|
533a009257 | ||
|
|
4a80bf6441 | ||
|
|
c8d217ad50 | ||
|
|
a8ddc07a9a | ||
|
|
af85f2036c | ||
|
|
ff6c15f9c1 | ||
|
|
4110ae21af | ||
|
|
b15e0a279b | ||
|
|
787bec9875 | ||
|
|
f0ce2c1afa | ||
|
|
850c1d0234 | ||
|
|
ee7d976283 | ||
|
|
258ff6f462 | ||
|
|
95a3fe17fa | ||
|
|
501861e435 | ||
|
|
f3890cbae6 | ||
|
|
f714534393 | ||
|
|
d0fcd8ae8a | ||
|
|
7c46e7ac69 | ||
|
|
1db5de9653 | ||
|
|
b5fc06bd56 | ||
|
|
7c4d33654f | ||
|
|
05729b27a0 | ||
|
|
0bf3f7e01f | ||
|
|
bd5503a0d3 | ||
|
|
25e855a009 | ||
|
|
c2501ae733 | ||
|
|
3a4f2bebb4 | ||
|
|
394ca402a8 | ||
|
|
db25cc9157 | ||
|
|
93f8d1610d | ||
|
|
99c9ab467b | ||
|
|
db43efe3ec | ||
|
|
9a4ee47c52 | ||
|
|
0a674a158d | ||
|
|
3bd26c7a24 | ||
|
|
8c31d38fa1 | ||
|
|
d988054ad8 | ||
|
|
2db86833a9 | ||
|
|
b0a4750624 | ||
|
|
4f69285375 | ||
|
|
e640b4a1ff | ||
|
|
7f5a18fa34 | ||
|
|
c4897139ae | ||
|
|
372290a796 | ||
|
|
729385362c | ||
|
|
f6db88aca8 | ||
|
|
0819bbe21f | ||
|
|
18342b3aa3 | ||
|
|
c2daad8340 | ||
|
|
de9a0ed522 | ||
|
|
06e7216c83 | ||
|
|
60155294e9 | ||
|
|
3f2d41de9e | ||
|
|
b0f19fd862 | ||
|
|
0bf51c6a0d | ||
|
|
1d2c2cffd2 | ||
|
|
157fe016e5 | ||
|
|
5a233398eb | ||
|
|
919ba88413 | ||
|
|
445441ce25 | ||
|
|
34375b2ebf | ||
|
|
9ea744a710 | ||
|
|
2b6f9fb6a7 | ||
|
|
8c8f30d8ce | ||
|
|
b6c434c445 | ||
|
|
569a68eb73 | ||
|
|
1885ece2dc | ||
|
|
459c52137a | ||
|
|
190945352a | ||
|
|
def8d2c569 | ||
|
|
fdd7de00bd | ||
|
|
2f30eac27f | ||
|
|
14f3585816 | ||
|
|
8ad18de54c | ||
|
|
7560aec66b | ||
|
|
fb32d0b86f | ||
|
|
7090fffeae | ||
|
|
c1de4d46aa | ||
|
|
82b563f165 | ||
|
|
9cb25e16f9 | ||
|
|
ca07abf3dc | ||
|
|
b711dd692a | ||
|
|
1e1f031713 | ||
|
|
b5e17c965d | ||
|
|
23f0fae1c8 | ||
|
|
79ca821e26 | ||
|
|
fe7d775818 | ||
|
|
4e59857228 | ||
|
|
c2b7f45806 | ||
|
|
c6597d0010 | ||
|
|
1a4f55e0e6 | ||
|
|
30273a6ee5 | ||
|
|
8e3cc9d70c | ||
|
|
2b01811fe9 | ||
|
|
a561a0f7f0 | ||
|
|
36a8e3ac0e | ||
|
|
0f18d599e9 | ||
|
|
3959570221 | ||
|
|
3ff9b0cd2a | ||
|
|
5b4103bbac | ||
|
|
d5ed749e9f | ||
|
|
39bdd086a7 | ||
|
|
dd025391f2 | ||
|
|
e5efc68a91 | ||
|
|
62afbb034f | ||
|
|
9691c3cb55 | ||
|
|
24cb4a3bc9 | ||
|
|
0888952cb9 | ||
|
|
b8437bea73 | ||
|
|
842e341895 | ||
|
|
3df59379de | ||
|
|
58b03af587 | ||
|
|
5652862b23 | ||
|
|
9895c1f9bd | ||
|
|
4e7f9ca1b3 | ||
|
|
c7cf3720bd | ||
|
|
d2996b4cc6 | ||
|
|
19675008c8 | ||
|
|
4937cb5b7c | ||
|
|
7b20ca9d04 | ||
|
|
217c6d42fb | ||
|
|
fb8dd57d1f | ||
|
|
669adbeb60 | ||
|
|
dd72429af4 | ||
|
|
971e7f94dc | ||
|
|
92183a74c4 | ||
|
|
e7bb832bf3 | ||
|
|
34d04139cd | ||
|
|
c4d434a2b4 | ||
|
|
76764633b4 | ||
|
|
8e87c35c88 | ||
|
|
45a1a74559 | ||
|
|
b24f256f2a | ||
|
|
864d046058 | ||
|
|
a27741b131 | ||
|
|
b13bafa13e | ||
|
|
f995b4c041 | ||
|
|
b8a5886db4 | ||
|
|
b9d2756ce8 | ||
|
|
07dec76f7c | ||
|
|
deeefcf16c | ||
|
|
8e0f7e56f7 | ||
|
|
87ca05b4bb | ||
|
|
d69a8a7045 | ||
|
|
87001a68c0 | ||
|
|
a610fc1bc2 | ||
|
|
e89028581c | ||
|
|
980ffa2a2b | ||
|
|
1f2029ae55 | ||
|
|
ed0fcf8e3d | ||
|
|
f36efae25d | ||
|
|
853d0593d0 | ||
|
|
078f6ffc1c | ||
|
|
7a6f71f090 | ||
|
|
a158c77d81 | ||
|
|
8ddbf9635d | ||
|
|
8d3ec24c11 | ||
|
|
a5ba44bd6a | ||
|
|
f5135ae4df | ||
|
|
87e55ccffd | ||
|
|
d911586788 | ||
|
|
b932ed1f67 | ||
|
|
dca3ea355e | ||
|
|
d095a307dd | ||
|
|
51712cc19f | ||
|
|
efa9f57048 | ||
|
|
b3aef377be | ||
|
|
e4520602f5 | ||
|
|
83cd91ccca | ||
|
|
51b4c240ed | ||
|
|
bdf826a026 | ||
|
|
c0c112985b | ||
|
|
f205ee3d4c | ||
|
|
e1375ef431 | ||
|
|
0aeaccc3a5 | ||
|
|
01b7d6334c | ||
|
|
a325df55d1 | ||
|
|
27fa7c3e4a | ||
|
|
0d93266462 | ||
|
|
3dce7e5696 | ||
|
|
e276c12192 | ||
|
|
eb952a480d | ||
|
|
f2833c5279 | ||
|
|
9c6f56b836 | ||
|
|
f3fdb07507 | ||
|
|
1fe32a7ff2 | ||
|
|
71700c506c | ||
|
|
18d0f3411f | ||
|
|
e1fa6cf30b | ||
|
|
a07172a069 | ||
|
|
32d2c38aa2 | ||
|
|
80388c042b | ||
|
|
c723bcd594 | ||
|
|
d4233f8166 | ||
|
|
60f44cc509 | ||
|
|
14ca4e8197 | ||
|
|
ae69f423cd | ||
|
|
d8ecf4bc2d | ||
|
|
3eabf2aafc | ||
|
|
02acf83e99 | ||
|
|
d53ae18918 | ||
|
|
0d37f9011c | ||
|
|
244ec8fbf2 | ||
|
|
57984ae9f3 | ||
|
|
1e69e67997 | ||
|
|
1c3b129a53 | ||
|
|
a449d39bdc | ||
|
|
34df327d2a | ||
|
|
b7b74910d8 | ||
|
|
b7add6a1a8 | ||
|
|
ce5df2d84b | ||
|
|
76acf613c5 | ||
|
|
2966a29449 | ||
|
|
c01ddbc747 | ||
|
|
f8f627b6f7 | ||
|
|
c3f1183815 | ||
|
|
f08fd02f33 | ||
|
|
8d1258f26a | ||
|
|
4304b3981e | ||
|
|
31e7920cee | ||
|
|
6fb45305f8 | ||
|
|
9cf5a2f83f | ||
|
|
3d6b5e8102 | ||
|
|
8c5d091513 | ||
|
|
91df875847 | ||
|
|
1ac392a551 | ||
|
|
3f0dc81a9c | ||
|
|
44ef58be43 | ||
|
|
803e0a4fbb | ||
|
|
62b435a309 | ||
|
|
fe28feba1e | ||
|
|
cc27966980 | ||
|
|
6b0a2ff0d0 | ||
|
|
b0c50b3bc7 | ||
|
|
4c51cb0909 | ||
|
|
032e3c9f30 | ||
|
|
9bae712453 | ||
|
|
b057e09156 | ||
|
|
0d5c105c15 | ||
|
|
fe698d9096 | ||
|
|
c54ec23b9e | ||
|
|
6f1d309308 | ||
|
|
6f88dd437e | ||
|
|
557bbe2b85 | ||
|
|
32c19c2e47 | ||
|
|
27d1a31eb6 | ||
|
|
3c6c29e19e | ||
|
|
2b97faa1d3 | ||
|
|
17ee0e3c7a | ||
|
|
c46a711526 | ||
|
|
098ff228d7 | ||
|
|
f5e9db90cc | ||
|
|
36db08340d | ||
|
|
2fb135026c | ||
|
|
77903200a0 | ||
|
|
e424e9f6c7 | ||
|
|
11f0fd7fd9 | ||
|
|
547f3ac835 | ||
|
|
373676a576 | ||
|
|
9bda8598e1 | ||
|
|
19b5e24d5c | ||
|
|
1da82a0eab | ||
|
|
75ee0e4245 | ||
|
|
53c40024d8 | ||
|
|
bcb192c707 | ||
|
|
6072ec16a0 | ||
|
|
b70ed105db | ||
|
|
8d0aa11a35 | ||
|
|
e2674498c6 | ||
|
|
3200581d4d | ||
|
|
6afc4840b4 | ||
|
|
93aef73eb5 | ||
|
|
5453fad991 | ||
|
|
f35f63fa57 | ||
|
|
88b583f2bb | ||
|
|
8863855627 | ||
|
|
5bbdb3d5ba | ||
|
|
9f4b5566db | ||
|
|
f97f4bc4f1 | ||
|
|
3e7f1e3ff2 | ||
|
|
4b80097817 | ||
|
|
7f530ebf20 | ||
|
|
11e74147ae | ||
|
|
5d78a2f103 | ||
|
|
194e0b951d | ||
|
|
369a3d3678 | ||
|
|
21b1e6ecf8 | ||
|
|
12d1bf407a | ||
|
|
5c4821ac6f | ||
|
|
8bfe2ec71e | ||
|
|
adf7d1b975 | ||
|
|
14e423fe53 | ||
|
|
a49f231b5d | ||
|
|
70f472484f | ||
|
|
77b687d501 | ||
|
|
0f629a47a5 | ||
|
|
f01f2d13c7 | ||
|
|
3461c4f73d | ||
|
|
4d6cd0ebb4 | ||
|
|
3080141c5f | ||
|
|
bc3808cf29 | ||
|
|
761fced786 | ||
|
|
706e075908 | ||
|
|
a13c7b0ae3 | ||
|
|
dad2216984 | ||
|
|
7e12aaa24a | ||
|
|
6e7f1f5f07 | ||
|
|
e0904de6ea | ||
|
|
4ecc35131c | ||
|
|
22838ba227 | ||
|
|
3b34167924 | ||
|
|
cb47760978 | ||
|
|
fb327612f8 | ||
|
|
7e16e7721a | ||
|
|
3181d9f3f8 | ||
|
|
02b1b5f6ab | ||
|
|
9de432e6bf | ||
|
|
24f819d823 | ||
|
|
13837b25cf | ||
|
|
2ac6606c6c | ||
|
|
c306792449 | ||
|
|
1d16528542 | ||
|
|
e74a7001ef | ||
|
|
c5c33578d9 | ||
|
|
0d65d17f10 | ||
|
|
98096d9859 | ||
|
|
5b25de927e | ||
|
|
a4698d8e10 | ||
|
|
078de99c61 | ||
|
|
02a122c2e7 | ||
|
|
faa261e3e2 | ||
|
|
9394825018 | ||
|
|
efd6b8b9c7 | ||
|
|
be6630bec6 | ||
|
|
d757726aca | ||
|
|
3545c5a7a4 | ||
|
|
3c4fde4610 | ||
|
|
33220c5109 | ||
|
|
64d95837e9 | ||
|
|
c3941323e2 | ||
|
|
9a7d88f139 | ||
|
|
c7fccf74c9 | ||
|
|
54c0ac1f91 | ||
|
|
642aac6f43 | ||
|
|
5374811f96 | ||
|
|
b97c88f202 | ||
|
|
d15096f0df | ||
|
|
8e6c83b4cf | ||
|
|
3bfd857a27 | ||
|
|
c03bc1ec3e | ||
|
|
2fcafc6602 | ||
|
|
11227403ce | ||
|
|
177981d1cd | ||
|
|
579735b1c3 | ||
|
|
511e334365 | ||
|
|
cc658eb288 | ||
|
|
da3d55ba03 | ||
|
|
e1bd5ef858 | ||
|
|
5c405ea0f5 | ||
|
|
92f96c1d45 | ||
|
|
00e16b49e5 | ||
|
|
463e23e006 | ||
|
|
d7e1064b13 | ||
|
|
e58c8322e9 | ||
|
|
be78831ac0 | ||
|
|
fb2840ede5 | ||
|
|
b88c23897f | ||
|
|
6aa47be78e | ||
|
|
c63c44ac70 | ||
|
|
06f865307f | ||
|
|
f86a3c5ddc | ||
|
|
666857dc4e | ||
|
|
1552822404 | ||
|
|
83ac243c00 | ||
|
|
9a743f80c5 | ||
|
|
170aaabe9b | ||
|
|
ef122c9973 | ||
|
|
8e8c74c6c0 | ||
|
|
a38840ae92 | ||
|
|
2e48fe9cc7 | ||
|
|
3b451e4ab1 | ||
|
|
746180b153 | ||
|
|
62415f758b | ||
|
|
0807353bf0 | ||
|
|
a808cf71a3 | ||
|
|
8716558696 | ||
|
|
eb84eaf151 | ||
|
|
a0699bd917 | ||
|
|
0ee9c5b776 | ||
|
|
51c8da06b0 | ||
|
|
95640cba23 | ||
|
|
241889159a | ||
|
|
edb8813cc7 | ||
|
|
4a1290cb66 | ||
|
|
d52ce2d354 | ||
|
|
b33ef03ac6 | ||
|
|
dceba07e82 | ||
|
|
e12504a61d | ||
|
|
9de22c9afa | ||
|
|
e17d603201 | ||
|
|
47fbd6d160 | ||
|
|
9dc8f13925 | ||
|
|
33a4f4e454 | ||
|
|
a5e4133516 | ||
|
|
4d04aad890 | ||
|
|
847b57423f | ||
|
|
58cabf2ebd | ||
|
|
ae28d2fa2d | ||
|
|
de45998f69 | ||
|
|
0d36050b36 | ||
|
|
f31a18429b | ||
|
|
3ad30308ec | ||
|
|
6c0c397507 | ||
|
|
42da308140 | ||
|
|
680a32a85c | ||
|
|
951dde4e94 | ||
|
|
14fbdd20ac | ||
|
|
ad0fad4218 | ||
|
|
a5fe578e79 | ||
|
|
d5525794f8 | ||
|
|
3f7ef6fe33 | ||
|
|
992e5163d3 | ||
|
|
d03f624357 | ||
|
|
b547321868 | ||
|
|
9a0e5bd003 | ||
|
|
c57ad35e5b | ||
|
|
f7ef198e3a | ||
|
|
fcac2b553c | ||
|
|
e8c2d27b4a | ||
|
|
630cbf8f85 | ||
|
|
0aa9418736 | ||
|
|
abc3013096 | ||
|
|
51e237d5f9 | ||
|
|
6eb9bde786 | ||
|
|
dce89aefb9 | ||
|
|
47e14cff8d | ||
|
|
4d9b68b377 | ||
|
|
a8f4994935 | ||
|
|
8ca60f2cbb | ||
|
|
bb550497d5 | ||
|
|
849e4a3647 | ||
|
|
c177507db3 | ||
|
|
a09a0c47ae | ||
|
|
a26c396335 | ||
|
|
4aa5ca2818 | ||
|
|
27881a83d4 | ||
|
|
6378c2a81f | ||
|
|
45cadcf020 | ||
|
|
7d53abdb0a | ||
|
|
a059ded709 | ||
|
|
4de3b4a635 | ||
|
|
64162d3a24 | ||
|
|
626e2749a6 | ||
|
|
b39d896db7 | ||
|
|
4a9699226a | ||
|
|
11f4ec93ac | ||
|
|
e57797a8ff | ||
|
|
0b7975b195 | ||
|
|
362318a6e0 | ||
|
|
5a93f2a4f1 | ||
|
|
e7bdc83a8f | ||
|
|
60b8487600 | ||
|
|
013f22c89c | ||
|
|
2d1da2ab57 | ||
|
|
9c0581bc0f | ||
|
|
d79984dbda | ||
|
|
c2eaa8f019 | ||
|
|
6c517199bf | ||
|
|
d258c30406 | ||
|
|
7bb69f8641 | ||
|
|
c1051f3f52 | ||
|
|
193b600382 | ||
|
|
16936d95d1 | ||
|
|
64224d3918 | ||
|
|
c0b8af2c42 | ||
|
|
c655612d2d | ||
|
|
3cc9be0d11 | ||
|
|
571bab20c1 | ||
|
|
c663f06669 | ||
|
|
77f0e177e6 | ||
|
|
e7ad540618 | ||
|
|
38b4327f41 | ||
|
|
fa0463b3b2 | ||
|
|
af76794627 | ||
|
|
464cb5566d | ||
|
|
d670847308 | ||
|
|
33a45d0f89 | ||
|
|
da395fed20 | ||
|
|
ad1c29c512 | ||
|
|
720f33eee6 | ||
|
|
64035f766f | ||
|
|
1ace9795f7 | ||
|
|
24c838bc0b | ||
|
|
b64aa9993b | ||
|
|
2691a35102 | ||
|
|
828e724659 | ||
|
|
11d8aea96f | ||
|
|
62adbdf7f2 | ||
|
|
f39df76215 | ||
|
|
4d26307cfc | ||
|
|
be8d1df8b9 | ||
|
|
4592b4c409 | ||
|
|
bb5fa3f1e8 | ||
|
|
8283ae8c4c | ||
|
|
478e9d67df | ||
|
|
ef8f1f108b | ||
|
|
7f9f897945 | ||
|
|
662e5bddd7 | ||
|
|
b949422d46 | ||
|
|
2c7dec7327 | ||
|
|
f4d86f384c | ||
|
|
13bbe9c07d | ||
|
|
2934d062a3 | ||
|
|
37cdea9183 | ||
|
|
a7300da78d | ||
|
|
176fb7c447 | ||
|
|
0e0c5dfe99 | ||
|
|
6cc34fa1f7 | ||
|
|
287172698a | ||
|
|
0ab781c7a7 | ||
|
|
c5b0627180 | ||
|
|
b99c7b8c37 | ||
|
|
a6b562b8e4 | ||
|
|
a46d42f45e | ||
|
|
47b3a53132 | ||
|
|
a470500a43 | ||
|
|
405b32e77a | ||
|
|
2584ff0440 | ||
|
|
2e4022dd73 | ||
|
|
f03a915c75 | ||
|
|
9379d06275 | ||
|
|
eacf7db6f3 | ||
|
|
adc7ca5690 | ||
|
|
c5231f0ce3 | ||
|
|
c2264cabae | ||
|
|
f3d0ba2f51 | ||
|
|
0cb63cdd01 | ||
|
|
c236a80a37 | ||
|
|
4b9e77d2ef | ||
|
|
e1704a2f1b | ||
|
|
0282da6881 | ||
|
|
846e68e1aa | ||
|
|
33cf4f7eca | ||
|
|
132d5ca943 | ||
|
|
b44472b237 | ||
|
|
4cfcf2ccd7 | ||
|
|
a2f99ad00d | ||
|
|
eb3c9658b1 | ||
|
|
06ddcfb0bb | ||
|
|
d6bb8547b3 | ||
|
|
5219621595 | ||
|
|
a14f0c3f55 | ||
|
|
44f706a5e7 | ||
|
|
55636e6978 | ||
|
|
5921948de8 | ||
|
|
bd05bab4bf | ||
|
|
c6c7dd2fce | ||
|
|
171d20ce3e | ||
|
|
c2bb9ebd8e | ||
|
|
d35a352fe6 | ||
|
|
4fd52390ee | ||
|
|
974717ca11 | ||
|
|
d77e6c0d05 | ||
|
|
47fcab1e60 | ||
|
|
a1188ca0ee | ||
|
|
0d2a1bdef1 | ||
|
|
369ae2e63d | ||
|
|
1ce9d93e94 | ||
|
|
e0ea03dc56 | ||
|
|
3cced07c13 | ||
|
|
dca6e869df | ||
|
|
f30f0bf148 | ||
|
|
d0a1783083 | ||
|
|
a4fe3602b2 | ||
|
|
8974e33f69 | ||
|
|
bbfb4c7e63 | ||
|
|
479574e88e | ||
|
|
a96bbcd967 | ||
|
|
1e02f194fd | ||
|
|
7eef5d15ee | ||
|
|
30291a3c25 | ||
|
|
33224370eb | ||
|
|
b9cb931167 | ||
|
|
10d8357876 | ||
|
|
9604ab6621 | ||
|
|
e35a84fcb3 | ||
|
|
e910205c19 | ||
|
|
15ad02c984 | ||
|
|
8e62346f86 | ||
|
|
59344c679d | ||
|
|
a7257a1d1e | ||
|
|
f2de12aa34 | ||
|
|
2d544f18b5 | ||
|
|
0667ee7c4d | ||
|
|
19cee73209 | ||
|
|
4c638e365f | ||
|
|
f452fd7bb0 | ||
|
|
6d1f8c5111 | ||
|
|
ab61a0d5c7 | ||
|
|
af52fce275 | ||
|
|
656140d9e6 | ||
|
|
9508e97914 | ||
|
|
a6f99645c6 | ||
|
|
fd84c2d8f7 | ||
|
|
eeb439eaf9 | ||
|
|
58cbdd71b6 | ||
|
|
81cd97902a | ||
|
|
ccf4a78f5d | ||
|
|
6abff39549 | ||
|
|
94c6131c59 | ||
|
|
05fcc246ae | ||
|
|
9bfb7055e2 | ||
|
|
c5fe42089d | ||
|
|
70cf7698ac | ||
|
|
b07680108b | ||
|
|
d45ec21b3c | ||
|
|
0d252636be | ||
|
|
70da26f649 | ||
|
|
b882da1ad4 | ||
|
|
3ecb47ff2c | ||
|
|
c44e3025f9 | ||
|
|
9ffcab07bf | ||
|
|
583925c085 | ||
|
|
e631f3c78b | ||
|
|
9a6e57eec9 | ||
|
|
d3fea5f15a | ||
|
|
5d3696a9e6 | ||
|
|
b75d2aa3f4 | ||
|
|
eb4079c674 | ||
|
|
72d0c53b33 | ||
|
|
6ae0525f7a | ||
|
|
c4627e7112 | ||
|
|
6d4a980b04 | ||
|
|
545a726252 | ||
|
|
065cd0170e | ||
|
|
a7eeaa3a4b | ||
|
|
e2da663628 | ||
|
|
836134202e | ||
|
|
319a8253ba | ||
|
|
fc81bb15fe | ||
|
|
6209e7004e | ||
|
|
4944488287 | ||
|
|
0dc9c33b01 | ||
|
|
a4a5691a7b | ||
|
|
352267871c | ||
|
|
15ae83f868 | ||
|
|
e6b1ef2049 | ||
|
|
8ed2cf7ef5 | ||
|
|
8cb5cba775 | ||
|
|
c74e0bfd18 | ||
|
|
9fc336c7f7 | ||
|
|
5de7124eee | ||
|
|
2f33826063 | ||
|
|
087e076ec0 | ||
|
|
b39b819725 | ||
|
|
d544bfcd6d | ||
|
|
c7adaa7d14 | ||
|
|
f86fa1e909 | ||
|
|
2285b89aea | ||
|
|
16ca871544 | ||
|
|
722c7910e4 | ||
|
|
ab6aa23cec | ||
|
|
5fd3dfe01b | ||
|
|
8a7f437641 | ||
|
|
63a467af31 | ||
|
|
af365f444f | ||
|
|
9a9b487abd | ||
|
|
102d7f3d0e | ||
|
|
c4974ac782 | ||
|
|
27b7579566 | ||
|
|
01fa21f160 | ||
|
|
54d21dc7c1 | ||
|
|
2f2fd43771 | ||
|
|
2ca4ee2a54 | ||
|
|
b1fb38e73c | ||
|
|
09dc7058c9 | ||
|
|
75f0ab65d1 | ||
|
|
391e5d121a | ||
|
|
6f84887f60 | ||
|
|
3e44060b5b | ||
|
|
84dcd51d37 | ||
|
|
e185e27273 | ||
|
|
e2eb24761f | ||
|
|
d7111cb4a3 | ||
|
|
22bb662d3e | ||
|
|
8c4a7bea5f | ||
|
|
382e16eb7e | ||
|
|
362c1b0d11 | ||
|
|
1db646474e | ||
|
|
fbec311844 | ||
|
|
347462d87e | ||
|
|
99bd7181f9 | ||
|
|
92f09dbe81 | ||
|
|
4b1fe0a1cc | ||
|
|
78f4d66364 | ||
|
|
13356e16a3 | ||
|
|
e0e0b3f387 | ||
|
|
592694036f | ||
|
|
b21a4ac12b | ||
|
|
5e43c7aba5 | ||
|
|
db993899d3 | ||
|
|
e2de7b8ae3 | ||
|
|
95e51f384e | ||
|
|
4ff38c7bf3 | ||
|
|
faf4d9a888 | ||
|
|
18a9510048 | ||
|
|
2012641610 | ||
|
|
864e741dd8 | ||
|
|
22eb7e3847 | ||
|
|
766b83b513 | ||
|
|
c28b78fae5 | ||
|
|
6d4a87227d | ||
|
|
65b8770ce9 | ||
|
|
2ef6fb66ac | ||
|
|
82f72c3ec6 | ||
|
|
efd4d83731 | ||
|
|
8bab260587 | ||
|
|
d5449c992e | ||
|
|
4160b06c6c | ||
|
|
6e9ed48f42 | ||
|
|
5687676014 | ||
|
|
5d91c86cf2 | ||
|
|
9acefe8b3a | ||
|
|
06fac0e570 | ||
|
|
e8b44a39e0 | ||
|
|
a55c8dc1a8 | ||
|
|
7bab78c66d | ||
|
|
5c5cd4c658 | ||
|
|
53a8318f32 | ||
|
|
31b208248b | ||
|
|
9c515c7863 | ||
|
|
ec86b60e70 | ||
|
|
7f1754ecc5 | ||
|
|
e4971ec7b3 | ||
|
|
ec974f5dac | ||
|
|
7b2bfda37f | ||
|
|
2f34370f2f | ||
|
|
94799b1e98 | ||
|
|
d334e0c66c | ||
|
|
3da5816db2 | ||
|
|
c8273e06c6 | ||
|
|
ff50159a3d | ||
|
|
34aafa82f9 | ||
|
|
278a1f103b | ||
|
|
1acbbb6d43 | ||
|
|
e3a20b8bc8 | ||
|
|
f7678b4a9e | ||
|
|
52ed5dbcf9 | ||
|
|
6c5ba7cc01 | ||
|
|
36e66b545e | ||
|
|
0e9966d6a4 | ||
|
|
75fbf7a8f3 | ||
|
|
e700a3cc4d | ||
|
|
eb7f21df04 | ||
|
|
ac9c1adb75 | ||
|
|
d06f7bf1ff | ||
|
|
7f06bb5fa7 | ||
|
|
0ad8eec3eb | ||
|
|
3c841c4685 | ||
|
|
d5b647d5ab | ||
|
|
86f8fa8e6e | ||
|
|
351e4e2460 | ||
|
|
1afc7ed8c5 | ||
|
|
fcadbfc70d | ||
|
|
8c88f769b6 | ||
|
|
de24536187 | ||
|
|
1ac66f372b | ||
|
|
701b4bef51 | ||
|
|
045d86aa42 | ||
|
|
89069f78b1 | ||
|
|
fef8314d3d | ||
|
|
bec7be05f5 | ||
|
|
d42ac49de4 | ||
|
|
1272d0b990 | ||
|
|
cf86e734f2 | ||
|
|
238a496af5 | ||
|
|
a3670d267b | ||
|
|
65f05f0541 | ||
|
|
338c95f120 | ||
|
|
2b9dc4424e | ||
|
|
ef0b25c392 | ||
|
|
6f0e5d13ed | ||
|
|
046a18cd16 | ||
|
|
e1e67d0d41 | ||
|
|
216d08d013 | ||
|
|
bbdc5c6039 | ||
|
|
149e0c8ac2 | ||
|
|
48ce9d2fd8 | ||
|
|
b653d4848a | ||
|
|
4972bede48 | ||
|
|
f94f365e14 | ||
|
|
5ff23a2861 |
1851
.all-contributorsrc
1851
.all-contributorsrc
File diff suppressed because it is too large
Load Diff
2
.cargo/config.toml
Normal file
2
.cargo/config.toml
Normal file
@ -0,0 +1,2 @@
|
|||||||
|
[alias]
|
||||||
|
dev = ["run", "--", "dev"]
|
||||||
@ -1,7 +0,0 @@
|
|||||||
root = true
|
|
||||||
|
|
||||||
[*.rs]
|
|
||||||
end_of_line = lf
|
|
||||||
insert_final_newline = true
|
|
||||||
indent_style = space
|
|
||||||
indent_size = 4
|
|
||||||
45
.github/workflows/rust.yml
vendored
45
.github/workflows/rust.yml
vendored
@ -1,20 +1,47 @@
|
|||||||
name: Rustlings Tests
|
name: Check
|
||||||
|
|
||||||
on:
|
on:
|
||||||
push:
|
push:
|
||||||
branches: [ main ]
|
branches: [main]
|
||||||
|
paths-ignore:
|
||||||
|
- website
|
||||||
|
- '*.md'
|
||||||
pull_request:
|
pull_request:
|
||||||
branches: [ main ]
|
branches: [main]
|
||||||
|
paths-ignore:
|
||||||
|
- website
|
||||||
|
- '*.md'
|
||||||
|
|
||||||
env:
|
env:
|
||||||
CARGO_TERM_COLOR: always
|
CARGO_TERM_COLOR: always
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
build:
|
clippy:
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v3
|
- uses: actions/checkout@v4
|
||||||
- name: Build
|
- name: Clippy
|
||||||
run: cargo build --verbose
|
run: cargo clippy -- --deny warnings
|
||||||
- name: Run tests
|
fmt:
|
||||||
run: cargo test --verbose
|
runs-on: ubuntu-latest
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@v4
|
||||||
|
- name: rustfmt
|
||||||
|
run: cargo fmt --all --check
|
||||||
|
test:
|
||||||
|
runs-on: ${{ matrix.os }}
|
||||||
|
strategy:
|
||||||
|
matrix:
|
||||||
|
os: [ubuntu-latest, windows-latest, macos-latest]
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@v4
|
||||||
|
- uses: swatinem/rust-cache@v2
|
||||||
|
- name: cargo test
|
||||||
|
run: cargo test --workspace
|
||||||
|
dev-check:
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@v4
|
||||||
|
- uses: swatinem/rust-cache@v2
|
||||||
|
- name: rustlings dev check
|
||||||
|
run: cargo dev check --require-solutions
|
||||||
|
|||||||
43
.github/workflows/website.yml
vendored
Normal file
43
.github/workflows/website.yml
vendored
Normal file
@ -0,0 +1,43 @@
|
|||||||
|
name: Website
|
||||||
|
|
||||||
|
on:
|
||||||
|
workflow_dispatch:
|
||||||
|
push:
|
||||||
|
branches: [main]
|
||||||
|
paths: [website]
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
build:
|
||||||
|
defaults:
|
||||||
|
run:
|
||||||
|
working-directory: website
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@v4
|
||||||
|
- name: Install TailwindCSS
|
||||||
|
run: npm install
|
||||||
|
- name: Build CSS
|
||||||
|
run: npx @tailwindcss/cli -m -i input.css -o static/main.css
|
||||||
|
- name: Download Zola
|
||||||
|
run: curl -fsSL https://github.com/getzola/zola/releases/download/v0.20.0/zola-v0.20.0-x86_64-unknown-linux-gnu.tar.gz | tar xz
|
||||||
|
- name: Build site
|
||||||
|
run: ./zola build
|
||||||
|
- name: Upload static files as artifact
|
||||||
|
uses: actions/upload-pages-artifact@v3
|
||||||
|
with:
|
||||||
|
path: website/public/
|
||||||
|
|
||||||
|
deploy:
|
||||||
|
needs: build
|
||||||
|
# Grant GITHUB_TOKEN the permissions required to make a Pages deployment
|
||||||
|
permissions:
|
||||||
|
pages: write # to deploy to Pages
|
||||||
|
id-token: write # to verify the deployment originates from an appropriate source
|
||||||
|
# Deploy to the github-pages environment
|
||||||
|
environment:
|
||||||
|
name: github-pages
|
||||||
|
url: ${{ steps.deployment.outputs.page_url }}
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
steps:
|
||||||
|
- name: Deploy to GitHub Pages
|
||||||
|
uses: actions/deploy-pages@v4
|
||||||
24
.gitignore
vendored
24
.gitignore
vendored
@ -1,13 +1,19 @@
|
|||||||
*.swp
|
# Cargo
|
||||||
target/
|
target/
|
||||||
**/*.rs.bk
|
Cargo.lock
|
||||||
|
!/Cargo.lock
|
||||||
|
|
||||||
|
# State file
|
||||||
|
.rustlings-state.txt
|
||||||
|
|
||||||
|
# OS
|
||||||
.DS_Store
|
.DS_Store
|
||||||
*.pdb
|
.direnv/
|
||||||
exercises/clippy/Cargo.toml
|
|
||||||
exercises/clippy/Cargo.lock
|
# Editor
|
||||||
rust-project.json
|
*.swp
|
||||||
.idea
|
.idea
|
||||||
.vscode/*
|
|
||||||
!.vscode/extensions.json
|
|
||||||
*.iml
|
*.iml
|
||||||
*.o
|
|
||||||
|
# Ignore file for editors like Helix
|
||||||
|
.ignore
|
||||||
|
|||||||
@ -1,7 +0,0 @@
|
|||||||
tasks:
|
|
||||||
- init: /workspace/rustlings/install.sh
|
|
||||||
command: /workspace/.cargo/bin/rustlings watch
|
|
||||||
|
|
||||||
vscode:
|
|
||||||
extensions:
|
|
||||||
- rust-lang.rust-analyzer@0.3.1348
|
|
||||||
2
.replit
2
.replit
@ -1,2 +0,0 @@
|
|||||||
language = "rust"
|
|
||||||
run = "[ -x ~/.cargo/bin/rustlings ] && ~/.cargo/bin/rustlings watch || ./install.sh"
|
|
||||||
7
.typos.toml
Normal file
7
.typos.toml
Normal file
@ -0,0 +1,7 @@
|
|||||||
|
[default.extend-words]
|
||||||
|
"earch" = "earch" # Because of <s>earch in the list footer
|
||||||
|
|
||||||
|
[files]
|
||||||
|
extend-exclude = [
|
||||||
|
"CHANGELOG.md",
|
||||||
|
]
|
||||||
5
.vscode/extensions.json
vendored
5
.vscode/extensions.json
vendored
@ -1,5 +0,0 @@
|
|||||||
{
|
|
||||||
"recommendations": [
|
|
||||||
"rust-lang.rust-analyzer"
|
|
||||||
]
|
|
||||||
}
|
|
||||||
274
AUTHORS.md
274
AUTHORS.md
@ -1,274 +0,0 @@
|
|||||||
## Authors
|
|
||||||
|
|
||||||
This file lists the people that have contributed to this project.
|
|
||||||
|
|
||||||
Excluded from this list are @carols10cents and @diannasoreil, the principal
|
|
||||||
authors.
|
|
||||||
|
|
||||||
<!-- ALL-CONTRIBUTORS-LIST:START - Do not remove or modify this section -->
|
|
||||||
<!-- prettier-ignore-start -->
|
|
||||||
<!-- markdownlint-disable -->
|
|
||||||
<table>
|
|
||||||
<tbody>
|
|
||||||
<tr>
|
|
||||||
<td align="center" valign="top" width="12.5%"><a href="http://carol-nichols.com"><img src="https://avatars2.githubusercontent.com/u/193874?v=4?s=100" width="100px;" alt="Carol (Nichols || Goulding)"/><br /><sub><b>Carol (Nichols || Goulding)</b></sub></a><br /><a href="https://github.com/rust-lang/rustlings/commits?author=carols10cents" title="Code">💻</a> <a href="#content-carols10cents" title="Content">🖋</a></td>
|
|
||||||
<td align="center" valign="top" width="12.5%"><a href="https://twitter.com/QuietMisdreavus"><img src="https://avatars2.githubusercontent.com/u/5217170?v=4?s=100" width="100px;" alt="QuietMisdreavus"/><br /><sub><b>QuietMisdreavus</b></sub></a><br /><a href="https://github.com/rust-lang/rustlings/commits?author=QuietMisdreavus" title="Code">💻</a> <a href="#content-QuietMisdreavus" title="Content">🖋</a></td>
|
|
||||||
<td align="center" valign="top" width="12.5%"><a href="https://github.com/robertlugg"><img src="https://avatars0.githubusercontent.com/u/6054540?v=4?s=100" width="100px;" alt="Robert M Lugg"/><br /><sub><b>Robert M Lugg</b></sub></a><br /><a href="#content-robertlugg" title="Content">🖋</a></td>
|
|
||||||
<td align="center" valign="top" width="12.5%"><a href="https://hynek.me/about/"><img src="https://avatars3.githubusercontent.com/u/41240?v=4?s=100" width="100px;" alt="Hynek Schlawack"/><br /><sub><b>Hynek Schlawack</b></sub></a><br /><a href="https://github.com/rust-lang/rustlings/commits?author=hynek" title="Code">💻</a></td>
|
|
||||||
<td align="center" valign="top" width="12.5%"><a href="https://spacekookie.de"><img src="https://avatars0.githubusercontent.com/u/7669898?v=4?s=100" width="100px;" alt="Katharina Fey"/><br /><sub><b>Katharina Fey</b></sub></a><br /><a href="https://github.com/rust-lang/rustlings/commits?author=spacekookie" title="Code">💻</a></td>
|
|
||||||
<td align="center" valign="top" width="12.5%"><a href="https://github.com/lukabavdaz"><img src="https://avatars0.githubusercontent.com/u/9624558?v=4?s=100" width="100px;" alt="lukabavdaz"/><br /><sub><b>lukabavdaz</b></sub></a><br /><a href="https://github.com/rust-lang/rustlings/commits?author=lukabavdaz" title="Code">💻</a> <a href="#content-lukabavdaz" title="Content">🖋</a></td>
|
|
||||||
<td align="center" valign="top" width="12.5%"><a href="http://vestera.as"><img src="https://avatars2.githubusercontent.com/u/4187449?v=4?s=100" width="100px;" alt="Erik Vesteraas"/><br /><sub><b>Erik Vesteraas</b></sub></a><br /><a href="https://github.com/rust-lang/rustlings/commits?author=evestera" title="Code">💻</a></td>
|
|
||||||
<td align="center" valign="top" width="12.5%"><a href="https://github.com/Delet0r"><img src="https://avatars1.githubusercontent.com/u/23195618?v=4?s=100" width="100px;" alt="delet0r"/><br /><sub><b>delet0r</b></sub></a><br /><a href="https://github.com/rust-lang/rustlings/commits?author=Delet0r" title="Code">💻</a></td>
|
|
||||||
</tr>
|
|
||||||
<tr>
|
|
||||||
<td align="center" valign="top" width="12.5%"><a href="http://phinary.ca"><img src="https://avatars1.githubusercontent.com/u/10522375?v=4?s=100" width="100px;" alt="Shaun Bennett"/><br /><sub><b>Shaun Bennett</b></sub></a><br /><a href="https://github.com/rust-lang/rustlings/commits?author=shaunbennett" title="Code">💻</a></td>
|
|
||||||
<td align="center" valign="top" width="12.5%"><a href="https://github.com/abagshaw"><img src="https://avatars2.githubusercontent.com/u/8594541?v=4?s=100" width="100px;" alt="Andrew Bagshaw"/><br /><sub><b>Andrew Bagshaw</b></sub></a><br /><a href="https://github.com/rust-lang/rustlings/commits?author=abagshaw" title="Code">💻</a></td>
|
|
||||||
<td align="center" valign="top" width="12.5%"><a href="https://ai6ua.net/"><img src="https://avatars2.githubusercontent.com/u/175578?v=4?s=100" width="100px;" alt="Kyle Isom"/><br /><sub><b>Kyle Isom</b></sub></a><br /><a href="https://github.com/rust-lang/rustlings/commits?author=kisom" title="Code">💻</a></td>
|
|
||||||
<td align="center" valign="top" width="12.5%"><a href="https://github.com/ColinPitrat"><img src="https://avatars3.githubusercontent.com/u/1541863?v=4?s=100" width="100px;" alt="Colin Pitrat"/><br /><sub><b>Colin Pitrat</b></sub></a><br /><a href="https://github.com/rust-lang/rustlings/commits?author=ColinPitrat" title="Code">💻</a></td>
|
|
||||||
<td align="center" valign="top" width="12.5%"><a href="https://zacanger.com"><img src="https://avatars3.githubusercontent.com/u/12520493?v=4?s=100" width="100px;" alt="Zac Anger"/><br /><sub><b>Zac Anger</b></sub></a><br /><a href="https://github.com/rust-lang/rustlings/commits?author=zacanger" title="Code">💻</a></td>
|
|
||||||
<td align="center" valign="top" width="12.5%"><a href="https://github.com/mgeier"><img src="https://avatars1.githubusercontent.com/u/705404?v=4?s=100" width="100px;" alt="Matthias Geier"/><br /><sub><b>Matthias Geier</b></sub></a><br /><a href="https://github.com/rust-lang/rustlings/commits?author=mgeier" title="Code">💻</a></td>
|
|
||||||
<td align="center" valign="top" width="12.5%"><a href="https://github.com/cjpearce"><img src="https://avatars1.githubusercontent.com/u/3453268?v=4?s=100" width="100px;" alt="Chris Pearce"/><br /><sub><b>Chris Pearce</b></sub></a><br /><a href="https://github.com/rust-lang/rustlings/commits?author=cjpearce" title="Code">💻</a></td>
|
|
||||||
<td align="center" valign="top" width="12.5%"><a href="https://yvan-sraka.github.io"><img src="https://avatars2.githubusercontent.com/u/705213?v=4?s=100" width="100px;" alt="Yvan Sraka"/><br /><sub><b>Yvan Sraka</b></sub></a><br /><a href="https://github.com/rust-lang/rustlings/commits?author=yvan-sraka" title="Code">💻</a></td>
|
|
||||||
</tr>
|
|
||||||
<tr>
|
|
||||||
<td align="center" valign="top" width="12.5%"><a href="https://github.com/dendi239"><img src="https://avatars3.githubusercontent.com/u/16478650?v=4?s=100" width="100px;" alt="Denys Smirnov"/><br /><sub><b>Denys Smirnov</b></sub></a><br /><a href="https://github.com/rust-lang/rustlings/commits?author=dendi239" title="Code">💻</a></td>
|
|
||||||
<td align="center" valign="top" width="12.5%"><a href="https://github.com/eddyp"><img src="https://avatars2.githubusercontent.com/u/123772?v=4?s=100" width="100px;" alt="eddyp"/><br /><sub><b>eddyp</b></sub></a><br /><a href="https://github.com/rust-lang/rustlings/commits?author=eddyp" title="Code">💻</a></td>
|
|
||||||
<td align="center" valign="top" width="12.5%"><a href="http://about.me/BrianKung"><img src="https://avatars1.githubusercontent.com/u/2836167?v=4?s=100" width="100px;" alt="Brian Kung"/><br /><sub><b>Brian Kung</b></sub></a><br /><a href="https://github.com/rust-lang/rustlings/commits?author=briankung" title="Code">💻</a> <a href="#content-briankung" title="Content">🖋</a></td>
|
|
||||||
<td align="center" valign="top" width="12.5%"><a href="https://rcousineau.gitlab.io"><img src="https://avatars3.githubusercontent.com/u/281039?v=4?s=100" width="100px;" alt="Russell"/><br /><sub><b>Russell</b></sub></a><br /><a href="https://github.com/rust-lang/rustlings/commits?author=miller-time" title="Code">💻</a></td>
|
|
||||||
<td align="center" valign="top" width="12.5%"><a href="http://danwilhelm.com"><img src="https://avatars3.githubusercontent.com/u/6137185?v=4?s=100" width="100px;" alt="Dan Wilhelm"/><br /><sub><b>Dan Wilhelm</b></sub></a><br /><a href="https://github.com/rust-lang/rustlings/commits?author=danwilhelm" title="Documentation">📖</a></td>
|
|
||||||
<td align="center" valign="top" width="12.5%"><a href="https://github.com/Jesse-Cameron"><img src="https://avatars3.githubusercontent.com/u/3723654?v=4?s=100" width="100px;" alt="Jesse"/><br /><sub><b>Jesse</b></sub></a><br /><a href="https://github.com/rust-lang/rustlings/commits?author=Jesse-Cameron" title="Code">💻</a> <a href="#content-Jesse-Cameron" title="Content">🖋</a></td>
|
|
||||||
<td align="center" valign="top" width="12.5%"><a href="https://github.com/MrFroop"><img src="https://avatars3.githubusercontent.com/u/196700?v=4?s=100" width="100px;" alt="Fredrik Jambrén"/><br /><sub><b>Fredrik Jambrén</b></sub></a><br /><a href="https://github.com/rust-lang/rustlings/commits?author=MrFroop" title="Code">💻</a></td>
|
|
||||||
<td align="center" valign="top" width="12.5%"><a href="https://github.com/petemcfarlane"><img src="https://avatars3.githubusercontent.com/u/3472717?v=4?s=100" width="100px;" alt="Pete McFarlane"/><br /><sub><b>Pete McFarlane</b></sub></a><br /><a href="#content-petemcfarlane" title="Content">🖋</a></td>
|
|
||||||
</tr>
|
|
||||||
<tr>
|
|
||||||
<td align="center" valign="top" width="12.5%"><a href="https://github.com/nkanderson"><img src="https://avatars0.githubusercontent.com/u/4128825?v=4?s=100" width="100px;" alt="nkanderson"/><br /><sub><b>nkanderson</b></sub></a><br /><a href="https://github.com/rust-lang/rustlings/commits?author=nkanderson" title="Code">💻</a> <a href="#content-nkanderson" title="Content">🖋</a></td>
|
|
||||||
<td align="center" valign="top" width="12.5%"><a href="https://github.com/ajaxm"><img src="https://avatars0.githubusercontent.com/u/13360138?v=4?s=100" width="100px;" alt="Ajax M"/><br /><sub><b>Ajax M</b></sub></a><br /><a href="https://github.com/rust-lang/rustlings/commits?author=ajaxm" title="Documentation">📖</a></td>
|
|
||||||
<td align="center" valign="top" width="12.5%"><a href="https://dylnuge.com"><img src="https://avatars2.githubusercontent.com/u/118624?v=4?s=100" width="100px;" alt="Dylan Nugent"/><br /><sub><b>Dylan Nugent</b></sub></a><br /><a href="#content-Dylnuge" title="Content">🖋</a></td>
|
|
||||||
<td align="center" valign="top" width="12.5%"><a href="https://github.com/vyaslav"><img src="https://avatars0.githubusercontent.com/u/1385427?v=4?s=100" width="100px;" alt="vyaslav"/><br /><sub><b>vyaslav</b></sub></a><br /><a href="https://github.com/rust-lang/rustlings/commits?author=vyaslav" title="Code">💻</a> <a href="#content-vyaslav" title="Content">🖋</a></td>
|
|
||||||
<td align="center" valign="top" width="12.5%"><a href="https://join.sfxd.org"><img src="https://avatars1.githubusercontent.com/u/17297466?v=4?s=100" width="100px;" alt="George"/><br /><sub><b>George</b></sub></a><br /><a href="https://github.com/rust-lang/rustlings/commits?author=gdoenlen" title="Code">💻</a></td>
|
|
||||||
<td align="center" valign="top" width="12.5%"><a href="https://github.com/nyxtom"><img src="https://avatars2.githubusercontent.com/u/222763?v=4?s=100" width="100px;" alt="Thomas Holloway"/><br /><sub><b>Thomas Holloway</b></sub></a><br /><a href="https://github.com/rust-lang/rustlings/commits?author=nyxtom" title="Code">💻</a> <a href="#content-nyxtom" title="Content">🖋</a></td>
|
|
||||||
<td align="center" valign="top" width="12.5%"><a href="https://github.com/workingjubilee"><img src="https://avatars1.githubusercontent.com/u/46493976?v=4?s=100" width="100px;" alt="Jubilee"/><br /><sub><b>Jubilee</b></sub></a><br /><a href="https://github.com/rust-lang/rustlings/commits?author=workingjubilee" title="Code">💻</a></td>
|
|
||||||
<td align="center" valign="top" width="12.5%"><a href="https://github.com/WofWca"><img src="https://avatars1.githubusercontent.com/u/39462442?v=4?s=100" width="100px;" alt="WofWca"/><br /><sub><b>WofWca</b></sub></a><br /><a href="https://github.com/rust-lang/rustlings/commits?author=WofWca" title="Code">💻</a></td>
|
|
||||||
</tr>
|
|
||||||
<tr>
|
|
||||||
<td align="center" valign="top" width="12.5%"><a href="https://github.com/jrvidal"><img src="https://avatars0.githubusercontent.com/u/1636604?v=4?s=100" width="100px;" alt="Roberto Vidal"/><br /><sub><b>Roberto Vidal</b></sub></a><br /><a href="https://github.com/rust-lang/rustlings/commits?author=jrvidal" title="Code">💻</a> <a href="https://github.com/rust-lang/rustlings/commits?author=jrvidal" title="Documentation">📖</a> <a href="#ideas-jrvidal" title="Ideas, Planning, & Feedback">🤔</a> <a href="#maintenance-jrvidal" title="Maintenance">🚧</a></td>
|
|
||||||
<td align="center" valign="top" width="12.5%"><a href="https://github.com/jensim"><img src="https://avatars0.githubusercontent.com/u/3663856?v=4?s=100" width="100px;" alt="Jens"/><br /><sub><b>Jens</b></sub></a><br /><a href="https://github.com/rust-lang/rustlings/commits?author=jensim" title="Documentation">📖</a></td>
|
|
||||||
<td align="center" valign="top" width="12.5%"><a href="http://rahatah.me/d"><img src="https://avatars3.githubusercontent.com/u/3174006?v=4?s=100" width="100px;" alt="Rahat Ahmed"/><br /><sub><b>Rahat Ahmed</b></sub></a><br /><a href="https://github.com/rust-lang/rustlings/commits?author=rahatarmanahmed" title="Documentation">📖</a></td>
|
|
||||||
<td align="center" valign="top" width="12.5%"><a href="https://github.com/AbdouSeck"><img src="https://avatars2.githubusercontent.com/u/6490055?v=4?s=100" width="100px;" alt="Abdou Seck"/><br /><sub><b>Abdou Seck</b></sub></a><br /><a href="https://github.com/rust-lang/rustlings/commits?author=AbdouSeck" title="Code">💻</a> <a href="#content-AbdouSeck" title="Content">🖋</a> <a href="https://github.com/rust-lang/rustlings/pulls?q=is%3Apr+reviewed-by%3AAbdouSeck" title="Reviewed Pull Requests">👀</a></td>
|
|
||||||
<td align="center" valign="top" width="12.5%"><a href="https://codehearts.com"><img src="https://avatars0.githubusercontent.com/u/2885412?v=4?s=100" width="100px;" alt="Katie"/><br /><sub><b>Katie</b></sub></a><br /><a href="https://github.com/rust-lang/rustlings/commits?author=codehearts" title="Code">💻</a></td>
|
|
||||||
<td align="center" valign="top" width="12.5%"><a href="https://github.com/Socratides"><img src="https://avatars3.githubusercontent.com/u/27732983?v=4?s=100" width="100px;" alt="Socrates"/><br /><sub><b>Socrates</b></sub></a><br /><a href="https://github.com/rust-lang/rustlings/commits?author=Socratides" title="Documentation">📖</a></td>
|
|
||||||
<td align="center" valign="top" width="12.5%"><a href="https://github.com/gnodarse"><img src="https://avatars3.githubusercontent.com/u/46761795?v=4?s=100" width="100px;" alt="gnodarse"/><br /><sub><b>gnodarse</b></sub></a><br /><a href="#content-gnodarse" title="Content">🖋</a></td>
|
|
||||||
<td align="center" valign="top" width="12.5%"><a href="https://github.com/harrisonmetz"><img src="https://avatars1.githubusercontent.com/u/7883408?v=4?s=100" width="100px;" alt="Harrison Metzger"/><br /><sub><b>Harrison Metzger</b></sub></a><br /><a href="https://github.com/rust-lang/rustlings/commits?author=harrisonmetz" title="Code">💻</a></td>
|
|
||||||
</tr>
|
|
||||||
<tr>
|
|
||||||
<td align="center" valign="top" width="12.5%"><a href="https://github.com/TorbenJ"><img src="https://avatars2.githubusercontent.com/u/9077102?v=4?s=100" width="100px;" alt="Torben Jonas"/><br /><sub><b>Torben Jonas</b></sub></a><br /><a href="https://github.com/rust-lang/rustlings/commits?author=TorbenJ" title="Code">💻</a> <a href="#content-TorbenJ" title="Content">🖋</a></td>
|
|
||||||
<td align="center" valign="top" width="12.5%"><a href="http://paulbissex.com/"><img src="https://avatars0.githubusercontent.com/u/641?v=4?s=100" width="100px;" alt="Paul Bissex"/><br /><sub><b>Paul Bissex</b></sub></a><br /><a href="https://github.com/rust-lang/rustlings/commits?author=pbx" title="Documentation">📖</a></td>
|
|
||||||
<td align="center" valign="top" width="12.5%"><a href="https://github.com/sjmann"><img src="https://avatars0.githubusercontent.com/u/6589896?v=4?s=100" width="100px;" alt="Steven Mann"/><br /><sub><b>Steven Mann</b></sub></a><br /><a href="https://github.com/rust-lang/rustlings/commits?author=sjmann" title="Code">💻</a> <a href="#content-sjmann" title="Content">🖋</a></td>
|
|
||||||
<td align="center" valign="top" width="12.5%"><a href="https://smmdb.net/"><img src="https://avatars2.githubusercontent.com/u/5855071?v=4?s=100" width="100px;" alt="Mario Reder"/><br /><sub><b>Mario Reder</b></sub></a><br /><a href="https://github.com/rust-lang/rustlings/commits?author=Tarnadas" title="Code">💻</a> <a href="#content-Tarnadas" title="Content">🖋</a></td>
|
|
||||||
<td align="center" valign="top" width="12.5%"><a href="https://keybase.io/skim"><img src="https://avatars0.githubusercontent.com/u/47347?v=4?s=100" width="100px;" alt="skim"/><br /><sub><b>skim</b></sub></a><br /><a href="https://github.com/rust-lang/rustlings/commits?author=sl4m" title="Code">💻</a></td>
|
|
||||||
<td align="center" valign="top" width="12.5%"><a href="https://github.com/sanjaykdragon"><img src="https://avatars1.githubusercontent.com/u/10261698?v=4?s=100" width="100px;" alt="Sanjay K"/><br /><sub><b>Sanjay K</b></sub></a><br /><a href="https://github.com/rust-lang/rustlings/commits?author=sanjaykdragon" title="Code">💻</a> <a href="#content-sanjaykdragon" title="Content">🖋</a></td>
|
|
||||||
<td align="center" valign="top" width="12.5%"><a href="http://www.rohanjain.in"><img src="https://avatars1.githubusercontent.com/u/343499?v=4?s=100" width="100px;" alt="Rohan Jain"/><br /><sub><b>Rohan Jain</b></sub></a><br /><a href="https://github.com/rust-lang/rustlings/commits?author=crodjer" title="Code">💻</a></td>
|
|
||||||
<td align="center" valign="top" width="12.5%"><a href="https://www.saidaspen.se"><img src="https://avatars1.githubusercontent.com/u/7727687?v=4?s=100" width="100px;" alt="Said Aspen"/><br /><sub><b>Said Aspen</b></sub></a><br /><a href="https://github.com/rust-lang/rustlings/commits?author=saidaspen" title="Code">💻</a> <a href="#content-saidaspen" title="Content">🖋</a></td>
|
|
||||||
</tr>
|
|
||||||
<tr>
|
|
||||||
<td align="center" valign="top" width="12.5%"><a href="https://github.com/uce"><img src="https://avatars3.githubusercontent.com/u/1756620?v=4?s=100" width="100px;" alt="Ufuk Celebi"/><br /><sub><b>Ufuk Celebi</b></sub></a><br /><a href="https://github.com/rust-lang/rustlings/commits?author=uce" title="Code">💻</a></td>
|
|
||||||
<td align="center" valign="top" width="12.5%"><a href="https://github.com/lebedevsergey"><img src="https://avatars2.githubusercontent.com/u/7325764?v=4?s=100" width="100px;" alt="lebedevsergey"/><br /><sub><b>lebedevsergey</b></sub></a><br /><a href="https://github.com/rust-lang/rustlings/commits?author=lebedevsergey" title="Documentation">📖</a></td>
|
|
||||||
<td align="center" valign="top" width="12.5%"><a href="https://github.com/avrong"><img src="https://avatars2.githubusercontent.com/u/6342851?v=4?s=100" width="100px;" alt="Aleksei Trifonov"/><br /><sub><b>Aleksei Trifonov</b></sub></a><br /><a href="#content-avrong" title="Content">🖋</a></td>
|
|
||||||
<td align="center" valign="top" width="12.5%"><a href="https://drn.ie"><img src="https://avatars2.githubusercontent.com/u/411136?v=4?s=100" width="100px;" alt="Darren Meehan"/><br /><sub><b>Darren Meehan</b></sub></a><br /><a href="#content-Darrenmeehan" title="Content">🖋</a></td>
|
|
||||||
<td align="center" valign="top" width="12.5%"><a href="https://github.com/jihchi"><img src="https://avatars1.githubusercontent.com/u/87983?v=4?s=100" width="100px;" alt="Jihchi Lee"/><br /><sub><b>Jihchi Lee</b></sub></a><br /><a href="#content-jihchi" title="Content">🖋</a></td>
|
|
||||||
<td align="center" valign="top" width="12.5%"><a href="https://github.com/bertonha"><img src="https://avatars3.githubusercontent.com/u/1225902?v=4?s=100" width="100px;" alt="Christofer Bertonha"/><br /><sub><b>Christofer Bertonha</b></sub></a><br /><a href="#content-bertonha" title="Content">🖋</a></td>
|
|
||||||
<td align="center" valign="top" width="12.5%"><a href="https://github.com/apatniv"><img src="https://avatars2.githubusercontent.com/u/22565917?v=4?s=100" width="100px;" alt="Vivek Bharath Akupatni"/><br /><sub><b>Vivek Bharath Akupatni</b></sub></a><br /><a href="https://github.com/rust-lang/rustlings/commits?author=apatniv" title="Code">💻</a> <a href="https://github.com/rust-lang/rustlings/commits?author=apatniv" title="Tests">⚠️</a></td>
|
|
||||||
<td align="center" valign="top" width="12.5%"><a href="https://github.com/DiD92"><img src="https://avatars3.githubusercontent.com/u/6002416?v=4?s=100" width="100px;" alt="Dídac Sementé Fernández"/><br /><sub><b>Dídac Sementé Fernández</b></sub></a><br /><a href="https://github.com/rust-lang/rustlings/commits?author=DiD92" title="Code">💻</a> <a href="#content-DiD92" title="Content">🖋</a></td>
|
|
||||||
</tr>
|
|
||||||
<tr>
|
|
||||||
<td align="center" valign="top" width="12.5%"><a href="https://github.com/wrobstory"><img src="https://avatars3.githubusercontent.com/u/2601457?v=4?s=100" width="100px;" alt="Rob Story"/><br /><sub><b>Rob Story</b></sub></a><br /><a href="https://github.com/rust-lang/rustlings/commits?author=wrobstory" title="Code">💻</a></td>
|
|
||||||
<td align="center" valign="top" width="12.5%"><a href="https://github.com/siobhanjacobson"><img src="https://avatars2.githubusercontent.com/u/28983835?v=4?s=100" width="100px;" alt="Siobhan Jacobson"/><br /><sub><b>Siobhan Jacobson</b></sub></a><br /><a href="https://github.com/rust-lang/rustlings/commits?author=siobhanjacobson" title="Code">💻</a></td>
|
|
||||||
<td align="center" valign="top" width="12.5%"><a href="https://www.linkedin.com/in/evancarroll/"><img src="https://avatars2.githubusercontent.com/u/19922?v=4?s=100" width="100px;" alt="Evan Carroll"/><br /><sub><b>Evan Carroll</b></sub></a><br /><a href="#content-EvanCarroll" title="Content">🖋</a></td>
|
|
||||||
<td align="center" valign="top" width="12.5%"><a href="http://www.jawaadmahmood.com"><img src="https://avatars3.githubusercontent.com/u/95606?v=4?s=100" width="100px;" alt="Jawaad Mahmood"/><br /><sub><b>Jawaad Mahmood</b></sub></a><br /><a href="#content-jmahmood" title="Content">🖋</a></td>
|
|
||||||
<td align="center" valign="top" width="12.5%"><a href="https://github.com/GaurangTandon"><img src="https://avatars1.githubusercontent.com/u/6308683?v=4?s=100" width="100px;" alt="Gaurang Tandon"/><br /><sub><b>Gaurang Tandon</b></sub></a><br /><a href="#content-GaurangTandon" title="Content">🖋</a></td>
|
|
||||||
<td align="center" valign="top" width="12.5%"><a href="https://github.com/dev-cyprium"><img src="https://avatars1.githubusercontent.com/u/6002628?v=4?s=100" width="100px;" alt="Stefan Kupresak"/><br /><sub><b>Stefan Kupresak</b></sub></a><br /><a href="#content-dev-cyprium" title="Content">🖋</a></td>
|
|
||||||
<td align="center" valign="top" width="12.5%"><a href="https://github.com/greg-el"><img src="https://avatars3.githubusercontent.com/u/45019882?v=4?s=100" width="100px;" alt="Greg Leonard"/><br /><sub><b>Greg Leonard</b></sub></a><br /><a href="#content-greg-el" title="Content">🖋</a></td>
|
|
||||||
<td align="center" valign="top" width="12.5%"><a href="https://ryanpcmcquen.org"><img src="https://avatars3.githubusercontent.com/u/772937?v=4?s=100" width="100px;" alt="Ryan McQuen"/><br /><sub><b>Ryan McQuen</b></sub></a><br /><a href="https://github.com/rust-lang/rustlings/commits?author=ryanpcmcquen" title="Code">💻</a></td>
|
|
||||||
</tr>
|
|
||||||
<tr>
|
|
||||||
<td align="center" valign="top" width="12.5%"><a href="https://github.com/AnnikaCodes"><img src="https://avatars3.githubusercontent.com/u/56906084?v=4?s=100" width="100px;" alt="Annika"/><br /><sub><b>Annika</b></sub></a><br /><a href="https://github.com/rust-lang/rustlings/pulls?q=is%3Apr+reviewed-by%3AAnnikaCodes" title="Reviewed Pull Requests">👀</a></td>
|
|
||||||
<td align="center" valign="top" width="12.5%"><a href="https://darnuria.eu"><img src="https://avatars1.githubusercontent.com/u/2827553?v=4?s=100" width="100px;" alt="Axel Viala"/><br /><sub><b>Axel Viala</b></sub></a><br /><a href="https://github.com/rust-lang/rustlings/commits?author=darnuria" title="Code">💻</a></td>
|
|
||||||
<td align="center" valign="top" width="12.5%"><a href="https://sazid.github.io"><img src="https://avatars1.githubusercontent.com/u/2370167?v=4?s=100" width="100px;" alt="Mohammed Sazid Al Rashid"/><br /><sub><b>Mohammed Sazid Al Rashid</b></sub></a><br /><a href="#content-sazid" title="Content">🖋</a> <a href="https://github.com/rust-lang/rustlings/commits?author=sazid" title="Code">💻</a></td>
|
|
||||||
<td align="center" valign="top" width="12.5%"><a href="https://codingthemsoftly.com"><img src="https://avatars1.githubusercontent.com/u/17479099?v=4?s=100" width="100px;" alt="Caleb Webber"/><br /><sub><b>Caleb Webber</b></sub></a><br /><a href="#maintenance-seeplusplus" title="Maintenance">🚧</a></td>
|
|
||||||
<td align="center" valign="top" width="12.5%"><a href="https://github.com/pcn"><img src="https://avatars2.githubusercontent.com/u/1056756?v=4?s=100" width="100px;" alt="Peter N"/><br /><sub><b>Peter N</b></sub></a><br /><a href="#maintenance-pcn" title="Maintenance">🚧</a></td>
|
|
||||||
<td align="center" valign="top" width="12.5%"><a href="https://github.com/seancad"><img src="https://avatars1.githubusercontent.com/u/47405611?v=4?s=100" width="100px;" alt="seancad"/><br /><sub><b>seancad</b></sub></a><br /><a href="#maintenance-seancad" title="Maintenance">🚧</a></td>
|
|
||||||
<td align="center" valign="top" width="12.5%"><a href="http://willhayworth.com"><img src="https://avatars3.githubusercontent.com/u/181174?v=4?s=100" width="100px;" alt="Will Hayworth"/><br /><sub><b>Will Hayworth</b></sub></a><br /><a href="#content-wsh" title="Content">🖋</a></td>
|
|
||||||
<td align="center" valign="top" width="12.5%"><a href="https://github.com/chrizel"><img src="https://avatars3.githubusercontent.com/u/20802?v=4?s=100" width="100px;" alt="Christian Zeller"/><br /><sub><b>Christian Zeller</b></sub></a><br /><a href="#content-chrizel" title="Content">🖋</a></td>
|
|
||||||
</tr>
|
|
||||||
<tr>
|
|
||||||
<td align="center" valign="top" width="12.5%"><a href="https://github.com/jfchevrette"><img src="https://avatars.githubusercontent.com/u/3001?v=4?s=100" width="100px;" alt="Jean-Francois Chevrette"/><br /><sub><b>Jean-Francois Chevrette</b></sub></a><br /><a href="#content-jfchevrette" title="Content">🖋</a> <a href="https://github.com/rust-lang/rustlings/commits?author=jfchevrette" title="Code">💻</a></td>
|
|
||||||
<td align="center" valign="top" width="12.5%"><a href="https://github.com/jbaber"><img src="https://avatars.githubusercontent.com/u/1908117?v=4?s=100" width="100px;" alt="John Baber-Lucero"/><br /><sub><b>John Baber-Lucero</b></sub></a><br /><a href="#content-jbaber" title="Content">🖋</a></td>
|
|
||||||
<td align="center" valign="top" width="12.5%"><a href="https://github.com/tal-zvon"><img src="https://avatars.githubusercontent.com/u/3195851?v=4?s=100" width="100px;" alt="Tal"/><br /><sub><b>Tal</b></sub></a><br /><a href="#content-tal-zvon" title="Content">🖋</a></td>
|
|
||||||
<td align="center" valign="top" width="12.5%"><a href="https://github.com/apogeeoak"><img src="https://avatars.githubusercontent.com/u/59737221?v=4?s=100" width="100px;" alt="apogeeoak"/><br /><sub><b>apogeeoak</b></sub></a><br /><a href="#content-apogeeoak" title="Content">🖋</a> <a href="https://github.com/rust-lang/rustlings/commits?author=apogeeoak" title="Code">💻</a></td>
|
|
||||||
<td align="center" valign="top" width="12.5%"><a href="http://www.garfieldtech.com/"><img src="https://avatars.githubusercontent.com/u/254863?v=4?s=100" width="100px;" alt="Larry Garfield"/><br /><sub><b>Larry Garfield</b></sub></a><br /><a href="#content-Crell" title="Content">🖋</a></td>
|
|
||||||
<td align="center" valign="top" width="12.5%"><a href="https://github.com/circumspect"><img src="https://avatars.githubusercontent.com/u/40770208?v=4?s=100" width="100px;" alt="circumspect"/><br /><sub><b>circumspect</b></sub></a><br /><a href="#content-circumspect" title="Content">🖋</a></td>
|
|
||||||
<td align="center" valign="top" width="12.5%"><a href="https://github.com/cjwyett"><img src="https://avatars.githubusercontent.com/u/34195737?v=4?s=100" width="100px;" alt="Cyrus Wyett"/><br /><sub><b>Cyrus Wyett</b></sub></a><br /><a href="#content-cjwyett" title="Content">🖋</a></td>
|
|
||||||
<td align="center" valign="top" width="12.5%"><a href="https://github.com/cadolphs"><img src="https://avatars.githubusercontent.com/u/13894820?v=4?s=100" width="100px;" alt="cadolphs"/><br /><sub><b>cadolphs</b></sub></a><br /><a href="https://github.com/rust-lang/rustlings/commits?author=cadolphs" title="Code">💻</a></td>
|
|
||||||
</tr>
|
|
||||||
<tr>
|
|
||||||
<td align="center" valign="top" width="12.5%"><a href="https://www.haveneer.com"><img src="https://avatars.githubusercontent.com/u/26146722?v=4?s=100" width="100px;" alt="Pascal H."/><br /><sub><b>Pascal H.</b></sub></a><br /><a href="#content-hpwxf" title="Content">🖋</a></td>
|
|
||||||
<td align="center" valign="top" width="12.5%"><a href="https://twitter.com/chapeupreto"><img src="https://avatars.githubusercontent.com/u/834048?v=4?s=100" width="100px;" alt="Rod Elias"/><br /><sub><b>Rod Elias</b></sub></a><br /><a href="#content-chapeupreto" title="Content">🖋</a></td>
|
|
||||||
<td align="center" valign="top" width="12.5%"><a href="https://github.com/blerchy"><img src="https://avatars.githubusercontent.com/u/2555355?v=4?s=100" width="100px;" alt="Matt Lebl"/><br /><sub><b>Matt Lebl</b></sub></a><br /><a href="https://github.com/rust-lang/rustlings/commits?author=blerchy" title="Code">💻</a></td>
|
|
||||||
<td align="center" valign="top" width="12.5%"><a href="http://flakolefluk.dev"><img src="https://avatars.githubusercontent.com/u/11986564?v=4?s=100" width="100px;" alt="Ignacio Le Fluk"/><br /><sub><b>Ignacio Le Fluk</b></sub></a><br /><a href="#content-flakolefluk" title="Content">🖋</a></td>
|
|
||||||
<td align="center" valign="top" width="12.5%"><a href="https://github.com/tlyu"><img src="https://avatars.githubusercontent.com/u/431873?v=4?s=100" width="100px;" alt="Taylor Yu"/><br /><sub><b>Taylor Yu</b></sub></a><br /><a href="https://github.com/rust-lang/rustlings/commits?author=tlyu" title="Code">💻</a> <a href="#content-tlyu" title="Content">🖋</a></td>
|
|
||||||
<td align="center" valign="top" width="12.5%"><a href="https://zerotask.github.io"><img src="https://avatars.githubusercontent.com/u/20150243?v=4?s=100" width="100px;" alt="Patrick Hintermayer"/><br /><sub><b>Patrick Hintermayer</b></sub></a><br /><a href="https://github.com/rust-lang/rustlings/commits?author=Zerotask" title="Code">💻</a></td>
|
|
||||||
<td align="center" valign="top" width="12.5%"><a href="https://petkopavlovski.com/"><img src="https://avatars.githubusercontent.com/u/32264020?v=4?s=100" width="100px;" alt="Pete Pavlovski"/><br /><sub><b>Pete Pavlovski</b></sub></a><br /><a href="#content-arthas168" title="Content">🖋</a></td>
|
|
||||||
<td align="center" valign="top" width="12.5%"><a href="https://github.com/k12ish"><img src="https://avatars.githubusercontent.com/u/45272873?v=4?s=100" width="100px;" alt="k12ish"/><br /><sub><b>k12ish</b></sub></a><br /><a href="#content-k12ish" title="Content">🖋</a></td>
|
|
||||||
</tr>
|
|
||||||
<tr>
|
|
||||||
<td align="center" valign="top" width="12.5%"><a href="https://github.com/hongshaoyang"><img src="https://avatars.githubusercontent.com/u/19281800?v=4?s=100" width="100px;" alt="Shao Yang Hong"/><br /><sub><b>Shao Yang Hong</b></sub></a><br /><a href="#content-hongshaoyang" title="Content">🖋</a></td>
|
|
||||||
<td align="center" valign="top" width="12.5%"><a href="https://github.com/bmacer"><img src="https://avatars.githubusercontent.com/u/13931806?v=4?s=100" width="100px;" alt="Brandon Macer"/><br /><sub><b>Brandon Macer</b></sub></a><br /><a href="#content-bmacer" title="Content">🖋</a></td>
|
|
||||||
<td align="center" valign="top" width="12.5%"><a href="https://github.com/stoiandan"><img src="https://avatars.githubusercontent.com/u/10388612?v=4?s=100" width="100px;" alt="Stoian Dan"/><br /><sub><b>Stoian Dan</b></sub></a><br /><a href="#content-stoiandan" title="Content">🖋</a></td>
|
|
||||||
<td align="center" valign="top" width="12.5%"><a href="https://about.me/pjdelport"><img src="https://avatars.githubusercontent.com/u/630271?v=4?s=100" width="100px;" alt="Pi Delport"/><br /><sub><b>Pi Delport</b></sub></a><br /><a href="#content-PiDelport" title="Content">🖋</a></td>
|
|
||||||
<td align="center" valign="top" width="12.5%"><a href="https://github.com/sateeshkumarb"><img src="https://avatars.githubusercontent.com/u/429263?v=4?s=100" width="100px;" alt="Sateesh "/><br /><sub><b>Sateesh </b></sub></a><br /><a href="https://github.com/rust-lang/rustlings/commits?author=sateeshkumarb" title="Code">💻</a> <a href="#content-sateeshkumarb" title="Content">🖋</a></td>
|
|
||||||
<td align="center" valign="top" width="12.5%"><a href="https://github.com/kayuapi"><img src="https://avatars.githubusercontent.com/u/10304328?v=4?s=100" width="100px;" alt="ZC"/><br /><sub><b>ZC</b></sub></a><br /><a href="#content-kayuapi" title="Content">🖋</a></td>
|
|
||||||
<td align="center" valign="top" width="12.5%"><a href="https://github.com/hyperparabolic"><img src="https://avatars.githubusercontent.com/u/12348474?v=4?s=100" width="100px;" alt="hyperparabolic"/><br /><sub><b>hyperparabolic</b></sub></a><br /><a href="https://github.com/rust-lang/rustlings/commits?author=hyperparabolic" title="Code">💻</a></td>
|
|
||||||
<td align="center" valign="top" width="12.5%"><a href="https://www.net4visions.at"><img src="https://avatars.githubusercontent.com/u/5228369?v=4?s=100" width="100px;" alt="arlecchino"/><br /><sub><b>arlecchino</b></sub></a><br /><a href="https://github.com/rust-lang/rustlings/commits?author=kolbma" title="Documentation">📖</a></td>
|
|
||||||
</tr>
|
|
||||||
<tr>
|
|
||||||
<td align="center" valign="top" width="12.5%"><a href="https://richthofen.io/"><img src="https://avatars.githubusercontent.com/u/7576730?v=4?s=100" width="100px;" alt="Richthofen"/><br /><sub><b>Richthofen</b></sub></a><br /><a href="https://github.com/rust-lang/rustlings/commits?author=jazzplato" title="Code">💻</a></td>
|
|
||||||
<td align="center" valign="top" width="12.5%"><a href="https://github.com/cseltol"><img src="https://avatars.githubusercontent.com/u/64264529?v=4?s=100" width="100px;" alt="Ivan Nerazumov"/><br /><sub><b>Ivan Nerazumov</b></sub></a><br /><a href="https://github.com/rust-lang/rustlings/commits?author=cseltol" title="Documentation">📖</a></td>
|
|
||||||
<td align="center" valign="top" width="12.5%"><a href="https://github.com/lauralindzey"><img src="https://avatars.githubusercontent.com/u/65185744?v=4?s=100" width="100px;" alt="lauralindzey"/><br /><sub><b>lauralindzey</b></sub></a><br /><a href="https://github.com/rust-lang/rustlings/commits?author=lauralindzey" title="Documentation">📖</a></td>
|
|
||||||
<td align="center" valign="top" width="12.5%"><a href="https://github.com/sinharaksh1t"><img src="https://avatars.githubusercontent.com/u/28585848?v=4?s=100" width="100px;" alt="Rakshit Sinha"/><br /><sub><b>Rakshit Sinha</b></sub></a><br /><a href="#content-sinharaksh1t" title="Content">🖋</a></td>
|
|
||||||
<td align="center" valign="top" width="12.5%"><a href="https://github.com/dbednar230"><img src="https://avatars.githubusercontent.com/u/54457902?v=4?s=100" width="100px;" alt="Damian"/><br /><sub><b>Damian</b></sub></a><br /><a href="#content-dbednar230" title="Content">🖋</a></td>
|
|
||||||
<td align="center" valign="top" width="12.5%"><a href="https://benarmstead.co.uk"><img src="https://avatars.githubusercontent.com/u/70973680?v=4?s=100" width="100px;" alt="Ben Armstead"/><br /><sub><b>Ben Armstead</b></sub></a><br /><a href="https://github.com/rust-lang/rustlings/commits?author=benarmstead" title="Code">💻</a></td>
|
|
||||||
<td align="center" valign="top" width="12.5%"><a href="https://github.com/anuk909"><img src="https://avatars.githubusercontent.com/u/34924662?v=4?s=100" width="100px;" alt="anuk909"/><br /><sub><b>anuk909</b></sub></a><br /><a href="#content-anuk909" title="Content">🖋</a> <a href="https://github.com/rust-lang/rustlings/commits?author=anuk909" title="Code">💻</a></td>
|
|
||||||
<td align="center" valign="top" width="12.5%"><a href="https://granddaifuku.com/"><img src="https://avatars.githubusercontent.com/u/49578068?v=4?s=100" width="100px;" alt="granddaifuku"/><br /><sub><b>granddaifuku</b></sub></a><br /><a href="#content-granddaifuku" title="Content">🖋</a></td>
|
|
||||||
</tr>
|
|
||||||
<tr>
|
|
||||||
<td align="center" valign="top" width="12.5%"><a href="https://weilet.me"><img src="https://avatars.githubusercontent.com/u/32561597?v=4?s=100" width="100px;" alt="Weilet"/><br /><sub><b>Weilet</b></sub></a><br /><a href="#content-Weilet" title="Content">🖋</a></td>
|
|
||||||
<td align="center" valign="top" width="12.5%"><a href="https://github.com/Millione"><img src="https://avatars.githubusercontent.com/u/38575932?v=4?s=100" width="100px;" alt="LIU JIE"/><br /><sub><b>LIU JIE</b></sub></a><br /><a href="#content-Millione" title="Content">🖋</a></td>
|
|
||||||
<td align="center" valign="top" width="12.5%"><a href="https://github.com/abusch"><img src="https://avatars.githubusercontent.com/u/506344?v=4?s=100" width="100px;" alt="Antoine Büsch"/><br /><sub><b>Antoine Büsch</b></sub></a><br /><a href="https://github.com/rust-lang/rustlings/commits?author=abusch" title="Code">💻</a></td>
|
|
||||||
<td align="center" valign="top" width="12.5%"><a href="https://frogtd.com/"><img src="https://avatars.githubusercontent.com/u/31412003?v=4?s=100" width="100px;" alt="frogtd"/><br /><sub><b>frogtd</b></sub></a><br /><a href="#content-frogtd" title="Content">🖋</a></td>
|
|
||||||
<td align="center" valign="top" width="12.5%"><a href="https://github.com/EmisonLu"><img src="https://avatars.githubusercontent.com/u/54395432?v=4?s=100" width="100px;" alt="Zhenghao Lu"/><br /><sub><b>Zhenghao Lu</b></sub></a><br /><a href="#content-EmisonLu" title="Content">🖋</a></td>
|
|
||||||
<td align="center" valign="top" width="12.5%"><a href="https://soundtrackyourbrand.com"><img src="https://avatars.githubusercontent.com/u/762956?v=4?s=100" width="100px;" alt="Fredrik Enestad"/><br /><sub><b>Fredrik Enestad</b></sub></a><br /><a href="#content-fredr" title="Content">🖋</a></td>
|
|
||||||
<td align="center" valign="top" width="12.5%"><a href="http://xuesong.pydevops.com"><img src="https://avatars.githubusercontent.com/u/18476085?v=4?s=100" width="100px;" alt="xuesong"/><br /><sub><b>xuesong</b></sub></a><br /><a href="#content-xuesongbj" title="Content">🖋</a></td>
|
|
||||||
<td align="center" valign="top" width="12.5%"><a href="https://github.com/MpdWalsh"><img src="https://avatars.githubusercontent.com/u/48160144?v=4?s=100" width="100px;" alt="Michael Walsh"/><br /><sub><b>Michael Walsh</b></sub></a><br /><a href="https://github.com/rust-lang/rustlings/commits?author=MpdWalsh" title="Code">💻</a></td>
|
|
||||||
</tr>
|
|
||||||
<tr>
|
|
||||||
<td align="center" valign="top" width="12.5%"><a href="https://github.com/alirezaghey"><img src="https://avatars.githubusercontent.com/u/26653424?v=4?s=100" width="100px;" alt="alirezaghey"/><br /><sub><b>alirezaghey</b></sub></a><br /><a href="#content-alirezaghey" title="Content">🖋</a></td>
|
|
||||||
<td align="center" valign="top" width="12.5%"><a href="https://github.com/frvannes16"><img src="https://avatars.githubusercontent.com/u/3188475?v=4?s=100" width="100px;" alt="Franklin van Nes"/><br /><sub><b>Franklin van Nes</b></sub></a><br /><a href="https://github.com/rust-lang/rustlings/commits?author=frvannes16" title="Code">💻</a></td>
|
|
||||||
<td align="center" valign="top" width="12.5%"><a href="https://nekonako.github.io"><img src="https://avatars.githubusercontent.com/u/46141275?v=4?s=100" width="100px;" alt="nekonako"/><br /><sub><b>nekonako</b></sub></a><br /><a href="https://github.com/rust-lang/rustlings/commits?author=nekonako" title="Code">💻</a></td>
|
|
||||||
<td align="center" valign="top" width="12.5%"><a href="https://github.com/tan-zx"><img src="https://avatars.githubusercontent.com/u/67887489?v=4?s=100" width="100px;" alt="ZX"/><br /><sub><b>ZX</b></sub></a><br /><a href="#content-tan-zx" title="Content">🖋</a></td>
|
|
||||||
<td align="center" valign="top" width="12.5%"><a href="https://github.com/sundevilyang"><img src="https://avatars.githubusercontent.com/u/1499214?v=4?s=100" width="100px;" alt="Yang Wen"/><br /><sub><b>Yang Wen</b></sub></a><br /><a href="#content-sundevilyang" title="Content">🖋</a></td>
|
|
||||||
<td align="center" valign="top" width="12.5%"><a href="https://brandon-high.com"><img src="https://avatars.githubusercontent.com/u/759848?v=4?s=100" width="100px;" alt="Brandon High"/><br /><sub><b>Brandon High</b></sub></a><br /><a href="https://github.com/rust-lang/rustlings/commits?author=highb" title="Documentation">📖</a></td>
|
|
||||||
<td align="center" valign="top" width="12.5%"><a href="https://github.com/x-hgg-x"><img src="https://avatars.githubusercontent.com/u/39058530?v=4?s=100" width="100px;" alt="x-hgg-x"/><br /><sub><b>x-hgg-x</b></sub></a><br /><a href="https://github.com/rust-lang/rustlings/commits?author=x-hgg-x" title="Code">💻</a></td>
|
|
||||||
<td align="center" valign="top" width="12.5%"><a href="http://kisaragieffective.github.io"><img src="https://avatars.githubusercontent.com/u/48310258?v=4?s=100" width="100px;" alt="Kisaragi"/><br /><sub><b>Kisaragi</b></sub></a><br /><a href="https://github.com/rust-lang/rustlings/commits?author=KisaragiEffective" title="Documentation">📖</a></td>
|
|
||||||
</tr>
|
|
||||||
<tr>
|
|
||||||
<td align="center" valign="top" width="12.5%"><a href="https://github.com/Kallu-A"><img src="https://avatars.githubusercontent.com/u/73198738?v=4?s=100" width="100px;" alt="Lucas Aries"/><br /><sub><b>Lucas Aries</b></sub></a><br /><a href="#content-Kallu-A" title="Content">🖋</a></td>
|
|
||||||
<td align="center" valign="top" width="12.5%"><a href="https://github.com/ragreenburg"><img src="https://avatars.githubusercontent.com/u/24358100?v=4?s=100" width="100px;" alt="ragreenburg"/><br /><sub><b>ragreenburg</b></sub></a><br /><a href="#content-ragreenburg" title="Content">🖋</a></td>
|
|
||||||
<td align="center" valign="top" width="12.5%"><a href="https://github.com/stevenfukase"><img src="https://avatars.githubusercontent.com/u/66785624?v=4?s=100" width="100px;" alt="stevenfukase"/><br /><sub><b>stevenfukase</b></sub></a><br /><a href="#content-stevenfukase" title="Content">🖋</a></td>
|
|
||||||
<td align="center" valign="top" width="12.5%"><a href="https://github.com/J-S-Kim"><img src="https://avatars.githubusercontent.com/u/17569303?v=4?s=100" width="100px;" alt="J-S-Kim"/><br /><sub><b>J-S-Kim</b></sub></a><br /><a href="#content-J-S-Kim" title="Content">🖋</a></td>
|
|
||||||
<td align="center" valign="top" width="12.5%"><a href="https://github.com/Fointard"><img src="https://avatars.githubusercontent.com/u/9333398?v=4?s=100" width="100px;" alt="Fointard"/><br /><sub><b>Fointard</b></sub></a><br /><a href="#content-Fointard" title="Content">🖋</a></td>
|
|
||||||
<td align="center" valign="top" width="12.5%"><a href="https://github.com/rytheo"><img src="https://avatars.githubusercontent.com/u/22184325?v=4?s=100" width="100px;" alt="Ryan Lowe"/><br /><sub><b>Ryan Lowe</b></sub></a><br /><a href="https://github.com/rust-lang/rustlings/commits?author=rytheo" title="Code">💻</a></td>
|
|
||||||
<td align="center" valign="top" width="12.5%"><a href="http://www.dashen.tech"><img src="https://avatars.githubusercontent.com/u/15921519?v=4?s=100" width="100px;" alt="cui fliter"/><br /><sub><b>cui fliter</b></sub></a><br /><a href="#content-cuishuang" title="Content">🖋</a></td>
|
|
||||||
<td align="center" valign="top" width="12.5%"><a href="https://github.com/luskwater"><img src="https://avatars.githubusercontent.com/u/42529?v=4?s=100" width="100px;" alt="Ron Lusk"/><br /><sub><b>Ron Lusk</b></sub></a><br /><a href="#content-luskwater" title="Content">🖋</a></td>
|
|
||||||
</tr>
|
|
||||||
<tr>
|
|
||||||
<td align="center" valign="top" width="12.5%"><a href="http://liby.github.io/liby/"><img src="https://avatars.githubusercontent.com/u/38807139?v=4?s=100" width="100px;" alt="Bryan Lee"/><br /><sub><b>Bryan Lee</b></sub></a><br /><a href="#content-liby" title="Content">🖋</a></td>
|
|
||||||
<td align="center" valign="top" width="12.5%"><a href="http://nandaja.space"><img src="https://avatars.githubusercontent.com/u/2624550?v=4?s=100" width="100px;" alt="Nandaja Varma"/><br /><sub><b>Nandaja Varma</b></sub></a><br /><a href="https://github.com/rust-lang/rustlings/commits?author=nandajavarma" title="Documentation">📖</a></td>
|
|
||||||
<td align="center" valign="top" width="12.5%"><a href="https://github.com/merelymyself"><img src="https://avatars.githubusercontent.com/u/88221256?v=4?s=100" width="100px;" alt="pwygab"/><br /><sub><b>pwygab</b></sub></a><br /><a href="https://github.com/rust-lang/rustlings/commits?author=merelymyself" title="Code">💻</a></td>
|
|
||||||
<td align="center" valign="top" width="12.5%"><a href="http://linkedin.com/in/lucasgrvarela"><img src="https://avatars.githubusercontent.com/u/37870368?v=4?s=100" width="100px;" alt="Lucas Grigolon Varela"/><br /><sub><b>Lucas Grigolon Varela</b></sub></a><br /><a href="#content-lucasgrvarela" title="Content">🖋</a></td>
|
|
||||||
<td align="center" valign="top" width="12.5%"><a href="https://github.com/bufo24"><img src="https://avatars.githubusercontent.com/u/32884105?v=4?s=100" width="100px;" alt="Bufo"/><br /><sub><b>Bufo</b></sub></a><br /><a href="#content-bufo24" title="Content">🖋</a></td>
|
|
||||||
<td align="center" valign="top" width="12.5%"><a href="http://rustnote.com"><img src="https://avatars.githubusercontent.com/u/77730378?v=4?s=100" width="100px;" alt="Jack Clayton"/><br /><sub><b>Jack Clayton</b></sub></a><br /><a href="https://github.com/rust-lang/rustlings/commits?author=jackos" title="Code">💻</a></td>
|
|
||||||
<td align="center" valign="top" width="12.5%"><a href="https://github.com/klkl0808"><img src="https://avatars.githubusercontent.com/u/24694249?v=4?s=100" width="100px;" alt="Konstantin"/><br /><sub><b>Konstantin</b></sub></a><br /><a href="#content-klkl0808" title="Content">🖋</a></td>
|
|
||||||
<td align="center" valign="top" width="12.5%"><a href="https://github.com/0pling"><img src="https://avatars.githubusercontent.com/u/104090344?v=4?s=100" width="100px;" alt="0pling"/><br /><sub><b>0pling</b></sub></a><br /><a href="#content-0pling" title="Content">🖋</a></td>
|
|
||||||
</tr>
|
|
||||||
<tr>
|
|
||||||
<td align="center" valign="top" width="12.5%"><a href="https://github.com/KatanaFluorescent"><img src="https://avatars.githubusercontent.com/u/60199077?v=4?s=100" width="100px;" alt="KatanaFluorescent"/><br /><sub><b>KatanaFluorescent</b></sub></a><br /><a href="https://github.com/rust-lang/rustlings/commits?author=KatanaFluorescent" title="Code">💻</a></td>
|
|
||||||
<td align="center" valign="top" width="12.5%"><a href="https://github.com/Drew-Morris"><img src="https://avatars.githubusercontent.com/u/95818166?v=4?s=100" width="100px;" alt="Drew Morris"/><br /><sub><b>Drew Morris</b></sub></a><br /><a href="https://github.com/rust-lang/rustlings/commits?author=Drew-Morris" title="Code">💻</a></td>
|
|
||||||
<td align="center" valign="top" width="12.5%"><a href="https://github.com/camperdue42"><img src="https://avatars.githubusercontent.com/u/43047763?v=4?s=100" width="100px;" alt="camperdue42"/><br /><sub><b>camperdue42</b></sub></a><br /><a href="#content-camperdue42" title="Content">🖋</a></td>
|
|
||||||
<td align="center" valign="top" width="12.5%"><a href="https://github.com/YsuOS"><img src="https://avatars.githubusercontent.com/u/30138661?v=4?s=100" width="100px;" alt="YsuOS"/><br /><sub><b>YsuOS</b></sub></a><br /><a href="#content-YsuOS" title="Content">🖋</a></td>
|
|
||||||
<td align="center" valign="top" width="12.5%"><a href="https://lichess.org/@/StevenEmily"><img src="https://avatars.githubusercontent.com/u/58114641?v=4?s=100" width="100px;" alt="Steven Nguyen"/><br /><sub><b>Steven Nguyen</b></sub></a><br /><a href="#content-icecream17" title="Content">🖋</a></td>
|
|
||||||
<td align="center" valign="top" width="12.5%"><a href="https://noahcairns.dev"><img src="https://avatars.githubusercontent.com/u/94420090?v=4?s=100" width="100px;" alt="nacairns1"/><br /><sub><b>nacairns1</b></sub></a><br /><a href="#content-nacairns1" title="Content">🖋</a></td>
|
|
||||||
<td align="center" valign="top" width="12.5%"><a href="https://github.com/pgjbz"><img src="https://avatars.githubusercontent.com/u/22059237?v=4?s=100" width="100px;" alt="Paulo Gabriel Justino Bezerra"/><br /><sub><b>Paulo Gabriel Justino Bezerra</b></sub></a><br /><a href="#content-pgjbz" title="Content">🖋</a></td>
|
|
||||||
<td align="center" valign="top" width="12.5%"><a href="https://github.com/jaystile"><img src="https://avatars.githubusercontent.com/u/46078028?v=4?s=100" width="100px;" alt="Jason"/><br /><sub><b>Jason</b></sub></a><br /><a href="#content-jaystile" title="Content">🖋</a></td>
|
|
||||||
</tr>
|
|
||||||
<tr>
|
|
||||||
<td align="center" valign="top" width="12.5%"><a href="https://exdx.github.io"><img src="https://avatars.githubusercontent.com/u/31546601?v=4?s=100" width="100px;" alt="exdx"/><br /><sub><b>exdx</b></sub></a><br /><a href="#content-exdx" title="Content">🖋</a></td>
|
|
||||||
<td align="center" valign="top" width="12.5%"><a href="https://github.com/Jzow"><img src="https://avatars.githubusercontent.com/u/68860495?v=4?s=100" width="100px;" alt="James Zow"/><br /><sub><b>James Zow</b></sub></a><br /><a href="#content-Jzow" title="Content">🖋</a></td>
|
|
||||||
<td align="center" valign="top" width="12.5%"><a href="https://jamesabromley.wordpress.com/"><img src="https://avatars.githubusercontent.com/u/2474334?v=4?s=100" width="100px;" alt="James Bromley"/><br /><sub><b>James Bromley</b></sub></a><br /><a href="#content-jayber" title="Content">🖋</a></td>
|
|
||||||
<td align="center" valign="top" width="12.5%"><a href="https://github.com/swhiteCQC"><img src="https://avatars.githubusercontent.com/u/77438466?v=4?s=100" width="100px;" alt="swhiteCQC"/><br /><sub><b>swhiteCQC</b></sub></a><br /><a href="#content-swhiteCQC" title="Content">🖋</a></td>
|
|
||||||
<td align="center" valign="top" width="12.5%"><a href="https://github.com/neilpate"><img src="https://avatars.githubusercontent.com/u/7802334?v=4?s=100" width="100px;" alt="Neil Pate"/><br /><sub><b>Neil Pate</b></sub></a><br /><a href="#content-neilpate" title="Content">🖋</a></td>
|
|
||||||
<td align="center" valign="top" width="12.5%"><a href="https://wojexe.com"><img src="https://avatars.githubusercontent.com/u/21208490?v=4?s=100" width="100px;" alt="wojexe"/><br /><sub><b>wojexe</b></sub></a><br /><a href="#content-wojexe" title="Content">🖋</a></td>
|
|
||||||
<td align="center" valign="top" width="12.5%"><a href="https://github.com/Tostapunk"><img src="https://avatars.githubusercontent.com/u/25140297?v=4?s=100" width="100px;" alt="Mattia Schiavon"/><br /><sub><b>Mattia Schiavon</b></sub></a><br /><a href="#content-Tostapunk" title="Content">🖋</a></td>
|
|
||||||
<td align="center" valign="top" width="12.5%"><a href="http://toucantoco.com"><img src="https://avatars.githubusercontent.com/u/18406791?v=4?s=100" width="100px;" alt="Eric Jolibois"/><br /><sub><b>Eric Jolibois</b></sub></a><br /><a href="#content-PrettyWood" title="Content">🖋</a></td>
|
|
||||||
</tr>
|
|
||||||
<tr>
|
|
||||||
<td align="center" valign="top" width="12.5%"><a href="http://edwinchang.vercel.app"><img src="https://avatars.githubusercontent.com/u/88263098?v=4?s=100" width="100px;" alt="Edwin Chang"/><br /><sub><b>Edwin Chang</b></sub></a><br /><a href="#content-EdwinChang24" title="Content">🖋</a></td>
|
|
||||||
<td align="center" valign="top" width="12.5%"><a href="https://saikat.dev/"><img src="https://avatars.githubusercontent.com/u/7412443?v=4?s=100" width="100px;" alt="Saikat Das"/><br /><sub><b>Saikat Das</b></sub></a><br /><a href="#content-saikatdas0790" title="Content">🖋</a></td>
|
|
||||||
<td align="center" valign="top" width="12.5%"><a href="https://github.com/thatlittleboy"><img src="https://avatars.githubusercontent.com/u/30731072?v=4?s=100" width="100px;" alt="Jeremy Goh"/><br /><sub><b>Jeremy Goh</b></sub></a><br /><a href="#content-thatlittleboy" title="Content">🖋</a></td>
|
|
||||||
<td align="center" valign="top" width="12.5%"><a href="https://github.com/Lioness100"><img src="https://avatars.githubusercontent.com/u/65814829?v=4?s=100" width="100px;" alt="Lioness100"/><br /><sub><b>Lioness100</b></sub></a><br /><a href="#content-Lioness100" title="Content">🖋</a></td>
|
|
||||||
<td align="center" valign="top" width="12.5%"><a href="https://github.com/tvkn"><img src="https://avatars.githubusercontent.com/u/79277926?v=4?s=100" width="100px;" alt="Tristan Nicholls"/><br /><sub><b>Tristan Nicholls</b></sub></a><br /><a href="#content-tvkn" title="Content">🖋</a></td>
|
|
||||||
<td align="center" valign="top" width="12.5%"><a href="http://clairewang.net"><img src="https://avatars.githubusercontent.com/u/9344258?v=4?s=100" width="100px;" alt="Claire"/><br /><sub><b>Claire</b></sub></a><br /><a href="#content-clairew" title="Content">🖋</a></td>
|
|
||||||
<td align="center" valign="top" width="12.5%"><a href="https://github.com/Mouwrice"><img src="https://avatars.githubusercontent.com/u/56763273?v=4?s=100" width="100px;" alt="Maurice Van Wassenhove"/><br /><sub><b>Maurice Van Wassenhove</b></sub></a><br /><a href="#content-Mouwrice" title="Content">🖋</a></td>
|
|
||||||
<td align="center" valign="top" width="12.5%"><a href="http://jmthree.com"><img src="https://avatars.githubusercontent.com/u/77524?v=4?s=100" width="100px;" alt="John Mendelewski"/><br /><sub><b>John Mendelewski</b></sub></a><br /><a href="https://github.com/rust-lang/rustlings/commits?author=johnmendel" title="Code">💻</a></td>
|
|
||||||
</tr>
|
|
||||||
<tr>
|
|
||||||
<td align="center" valign="top" width="12.5%"><a href="http://fakhoury.xyz"><img src="https://avatars.githubusercontent.com/u/20828724?v=4?s=100" width="100px;" alt="Brian Fakhoury"/><br /><sub><b>Brian Fakhoury</b></sub></a><br /><a href="#content-brianfakhoury" title="Content">🖋</a></td>
|
|
||||||
<td align="center" valign="top" width="12.5%"><a href="https://github.com/markusboehme"><img src="https://avatars.githubusercontent.com/u/5074759?v=4?s=100" width="100px;" alt="Markus Boehme"/><br /><sub><b>Markus Boehme</b></sub></a><br /><a href="https://github.com/rust-lang/rustlings/commits?author=markusboehme" title="Code">💻</a></td>
|
|
||||||
<td align="center" valign="top" width="12.5%"><a href="https://github.com/nico-vromans"><img src="https://avatars.githubusercontent.com/u/48183857?v=4?s=100" width="100px;" alt="Nico Vromans"/><br /><sub><b>Nico Vromans</b></sub></a><br /><a href="#content-nico-vromans" title="Content">🖋</a></td>
|
|
||||||
<td align="center" valign="top" width="12.5%"><a href="https://github.com/vostok92"><img src="https://avatars.githubusercontent.com/u/540339?v=4?s=100" width="100px;" alt="vostok92"/><br /><sub><b>vostok92</b></sub></a><br /><a href="#content-vostok92" title="Content">🖋</a></td>
|
|
||||||
<td align="center" valign="top" width="12.5%"><a href="http://magnusrodseth.vercel.app"><img src="https://avatars.githubusercontent.com/u/59113973?v=4?s=100" width="100px;" alt="Magnus Rødseth"/><br /><sub><b>Magnus Rødseth</b></sub></a><br /><a href="#content-magnusrodseth" title="Content">🖋</a></td>
|
|
||||||
<td align="center" valign="top" width="12.5%"><a href="https://github.com/rubiesonthesky"><img src="https://avatars.githubusercontent.com/u/2591240?v=4?s=100" width="100px;" alt="rubiesonthesky"/><br /><sub><b>rubiesonthesky</b></sub></a><br /><a href="#content-rubiesonthesky" title="Content">🖋</a></td>
|
|
||||||
<td align="center" valign="top" width="12.5%"><a href="http://www.gabrielbianconi.com/"><img src="https://avatars.githubusercontent.com/u/1275491?v=4?s=100" width="100px;" alt="Gabriel Bianconi"/><br /><sub><b>Gabriel Bianconi</b></sub></a><br /><a href="#content-GabrielBianconi" title="Content">🖋</a></td>
|
|
||||||
<td align="center" valign="top" width="12.5%"><a href="https://github.com/Kodylow"><img src="https://avatars.githubusercontent.com/u/74332828?v=4?s=100" width="100px;" alt="Kody Low"/><br /><sub><b>Kody Low</b></sub></a><br /><a href="#content-Kodylow" title="Content">🖋</a></td>
|
|
||||||
</tr>
|
|
||||||
<tr>
|
|
||||||
<td align="center" valign="top" width="12.5%"><a href="https://github.com/rzrymiak"><img src="https://avatars.githubusercontent.com/u/106121613?v=4?s=100" width="100px;" alt="rzrymiak"/><br /><sub><b>rzrymiak</b></sub></a><br /><a href="#content-rzrymiak" title="Content">🖋</a></td>
|
|
||||||
<td align="center" valign="top" width="12.5%"><a href="https://github.com/miguelraz"><img src="https://avatars.githubusercontent.com/u/13056181?v=4?s=100" width="100px;" alt="Miguel Raz Guzmán Macedo"/><br /><sub><b>Miguel Raz Guzmán Macedo</b></sub></a><br /><a href="#content-miguelraz" title="Content">🖋</a></td>
|
|
||||||
<td align="center" valign="top" width="12.5%"><a href="https://github.com/memark"><img src="https://avatars.githubusercontent.com/u/318504?v=4?s=100" width="100px;" alt="Magnus Markling"/><br /><sub><b>Magnus Markling</b></sub></a><br /><a href="#content-memark" title="Content">🖋</a></td>
|
|
||||||
<td align="center" valign="top" width="12.5%"><a href="https://github.com/gasparitiago"><img src="https://avatars.githubusercontent.com/u/3237254?v=4?s=100" width="100px;" alt="Tiago De Gaspari"/><br /><sub><b>Tiago De Gaspari</b></sub></a><br /><a href="#content-gasparitiago" title="Content">🖋</a></td>
|
|
||||||
<td align="center" valign="top" width="12.5%"><a href="https://github.com/skaunov"><img src="https://avatars.githubusercontent.com/u/65976143?v=4?s=100" width="100px;" alt="skaunov"/><br /><sub><b>skaunov</b></sub></a><br /><a href="#content-skaunov" title="Content">🖋</a></td>
|
|
||||||
<td align="center" valign="top" width="12.5%"><a href="http://caljacobson.dev"><img src="https://avatars.githubusercontent.com/u/9152032?v=4?s=100" width="100px;" alt="Cal Jacobson"/><br /><sub><b>Cal Jacobson</b></sub></a><br /><a href="#content-cj81499" title="Content">🖋</a></td>
|
|
||||||
<td align="center" valign="top" width="12.5%"><a href="https://github.com/duchonic"><img src="https://avatars.githubusercontent.com/u/34117620?v=4?s=100" width="100px;" alt="Duchoud Nicolas"/><br /><sub><b>Duchoud Nicolas</b></sub></a><br /><a href="#content-duchonic" title="Content">🖋</a></td>
|
|
||||||
<td align="center" valign="top" width="12.5%"><a href="https://github.com/gfaugere"><img src="https://avatars.githubusercontent.com/u/11901979?v=4?s=100" width="100px;" alt="Gaëtan Faugère"/><br /><sub><b>Gaëtan Faugère</b></sub></a><br /><a href="#tool-gfaugere" title="Tools">🔧</a></td>
|
|
||||||
</tr>
|
|
||||||
<tr>
|
|
||||||
<td align="center" valign="top" width="12.5%"><a href="https://github.com/bhbuehler"><img src="https://avatars.githubusercontent.com/u/25541343?v=4?s=100" width="100px;" alt="bhbuehler"/><br /><sub><b>bhbuehler</b></sub></a><br /><a href="#content-bhbuehler" title="Content">🖋</a></td>
|
|
||||||
<td align="center" valign="top" width="12.5%"><a href="https://github.com/nyurik"><img src="https://avatars.githubusercontent.com/u/1641515?v=4?s=100" width="100px;" alt="Yuri Astrakhan"/><br /><sub><b>Yuri Astrakhan</b></sub></a><br /><a href="https://github.com/rust-lang/rustlings/commits?author=nyurik" title="Code">💻</a></td>
|
|
||||||
<td align="center" valign="top" width="12.5%"><a href="http://azzamsa.com"><img src="https://avatars.githubusercontent.com/u/17734314?v=4?s=100" width="100px;" alt="azzamsa"/><br /><sub><b>azzamsa</b></sub></a><br /><a href="https://github.com/rust-lang/rustlings/commits?author=azzamsa" title="Code">💻</a></td>
|
|
||||||
<td align="center" valign="top" width="12.5%"><a href="https://github.com/mvanschellebeeck"><img src="https://avatars.githubusercontent.com/u/17671052?v=4?s=100" width="100px;" alt="mvanschellebeeck"/><br /><sub><b>mvanschellebeeck</b></sub></a><br /><a href="#content-mvanschellebeeck" title="Content">🖋</a></td>
|
|
||||||
<td align="center" valign="top" width="12.5%"><a href="https://github.com/aaarkid"><img src="https://avatars.githubusercontent.com/u/39987510?v=4?s=100" width="100px;" alt="Arkid"/><br /><sub><b>Arkid</b></sub></a><br /><a href="#content-aaarkid" title="Content">🖋</a></td>
|
|
||||||
<td align="center" valign="top" width="12.5%"><a href="http://tfpk.dev"><img src="https://avatars.githubusercontent.com/u/10906982?v=4?s=100" width="100px;" alt="Tom Kunc"/><br /><sub><b>Tom Kunc</b></sub></a><br /><a href="#content-tfpk" title="Content">🖋</a></td>
|
|
||||||
<td align="center" valign="top" width="12.5%"><a href="https://github.com/mfurak"><img src="https://avatars.githubusercontent.com/u/38523093?v=4?s=100" width="100px;" alt="Marek Furák"/><br /><sub><b>Marek Furák</b></sub></a><br /><a href="#content-mfurak" title="Content">🖋</a></td>
|
|
||||||
<td align="center" valign="top" width="12.5%"><a href="https://winter.cafe"><img src="https://avatars.githubusercontent.com/u/78392041?v=4?s=100" width="100px;" alt="Winter"/><br /><sub><b>Winter</b></sub></a><br /><a href="https://github.com/rust-lang/rustlings/commits?author=winterqt" title="Code">💻</a></td>
|
|
||||||
</tr>
|
|
||||||
<tr>
|
|
||||||
<td align="center" valign="top" width="12.5%"><a href="https://moritzboeh.me"><img src="https://avatars.githubusercontent.com/u/42215704?v=4?s=100" width="100px;" alt="Moritz Böhme"/><br /><sub><b>Moritz Böhme</b></sub></a><br /><a href="https://github.com/rust-lang/rustlings/commits?author=MoritzBoehme" title="Code">💻</a></td>
|
|
||||||
<td align="center" valign="top" width="12.5%"><a href="https://github.com/craymel"><img src="https://avatars.githubusercontent.com/u/71062756?v=4?s=100" width="100px;" alt="craymel"/><br /><sub><b>craymel</b></sub></a><br /><a href="#content-craymel" title="Content">🖋</a></td>
|
|
||||||
<td align="center" valign="top" width="12.5%"><a href="https://github.com/tkburis"><img src="https://avatars.githubusercontent.com/u/20501289?v=4?s=100" width="100px;" alt="TK Buristrakul"/><br /><sub><b>TK Buristrakul</b></sub></a><br /><a href="#content-tkburis" title="Content">🖋</a></td>
|
|
||||||
<td align="center" valign="top" width="12.5%"><a href="https://github.com/HerschelW"><img src="https://avatars.githubusercontent.com/u/17935816?v=4?s=100" width="100px;" alt="Kent Worthington"/><br /><sub><b>Kent Worthington</b></sub></a><br /><a href="#content-HerschelW" title="Content">🖋</a></td>
|
|
||||||
<td align="center" valign="top" width="12.5%"><a href="https://github.com/seporterfield"><img src="https://avatars.githubusercontent.com/u/107010978?v=4?s=100" width="100px;" alt="seporterfield"/><br /><sub><b>seporterfield</b></sub></a><br /><a href="#content-seporterfield" title="Content">🖋</a></td>
|
|
||||||
<td align="center" valign="top" width="12.5%"><a href="https://www.linkedin.com/in/dbarrosop"><img src="https://avatars.githubusercontent.com/u/6246622?v=4?s=100" width="100px;" alt="David Barroso"/><br /><sub><b>David Barroso</b></sub></a><br /><a href="#infra-dbarrosop" title="Infrastructure (Hosting, Build-Tools, etc)">🚇</a></td>
|
|
||||||
<td align="center" valign="top" width="12.5%"><a href="https://distanz.ch"><img src="https://avatars.githubusercontent.com/u/539708?v=4?s=100" width="100px;" alt="Tobias Klauser"/><br /><sub><b>Tobias Klauser</b></sub></a><br /><a href="https://github.com/rust-lang/rustlings/commits?author=tklauser" title="Code">💻</a></td>
|
|
||||||
<td align="center" valign="top" width="12.5%"><a href="https://github.com/0xMySt1c"><img src="https://avatars.githubusercontent.com/u/101825630?v=4?s=100" width="100px;" alt="0xMySt1c"/><br /><sub><b>0xMySt1c</b></sub></a><br /><a href="#tool-0xMySt1c" title="Tools">🔧</a></td>
|
|
||||||
</tr>
|
|
||||||
<tr>
|
|
||||||
<td align="center" valign="top" width="12.5%"><a href="https://github.com/AxolotlTears"><img src="https://avatars.githubusercontent.com/u/87157047?v=4?s=100" width="100px;" alt="Ten"/><br /><sub><b>Ten</b></sub></a><br /><a href="https://github.com/rust-lang/rustlings/commits?author=AxolotlTears" title="Code">💻</a></td>
|
|
||||||
<td align="center" valign="top" width="12.5%"><a href="http://h4x5p4c3.xyz"><img src="https://avatars.githubusercontent.com/u/66133688?v=4?s=100" width="100px;" alt="jones martin"/><br /><sub><b>jones martin</b></sub></a><br /><a href="#content-h4x5p4c3" title="Content">🖋</a></td>
|
|
||||||
<td align="center" valign="top" width="12.5%"><a href="https://github.com/cloppingemu"><img src="https://avatars.githubusercontent.com/u/12227963?v=4?s=100" width="100px;" alt="cloppingemu"/><br /><sub><b>cloppingemu</b></sub></a><br /><a href="https://github.com/rust-lang/rustlings/commits?author=cloppingemu" title="Code">💻</a></td>
|
|
||||||
<td align="center" valign="top" width="12.5%"><a href="http://github.com/zeromicro/go-zero"><img src="https://avatars.githubusercontent.com/u/1918356?v=4?s=100" width="100px;" alt="Kevin Wan"/><br /><sub><b>Kevin Wan</b></sub></a><br /><a href="#content-kevwan" title="Content">🖋</a></td>
|
|
||||||
<td align="center" valign="top" width="12.5%"><a href="http://kurowasaruby.cn"><img src="https://avatars.githubusercontent.com/u/43495006?v=4?s=100" width="100px;" alt="Ruby"/><br /><sub><b>Ruby</b></sub></a><br /><a href="https://github.com/rust-lang/rustlings/commits?author=wjwrh" title="Code">💻</a></td>
|
|
||||||
<td align="center" valign="top" width="12.5%"><a href="https://github.com/alexandergill"><img src="https://avatars.githubusercontent.com/u/7033716?v=4?s=100" width="100px;" alt="Alexander Gill"/><br /><sub><b>Alexander Gill</b></sub></a><br /><a href="https://github.com/rust-lang/rustlings/commits?author=alexandergill" title="Code">💻</a></td>
|
|
||||||
<td align="center" valign="top" width="12.5%"><a href="https://www.linkedin.com/in/jarrod-sanders/"><img src="https://avatars.githubusercontent.com/u/50600614?v=4?s=100" width="100px;" alt="Jarrod Sanders"/><br /><sub><b>Jarrod Sanders</b></sub></a><br /><a href="#content-kawaiiPlat" title="Content">🖋</a></td>
|
|
||||||
<td align="center" valign="top" width="12.5%"><a href="https://github.com/platformer"><img src="https://avatars.githubusercontent.com/u/40146328?v=4?s=100" width="100px;" alt="Andrew Sen"/><br /><sub><b>Andrew Sen</b></sub></a><br /><a href="#content-platformer" title="Content">🖋</a></td>
|
|
||||||
</tr>
|
|
||||||
<tr>
|
|
||||||
<td align="center" valign="top" width="12.5%"><a href="https://grzegorz-zur.com/"><img src="https://avatars.githubusercontent.com/u/5297583?v=4?s=100" width="100px;" alt="Grzegorz Żur"/><br /><sub><b>Grzegorz Żur</b></sub></a><br /><a href="#content-grzegorz-zur" title="Content">🖋</a></td>
|
|
||||||
</tr>
|
|
||||||
</tbody>
|
|
||||||
</table>
|
|
||||||
|
|
||||||
<!-- markdownlint-restore -->
|
|
||||||
<!-- prettier-ignore-end -->
|
|
||||||
|
|
||||||
<!-- ALL-CONTRIBUTORS-LIST:END -->
|
|
||||||
|
|
||||||
This project follows the [all-contributors](https://github.com/all-contributors/all-contributors) specification. Contributions of any kind welcome!
|
|
||||||
375
CHANGELOG.md
375
CHANGELOG.md
@ -1,4 +1,307 @@
|
|||||||
<a name="5.4.0"></a>
|
## Unreleased
|
||||||
|
|
||||||
|
### Changed
|
||||||
|
|
||||||
|
- `vecs2`: Removed the use of `map` and `collect`, which are only taught later.
|
||||||
|
|
||||||
|
## 6.5.0 (2025-08-21)
|
||||||
|
|
||||||
|
### Added
|
||||||
|
|
||||||
|
- Check that Clippy is installed before initialization
|
||||||
|
|
||||||
|
### Changed
|
||||||
|
|
||||||
|
- Upgrade to Rust edition 2024
|
||||||
|
- Raise the minimum supported Rust version to `1.88`
|
||||||
|
- Don't follow symlinks in the file watcher
|
||||||
|
- `dev new`: Don't add `.rustlings-state.txt` to `.gitignore`
|
||||||
|
|
||||||
|
### Fixed
|
||||||
|
|
||||||
|
- Fix file links in VS Code
|
||||||
|
- Fix error printing when the progress bar is shown
|
||||||
|
- `dev check`: Don't check formatting if there are no solution files
|
||||||
|
|
||||||
|
## 6.4.0 (2024-11-11)
|
||||||
|
|
||||||
|
### Added
|
||||||
|
|
||||||
|
- The list of exercises is now searchable by pressing `s` or `/` 🔍️ (thanks to [@frroossst](https://github.com/frroossst))
|
||||||
|
- New option `c` in the prompt to manually check all exercises ✅ (thanks to [@Nahor](https://github.com/Nahor))
|
||||||
|
- New command `check-all` to manually check all exercises ✅ (thanks to [@Nahor](https://github.com/Nahor))
|
||||||
|
- Addictive animation for showing the progress of checking all exercises. A nice showcase of parallelism in Rust ✨
|
||||||
|
- New option `x` in the prompt to reset the file of the current exercise 🔄
|
||||||
|
- Allow `dead_code` for all exercises and solutions ⚰️ (thanks to [@huss4in](https://github.com/huss4in))
|
||||||
|
- Pause input while running an exercise to avoid unexpected prompt interactions ⏸️
|
||||||
|
- Limit the maximum number of exercises to 999. Any community exercises willing to reach that limit? 🔝
|
||||||
|
|
||||||
|
### Changed
|
||||||
|
|
||||||
|
- `enums3`: Remove redundant enum definition task (thanks to [@senekor](https://github.com/senekor))
|
||||||
|
- `if2`: Make the exercise less confusing by avoiding "fizz", "fuzz", "foo", "bar" and "baz" (thanks to [@senekor](https://github.com/senekor))
|
||||||
|
- `hashmap3`: Use the method `Entry::or_default`.
|
||||||
|
- Update the state of all exercises when checking all of them (thanks to [@Nahor](https://github.com/Nahor))
|
||||||
|
- The main prompt doesn't need a confirmation with ENTER on Unix-like systems anymore.
|
||||||
|
- No more jumping back to a previous exercise when its file is changed. Use the list to jump between exercises.
|
||||||
|
- Dump the solution file after an exercise is done even if the solution's directory doesn't exist.
|
||||||
|
- Rework the footer in the list.
|
||||||
|
- Optimize the file watcher.
|
||||||
|
|
||||||
|
### Fixed
|
||||||
|
|
||||||
|
- Fix bad contrast in the list on terminals with a light theme.
|
||||||
|
|
||||||
|
## 6.3.0 (2024-08-29)
|
||||||
|
|
||||||
|
### Added
|
||||||
|
|
||||||
|
- Add the following exercise lints:
|
||||||
|
- `forbid(unsafe_code)`: You shouldn't write unsafe code in Rustlings.
|
||||||
|
- `forbid(unstable_features)`: You don't need unstable features in Rustlings and shouldn't rely on them while learning Rust.
|
||||||
|
- `forbid(todo)`: You forgot a `todo!()`.
|
||||||
|
- `forbid(empty_loop)`: This can only happen by mistake in Rustlings.
|
||||||
|
- `deny(infinite_loop)`: No infinite loops are needed in Rustlings.
|
||||||
|
- `deny(mem_forget)`: You shouldn't leak memory while still learning Rust.
|
||||||
|
- Show a link to every exercise file in the list.
|
||||||
|
- Add scroll padding in the list.
|
||||||
|
- Break the help footer of the list into two lines when the terminal width isn't big enough.
|
||||||
|
- Enable scrolling with the mouse in the list.
|
||||||
|
- `dev check`: Show the progress of checks.
|
||||||
|
- `dev check`: Check that the length of all exercise names is lower than 32.
|
||||||
|
- `dev check`: Check if exercise contains no tests and isn't marked with `test = false`.
|
||||||
|
|
||||||
|
### Changed
|
||||||
|
|
||||||
|
- The compilation time when installing Rustlings is reduced.
|
||||||
|
- Pressing `c` in the list for "continue on" now quits the list after setting the selected exercise as the current one.
|
||||||
|
- Better highlighting of the solution file after an exercise is done.
|
||||||
|
- Don't show the output of successful tests anymore. Instead, show the pretty output for tests.
|
||||||
|
- Be explicit about `q` only quitting the list and not the whole program in the list.
|
||||||
|
- Be explicit about `r` only resetting one exercise (the selected one) in the list.
|
||||||
|
- Ignore the standard output of `git init`.
|
||||||
|
- `threads3`: Remove the queue length and improve tests.
|
||||||
|
- `errors4`: Use match instead of a comparison chain in the solution.
|
||||||
|
- `functions3`: Only take `u8` to avoid using a too high number of iterations by mistake.
|
||||||
|
- `dev check`: Always check with strict Clippy (warnings to errors) when checking the solutions.
|
||||||
|
|
||||||
|
### Fixed
|
||||||
|
|
||||||
|
- Fix the error on some systems about too many open files during the final check of all exercises.
|
||||||
|
- Fix the list when the terminal height is too low.
|
||||||
|
- Restore the terminal after an error in the list.
|
||||||
|
|
||||||
|
## 6.2.0 (2024-08-09)
|
||||||
|
|
||||||
|
### Added
|
||||||
|
|
||||||
|
- Show a message before checking and running an exercise. This gives the user instant feedback and avoids confusion if the checks take too long.
|
||||||
|
- Show a helpful error message when trying to install Rustlings with a Rust version lower than the minimum one that Rustlings supports.
|
||||||
|
- Add a `README.md` file to the `solutions/` directory.
|
||||||
|
- Allow initializing Rustlings in a Cargo workspace.
|
||||||
|
- `dev check`: Check that all solutions are formatted with `rustfmt`.
|
||||||
|
|
||||||
|
### Changed
|
||||||
|
|
||||||
|
- Remove the state file and the solutions directory from the generated `.gitignore` file.
|
||||||
|
- Run the final check of all exercises in parallel.
|
||||||
|
- Small exercise improvements.
|
||||||
|
|
||||||
|
## 6.1.0 (2024-07-10)
|
||||||
|
|
||||||
|
#### Added
|
||||||
|
|
||||||
|
- `dev check`: Check that all exercises (including community ones) include at least one `TODO` comment.
|
||||||
|
- `dev check`: Check that all exercises actually fail to run (not already solved).
|
||||||
|
|
||||||
|
#### Changed
|
||||||
|
|
||||||
|
- Make enum variants more consistent between enum exercises.
|
||||||
|
- `iterators3`: Teach about the possible case of integer overflow during division.
|
||||||
|
|
||||||
|
#### Fixed
|
||||||
|
|
||||||
|
- Exit with a helpful error message on missing/unsupported terminal/TTY.
|
||||||
|
- Mark the last exercise as done.
|
||||||
|
|
||||||
|
## 6.0.1 (2024-07-04)
|
||||||
|
|
||||||
|
Small exercise improvements and fixes.
|
||||||
|
Most importantly, fixed that the exercise `clippy1` was already solved 😅
|
||||||
|
|
||||||
|
## 6.0.0 (2024-07-03)
|
||||||
|
|
||||||
|
This release is the result of a complete rewrite to deliver a ton of new features and improvements ✨
|
||||||
|
The most important changes are highlighted below.
|
||||||
|
|
||||||
|
### Installation
|
||||||
|
|
||||||
|
The installation has been simplified a lot!
|
||||||
|
To install Rustlings after installing Rust, all what you need to do now is running the following command:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
cargo install rustlings
|
||||||
|
```
|
||||||
|
|
||||||
|
Yes, this means that Rustlings is now on [crates.io](https://crates.io/crates/rustlings) 🎉
|
||||||
|
|
||||||
|
You can read about the motivations of this change in [this issue](https://github.com/rust-lang/rustlings/issues/1919).
|
||||||
|
|
||||||
|
### UI/UX
|
||||||
|
|
||||||
|
- The UI is now responsive when the terminal is resized.
|
||||||
|
- The progress bar was moved to the bottom so that you can always see your progress and the current exercise to work on.
|
||||||
|
- The current exercise path is now a terminal link. It will open the exercise file in your default editor when you click on it.
|
||||||
|
- A small prompt is now always shown at the bottom. It allows you to choose an action by entering a character. For example, entering `h` will show you the hint of the current exercise.
|
||||||
|
- The comment "I AM NOT DONE!" doesn't exist anymore. Instead of needing to remove it to go to the next exercise, you need to enter `n` in the terminal.
|
||||||
|
|
||||||
|
### List mode
|
||||||
|
|
||||||
|
A new list mode was added!
|
||||||
|
You can enter it by entering `l` in the watch mode.
|
||||||
|
It offers the following features:
|
||||||
|
|
||||||
|
- Browse all exercises and see their state (pending/done).
|
||||||
|
- Filter exercises based on their state (pending/done).
|
||||||
|
- Continue at another exercise. This allows you to skip some exercises or go back to previous ones.
|
||||||
|
- Reset an exercise so you can start over and revert your changes.
|
||||||
|
|
||||||
|
### Solutions
|
||||||
|
|
||||||
|
After finishing an exercise, a solution file will be available and Rustlings will show you its path in green.
|
||||||
|
This allows you to compare your solution with an idiomatic solution and maybe learn about other ways to solve a problem.
|
||||||
|
|
||||||
|
While writing the solutions, all exercises have been polished 🌟
|
||||||
|
For example, every exercise now contains `TODO` comments to highlight what the user needs to change and where.
|
||||||
|
|
||||||
|
### LSP support out of the box
|
||||||
|
|
||||||
|
Instead of creating a `project.json` file using `rustlings lsp`, Rustlings now works with a `Cargo.toml` file out of the box.
|
||||||
|
No actions are needed to activate the language server `rust-analyzer`.
|
||||||
|
|
||||||
|
This should avoid issues related to the language server or to running exercises, especially the ones with Clippy.
|
||||||
|
|
||||||
|
### Clippy
|
||||||
|
|
||||||
|
Clippy lints are now shown on all exercises, not only the Clippy exercises 📎
|
||||||
|
Make Clippy your friend from early on 🥰
|
||||||
|
|
||||||
|
### Community Exercises
|
||||||
|
|
||||||
|
Rustlings now supports community exercises!
|
||||||
|
|
||||||
|
Do you want to create your own set of Rustlings exercises to focus on some specific topic?
|
||||||
|
Or do you want to translate the original Rustlings exercises?
|
||||||
|
Then follow the link to the guide about [community exercises](https://rustlings.rust-lang.org/community-exercises)!
|
||||||
|
|
||||||
|
## 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`.
|
||||||
|
|
||||||
|
## 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.
|
||||||
|
|
||||||
|
## 5.5.1 (2023-05-17)
|
||||||
|
|
||||||
|
#### Fixed
|
||||||
|
|
||||||
|
- Reverted `rust-project.json` path generation due to an upstream `rust-analyzer` fix.
|
||||||
|
|
||||||
|
## 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
|
||||||
|
|
||||||
|
## 5.4.1 (2023-03-10)
|
||||||
|
|
||||||
|
#### Changed
|
||||||
|
|
||||||
|
- `vecs`: Added links to `iter_mut` and `map` to README.md
|
||||||
|
- `cow1`: Changed main to tests
|
||||||
|
- `iterators1`: Formatted according to rustfmt
|
||||||
|
|
||||||
|
#### Fixed
|
||||||
|
|
||||||
|
- `errors5`: Unified undisclosed type notation
|
||||||
|
- `arc1`: Improved readability by avoiding implicit dereference
|
||||||
|
- `macros4`: Prevented auto-fix by adding `#[rustfmt::skip]`
|
||||||
|
- `cli`: Actually show correct progress percentages
|
||||||
|
|
||||||
## 5.4.0 (2023-02-12)
|
## 5.4.0 (2023-02-12)
|
||||||
|
|
||||||
@ -28,8 +331,6 @@
|
|||||||
|
|
||||||
- Bumped min Rust version to 1.58 in installation script
|
- Bumped min Rust version to 1.58 in installation script
|
||||||
|
|
||||||
<a name="5.3.0"></a>
|
|
||||||
|
|
||||||
## 5.3.0 (2022-12-23)
|
## 5.3.0 (2022-12-23)
|
||||||
|
|
||||||
#### Added
|
#### Added
|
||||||
@ -53,7 +354,7 @@
|
|||||||
- **structs3**: Clarifed the hint
|
- **structs3**: Clarifed the hint
|
||||||
- **quiz2, as_ref_mut, options1, traits1, traits2**: Clarified hints
|
- **quiz2, as_ref_mut, options1, traits1, traits2**: Clarified hints
|
||||||
- **traits1, traits2, cli**: Tidied up unmatching backticks
|
- **traits1, traits2, cli**: Tidied up unmatching backticks
|
||||||
- **enums2**: Removed unneccessary indirection of self
|
- **enums2**: Removed unnecessary indirection of self
|
||||||
- **enums3**: Added an extra tuple comment
|
- **enums3**: Added an extra tuple comment
|
||||||
|
|
||||||
#### Housekeeping
|
#### Housekeeping
|
||||||
@ -62,8 +363,6 @@
|
|||||||
- Applied some Clippy and rustfmt formatting
|
- Applied some Clippy and rustfmt formatting
|
||||||
- Added a note on Windows PowerShell and other shell compatibility
|
- Added a note on Windows PowerShell and other shell compatibility
|
||||||
|
|
||||||
<a name="5.2.1"></a>
|
|
||||||
|
|
||||||
## 5.2.1 (2022-09-06)
|
## 5.2.1 (2022-09-06)
|
||||||
|
|
||||||
#### Fixed
|
#### Fixed
|
||||||
@ -77,8 +376,6 @@
|
|||||||
|
|
||||||
- Fixed a typo in README.md
|
- Fixed a typo in README.md
|
||||||
|
|
||||||
<a name="5.2.0"></a>
|
|
||||||
|
|
||||||
## 5.2.0 (2022-08-27)
|
## 5.2.0 (2022-08-27)
|
||||||
|
|
||||||
#### Added
|
#### Added
|
||||||
@ -95,16 +392,12 @@
|
|||||||
- **quiz1**: Adjusted the explanations to be consistent with
|
- **quiz1**: Adjusted the explanations to be consistent with
|
||||||
the tests
|
the tests
|
||||||
|
|
||||||
<a name="5.1.1"></a>
|
|
||||||
|
|
||||||
## 5.1.1 (2022-08-17)
|
## 5.1.1 (2022-08-17)
|
||||||
|
|
||||||
#### Bug Fixes
|
#### Bug Fixes
|
||||||
|
|
||||||
- Fixed an incorrect assertion in options1
|
- Fixed an incorrect assertion in options1
|
||||||
|
|
||||||
<a name="5.1.0"></a>
|
|
||||||
|
|
||||||
## 5.1.0 (2022-08-16)
|
## 5.1.0 (2022-08-16)
|
||||||
|
|
||||||
#### Features
|
#### Features
|
||||||
@ -139,8 +432,6 @@
|
|||||||
- Clarified manual installation instructions using `cargo install --path .`
|
- Clarified manual installation instructions using `cargo install --path .`
|
||||||
- Added a link to our Zulip in the readme file
|
- Added a link to our Zulip in the readme file
|
||||||
|
|
||||||
<a name="5.0.0"></a>
|
|
||||||
|
|
||||||
## 5.0.0 (2022-07-16)
|
## 5.0.0 (2022-07-16)
|
||||||
|
|
||||||
#### Features
|
#### Features
|
||||||
@ -213,8 +504,6 @@
|
|||||||
- Updated spacing in Cargo.toml.
|
- Updated spacing in Cargo.toml.
|
||||||
- Added a GitHub actions config so that tests run on every PR/commit.
|
- Added a GitHub actions config so that tests run on every PR/commit.
|
||||||
|
|
||||||
<a name="4.8.0"></a>
|
|
||||||
|
|
||||||
## 4.8.0 (2022-07-01)
|
## 4.8.0 (2022-07-01)
|
||||||
|
|
||||||
#### Features
|
#### Features
|
||||||
@ -235,8 +524,6 @@
|
|||||||
- Replaced the git.io URL with the fully qualified URL because of git.io's sunsetting.
|
- Replaced the git.io URL with the fully qualified URL because of git.io's sunsetting.
|
||||||
- Removed the deprecated Rust GitPod extension.
|
- Removed the deprecated Rust GitPod extension.
|
||||||
|
|
||||||
<a name="4.7.1"></a>
|
|
||||||
|
|
||||||
## 4.7.1 (2022-04-20)
|
## 4.7.1 (2022-04-20)
|
||||||
|
|
||||||
#### Features
|
#### Features
|
||||||
@ -257,8 +544,6 @@
|
|||||||
- The changelog will now be manually written instead of being automatically generated by the
|
- The changelog will now be manually written instead of being automatically generated by the
|
||||||
Git log.
|
Git log.
|
||||||
|
|
||||||
<a name="4.7.0"></a>
|
|
||||||
|
|
||||||
## 4.7.0 (2022-04-14)
|
## 4.7.0 (2022-04-14)
|
||||||
|
|
||||||
#### Features
|
#### Features
|
||||||
@ -299,8 +584,6 @@
|
|||||||
- Add hints on how to get GCC installed (#741) ([bc56861](https://github.com/rust-lang/rustlings/commit/bc5686174463ad6f4f6b824b0e9b97c3039d4886))
|
- Add hints on how to get GCC installed (#741) ([bc56861](https://github.com/rust-lang/rustlings/commit/bc5686174463ad6f4f6b824b0e9b97c3039d4886))
|
||||||
- Fix some code blocks that were not highlighted ([17f9d74](https://github.com/rust-lang/rustlings/commit/17f9d7429ccd133a72e815fb5618e0ce79560929))
|
- Fix some code blocks that were not highlighted ([17f9d74](https://github.com/rust-lang/rustlings/commit/17f9d7429ccd133a72e815fb5618e0ce79560929))
|
||||||
|
|
||||||
<a name="4.6.0"></a>
|
|
||||||
|
|
||||||
## 4.6.0 (2021-09-25)
|
## 4.6.0 (2021-09-25)
|
||||||
|
|
||||||
#### Features
|
#### Features
|
||||||
@ -323,8 +606,6 @@
|
|||||||
- Clarify instructions ([df25684c](https://github.com/rust-lang/rustlings/commit/df25684cb79f8413915e00b5efef29369849cef1))
|
- Clarify instructions ([df25684c](https://github.com/rust-lang/rustlings/commit/df25684cb79f8413915e00b5efef29369849cef1))
|
||||||
- **quiz1:** Fix inconsistent wording (#826) ([03131a3d](https://github.com/rust-lang/rustlings/commit/03131a3d35d9842598150f9da817f7cc26e2669a))
|
- **quiz1:** Fix inconsistent wording (#826) ([03131a3d](https://github.com/rust-lang/rustlings/commit/03131a3d35d9842598150f9da817f7cc26e2669a))
|
||||||
|
|
||||||
<a name="4.5.0"></a>
|
|
||||||
|
|
||||||
## 4.5.0 (2021-07-07)
|
## 4.5.0 (2021-07-07)
|
||||||
|
|
||||||
#### Features
|
#### Features
|
||||||
@ -345,8 +626,6 @@
|
|||||||
- **try_from_into, from_str:** hints for dyn Error ([11d2cf0d](https://github.com/rust-lang/rustlings/commit/11d2cf0d604dee3f5023c17802d69438e69fa50e))
|
- **try_from_into, from_str:** hints for dyn Error ([11d2cf0d](https://github.com/rust-lang/rustlings/commit/11d2cf0d604dee3f5023c17802d69438e69fa50e))
|
||||||
- **variables5:** confine the answer further ([48ffcbd2](https://github.com/rust-lang/rustlings/commit/48ffcbd2c4cc4d936c2c7480019190f179813cc5))
|
- **variables5:** confine the answer further ([48ffcbd2](https://github.com/rust-lang/rustlings/commit/48ffcbd2c4cc4d936c2c7480019190f179813cc5))
|
||||||
|
|
||||||
<a name="4.4.0"></a>
|
|
||||||
|
|
||||||
## 4.4.0 (2021-04-24)
|
## 4.4.0 (2021-04-24)
|
||||||
|
|
||||||
#### Bug Fixes
|
#### Bug Fixes
|
||||||
@ -388,8 +667,6 @@
|
|||||||
- updated progress percentage ([1c6f7e4b](https://github.com/rust-lang/rustlings/commit/1c6f7e4b7b9b3bd36f4da2bb2b69c549cc8bd913))
|
- updated progress percentage ([1c6f7e4b](https://github.com/rust-lang/rustlings/commit/1c6f7e4b7b9b3bd36f4da2bb2b69c549cc8bd913))
|
||||||
- added progress info ([c0e3daac](https://github.com/rust-lang/rustlings/commit/c0e3daacaf6850811df5bc57fa43e0f249d5cfa4))
|
- added progress info ([c0e3daac](https://github.com/rust-lang/rustlings/commit/c0e3daacaf6850811df5bc57fa43e0f249d5cfa4))
|
||||||
|
|
||||||
<a name="4.3.0"></a>
|
|
||||||
|
|
||||||
## 4.3.0 (2020-12-29)
|
## 4.3.0 (2020-12-29)
|
||||||
|
|
||||||
#### Features
|
#### Features
|
||||||
@ -412,8 +689,6 @@
|
|||||||
- Update description (#584) ([96347df9](https://github.com/rust-lang/rustlings/commit/96347df9df294f01153b29d9ad4ba361f665c755))
|
- Update description (#584) ([96347df9](https://github.com/rust-lang/rustlings/commit/96347df9df294f01153b29d9ad4ba361f665c755))
|
||||||
- **vec1:** Have test compare every element in a and v ([9b6c6293](https://github.com/rust-lang/rustlings/commit/9b6c629397b24b944f484f5b2bbd8144266b5695))
|
- **vec1:** Have test compare every element in a and v ([9b6c6293](https://github.com/rust-lang/rustlings/commit/9b6c629397b24b944f484f5b2bbd8144266b5695))
|
||||||
|
|
||||||
<a name="4.2.0"></a>
|
|
||||||
|
|
||||||
## 4.2.0 (2020-11-07)
|
## 4.2.0 (2020-11-07)
|
||||||
|
|
||||||
#### Features
|
#### Features
|
||||||
@ -434,8 +709,6 @@
|
|||||||
- missing comma in test ([4fb230da](https://github.com/rust-lang/rustlings/commit/4fb230daf1251444fcf29e085cee222a91f8a37e))
|
- missing comma in test ([4fb230da](https://github.com/rust-lang/rustlings/commit/4fb230daf1251444fcf29e085cee222a91f8a37e))
|
||||||
- **quiz3:** Second test is for odd numbers, not even. (#553) ([18e0bfef](https://github.com/rust-lang/rustlings/commit/18e0bfef1de53071e353ba1ec5837002ff7290e6))
|
- **quiz3:** Second test is for odd numbers, not even. (#553) ([18e0bfef](https://github.com/rust-lang/rustlings/commit/18e0bfef1de53071e353ba1ec5837002ff7290e6))
|
||||||
|
|
||||||
<a name="4.1.0"></a>
|
|
||||||
|
|
||||||
## 4.1.0 (2020-10-05)
|
## 4.1.0 (2020-10-05)
|
||||||
|
|
||||||
#### Bug Fixes
|
#### Bug Fixes
|
||||||
@ -458,8 +731,6 @@
|
|||||||
- **cli:** Added 'cls' command to 'watch' mode (#474) ([4f2468e1](https://github.com/rust-lang/rustlings/commit/4f2468e14f574a93a2e9b688367b5752ed96ae7b))
|
- **cli:** Added 'cls' command to 'watch' mode (#474) ([4f2468e1](https://github.com/rust-lang/rustlings/commit/4f2468e14f574a93a2e9b688367b5752ed96ae7b))
|
||||||
- **try_from_into:** Add insufficient length test (#469) ([523d18b8](https://github.com/rust-lang/rustlings/commit/523d18b873a319f7c09262f44bd40e2fab1830e5))
|
- **try_from_into:** Add insufficient length test (#469) ([523d18b8](https://github.com/rust-lang/rustlings/commit/523d18b873a319f7c09262f44bd40e2fab1830e5))
|
||||||
|
|
||||||
<a name="4.0.0"></a>
|
|
||||||
|
|
||||||
## 4.0.0 (2020-07-08)
|
## 4.0.0 (2020-07-08)
|
||||||
|
|
||||||
#### Breaking Changes
|
#### Breaking Changes
|
||||||
@ -501,8 +772,6 @@
|
|||||||
- **test2:** name of type String and &str (#394) ([d6c0a688](https://github.com/rust-lang/rustlings/commit/d6c0a688e6a96f93ad60d540d4b326f342fc0d45))
|
- **test2:** name of type String and &str (#394) ([d6c0a688](https://github.com/rust-lang/rustlings/commit/d6c0a688e6a96f93ad60d540d4b326f342fc0d45))
|
||||||
- **variables6:** minor typo (#419) ([524e17df](https://github.com/rust-lang/rustlings/commit/524e17df10db95f7b90a0f75cc8997182a8a4094))
|
- **variables6:** minor typo (#419) ([524e17df](https://github.com/rust-lang/rustlings/commit/524e17df10db95f7b90a0f75cc8997182a8a4094))
|
||||||
|
|
||||||
<a name="3.0.0"></a>
|
|
||||||
|
|
||||||
## 3.0.0 (2020-04-11)
|
## 3.0.0 (2020-04-11)
|
||||||
|
|
||||||
#### Breaking Changes
|
#### Breaking Changes
|
||||||
@ -525,8 +794,6 @@
|
|||||||
- add new exercises for generics (#280) ([76be5e4e](https://github.com/rust-lang/rustlings/commit/76be5e4e991160f5fd9093f03ee2ba260e8f7229))
|
- add new exercises for generics (#280) ([76be5e4e](https://github.com/rust-lang/rustlings/commit/76be5e4e991160f5fd9093f03ee2ba260e8f7229))
|
||||||
- **ci:** add buildkite config ([b049fa2c](https://github.com/rust-lang/rustlings/commit/b049fa2c84dba0f0c8906ac44e28fd45fba51a71))
|
- **ci:** add buildkite config ([b049fa2c](https://github.com/rust-lang/rustlings/commit/b049fa2c84dba0f0c8906ac44e28fd45fba51a71))
|
||||||
|
|
||||||
<a name="2.2.1"></a>
|
|
||||||
|
|
||||||
### 2.2.1 (2020-02-27)
|
### 2.2.1 (2020-02-27)
|
||||||
|
|
||||||
#### Bug Fixes
|
#### Bug Fixes
|
||||||
@ -537,13 +804,11 @@
|
|||||||
|
|
||||||
- Add clippy lints (#269) ([1e2fd9c9](https://github.com/rust-lang/rustlings/commit/1e2fd9c92f8cd6e389525ca1a999fca4c90b5921))
|
- Add clippy lints (#269) ([1e2fd9c9](https://github.com/rust-lang/rustlings/commit/1e2fd9c92f8cd6e389525ca1a999fca4c90b5921))
|
||||||
|
|
||||||
<a name="2.2.0"></a>
|
|
||||||
|
|
||||||
## 2.2.0 (2020-02-25)
|
## 2.2.0 (2020-02-25)
|
||||||
|
|
||||||
#### Bug Fixes
|
#### Bug Fixes
|
||||||
|
|
||||||
- Update deps to version compatable with aarch64-pc-windows (#263) ([19a93428](https://github.com/rust-lang/rustlings/commit/19a93428b3c73d994292671f829bdc8e5b7b3401))
|
- Update deps to version compatible with aarch64-pc-windows (#263) ([19a93428](https://github.com/rust-lang/rustlings/commit/19a93428b3c73d994292671f829bdc8e5b7b3401))
|
||||||
- **docs:**
|
- **docs:**
|
||||||
- Added a necessary step to Windows installation process (#242) ([3906efcd](https://github.com/rust-lang/rustlings/commit/3906efcd52a004047b460ed548037093de3f523f))
|
- Added a necessary step to Windows installation process (#242) ([3906efcd](https://github.com/rust-lang/rustlings/commit/3906efcd52a004047b460ed548037093de3f523f))
|
||||||
- Fixed mangled sentence from book; edited for clarity (#266) ([ade52ff](https://github.com/rust-lang/rustlings/commit/ade52ffb739987287ddd5705944c8777705faed9))
|
- Fixed mangled sentence from book; edited for clarity (#266) ([ade52ff](https://github.com/rust-lang/rustlings/commit/ade52ffb739987287ddd5705944c8777705faed9))
|
||||||
@ -566,8 +831,6 @@
|
|||||||
- Added traits exercises (#274 but specifically #216, which originally added
|
- Added traits exercises (#274 but specifically #216, which originally added
|
||||||
this :heart:) ([b559cdd](https://github.com/rust-lang/rustlings/commit/b559cdd73f32c0d0cfc1feda39f82b3e3583df17))
|
this :heart:) ([b559cdd](https://github.com/rust-lang/rustlings/commit/b559cdd73f32c0d0cfc1feda39f82b3e3583df17))
|
||||||
|
|
||||||
<a name="2.1.0"></a>
|
|
||||||
|
|
||||||
## 2.1.0 (2019-11-27)
|
## 2.1.0 (2019-11-27)
|
||||||
|
|
||||||
#### Bug Fixes
|
#### Bug Fixes
|
||||||
@ -585,8 +848,6 @@
|
|||||||
|
|
||||||
- **watch:** show hint while watching ([8143d57b](https://github.com/rust-lang/rustlings/commit/8143d57b4e88c51341dd4a18a14c536042cc009c))
|
- **watch:** show hint while watching ([8143d57b](https://github.com/rust-lang/rustlings/commit/8143d57b4e88c51341dd4a18a14c536042cc009c))
|
||||||
|
|
||||||
<a name="2.0.0"></a>
|
|
||||||
|
|
||||||
## 2.0.0 (2019-11-12)
|
## 2.0.0 (2019-11-12)
|
||||||
|
|
||||||
#### Bug Fixes
|
#### Bug Fixes
|
||||||
@ -607,8 +868,6 @@
|
|||||||
- **cli:** check for rustc before doing anything ([36a033b8](https://github.com/rust-lang/rustlings/commit/36a033b87a6549c1e5639c908bf7381c84f4f425))
|
- **cli:** check for rustc before doing anything ([36a033b8](https://github.com/rust-lang/rustlings/commit/36a033b87a6549c1e5639c908bf7381c84f4f425))
|
||||||
- **hint:** Add test for hint ([ce9fa6eb](https://github.com/rust-lang/rustlings/commit/ce9fa6ebbfdc3e7585d488d9409797285708316f))
|
- **hint:** Add test for hint ([ce9fa6eb](https://github.com/rust-lang/rustlings/commit/ce9fa6ebbfdc3e7585d488d9409797285708316f))
|
||||||
|
|
||||||
<a name="1.5.1"></a>
|
|
||||||
|
|
||||||
### 1.5.1 (2019-11-11)
|
### 1.5.1 (2019-11-11)
|
||||||
|
|
||||||
#### Bug Fixes
|
#### Bug Fixes
|
||||||
@ -620,8 +879,6 @@
|
|||||||
- **threads:** Move Threads behind SLT ([fbe91a67](https://github.com/rust-lang/rustlings/commit/fbe91a67a482bfe64cbcdd58d06ba830a0f39da3), closes [#205](https://github.com/rust-lang/rustlings/issues/205))
|
- **threads:** Move Threads behind SLT ([fbe91a67](https://github.com/rust-lang/rustlings/commit/fbe91a67a482bfe64cbcdd58d06ba830a0f39da3), closes [#205](https://github.com/rust-lang/rustlings/issues/205))
|
||||||
- **watch:** clear screen before each `verify()` ([3aff590](https://github.com/rust-lang/rustlings/commit/3aff59085586c24196a547c2693adbdcf4432648))
|
- **watch:** clear screen before each `verify()` ([3aff590](https://github.com/rust-lang/rustlings/commit/3aff59085586c24196a547c2693adbdcf4432648))
|
||||||
|
|
||||||
<a name="1.5.0"></a>
|
|
||||||
|
|
||||||
## 1.5.0 (2019-11-09)
|
## 1.5.0 (2019-11-09)
|
||||||
|
|
||||||
#### Bug Fixes
|
#### Bug Fixes
|
||||||
@ -646,8 +903,6 @@
|
|||||||
- Added exercise for struct update syntax ([1c4c8764](https://github.com/rust-lang/rustlings/commit/1c4c8764ed118740cd4cee73272ddc6cceb9d959))
|
- Added exercise for struct update syntax ([1c4c8764](https://github.com/rust-lang/rustlings/commit/1c4c8764ed118740cd4cee73272ddc6cceb9d959))
|
||||||
- **iterators2:** adds iterators2 exercise including config ([9288fccf](https://github.com/rust-lang/rustlings/commit/9288fccf07a2c5043b76d0fd6491e4cf72d76031))
|
- **iterators2:** adds iterators2 exercise including config ([9288fccf](https://github.com/rust-lang/rustlings/commit/9288fccf07a2c5043b76d0fd6491e4cf72d76031))
|
||||||
|
|
||||||
<a name="1.4.1"></a>
|
|
||||||
|
|
||||||
### 1.4.1 (2019-08-13)
|
### 1.4.1 (2019-08-13)
|
||||||
|
|
||||||
#### Bug Fixes
|
#### Bug Fixes
|
||||||
@ -656,8 +911,6 @@
|
|||||||
- **option1:** Add test for prematurely passing exercise ([a750e4a1](https://github.com/rust-lang/rustlings/commit/a750e4a1a3006227292bb17d57d78ce84da6bfc6))
|
- **option1:** Add test for prematurely passing exercise ([a750e4a1](https://github.com/rust-lang/rustlings/commit/a750e4a1a3006227292bb17d57d78ce84da6bfc6))
|
||||||
- **test1:** Swap assertion parameter order ([4086d463](https://github.com/rust-lang/rustlings/commit/4086d463a981e81d97781851d17db2ced290f446))
|
- **test1:** Swap assertion parameter order ([4086d463](https://github.com/rust-lang/rustlings/commit/4086d463a981e81d97781851d17db2ced290f446))
|
||||||
|
|
||||||
<a name="1.4.0"></a>
|
|
||||||
|
|
||||||
## 1.4.0 (2019-07-13)
|
## 1.4.0 (2019-07-13)
|
||||||
|
|
||||||
#### Bug Fixes
|
#### Bug Fixes
|
||||||
@ -674,8 +927,6 @@
|
|||||||
- **changelog:** Use clog for changelogs ([34e31232](https://github.com/rust-lang/rustlings/commit/34e31232dfddde284a341c9609b33cd27d9d5724))
|
- **changelog:** Use clog for changelogs ([34e31232](https://github.com/rust-lang/rustlings/commit/34e31232dfddde284a341c9609b33cd27d9d5724))
|
||||||
- **iterators2:** adds iterators2 exercise including config ([9288fccf](https://github.com/rust-lang/rustlings/commit/9288fccf07a2c5043b76d0fd6491e4cf72d76031))
|
- **iterators2:** adds iterators2 exercise including config ([9288fccf](https://github.com/rust-lang/rustlings/commit/9288fccf07a2c5043b76d0fd6491e4cf72d76031))
|
||||||
|
|
||||||
<a name="1.3.0"></a>
|
|
||||||
|
|
||||||
### 1.3.0 (2019-06-05)
|
### 1.3.0 (2019-06-05)
|
||||||
|
|
||||||
#### Features
|
#### Features
|
||||||
@ -691,16 +942,12 @@
|
|||||||
- Fix broken link (#164, @HanKruiger)
|
- Fix broken link (#164, @HanKruiger)
|
||||||
- Remove highlighting and syntect (#167, @komaeda)
|
- Remove highlighting and syntect (#167, @komaeda)
|
||||||
|
|
||||||
<a name="1.2.2"></a>
|
|
||||||
|
|
||||||
### 1.2.2 (2019-05-07)
|
### 1.2.2 (2019-05-07)
|
||||||
|
|
||||||
#### Bug Fixes
|
#### Bug Fixes
|
||||||
|
|
||||||
- Reverted `--nocapture` flag since it was causing tests to pass unconditionally
|
- Reverted `--nocapture` flag since it was causing tests to pass unconditionally
|
||||||
|
|
||||||
<a name="1.2.1"></a>
|
|
||||||
|
|
||||||
### 1.2.1 (2019-04-22)
|
### 1.2.1 (2019-04-22)
|
||||||
|
|
||||||
#### Bug Fixes
|
#### Bug Fixes
|
||||||
@ -708,8 +955,6 @@
|
|||||||
- Fix the `--nocapture` feature (@komaeda)
|
- Fix the `--nocapture` feature (@komaeda)
|
||||||
- Provide a nicer error message for when you're in the wrong directory
|
- Provide a nicer error message for when you're in the wrong directory
|
||||||
|
|
||||||
<a name="1.2.0"></a>
|
|
||||||
|
|
||||||
### 1.2.0 (2019-04-22)
|
### 1.2.0 (2019-04-22)
|
||||||
|
|
||||||
#### Features
|
#### Features
|
||||||
@ -717,8 +962,6 @@
|
|||||||
- Add errors to exercises that compile without user changes (@yvan-sraka)
|
- Add errors to exercises that compile without user changes (@yvan-sraka)
|
||||||
- Use --nocapture when testing, enabling `println!` when running (@komaeda)
|
- Use --nocapture when testing, enabling `println!` when running (@komaeda)
|
||||||
|
|
||||||
<a name="1.1.1"></a>
|
|
||||||
|
|
||||||
### 1.1.1 (2019-04-14)
|
### 1.1.1 (2019-04-14)
|
||||||
|
|
||||||
#### Bug fixes
|
#### Bug fixes
|
||||||
@ -731,8 +974,6 @@
|
|||||||
- Fix links by deleting book version (@diodfr, #142)
|
- Fix links by deleting book version (@diodfr, #142)
|
||||||
- Canonicalize paths to fix path matching (@cjpearce, #143)
|
- Canonicalize paths to fix path matching (@cjpearce, #143)
|
||||||
|
|
||||||
<a name="1.1.0"></a>
|
|
||||||
|
|
||||||
### 1.1.0 (2019-03-20)
|
### 1.1.0 (2019-03-20)
|
||||||
|
|
||||||
- errors2.rs: update link to Rust book (#124)
|
- errors2.rs: update link to Rust book (#124)
|
||||||
@ -742,16 +983,12 @@
|
|||||||
- Give a warning when Rustlings isn't run from the right directory (#123)
|
- Give a warning when Rustlings isn't run from the right directory (#123)
|
||||||
- Verify that rust version is recent enough to install Rustlings (#131)
|
- Verify that rust version is recent enough to install Rustlings (#131)
|
||||||
|
|
||||||
<a name="1.0.1"></a>
|
|
||||||
|
|
||||||
### 1.0.1 (2019-03-06)
|
### 1.0.1 (2019-03-06)
|
||||||
|
|
||||||
- Adds a way to install Rustlings in one command (`curl -L https://git.io/rustlings | bash`)
|
- Adds a way to install Rustlings in one command (`curl -L https://git.io/rustlings | bash`)
|
||||||
- Makes `rustlings watch` react to create file events (@shaunbennett, #117)
|
- Makes `rustlings watch` react to create file events (@shaunbennett, #117)
|
||||||
- Reworks the exercise management to use an external TOML file instead of just listing them in the code
|
- Reworks the exercise management to use an external TOML file instead of just listing them in the code
|
||||||
|
|
||||||
<a name="1.0.0"></a>
|
|
||||||
|
|
||||||
### 1.0.0 (2019-03-06)
|
### 1.0.0 (2019-03-06)
|
||||||
|
|
||||||
Initial release.
|
Initial release.
|
||||||
|
|||||||
153
CONTRIBUTING.md
153
CONTRIBUTING.md
@ -1,130 +1,61 @@
|
|||||||
## Contributing to Rustlings
|
# Contributing to Rustlings
|
||||||
|
|
||||||
First off, thanks for taking the time to contribute!! ❤️
|
First off, thanks for taking the time to contribute! ❤️
|
||||||
|
|
||||||
### Quick Reference
|
## Quick Reference
|
||||||
|
|
||||||
I want to...
|
I want to …
|
||||||
|
|
||||||
_add an exercise! ➡️ [read this](#addex) and then [open a Pull Request](#prs)_
|
- _report a bug!_ ➡️ [open an issue](#issues)
|
||||||
|
- _fix a bug!_ ➡️ [open a pull request](#pull-requests)
|
||||||
|
- _implement a new feature!_ ➡️ [open an issue to discuss it first, then a pull request](#issues)
|
||||||
|
- _add an exercise!_ ➡️ [read this](#adding-an-exercise)
|
||||||
|
- _update an outdated exercise!_ ➡️ [open a pull request](#pull-requests)
|
||||||
|
|
||||||
_update an outdated exercise! ➡️ [open a Pull Request](#prs)_
|
## Issues
|
||||||
|
|
||||||
_report a bug! ➡️ [open an Issue](#issues)_
|
|
||||||
|
|
||||||
_fix a bug! ➡️ [open a Pull Request](#prs)_
|
|
||||||
|
|
||||||
_implement a new feature! ➡️ [open an Issue to discuss it first, then a Pull Request](#issues)_
|
|
||||||
|
|
||||||
<a name="#src"></a>
|
|
||||||
### Working on the source code
|
|
||||||
|
|
||||||
`rustlings` is basically a glorified `rustc` wrapper. Therefore the source code
|
|
||||||
isn't really that complicated since the bulk of the work is done by `rustc`.
|
|
||||||
`src/main.rs` contains a simple `argh` CLI that connects to most of the other source files.
|
|
||||||
|
|
||||||
<a name="addex"></a>
|
|
||||||
### Adding an exercise
|
|
||||||
|
|
||||||
The first step is to add the exercise! Name the file `exercises/yourTopic/yourTopicN.rs`, make sure to
|
|
||||||
put in some helpful links, and link to sections of the book in `exercises/yourTopic/README.md`.
|
|
||||||
|
|
||||||
Next make sure it runs with `rustlings`. The exercise metadata is stored in `info.toml`, under the `exercises` array. The order of the `exercises` array determines the order the exercises are run by `rustlings verify` and `rustlings watch`.
|
|
||||||
|
|
||||||
Add the metadata for your exercise in the correct order in the `exercises` array. If you are unsure of the correct ordering, add it at the bottom and ask in your pull request. The exercise metadata should contain the following:
|
|
||||||
```diff
|
|
||||||
...
|
|
||||||
+ [[exercises]]
|
|
||||||
+ name = "yourTopicN"
|
|
||||||
+ path = "exercises/yourTopic/yourTopicN.rs"
|
|
||||||
+ mode = "compile"
|
|
||||||
+ hint = """
|
|
||||||
+ Some kind of useful hint for your exercise."""
|
|
||||||
...
|
|
||||||
```
|
|
||||||
|
|
||||||
The `mode` attribute decides whether Rustlings will only compile your exercise, or compile and test it. If you have tests to verify in your exercise, choose `test`, otherwise `compile`. If you're working on a Clippy exercise, use `mode = "clippy"`.
|
|
||||||
|
|
||||||
That's all! Feel free to put up a pull request.
|
|
||||||
|
|
||||||
<a name="issues"></a>
|
|
||||||
### Issues
|
|
||||||
|
|
||||||
You can open an issue [here](https://github.com/rust-lang/rustlings/issues/new).
|
You can open an issue [here](https://github.com/rust-lang/rustlings/issues/new).
|
||||||
If you're reporting a bug, please include the output of the following commands:
|
If you're reporting a bug, please include the output of the following commands:
|
||||||
|
|
||||||
- `rustc --version`
|
- `cargo --version`
|
||||||
- `rustlings --version`
|
- `rustlings --version`
|
||||||
- `ls -la`
|
- `ls -la`
|
||||||
- Your OS name and version
|
- Your OS name and version
|
||||||
|
|
||||||
<a name="prs"></a>
|
## Pull Requests
|
||||||
### Pull Requests
|
|
||||||
|
|
||||||
Opening a pull request is as easy as forking the repository and committing your
|
You are welcome to open a pull request, but unless it is small and trivial, **please open an issue to discuss your idea first** 🙏🏼
|
||||||
changes. There's a couple of things to watch out for:
|
|
||||||
|
|
||||||
#### Write correct commit messages
|
Opening a pull request is as easy as forking the repository and committing your changes.
|
||||||
|
If you need any help with it or face any Git related problems, don't hesitate to ask for help 🤗
|
||||||
|
|
||||||
We follow the [Conventional Commits](https://www.conventionalcommits.org/en/v1.0.0-beta.4/)
|
It may take time to review your pull request.
|
||||||
specification.
|
Please be patient 😇
|
||||||
This means that you have to format your commit messages in a specific way. Say
|
|
||||||
you're working on adding a new exercise called `foobar1.rs`. You could write
|
|
||||||
the following commit message:
|
|
||||||
|
|
||||||
```
|
When updating an exercise, check if its solution needs to be updated.
|
||||||
feat: add foobar1.rs exercise
|
|
||||||
|
## Adding An Exercise
|
||||||
|
|
||||||
|
- Name the file `exercises/yourTopic/yourTopicN.rs`.
|
||||||
|
- Make sure to put in some helpful links, and link to sections of The Book in `exercises/yourTopic/README.md`.
|
||||||
|
- In the exercise, add a `// TODO: …` comment where user changes are required.
|
||||||
|
- Add a solution at `solutions/yourTopic/yourTopicN.rs` with comments explaining it.
|
||||||
|
- Add the [metadata for your exercise](#exercise-metadata) in the `rustlings-macros/info.toml` file.
|
||||||
|
- Make sure your exercise runs with `rustlings run yourTopicN`.
|
||||||
|
- [Open a pull request](#pull-requests).
|
||||||
|
|
||||||
|
### Exercise Metadata
|
||||||
|
|
||||||
|
The exercise metadata should contain the following:
|
||||||
|
|
||||||
|
```toml
|
||||||
|
[[exercises]]
|
||||||
|
name = "yourTopicN"
|
||||||
|
dir = "yourTopic"
|
||||||
|
hint = """
|
||||||
|
A useful (multi-line) hint for your exercise.
|
||||||
|
Include links to a section in The Book or a documentation page."""
|
||||||
```
|
```
|
||||||
|
|
||||||
If you're just fixing a bug, please use the `fix` type:
|
If your exercise doesn't contain any test, add `test = false` to the exercise metadata.
|
||||||
|
But adding tests is recommended.
|
||||||
```
|
|
||||||
fix(verify): make sure verify doesn't self-destruct
|
|
||||||
```
|
|
||||||
|
|
||||||
The scope within the brackets is optional, but should be any of these:
|
|
||||||
|
|
||||||
- `installation` (for the installation script)
|
|
||||||
- `cli` (for general CLI changes)
|
|
||||||
- `verify` (for the verification source file)
|
|
||||||
- `watch` (for the watch functionality source)
|
|
||||||
- `run` (for the run functionality source)
|
|
||||||
- `EXERCISENAME` (if you're changing a specific exercise, or set of exercises,
|
|
||||||
substitute them here)
|
|
||||||
|
|
||||||
When the commit also happens to close an existing issue, link it in the message
|
|
||||||
body:
|
|
||||||
|
|
||||||
```
|
|
||||||
fix: update foobar
|
|
||||||
|
|
||||||
closes #101029908
|
|
||||||
```
|
|
||||||
|
|
||||||
If you're doing simple changes, like updating a book link, use `chore`:
|
|
||||||
|
|
||||||
```
|
|
||||||
chore: update exercise1.rs book link
|
|
||||||
```
|
|
||||||
|
|
||||||
If you're updating documentation, use `docs`:
|
|
||||||
|
|
||||||
```
|
|
||||||
docs: add more information to Readme
|
|
||||||
```
|
|
||||||
|
|
||||||
If, and only if, you're absolutely sure you want to make a breaking change
|
|
||||||
(please discuss this beforehand!), add an exclamation mark to the type and
|
|
||||||
explain the breaking change in the message body:
|
|
||||||
|
|
||||||
```
|
|
||||||
fix!: completely change verification
|
|
||||||
|
|
||||||
BREAKING CHANGE: This has to be done because lorem ipsum dolor
|
|
||||||
```
|
|
||||||
|
|
||||||
#### Pull Request Workflow
|
|
||||||
|
|
||||||
Once you open a Pull Request, it may be reviewed or labeled (or both) until
|
|
||||||
the maintainers accept your change. Please be patient, it may take some time
|
|
||||||
for this to happen!
|
|
||||||
|
|||||||
938
Cargo.lock
generated
938
Cargo.lock
generated
File diff suppressed because it is too large
Load Diff
100
Cargo.toml
100
Cargo.toml
@ -1,29 +1,87 @@
|
|||||||
|
[workspace]
|
||||||
|
exclude = [
|
||||||
|
"tests/test_exercises",
|
||||||
|
"dev",
|
||||||
|
]
|
||||||
|
|
||||||
|
[workspace.package]
|
||||||
|
version = "6.5.0"
|
||||||
|
authors = [
|
||||||
|
"Mo Bitar <mo8it@proton.me>", # https://github.com/mo8it
|
||||||
|
"Liv <mokou@fastmail.com>", # https://github.com/shadows-withal
|
||||||
|
# Alumni
|
||||||
|
"Carol (Nichols || Goulding) <carol.nichols@gmail.com>", # https://github.com/carols10cents
|
||||||
|
]
|
||||||
|
repository = "https://github.com/rust-lang/rustlings"
|
||||||
|
license = "MIT"
|
||||||
|
edition = "2024" # On Update: Update the edition of `rustfmt` in `dev check` and `CARGO_TOML` in `dev new`.
|
||||||
|
rust-version = "1.88"
|
||||||
|
|
||||||
|
[workspace.dependencies]
|
||||||
|
serde = { version = "1.0", features = ["derive"] }
|
||||||
|
toml = { version = "0.9", default-features = false, features = ["std", "parse", "serde"] }
|
||||||
|
|
||||||
[package]
|
[package]
|
||||||
name = "rustlings"
|
name = "rustlings"
|
||||||
version = "5.4.0"
|
description = "Small exercises to get you used to reading and writing Rust code!"
|
||||||
authors = [
|
version.workspace = true
|
||||||
"Liv <mokou@fastmail.com>",
|
authors.workspace = true
|
||||||
"Carol (Nichols || Goulding) <carol.nichols@gmail.com>",
|
repository.workspace = true
|
||||||
|
license.workspace = true
|
||||||
|
edition.workspace = true
|
||||||
|
rust-version.workspace = true
|
||||||
|
keywords = [
|
||||||
|
"exercise",
|
||||||
|
"learning",
|
||||||
|
]
|
||||||
|
include = [
|
||||||
|
"/src/",
|
||||||
|
"/exercises/",
|
||||||
|
"/solutions/",
|
||||||
|
# A symlink to be able to include `dev/Cargo.toml` although `dev` is excluded.
|
||||||
|
"/dev-Cargo.toml",
|
||||||
|
"/README.md",
|
||||||
|
"/LICENSE",
|
||||||
]
|
]
|
||||||
edition = "2021"
|
|
||||||
|
|
||||||
[dependencies]
|
[dependencies]
|
||||||
argh = "0.1"
|
anyhow = "1.0"
|
||||||
indicatif = "0.16"
|
clap = { version = "4.5", features = ["derive"] }
|
||||||
console = "0.15"
|
crossterm = { version = "0.29", default-features = false, features = ["windows", "events"] }
|
||||||
notify = "4.0"
|
notify = "8.0"
|
||||||
toml = "0.5"
|
rustlings-macros = { path = "rustlings-macros", version = "=6.5.0" }
|
||||||
regex = "1.5"
|
serde_json = "1.0"
|
||||||
serde = { version = "1.0", features = ["derive"] }
|
serde.workspace = true
|
||||||
serde_json = "1.0.81"
|
toml.workspace = true
|
||||||
home = "0.5.3"
|
|
||||||
glob = "0.3.0"
|
|
||||||
|
|
||||||
[[bin]]
|
[target.'cfg(not(windows))'.dependencies]
|
||||||
name = "rustlings"
|
rustix = { version = "1.0", default-features = false, features = ["std", "stdio", "termios"] }
|
||||||
path = "src/main.rs"
|
|
||||||
|
|
||||||
[dev-dependencies]
|
[dev-dependencies]
|
||||||
assert_cmd = "0.11.0"
|
tempfile = "3.21"
|
||||||
predicates = "1.0.1"
|
|
||||||
glob = "0.3.0"
|
[profile.release]
|
||||||
|
panic = "abort"
|
||||||
|
|
||||||
|
[profile.dev]
|
||||||
|
panic = "abort"
|
||||||
|
|
||||||
|
[package.metadata.release]
|
||||||
|
pre-release-hook = ["./release-hook.sh"]
|
||||||
|
pre-release-commit-message = "Release 🎉"
|
||||||
|
|
||||||
|
[workspace.lints.rust]
|
||||||
|
unsafe_code = "forbid"
|
||||||
|
unstable_features = "forbid"
|
||||||
|
|
||||||
|
[workspace.lints.clippy]
|
||||||
|
empty_loop = "forbid"
|
||||||
|
disallowed-types = "deny"
|
||||||
|
disallowed-methods = "deny"
|
||||||
|
infinite_loop = "deny"
|
||||||
|
mem_forget = "deny"
|
||||||
|
dbg_macro = "warn"
|
||||||
|
todo = "warn"
|
||||||
|
|
||||||
|
[lints]
|
||||||
|
workspace = true
|
||||||
|
|||||||
178
README.md
178
README.md
@ -1,177 +1,7 @@
|
|||||||
# rustlings 🦀❤️
|
# [Rustlings](https://rustlings.rust-lang.org) 🦀
|
||||||
|
|
||||||
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!
|
Small exercises to get you used to reading and writing [Rust](https://www.rust-lang.org) code - _Recommended in parallel to reading [the official Rust book](https://doc.rust-lang.org/book) 📚️_
|
||||||
|
|
||||||
_...looking for the old, web-based version of Rustlings? Try [here](https://github.com/rust-lang/rustlings/tree/rustlings-1)_
|
Visit the **website** for a demo, info about setup and more:
|
||||||
|
|
||||||
Alternatively, for a first-time Rust learner, there are several other resources:
|
## ➡️ [rustlings.rust-lang.org](https://rustlings.rust-lang.org) ⬅️
|
||||||
|
|
||||||
- [The Book](https://doc.rust-lang.org/book/index.html) - The most comprehensive resource for learning Rust, but a bit theoretical sometimes. You will be using this along with Rustlings!
|
|
||||||
- [Rust By Example](https://doc.rust-lang.org/rust-by-example/index.html) - Learn Rust by solving little exercises! It's almost like `rustlings`, but online
|
|
||||||
|
|
||||||
## Getting Started
|
|
||||||
|
|
||||||
_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.
|
|
||||||
|
|
||||||
## MacOS/Linux
|
|
||||||
|
|
||||||
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:
|
|
||||||
curl -L https://raw.githubusercontent.com/rust-lang/rustlings/main/install.sh | bash -s mypath/
|
|
||||||
```
|
|
||||||
|
|
||||||
This will install Rustlings and give you access to the `rustlings` command. Run it to get started!
|
|
||||||
|
|
||||||
### Nix
|
|
||||||
|
|
||||||
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.0)
|
|
||||||
git clone -b 5.4.0 --depth 1 https://github.com/rust-lang/rustlings
|
|
||||||
cd rustlings
|
|
||||||
# if nix version > 2.3
|
|
||||||
nix develop
|
|
||||||
# if nix version <= 2.3
|
|
||||||
nix-shell
|
|
||||||
```
|
|
||||||
|
|
||||||
## Windows
|
|
||||||
|
|
||||||
In PowerShell (Run as Administrator), set `ExecutionPolicy` to `RemoteSigned`:
|
|
||||||
|
|
||||||
```ps1
|
|
||||||
Set-ExecutionPolicy -ExecutionPolicy RemoteSigned -Scope CurrentUser
|
|
||||||
```
|
|
||||||
|
|
||||||
Then, you can run:
|
|
||||||
|
|
||||||
```ps1
|
|
||||||
Start-BitsTransfer -Source https://raw.githubusercontent.com/rust-lang/rustlings/main/install.ps1 -Destination $env:TMP/install_rustlings.ps1; Unblock-File $env:TMP/install_rustlings.ps1; Invoke-Expression $env:TMP/install_rustlings.ps1
|
|
||||||
```
|
|
||||||
|
|
||||||
To install Rustlings. Same as on MacOS/Linux, you will have access to the `rustlings` command after it. Keep in mind that this works best in PowerShell, and any other terminals may give you errors.
|
|
||||||
|
|
||||||
If you get a permission denied message, you might have to exclude the directory where you cloned Rustlings in your antivirus.
|
|
||||||
|
|
||||||
## Browser
|
|
||||||
|
|
||||||
[Run on Repl.it](https://repl.it/github/rust-lang/rustlings)
|
|
||||||
|
|
||||||
[](https://gitpod.io/#https://github.com/rust-lang/rustlings)
|
|
||||||
|
|
||||||
## Manually
|
|
||||||
|
|
||||||
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.0)
|
|
||||||
git clone -b 5.4.0 --depth 1 https://github.com/rust-lang/rustlings
|
|
||||||
cd rustlings
|
|
||||||
cargo install --force --path .
|
|
||||||
```
|
|
||||||
|
|
||||||
If there are installation errors, ensure that your toolchain is up to date. For the latest, run:
|
|
||||||
|
|
||||||
```bash
|
|
||||||
rustup update
|
|
||||||
```
|
|
||||||
|
|
||||||
Then, same as above, run `rustlings` to get started.
|
|
||||||
|
|
||||||
## Doing exercises
|
|
||||||
|
|
||||||
The exercises are sorted by topic and can be found in the subdirectory `rustlings/exercises/<topic>`. For every topic there is an additional README file with some resources to get you started on the topic. We really recommend that you have a look at them before you start.
|
|
||||||
|
|
||||||
The task is simple. Most exercises contain an error that keeps them from compiling, and it's up to you to fix it! Some exercises are also run as tests, but rustlings handles them all the same. To run the exercises in the recommended order, execute:
|
|
||||||
|
|
||||||
```bash
|
|
||||||
rustlings watch
|
|
||||||
```
|
|
||||||
|
|
||||||
This will try to verify the completion of every exercise in a predetermined order (what we think is best for newcomers). It will also rerun automatically every time you change a file in the `exercises/` directory. If you want to only run it once, you can use:
|
|
||||||
|
|
||||||
```bash
|
|
||||||
rustlings verify
|
|
||||||
```
|
|
||||||
|
|
||||||
This will do the same as watch, but it'll quit after running.
|
|
||||||
|
|
||||||
In case you want to go by your own order, or want to only verify a single exercise, you can run:
|
|
||||||
|
|
||||||
```bash
|
|
||||||
rustlings run myExercise1
|
|
||||||
```
|
|
||||||
|
|
||||||
Or simply use the following command to run the next unsolved exercise in the course:
|
|
||||||
|
|
||||||
```bash
|
|
||||||
rustlings run next
|
|
||||||
```
|
|
||||||
|
|
||||||
In case you get stuck, you can run the following command to get a hint for your
|
|
||||||
exercise:
|
|
||||||
|
|
||||||
```bash
|
|
||||||
rustlings hint myExercise1
|
|
||||||
```
|
|
||||||
|
|
||||||
You can also get the hint for the next unsolved exercise with the following command:
|
|
||||||
|
|
||||||
```bash
|
|
||||||
rustlings hint next
|
|
||||||
```
|
|
||||||
|
|
||||||
To check your progress, you can run the following command:
|
|
||||||
|
|
||||||
```bash
|
|
||||||
rustlings list
|
|
||||||
```
|
|
||||||
|
|
||||||
## Testing yourself
|
|
||||||
|
|
||||||
After every couple of sections, there will be a quiz that'll test your knowledge on a bunch of sections at once. These quizzes are found in `exercises/quizN.rs`.
|
|
||||||
|
|
||||||
## Enabling `rust-analyzer`
|
|
||||||
|
|
||||||
Run the command `rustlings lsp` which will generate a `rust-project.json` at the root of the project, this allows [rust-analyzer](https://rust-analyzer.github.io/) to parse each exercise.
|
|
||||||
|
|
||||||
## Continuing On
|
|
||||||
|
|
||||||
Once you've completed Rustlings, put your new knowledge to good use! Continue practicing your Rust skills by building your own projects, contributing to Rustlings, or finding other open-source projects to contribute to.
|
|
||||||
|
|
||||||
## Uninstalling Rustlings
|
|
||||||
|
|
||||||
If you want to remove Rustlings from your system, there are two steps. First, you'll need to remove the exercises folder that the install script created
|
|
||||||
for you:
|
|
||||||
|
|
||||||
```bash
|
|
||||||
rm -rf rustlings # or your custom folder name, if you chose and or renamed it
|
|
||||||
```
|
|
||||||
|
|
||||||
Second, since Rustlings got installed via `cargo install`, it's only reasonable to assume that you can also remove it using Cargo, and
|
|
||||||
exactly that is the case. Run `cargo uninstall` to remove the `rustlings` binary:
|
|
||||||
|
|
||||||
```bash
|
|
||||||
cargo uninstall rustlings
|
|
||||||
```
|
|
||||||
|
|
||||||
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!
|
|
||||||
|
|
||||||
## Contributors ✨
|
|
||||||
|
|
||||||
Thanks goes to the wonderful people listed in [AUTHORS.md](./AUTHORS.md) 🎉
|
|
||||||
|
|||||||
5
build.rs
Normal file
5
build.rs
Normal file
@ -0,0 +1,5 @@
|
|||||||
|
fn main() {
|
||||||
|
// Fix building from source on Windows because it can't handle file links.
|
||||||
|
#[cfg(windows)]
|
||||||
|
let _ = std::fs::copy("dev/Cargo.toml", "dev-Cargo.toml");
|
||||||
|
}
|
||||||
11
clippy.toml
Normal file
11
clippy.toml
Normal file
@ -0,0 +1,11 @@
|
|||||||
|
disallowed-types = [
|
||||||
|
{ path = "crossterm::style::Stylize", reason = "inefficient, use `.queue(…)` instead" },
|
||||||
|
{ path = "crossterm::style::styled_content::StyledContent", reason = "inefficient, use `.queue(…)` instead" },
|
||||||
|
]
|
||||||
|
|
||||||
|
disallowed-methods = [
|
||||||
|
{ path = "crossterm::style::style", reason = "inefficient, use `.queue(…)` instead" },
|
||||||
|
{ path = "std::thread::spawn", replacement = "std::thread::Builder::spawn", reason = "handle the error" },
|
||||||
|
{ path = "std::thread::Scope::spawn", replacement = "std::thread::Builder::spawn", reason = "handle the error" },
|
||||||
|
{ path = "std::process::exit", replacement = "std::process::ExitCode" },
|
||||||
|
]
|
||||||
1
dev-Cargo.toml
Symbolic link
1
dev-Cargo.toml
Symbolic link
@ -0,0 +1 @@
|
|||||||
|
dev/Cargo.toml
|
||||||
223
dev/Cargo.toml
Normal file
223
dev/Cargo.toml
Normal file
@ -0,0 +1,223 @@
|
|||||||
|
# Don't edit the `bin` list manually! It is updated by `cargo dev update`. This comment line will be stripped in `rustlings init`.
|
||||||
|
bin = [
|
||||||
|
{ name = "intro1", path = "../exercises/00_intro/intro1.rs" },
|
||||||
|
{ name = "intro1_sol", path = "../solutions/00_intro/intro1.rs" },
|
||||||
|
{ name = "intro2", path = "../exercises/00_intro/intro2.rs" },
|
||||||
|
{ name = "intro2_sol", path = "../solutions/00_intro/intro2.rs" },
|
||||||
|
{ name = "variables1", path = "../exercises/01_variables/variables1.rs" },
|
||||||
|
{ name = "variables1_sol", path = "../solutions/01_variables/variables1.rs" },
|
||||||
|
{ name = "variables2", path = "../exercises/01_variables/variables2.rs" },
|
||||||
|
{ name = "variables2_sol", path = "../solutions/01_variables/variables2.rs" },
|
||||||
|
{ name = "variables3", path = "../exercises/01_variables/variables3.rs" },
|
||||||
|
{ name = "variables3_sol", path = "../solutions/01_variables/variables3.rs" },
|
||||||
|
{ name = "variables4", path = "../exercises/01_variables/variables4.rs" },
|
||||||
|
{ name = "variables4_sol", path = "../solutions/01_variables/variables4.rs" },
|
||||||
|
{ name = "variables5", path = "../exercises/01_variables/variables5.rs" },
|
||||||
|
{ name = "variables5_sol", path = "../solutions/01_variables/variables5.rs" },
|
||||||
|
{ name = "variables6", path = "../exercises/01_variables/variables6.rs" },
|
||||||
|
{ name = "variables6_sol", path = "../solutions/01_variables/variables6.rs" },
|
||||||
|
{ name = "functions1", path = "../exercises/02_functions/functions1.rs" },
|
||||||
|
{ name = "functions1_sol", path = "../solutions/02_functions/functions1.rs" },
|
||||||
|
{ name = "functions2", path = "../exercises/02_functions/functions2.rs" },
|
||||||
|
{ name = "functions2_sol", path = "../solutions/02_functions/functions2.rs" },
|
||||||
|
{ name = "functions3", path = "../exercises/02_functions/functions3.rs" },
|
||||||
|
{ name = "functions3_sol", path = "../solutions/02_functions/functions3.rs" },
|
||||||
|
{ name = "functions4", path = "../exercises/02_functions/functions4.rs" },
|
||||||
|
{ name = "functions4_sol", path = "../solutions/02_functions/functions4.rs" },
|
||||||
|
{ name = "functions5", path = "../exercises/02_functions/functions5.rs" },
|
||||||
|
{ name = "functions5_sol", path = "../solutions/02_functions/functions5.rs" },
|
||||||
|
{ name = "if1", path = "../exercises/03_if/if1.rs" },
|
||||||
|
{ name = "if1_sol", path = "../solutions/03_if/if1.rs" },
|
||||||
|
{ name = "if2", path = "../exercises/03_if/if2.rs" },
|
||||||
|
{ name = "if2_sol", path = "../solutions/03_if/if2.rs" },
|
||||||
|
{ name = "if3", path = "../exercises/03_if/if3.rs" },
|
||||||
|
{ name = "if3_sol", path = "../solutions/03_if/if3.rs" },
|
||||||
|
{ name = "quiz1", path = "../exercises/quizzes/quiz1.rs" },
|
||||||
|
{ name = "quiz1_sol", path = "../solutions/quizzes/quiz1.rs" },
|
||||||
|
{ name = "primitive_types1", path = "../exercises/04_primitive_types/primitive_types1.rs" },
|
||||||
|
{ name = "primitive_types1_sol", path = "../solutions/04_primitive_types/primitive_types1.rs" },
|
||||||
|
{ name = "primitive_types2", path = "../exercises/04_primitive_types/primitive_types2.rs" },
|
||||||
|
{ name = "primitive_types2_sol", path = "../solutions/04_primitive_types/primitive_types2.rs" },
|
||||||
|
{ name = "primitive_types3", path = "../exercises/04_primitive_types/primitive_types3.rs" },
|
||||||
|
{ name = "primitive_types3_sol", path = "../solutions/04_primitive_types/primitive_types3.rs" },
|
||||||
|
{ name = "primitive_types4", path = "../exercises/04_primitive_types/primitive_types4.rs" },
|
||||||
|
{ name = "primitive_types4_sol", path = "../solutions/04_primitive_types/primitive_types4.rs" },
|
||||||
|
{ name = "primitive_types5", path = "../exercises/04_primitive_types/primitive_types5.rs" },
|
||||||
|
{ name = "primitive_types5_sol", path = "../solutions/04_primitive_types/primitive_types5.rs" },
|
||||||
|
{ name = "primitive_types6", path = "../exercises/04_primitive_types/primitive_types6.rs" },
|
||||||
|
{ name = "primitive_types6_sol", path = "../solutions/04_primitive_types/primitive_types6.rs" },
|
||||||
|
{ name = "vecs1", path = "../exercises/05_vecs/vecs1.rs" },
|
||||||
|
{ name = "vecs1_sol", path = "../solutions/05_vecs/vecs1.rs" },
|
||||||
|
{ name = "vecs2", path = "../exercises/05_vecs/vecs2.rs" },
|
||||||
|
{ name = "vecs2_sol", path = "../solutions/05_vecs/vecs2.rs" },
|
||||||
|
{ name = "move_semantics1", path = "../exercises/06_move_semantics/move_semantics1.rs" },
|
||||||
|
{ name = "move_semantics1_sol", path = "../solutions/06_move_semantics/move_semantics1.rs" },
|
||||||
|
{ name = "move_semantics2", path = "../exercises/06_move_semantics/move_semantics2.rs" },
|
||||||
|
{ name = "move_semantics2_sol", path = "../solutions/06_move_semantics/move_semantics2.rs" },
|
||||||
|
{ name = "move_semantics3", path = "../exercises/06_move_semantics/move_semantics3.rs" },
|
||||||
|
{ name = "move_semantics3_sol", path = "../solutions/06_move_semantics/move_semantics3.rs" },
|
||||||
|
{ name = "move_semantics4", path = "../exercises/06_move_semantics/move_semantics4.rs" },
|
||||||
|
{ name = "move_semantics4_sol", path = "../solutions/06_move_semantics/move_semantics4.rs" },
|
||||||
|
{ name = "move_semantics5", path = "../exercises/06_move_semantics/move_semantics5.rs" },
|
||||||
|
{ name = "move_semantics5_sol", path = "../solutions/06_move_semantics/move_semantics5.rs" },
|
||||||
|
{ name = "structs1", path = "../exercises/07_structs/structs1.rs" },
|
||||||
|
{ name = "structs1_sol", path = "../solutions/07_structs/structs1.rs" },
|
||||||
|
{ name = "structs2", path = "../exercises/07_structs/structs2.rs" },
|
||||||
|
{ name = "structs2_sol", path = "../solutions/07_structs/structs2.rs" },
|
||||||
|
{ name = "structs3", path = "../exercises/07_structs/structs3.rs" },
|
||||||
|
{ name = "structs3_sol", path = "../solutions/07_structs/structs3.rs" },
|
||||||
|
{ name = "enums1", path = "../exercises/08_enums/enums1.rs" },
|
||||||
|
{ name = "enums1_sol", path = "../solutions/08_enums/enums1.rs" },
|
||||||
|
{ name = "enums2", path = "../exercises/08_enums/enums2.rs" },
|
||||||
|
{ name = "enums2_sol", path = "../solutions/08_enums/enums2.rs" },
|
||||||
|
{ name = "enums3", path = "../exercises/08_enums/enums3.rs" },
|
||||||
|
{ name = "enums3_sol", path = "../solutions/08_enums/enums3.rs" },
|
||||||
|
{ name = "strings1", path = "../exercises/09_strings/strings1.rs" },
|
||||||
|
{ name = "strings1_sol", path = "../solutions/09_strings/strings1.rs" },
|
||||||
|
{ name = "strings2", path = "../exercises/09_strings/strings2.rs" },
|
||||||
|
{ name = "strings2_sol", path = "../solutions/09_strings/strings2.rs" },
|
||||||
|
{ name = "strings3", path = "../exercises/09_strings/strings3.rs" },
|
||||||
|
{ name = "strings3_sol", path = "../solutions/09_strings/strings3.rs" },
|
||||||
|
{ name = "strings4", path = "../exercises/09_strings/strings4.rs" },
|
||||||
|
{ name = "strings4_sol", path = "../solutions/09_strings/strings4.rs" },
|
||||||
|
{ name = "modules1", path = "../exercises/10_modules/modules1.rs" },
|
||||||
|
{ name = "modules1_sol", path = "../solutions/10_modules/modules1.rs" },
|
||||||
|
{ name = "modules2", path = "../exercises/10_modules/modules2.rs" },
|
||||||
|
{ name = "modules2_sol", path = "../solutions/10_modules/modules2.rs" },
|
||||||
|
{ name = "modules3", path = "../exercises/10_modules/modules3.rs" },
|
||||||
|
{ name = "modules3_sol", path = "../solutions/10_modules/modules3.rs" },
|
||||||
|
{ name = "hashmaps1", path = "../exercises/11_hashmaps/hashmaps1.rs" },
|
||||||
|
{ name = "hashmaps1_sol", path = "../solutions/11_hashmaps/hashmaps1.rs" },
|
||||||
|
{ name = "hashmaps2", path = "../exercises/11_hashmaps/hashmaps2.rs" },
|
||||||
|
{ name = "hashmaps2_sol", path = "../solutions/11_hashmaps/hashmaps2.rs" },
|
||||||
|
{ name = "hashmaps3", path = "../exercises/11_hashmaps/hashmaps3.rs" },
|
||||||
|
{ name = "hashmaps3_sol", path = "../solutions/11_hashmaps/hashmaps3.rs" },
|
||||||
|
{ name = "quiz2", path = "../exercises/quizzes/quiz2.rs" },
|
||||||
|
{ name = "quiz2_sol", path = "../solutions/quizzes/quiz2.rs" },
|
||||||
|
{ name = "options1", path = "../exercises/12_options/options1.rs" },
|
||||||
|
{ name = "options1_sol", path = "../solutions/12_options/options1.rs" },
|
||||||
|
{ name = "options2", path = "../exercises/12_options/options2.rs" },
|
||||||
|
{ name = "options2_sol", path = "../solutions/12_options/options2.rs" },
|
||||||
|
{ name = "options3", path = "../exercises/12_options/options3.rs" },
|
||||||
|
{ name = "options3_sol", path = "../solutions/12_options/options3.rs" },
|
||||||
|
{ name = "errors1", path = "../exercises/13_error_handling/errors1.rs" },
|
||||||
|
{ name = "errors1_sol", path = "../solutions/13_error_handling/errors1.rs" },
|
||||||
|
{ name = "errors2", path = "../exercises/13_error_handling/errors2.rs" },
|
||||||
|
{ name = "errors2_sol", path = "../solutions/13_error_handling/errors2.rs" },
|
||||||
|
{ name = "errors3", path = "../exercises/13_error_handling/errors3.rs" },
|
||||||
|
{ name = "errors3_sol", path = "../solutions/13_error_handling/errors3.rs" },
|
||||||
|
{ name = "errors4", path = "../exercises/13_error_handling/errors4.rs" },
|
||||||
|
{ name = "errors4_sol", path = "../solutions/13_error_handling/errors4.rs" },
|
||||||
|
{ name = "errors5", path = "../exercises/13_error_handling/errors5.rs" },
|
||||||
|
{ name = "errors5_sol", path = "../solutions/13_error_handling/errors5.rs" },
|
||||||
|
{ name = "errors6", path = "../exercises/13_error_handling/errors6.rs" },
|
||||||
|
{ name = "errors6_sol", path = "../solutions/13_error_handling/errors6.rs" },
|
||||||
|
{ name = "generics1", path = "../exercises/14_generics/generics1.rs" },
|
||||||
|
{ name = "generics1_sol", path = "../solutions/14_generics/generics1.rs" },
|
||||||
|
{ name = "generics2", path = "../exercises/14_generics/generics2.rs" },
|
||||||
|
{ name = "generics2_sol", path = "../solutions/14_generics/generics2.rs" },
|
||||||
|
{ name = "traits1", path = "../exercises/15_traits/traits1.rs" },
|
||||||
|
{ name = "traits1_sol", path = "../solutions/15_traits/traits1.rs" },
|
||||||
|
{ name = "traits2", path = "../exercises/15_traits/traits2.rs" },
|
||||||
|
{ name = "traits2_sol", path = "../solutions/15_traits/traits2.rs" },
|
||||||
|
{ name = "traits3", path = "../exercises/15_traits/traits3.rs" },
|
||||||
|
{ name = "traits3_sol", path = "../solutions/15_traits/traits3.rs" },
|
||||||
|
{ name = "traits4", path = "../exercises/15_traits/traits4.rs" },
|
||||||
|
{ name = "traits4_sol", path = "../solutions/15_traits/traits4.rs" },
|
||||||
|
{ name = "traits5", path = "../exercises/15_traits/traits5.rs" },
|
||||||
|
{ name = "traits5_sol", path = "../solutions/15_traits/traits5.rs" },
|
||||||
|
{ name = "quiz3", path = "../exercises/quizzes/quiz3.rs" },
|
||||||
|
{ name = "quiz3_sol", path = "../solutions/quizzes/quiz3.rs" },
|
||||||
|
{ name = "lifetimes1", path = "../exercises/16_lifetimes/lifetimes1.rs" },
|
||||||
|
{ name = "lifetimes1_sol", path = "../solutions/16_lifetimes/lifetimes1.rs" },
|
||||||
|
{ name = "lifetimes2", path = "../exercises/16_lifetimes/lifetimes2.rs" },
|
||||||
|
{ name = "lifetimes2_sol", path = "../solutions/16_lifetimes/lifetimes2.rs" },
|
||||||
|
{ name = "lifetimes3", path = "../exercises/16_lifetimes/lifetimes3.rs" },
|
||||||
|
{ name = "lifetimes3_sol", path = "../solutions/16_lifetimes/lifetimes3.rs" },
|
||||||
|
{ name = "tests1", path = "../exercises/17_tests/tests1.rs" },
|
||||||
|
{ name = "tests1_sol", path = "../solutions/17_tests/tests1.rs" },
|
||||||
|
{ name = "tests2", path = "../exercises/17_tests/tests2.rs" },
|
||||||
|
{ name = "tests2_sol", path = "../solutions/17_tests/tests2.rs" },
|
||||||
|
{ name = "tests3", path = "../exercises/17_tests/tests3.rs" },
|
||||||
|
{ name = "tests3_sol", path = "../solutions/17_tests/tests3.rs" },
|
||||||
|
{ name = "iterators1", path = "../exercises/18_iterators/iterators1.rs" },
|
||||||
|
{ name = "iterators1_sol", path = "../solutions/18_iterators/iterators1.rs" },
|
||||||
|
{ name = "iterators2", path = "../exercises/18_iterators/iterators2.rs" },
|
||||||
|
{ name = "iterators2_sol", path = "../solutions/18_iterators/iterators2.rs" },
|
||||||
|
{ name = "iterators3", path = "../exercises/18_iterators/iterators3.rs" },
|
||||||
|
{ name = "iterators3_sol", path = "../solutions/18_iterators/iterators3.rs" },
|
||||||
|
{ name = "iterators4", path = "../exercises/18_iterators/iterators4.rs" },
|
||||||
|
{ name = "iterators4_sol", path = "../solutions/18_iterators/iterators4.rs" },
|
||||||
|
{ name = "iterators5", path = "../exercises/18_iterators/iterators5.rs" },
|
||||||
|
{ name = "iterators5_sol", path = "../solutions/18_iterators/iterators5.rs" },
|
||||||
|
{ name = "box1", path = "../exercises/19_smart_pointers/box1.rs" },
|
||||||
|
{ name = "box1_sol", path = "../solutions/19_smart_pointers/box1.rs" },
|
||||||
|
{ name = "rc1", path = "../exercises/19_smart_pointers/rc1.rs" },
|
||||||
|
{ name = "rc1_sol", path = "../solutions/19_smart_pointers/rc1.rs" },
|
||||||
|
{ name = "arc1", path = "../exercises/19_smart_pointers/arc1.rs" },
|
||||||
|
{ name = "arc1_sol", path = "../solutions/19_smart_pointers/arc1.rs" },
|
||||||
|
{ name = "cow1", path = "../exercises/19_smart_pointers/cow1.rs" },
|
||||||
|
{ name = "cow1_sol", path = "../solutions/19_smart_pointers/cow1.rs" },
|
||||||
|
{ name = "threads1", path = "../exercises/20_threads/threads1.rs" },
|
||||||
|
{ name = "threads1_sol", path = "../solutions/20_threads/threads1.rs" },
|
||||||
|
{ name = "threads2", path = "../exercises/20_threads/threads2.rs" },
|
||||||
|
{ name = "threads2_sol", path = "../solutions/20_threads/threads2.rs" },
|
||||||
|
{ name = "threads3", path = "../exercises/20_threads/threads3.rs" },
|
||||||
|
{ name = "threads3_sol", path = "../solutions/20_threads/threads3.rs" },
|
||||||
|
{ name = "macros1", path = "../exercises/21_macros/macros1.rs" },
|
||||||
|
{ name = "macros1_sol", path = "../solutions/21_macros/macros1.rs" },
|
||||||
|
{ name = "macros2", path = "../exercises/21_macros/macros2.rs" },
|
||||||
|
{ name = "macros2_sol", path = "../solutions/21_macros/macros2.rs" },
|
||||||
|
{ name = "macros3", path = "../exercises/21_macros/macros3.rs" },
|
||||||
|
{ name = "macros3_sol", path = "../solutions/21_macros/macros3.rs" },
|
||||||
|
{ name = "macros4", path = "../exercises/21_macros/macros4.rs" },
|
||||||
|
{ name = "macros4_sol", path = "../solutions/21_macros/macros4.rs" },
|
||||||
|
{ name = "clippy1", path = "../exercises/22_clippy/clippy1.rs" },
|
||||||
|
{ name = "clippy1_sol", path = "../solutions/22_clippy/clippy1.rs" },
|
||||||
|
{ name = "clippy2", path = "../exercises/22_clippy/clippy2.rs" },
|
||||||
|
{ name = "clippy2_sol", path = "../solutions/22_clippy/clippy2.rs" },
|
||||||
|
{ name = "clippy3", path = "../exercises/22_clippy/clippy3.rs" },
|
||||||
|
{ name = "clippy3_sol", path = "../solutions/22_clippy/clippy3.rs" },
|
||||||
|
{ name = "using_as", path = "../exercises/23_conversions/using_as.rs" },
|
||||||
|
{ name = "using_as_sol", path = "../solutions/23_conversions/using_as.rs" },
|
||||||
|
{ name = "from_into", path = "../exercises/23_conversions/from_into.rs" },
|
||||||
|
{ name = "from_into_sol", path = "../solutions/23_conversions/from_into.rs" },
|
||||||
|
{ name = "from_str", path = "../exercises/23_conversions/from_str.rs" },
|
||||||
|
{ name = "from_str_sol", path = "../solutions/23_conversions/from_str.rs" },
|
||||||
|
{ name = "try_from_into", path = "../exercises/23_conversions/try_from_into.rs" },
|
||||||
|
{ name = "try_from_into_sol", path = "../solutions/23_conversions/try_from_into.rs" },
|
||||||
|
{ name = "as_ref_mut", path = "../exercises/23_conversions/as_ref_mut.rs" },
|
||||||
|
{ name = "as_ref_mut_sol", path = "../solutions/23_conversions/as_ref_mut.rs" },
|
||||||
|
]
|
||||||
|
|
||||||
|
[package]
|
||||||
|
name = "exercises"
|
||||||
|
edition = "2024"
|
||||||
|
# Don't publish the exercises on crates.io!
|
||||||
|
publish = false
|
||||||
|
|
||||||
|
[profile.release]
|
||||||
|
panic = "abort"
|
||||||
|
|
||||||
|
[profile.dev]
|
||||||
|
panic = "abort"
|
||||||
|
|
||||||
|
[lints.rust]
|
||||||
|
# You shouldn't write unsafe code in Rustlings!
|
||||||
|
unsafe_code = "forbid"
|
||||||
|
# You don't need unstable features in Rustlings and shouldn't rely on them while learning Rust.
|
||||||
|
unstable_features = "forbid"
|
||||||
|
# Dead code warnings can't be avoided in some exercises and might distract while learning.
|
||||||
|
dead_code = "allow"
|
||||||
|
|
||||||
|
[lints.clippy]
|
||||||
|
# You forgot a `todo!()`!
|
||||||
|
todo = "forbid"
|
||||||
|
# This can only happen by mistake in Rustlings.
|
||||||
|
empty_loop = "forbid"
|
||||||
|
# No infinite loops are needed in Rustlings.
|
||||||
|
infinite_loop = "deny"
|
||||||
|
# You shouldn't leak memory while still learning Rust!
|
||||||
|
mem_forget = "deny"
|
||||||
|
# Currently, there are no disallowed methods. This line avoids problems when developing Rustlings.
|
||||||
|
disallowed_methods = "allow"
|
||||||
1
dev/rustlings-repo.txt
Normal file
1
dev/rustlings-repo.txt
Normal file
@ -0,0 +1 @@
|
|||||||
|
This file is used to check if the user tries to run Rustlings in the repository (the method before version 6)
|
||||||
24
exercises/00_intro/intro1.rs
Normal file
24
exercises/00_intro/intro1.rs
Normal file
@ -0,0 +1,24 @@
|
|||||||
|
// TODO: 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, enter `n` in the terminal.
|
||||||
|
//
|
||||||
|
// The exercise file will be reloaded when you change one of the lines below!
|
||||||
|
// Try adding a new `println!` and check the updated output in the terminal.
|
||||||
|
|
||||||
|
fn main() {
|
||||||
|
println!(r#" Welcome to... "#);
|
||||||
|
println!(r#" _ _ _ "#);
|
||||||
|
println!(r#" _ __ _ _ ___| |_| (_)_ __ __ _ ___ "#);
|
||||||
|
println!(r#" | '__| | | / __| __| | | '_ \ / _` / __| "#);
|
||||||
|
println!(r#" | | | |_| \__ \ |_| | | | | | (_| \__ \ "#);
|
||||||
|
println!(r#" |_| \__,_|___/\__|_|_|_| |_|\__, |___/ "#);
|
||||||
|
println!(r#" |___/ "#);
|
||||||
|
println!();
|
||||||
|
println!("This exercise compiles successfully. The remaining exercises contain a compiler");
|
||||||
|
println!("or logic error. The central concept behind Rustlings is to fix these errors and");
|
||||||
|
println!("solve the exercises. Good luck!");
|
||||||
|
println!();
|
||||||
|
println!("The file of this exercise is `exercises/00_intro/intro1.rs`. Have a look!");
|
||||||
|
println!("The current exercise path will be always shown under the progress bar.");
|
||||||
|
println!("You can click on the path to open the exercise file in your editor.");
|
||||||
|
}
|
||||||
4
exercises/00_intro/intro2.rs
Normal file
4
exercises/00_intro/intro2.rs
Normal file
@ -0,0 +1,4 @@
|
|||||||
|
fn main() {
|
||||||
|
// TODO: Fix the code to print "Hello world!".
|
||||||
|
printline!("Hello world!");
|
||||||
|
}
|
||||||
@ -1,8 +1,8 @@
|
|||||||
# Variables
|
# Variables
|
||||||
|
|
||||||
In Rust, variables are immutable by default.
|
In Rust, variables are immutable by default.
|
||||||
When a variable is immutable, once a value is bound to a name, you can’t change that value.
|
When a variable is immutable, once a value is bound to a name, you can't change that value.
|
||||||
You can make them mutable by adding mut in front of the variable name.
|
You can make them mutable by adding `mut` in front of the variable name.
|
||||||
|
|
||||||
## Further information
|
## Further information
|
||||||
|
|
||||||
6
exercises/01_variables/variables1.rs
Normal file
6
exercises/01_variables/variables1.rs
Normal file
@ -0,0 +1,6 @@
|
|||||||
|
fn main() {
|
||||||
|
// TODO: Add the missing keyword.
|
||||||
|
x = 5;
|
||||||
|
|
||||||
|
println!("x has the value {x}");
|
||||||
|
}
|
||||||
@ -1,10 +1,7 @@
|
|||||||
// variables2.rs
|
|
||||||
// Execute `rustlings hint variables2` or use the `hint` watch subcommand for a hint.
|
|
||||||
|
|
||||||
// I AM NOT DONE
|
|
||||||
|
|
||||||
fn main() {
|
fn main() {
|
||||||
|
// TODO: Change the line below to fix the compiler error.
|
||||||
let x;
|
let x;
|
||||||
|
|
||||||
if x == 10 {
|
if x == 10 {
|
||||||
println!("x is ten!");
|
println!("x is ten!");
|
||||||
} else {
|
} else {
|
||||||
6
exercises/01_variables/variables3.rs
Normal file
6
exercises/01_variables/variables3.rs
Normal file
@ -0,0 +1,6 @@
|
|||||||
|
fn main() {
|
||||||
|
// TODO: Change the line below to fix the compiler error.
|
||||||
|
let x: i32;
|
||||||
|
|
||||||
|
println!("Number {x}");
|
||||||
|
}
|
||||||
8
exercises/01_variables/variables4.rs
Normal file
8
exercises/01_variables/variables4.rs
Normal file
@ -0,0 +1,8 @@
|
|||||||
|
// TODO: Fix the compiler error.
|
||||||
|
fn main() {
|
||||||
|
let x = 3;
|
||||||
|
println!("Number {x}");
|
||||||
|
|
||||||
|
x = 5; // Don't change this line
|
||||||
|
println!("Number {x}");
|
||||||
|
}
|
||||||
8
exercises/01_variables/variables5.rs
Normal file
8
exercises/01_variables/variables5.rs
Normal file
@ -0,0 +1,8 @@
|
|||||||
|
fn main() {
|
||||||
|
let number = "T-H-R-E-E"; // Don't change this line
|
||||||
|
println!("Spell a number: {number}");
|
||||||
|
|
||||||
|
// TODO: Fix the compiler error by changing the line below without renaming the variable.
|
||||||
|
number = 3;
|
||||||
|
println!("Number plus two is: {}", number + 2);
|
||||||
|
}
|
||||||
6
exercises/01_variables/variables6.rs
Normal file
6
exercises/01_variables/variables6.rs
Normal file
@ -0,0 +1,6 @@
|
|||||||
|
// TODO: Change the line below to fix the compiler error.
|
||||||
|
const NUMBER = 3;
|
||||||
|
|
||||||
|
fn main() {
|
||||||
|
println!("Number: {NUMBER}");
|
||||||
|
}
|
||||||
5
exercises/02_functions/functions1.rs
Normal file
5
exercises/02_functions/functions1.rs
Normal file
@ -0,0 +1,5 @@
|
|||||||
|
// TODO: Add some function with the name `call_me` without arguments or a return value.
|
||||||
|
|
||||||
|
fn main() {
|
||||||
|
call_me(); // Don't change this line
|
||||||
|
}
|
||||||
@ -1,14 +1,10 @@
|
|||||||
// functions2.rs
|
// TODO: Add the missing type of the argument `num` after the colon `:`.
|
||||||
// Execute `rustlings hint functions2` or use the `hint` watch subcommand for a hint.
|
|
||||||
|
|
||||||
// I AM NOT DONE
|
|
||||||
|
|
||||||
fn main() {
|
|
||||||
call_me(3);
|
|
||||||
}
|
|
||||||
|
|
||||||
fn call_me(num:) {
|
fn call_me(num:) {
|
||||||
for i in 0..num {
|
for i in 0..num {
|
||||||
println!("Ring! Call number {}", i + 1);
|
println!("Ring! Call number {}", i + 1);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn main() {
|
||||||
|
call_me(3);
|
||||||
|
}
|
||||||
10
exercises/02_functions/functions3.rs
Normal file
10
exercises/02_functions/functions3.rs
Normal file
@ -0,0 +1,10 @@
|
|||||||
|
fn call_me(num: u8) {
|
||||||
|
for i in 0..num {
|
||||||
|
println!("Ring! Call number {}", i + 1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fn main() {
|
||||||
|
// TODO: Fix the function call.
|
||||||
|
call_me();
|
||||||
|
}
|
||||||
22
exercises/02_functions/functions4.rs
Normal file
22
exercises/02_functions/functions4.rs
Normal file
@ -0,0 +1,22 @@
|
|||||||
|
// 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 are only interested in
|
||||||
|
// the signatures for now.
|
||||||
|
|
||||||
|
fn is_even(num: i64) -> bool {
|
||||||
|
num % 2 == 0
|
||||||
|
}
|
||||||
|
|
||||||
|
// TODO: Fix the function signature.
|
||||||
|
fn sale_price(price: i64) -> {
|
||||||
|
if is_even(price) {
|
||||||
|
price - 10
|
||||||
|
} else {
|
||||||
|
price - 3
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fn main() {
|
||||||
|
let original_price = 51;
|
||||||
|
println!("Your sale price is {}", sale_price(original_price));
|
||||||
|
}
|
||||||
9
exercises/02_functions/functions5.rs
Normal file
9
exercises/02_functions/functions5.rs
Normal file
@ -0,0 +1,9 @@
|
|||||||
|
// TODO: Fix the function body without changing the signature.
|
||||||
|
fn square(num: i32) -> i32 {
|
||||||
|
num * num;
|
||||||
|
}
|
||||||
|
|
||||||
|
fn main() {
|
||||||
|
let answer = square(3);
|
||||||
|
println!("The square of 3 is {answer}");
|
||||||
|
}
|
||||||
@ -1,15 +1,15 @@
|
|||||||
// if1.rs
|
fn bigger(a: i32, b: i32) -> i32 {
|
||||||
// Execute `rustlings hint if1` or use the `hint` watch subcommand for a hint.
|
// TODO: Complete this function to return the bigger number!
|
||||||
|
// If both numbers are equal, any of them can be returned.
|
||||||
// I AM NOT DONE
|
|
||||||
|
|
||||||
pub fn bigger(a: i32, b: i32) -> i32 {
|
|
||||||
// Complete this function to return the bigger number!
|
|
||||||
// Do not use:
|
// Do not use:
|
||||||
// - another function call
|
// - another function call
|
||||||
// - additional variables
|
// - additional variables
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn main() {
|
||||||
|
// You can optionally experiment here.
|
||||||
|
}
|
||||||
|
|
||||||
// Don't mind this for now :)
|
// Don't mind this for now :)
|
||||||
#[cfg(test)]
|
#[cfg(test)]
|
||||||
mod tests {
|
mod tests {
|
||||||
@ -24,4 +24,9 @@ mod tests {
|
|||||||
fn fortytwo_is_bigger_than_thirtytwo() {
|
fn fortytwo_is_bigger_than_thirtytwo() {
|
||||||
assert_eq!(42, bigger(32, 42));
|
assert_eq!(42, bigger(32, 42));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn equal_numbers() {
|
||||||
|
assert_eq!(42, bigger(42, 42));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
37
exercises/03_if/if2.rs
Normal file
37
exercises/03_if/if2.rs
Normal file
@ -0,0 +1,37 @@
|
|||||||
|
// TODO: Fix the compiler error on this function.
|
||||||
|
fn picky_eater(food: &str) -> &str {
|
||||||
|
if food == "strawberry" {
|
||||||
|
"Yummy!"
|
||||||
|
} else {
|
||||||
|
1
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fn main() {
|
||||||
|
// You can optionally experiment here.
|
||||||
|
}
|
||||||
|
|
||||||
|
// TODO: Read the tests to understand the desired behavior.
|
||||||
|
// Make all tests pass without changing them.
|
||||||
|
#[cfg(test)]
|
||||||
|
mod tests {
|
||||||
|
use super::*;
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn yummy_food() {
|
||||||
|
// This means that calling `picky_eater` with the argument "strawberry" should return "Yummy!".
|
||||||
|
assert_eq!(picky_eater("strawberry"), "Yummy!");
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn neutral_food() {
|
||||||
|
assert_eq!(picky_eater("potato"), "I guess I can eat that.");
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn default_disliked_food() {
|
||||||
|
assert_eq!(picky_eater("broccoli"), "No thanks!");
|
||||||
|
assert_eq!(picky_eater("gummy bears"), "No thanks!");
|
||||||
|
assert_eq!(picky_eater("literally anything"), "No thanks!");
|
||||||
|
}
|
||||||
|
}
|
||||||
53
exercises/03_if/if3.rs
Normal file
53
exercises/03_if/if3.rs
Normal file
@ -0,0 +1,53 @@
|
|||||||
|
fn animal_habitat(animal: &str) -> &str {
|
||||||
|
// TODO: Fix the compiler error in the statement below.
|
||||||
|
let identifier = if animal == "crab" {
|
||||||
|
1
|
||||||
|
} else if animal == "gopher" {
|
||||||
|
2.0
|
||||||
|
} else if animal == "snake" {
|
||||||
|
3
|
||||||
|
} else {
|
||||||
|
"Unknown"
|
||||||
|
};
|
||||||
|
|
||||||
|
// Don't change the expression below!
|
||||||
|
if identifier == 1 {
|
||||||
|
"Beach"
|
||||||
|
} else if identifier == 2 {
|
||||||
|
"Burrow"
|
||||||
|
} else if identifier == 3 {
|
||||||
|
"Desert"
|
||||||
|
} else {
|
||||||
|
"Unknown"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fn main() {
|
||||||
|
// You can optionally experiment here.
|
||||||
|
}
|
||||||
|
|
||||||
|
// Don't change the tests!
|
||||||
|
#[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")
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -5,5 +5,5 @@ compiler. In this section, we'll go through the most important ones.
|
|||||||
|
|
||||||
## Further information
|
## Further information
|
||||||
|
|
||||||
- [Data Types](https://doc.rust-lang.org/stable/book/ch03-02-data-types.html)
|
- [Data Types](https://doc.rust-lang.org/book/ch03-02-data-types.html)
|
||||||
- [The Slice Type](https://doc.rust-lang.org/stable/book/ch04-03-slices.html)
|
- [The Slice Type](https://doc.rust-lang.org/book/ch04-03-slices.html)
|
||||||
15
exercises/04_primitive_types/primitive_types1.rs
Normal file
15
exercises/04_primitive_types/primitive_types1.rs
Normal file
@ -0,0 +1,15 @@
|
|||||||
|
// Booleans (`bool`)
|
||||||
|
|
||||||
|
fn main() {
|
||||||
|
let is_morning = true;
|
||||||
|
if is_morning {
|
||||||
|
println!("Good morning!");
|
||||||
|
}
|
||||||
|
|
||||||
|
// TODO: Define a boolean variable with the name `is_evening` before the `if` statement below.
|
||||||
|
// The value of the variable should be the negation (opposite) of `is_morning`.
|
||||||
|
// let …
|
||||||
|
if is_evening {
|
||||||
|
println!("Good evening!");
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -1,12 +1,6 @@
|
|||||||
// primitive_types2.rs
|
// Characters (`char`)
|
||||||
// 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
|
|
||||||
|
|
||||||
fn main() {
|
fn main() {
|
||||||
// Characters (`char`)
|
|
||||||
|
|
||||||
// Note the _single_ quotes, these are different from the double quotes
|
// Note the _single_ quotes, these are different from the double quotes
|
||||||
// you've been seeing around.
|
// you've been seeing around.
|
||||||
let my_first_initial = 'C';
|
let my_first_initial = 'C';
|
||||||
@ -18,9 +12,12 @@ fn main() {
|
|||||||
println!("Neither alphabetic nor numeric!");
|
println!("Neither alphabetic nor numeric!");
|
||||||
}
|
}
|
||||||
|
|
||||||
let // Finish this line like the example! What's your favorite character?
|
// TODO: Analogous to the example before, declare a variable called `your_character`
|
||||||
// Try a letter, try a number, try a special character, try a character
|
// below with your favorite character.
|
||||||
// from a different language than your own, try an emoji!
|
// Try a letter, try a digit (in single quotes), try a special character, try a character
|
||||||
|
// from a different language than your own, try an emoji 😉
|
||||||
|
// let your_character = '';
|
||||||
|
|
||||||
if your_character.is_alphabetic() {
|
if your_character.is_alphabetic() {
|
||||||
println!("Alphabetical!");
|
println!("Alphabetical!");
|
||||||
} else if your_character.is_numeric() {
|
} else if your_character.is_numeric() {
|
||||||
11
exercises/04_primitive_types/primitive_types3.rs
Normal file
11
exercises/04_primitive_types/primitive_types3.rs
Normal file
@ -0,0 +1,11 @@
|
|||||||
|
fn main() {
|
||||||
|
// TODO: Create an array called `a` with at least 100 elements in it.
|
||||||
|
// let a = ???
|
||||||
|
|
||||||
|
if a.len() >= 100 {
|
||||||
|
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");
|
||||||
|
}
|
||||||
|
}
|
||||||
16
exercises/04_primitive_types/primitive_types4.rs
Normal file
16
exercises/04_primitive_types/primitive_types4.rs
Normal file
@ -0,0 +1,16 @@
|
|||||||
|
fn main() {
|
||||||
|
// You can optionally experiment here.
|
||||||
|
}
|
||||||
|
|
||||||
|
#[cfg(test)]
|
||||||
|
mod tests {
|
||||||
|
#[test]
|
||||||
|
fn slice_out_of_array() {
|
||||||
|
let a = [1, 2, 3, 4, 5];
|
||||||
|
|
||||||
|
// TODO: Get a slice called `nice_slice` out of the array `a` so that the test passes.
|
||||||
|
// let nice_slice = ???
|
||||||
|
|
||||||
|
assert_eq!([2, 3, 4], nice_slice);
|
||||||
|
}
|
||||||
|
}
|
||||||
8
exercises/04_primitive_types/primitive_types5.rs
Normal file
8
exercises/04_primitive_types/primitive_types5.rs
Normal file
@ -0,0 +1,8 @@
|
|||||||
|
fn main() {
|
||||||
|
let cat = ("Furry McFurson", 3.5);
|
||||||
|
|
||||||
|
// TODO: Destructure the `cat` tuple in one statement so that the println works.
|
||||||
|
// let /* your pattern here */ = cat;
|
||||||
|
|
||||||
|
println!("{name} is {age} years old");
|
||||||
|
}
|
||||||
17
exercises/04_primitive_types/primitive_types6.rs
Normal file
17
exercises/04_primitive_types/primitive_types6.rs
Normal file
@ -0,0 +1,17 @@
|
|||||||
|
fn main() {
|
||||||
|
// You can optionally experiment here.
|
||||||
|
}
|
||||||
|
|
||||||
|
#[cfg(test)]
|
||||||
|
mod tests {
|
||||||
|
#[test]
|
||||||
|
fn indexing_tuple() {
|
||||||
|
let numbers = (1, 2, 3);
|
||||||
|
|
||||||
|
// TODO: Use a tuple index to access the second element of `numbers`
|
||||||
|
// and assign it to a variable called `second`.
|
||||||
|
// let second = ???;
|
||||||
|
|
||||||
|
assert_eq!(second, 2, "This is not the 2nd number in the tuple!");
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -12,4 +12,6 @@ the other useful data structure, hash maps, later.
|
|||||||
|
|
||||||
## Further information
|
## Further information
|
||||||
|
|
||||||
- [Storing Lists of Values with Vectors](https://doc.rust-lang.org/stable/book/ch08-01-vectors.html)
|
- [Storing Lists of Values with Vectors](https://doc.rust-lang.org/book/ch08-01-vectors.html)
|
||||||
|
- [`iter_mut`](https://doc.rust-lang.org/std/primitive.slice.html#method.iter_mut)
|
||||||
|
- [`map`](https://doc.rust-lang.org/std/iter/trait.Iterator.html#method.map)
|
||||||
24
exercises/05_vecs/vecs1.rs
Normal file
24
exercises/05_vecs/vecs1.rs
Normal file
@ -0,0 +1,24 @@
|
|||||||
|
fn array_and_vec() -> ([i32; 4], Vec<i32>) {
|
||||||
|
let a = [10, 20, 30, 40]; // Array
|
||||||
|
|
||||||
|
// TODO: Create a vector called `v` which contains the exact same elements as in the array `a`.
|
||||||
|
// Use the vector macro.
|
||||||
|
// let v = ???;
|
||||||
|
|
||||||
|
(a, v)
|
||||||
|
}
|
||||||
|
|
||||||
|
fn main() {
|
||||||
|
// You can optionally experiment here.
|
||||||
|
}
|
||||||
|
|
||||||
|
#[cfg(test)]
|
||||||
|
mod tests {
|
||||||
|
use super::*;
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn test_array_and_vec_similarity() {
|
||||||
|
let (a, v) = array_and_vec();
|
||||||
|
assert_eq!(a, *v);
|
||||||
|
}
|
||||||
|
}
|
||||||
26
exercises/05_vecs/vecs2.rs
Normal file
26
exercises/05_vecs/vecs2.rs
Normal file
@ -0,0 +1,26 @@
|
|||||||
|
fn vec_loop(input: &[i32]) -> Vec<i32> {
|
||||||
|
let mut output = Vec::new();
|
||||||
|
|
||||||
|
for element in input {
|
||||||
|
// TODO: Multiply each element in the `input` slice by 2 and push it to
|
||||||
|
// the `output` vector.
|
||||||
|
}
|
||||||
|
|
||||||
|
output
|
||||||
|
}
|
||||||
|
|
||||||
|
fn main() {
|
||||||
|
// You can optionally experiment here.
|
||||||
|
}
|
||||||
|
|
||||||
|
#[cfg(test)]
|
||||||
|
mod tests {
|
||||||
|
use super::*;
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn test_vec_loop() {
|
||||||
|
let input = [2, 4, 6, 8, 10];
|
||||||
|
let ans = vec_loop(&input);
|
||||||
|
assert_eq!(ans, [4, 8, 12, 16, 20]);
|
||||||
|
}
|
||||||
|
}
|
||||||
24
exercises/06_move_semantics/move_semantics1.rs
Normal file
24
exercises/06_move_semantics/move_semantics1.rs
Normal file
@ -0,0 +1,24 @@
|
|||||||
|
// TODO: Fix the compiler error in this function.
|
||||||
|
fn fill_vec(vec: Vec<i32>) -> Vec<i32> {
|
||||||
|
let vec = vec;
|
||||||
|
|
||||||
|
vec.push(88);
|
||||||
|
|
||||||
|
vec
|
||||||
|
}
|
||||||
|
|
||||||
|
fn main() {
|
||||||
|
// You can optionally experiment here.
|
||||||
|
}
|
||||||
|
|
||||||
|
#[cfg(test)]
|
||||||
|
mod tests {
|
||||||
|
use super::*;
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn move_semantics1() {
|
||||||
|
let vec0 = vec![22, 44, 66];
|
||||||
|
let vec1 = fill_vec(vec0);
|
||||||
|
assert_eq!(vec1, vec![22, 44, 66, 88]);
|
||||||
|
}
|
||||||
|
}
|
||||||
28
exercises/06_move_semantics/move_semantics2.rs
Normal file
28
exercises/06_move_semantics/move_semantics2.rs
Normal file
@ -0,0 +1,28 @@
|
|||||||
|
fn fill_vec(vec: Vec<i32>) -> Vec<i32> {
|
||||||
|
let mut vec = vec;
|
||||||
|
|
||||||
|
vec.push(88);
|
||||||
|
|
||||||
|
vec
|
||||||
|
}
|
||||||
|
|
||||||
|
fn main() {
|
||||||
|
// You can optionally experiment here.
|
||||||
|
}
|
||||||
|
|
||||||
|
#[cfg(test)]
|
||||||
|
mod tests {
|
||||||
|
use super::*;
|
||||||
|
|
||||||
|
// TODO: Make both vectors `vec0` and `vec1` accessible at the same time to
|
||||||
|
// fix the compiler error in the test.
|
||||||
|
#[test]
|
||||||
|
fn move_semantics2() {
|
||||||
|
let vec0 = vec![22, 44, 66];
|
||||||
|
|
||||||
|
let vec1 = fill_vec(vec0);
|
||||||
|
|
||||||
|
assert_eq!(vec0, [22, 44, 66]);
|
||||||
|
assert_eq!(vec1, [22, 44, 66, 88]);
|
||||||
|
}
|
||||||
|
}
|
||||||
22
exercises/06_move_semantics/move_semantics3.rs
Normal file
22
exercises/06_move_semantics/move_semantics3.rs
Normal file
@ -0,0 +1,22 @@
|
|||||||
|
// TODO: Fix the compiler error in the function without adding any new line.
|
||||||
|
fn fill_vec(vec: Vec<i32>) -> Vec<i32> {
|
||||||
|
vec.push(88);
|
||||||
|
|
||||||
|
vec
|
||||||
|
}
|
||||||
|
|
||||||
|
fn main() {
|
||||||
|
// You can optionally experiment here.
|
||||||
|
}
|
||||||
|
|
||||||
|
#[cfg(test)]
|
||||||
|
mod tests {
|
||||||
|
use super::*;
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn move_semantics3() {
|
||||||
|
let vec0 = vec![22, 44, 66];
|
||||||
|
let vec1 = fill_vec(vec0);
|
||||||
|
assert_eq!(vec1, [22, 44, 66, 88]);
|
||||||
|
}
|
||||||
|
}
|
||||||
18
exercises/06_move_semantics/move_semantics4.rs
Normal file
18
exercises/06_move_semantics/move_semantics4.rs
Normal file
@ -0,0 +1,18 @@
|
|||||||
|
fn main() {
|
||||||
|
// You can optionally experiment here.
|
||||||
|
}
|
||||||
|
|
||||||
|
#[cfg(test)]
|
||||||
|
mod tests {
|
||||||
|
// TODO: Fix the compiler errors only by reordering the lines in the test.
|
||||||
|
// Don't add, change or remove any line.
|
||||||
|
#[test]
|
||||||
|
fn move_semantics4() {
|
||||||
|
let mut x = Vec::new();
|
||||||
|
let y = &mut x;
|
||||||
|
let z = &mut x;
|
||||||
|
y.push(42);
|
||||||
|
z.push(13);
|
||||||
|
assert_eq!(x, [42, 13]);
|
||||||
|
}
|
||||||
|
}
|
||||||
24
exercises/06_move_semantics/move_semantics5.rs
Normal file
24
exercises/06_move_semantics/move_semantics5.rs
Normal file
@ -0,0 +1,24 @@
|
|||||||
|
#![allow(clippy::ptr_arg)]
|
||||||
|
|
||||||
|
// TODO: Fix the compiler errors without changing anything except adding or
|
||||||
|
// removing references (the character `&`).
|
||||||
|
|
||||||
|
// Shouldn't take ownership
|
||||||
|
fn get_char(data: String) -> char {
|
||||||
|
data.chars().last().unwrap()
|
||||||
|
}
|
||||||
|
|
||||||
|
// Should take ownership
|
||||||
|
fn string_uppercase(mut data: &String) {
|
||||||
|
data = data.to_uppercase();
|
||||||
|
|
||||||
|
println!("{data}");
|
||||||
|
}
|
||||||
|
|
||||||
|
fn main() {
|
||||||
|
let data = "Rust is great!".to_string();
|
||||||
|
|
||||||
|
get_char(data);
|
||||||
|
|
||||||
|
string_uppercase(&data);
|
||||||
|
}
|
||||||
47
exercises/07_structs/structs1.rs
Normal file
47
exercises/07_structs/structs1.rs
Normal file
@ -0,0 +1,47 @@
|
|||||||
|
struct ColorRegularStruct {
|
||||||
|
// TODO: Add the fields that the test `regular_structs` expects.
|
||||||
|
// What types should the fields have? What are the minimum and maximum values for RGB colors?
|
||||||
|
}
|
||||||
|
|
||||||
|
struct ColorTupleStruct(/* TODO: Add the fields that the test `tuple_structs` expects */);
|
||||||
|
|
||||||
|
#[derive(Debug)]
|
||||||
|
struct UnitStruct;
|
||||||
|
|
||||||
|
fn main() {
|
||||||
|
// You can optionally experiment here.
|
||||||
|
}
|
||||||
|
|
||||||
|
#[cfg(test)]
|
||||||
|
mod tests {
|
||||||
|
use super::*;
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn regular_structs() {
|
||||||
|
// TODO: Instantiate a regular struct.
|
||||||
|
// let green =
|
||||||
|
|
||||||
|
assert_eq!(green.red, 0);
|
||||||
|
assert_eq!(green.green, 255);
|
||||||
|
assert_eq!(green.blue, 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn tuple_structs() {
|
||||||
|
// TODO: Instantiate a tuple struct.
|
||||||
|
// let green =
|
||||||
|
|
||||||
|
assert_eq!(green.0, 0);
|
||||||
|
assert_eq!(green.1, 255);
|
||||||
|
assert_eq!(green.2, 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn unit_structs() {
|
||||||
|
// TODO: Instantiate a unit struct.
|
||||||
|
// let unit_struct =
|
||||||
|
let message = format!("{unit_struct:?}s are fun!");
|
||||||
|
|
||||||
|
assert_eq!(message, "UnitStructs are fun!");
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -1,9 +1,3 @@
|
|||||||
// structs2.rs
|
|
||||||
// Address all the TODOs to make the tests pass!
|
|
||||||
// Execute `rustlings hint structs2` or use the `hint` watch subcommand for a hint.
|
|
||||||
|
|
||||||
// I AM NOT DONE
|
|
||||||
|
|
||||||
#[derive(Debug)]
|
#[derive(Debug)]
|
||||||
struct Order {
|
struct Order {
|
||||||
name: String,
|
name: String,
|
||||||
@ -27,6 +21,10 @@ fn create_order_template() -> Order {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn main() {
|
||||||
|
// You can optionally experiment here.
|
||||||
|
}
|
||||||
|
|
||||||
#[cfg(test)]
|
#[cfg(test)]
|
||||||
mod tests {
|
mod tests {
|
||||||
use super::*;
|
use super::*;
|
||||||
@ -34,8 +32,10 @@ mod tests {
|
|||||||
#[test]
|
#[test]
|
||||||
fn your_order() {
|
fn your_order() {
|
||||||
let order_template = create_order_template();
|
let order_template = create_order_template();
|
||||||
|
|
||||||
// TODO: Create your own order using the update syntax and template above!
|
// TODO: Create your own order using the update syntax and template above!
|
||||||
// let your_order =
|
// let your_order =
|
||||||
|
|
||||||
assert_eq!(your_order.name, "Hacker in Rust");
|
assert_eq!(your_order.name, "Hacker in Rust");
|
||||||
assert_eq!(your_order.year, order_template.year);
|
assert_eq!(your_order.year, order_template.year);
|
||||||
assert_eq!(your_order.made_by_phone, order_template.made_by_phone);
|
assert_eq!(your_order.made_by_phone, order_template.made_by_phone);
|
||||||
87
exercises/07_structs/structs3.rs
Normal file
87
exercises/07_structs/structs3.rs
Normal file
@ -0,0 +1,87 @@
|
|||||||
|
// 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.
|
||||||
|
|
||||||
|
#[derive(Debug)]
|
||||||
|
struct Package {
|
||||||
|
sender_country: String,
|
||||||
|
recipient_country: String,
|
||||||
|
weight_in_grams: u32,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl Package {
|
||||||
|
fn new(sender_country: String, recipient_country: String, weight_in_grams: u32) -> Self {
|
||||||
|
if weight_in_grams < 10 {
|
||||||
|
// This isn't how you should handle errors in Rust, but we will
|
||||||
|
// learn about error handling later.
|
||||||
|
panic!("Can't ship a package with weight below 10 grams");
|
||||||
|
}
|
||||||
|
|
||||||
|
Self {
|
||||||
|
sender_country,
|
||||||
|
recipient_country,
|
||||||
|
weight_in_grams,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// TODO: Add the correct return type to the function signature.
|
||||||
|
fn is_international(&self) {
|
||||||
|
// TODO: Read the tests that use this method to find out when a package
|
||||||
|
// is considered international.
|
||||||
|
}
|
||||||
|
|
||||||
|
// TODO: Add the correct return type to the function signature.
|
||||||
|
fn get_fees(&self, cents_per_gram: u32) {
|
||||||
|
// TODO: Calculate the package's fees.
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fn main() {
|
||||||
|
// You can optionally experiment here.
|
||||||
|
}
|
||||||
|
|
||||||
|
#[cfg(test)]
|
||||||
|
mod tests {
|
||||||
|
use super::*;
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
#[should_panic]
|
||||||
|
fn fail_creating_weightless_package() {
|
||||||
|
let sender_country = String::from("Spain");
|
||||||
|
let recipient_country = String::from("Austria");
|
||||||
|
|
||||||
|
Package::new(sender_country, recipient_country, 5);
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn create_international_package() {
|
||||||
|
let sender_country = String::from("Spain");
|
||||||
|
let recipient_country = String::from("Russia");
|
||||||
|
|
||||||
|
let package = Package::new(sender_country, recipient_country, 1200);
|
||||||
|
|
||||||
|
assert!(package.is_international());
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn create_local_package() {
|
||||||
|
let sender_country = String::from("Canada");
|
||||||
|
let recipient_country = sender_country.clone();
|
||||||
|
|
||||||
|
let package = Package::new(sender_country, recipient_country, 1200);
|
||||||
|
|
||||||
|
assert!(!package.is_international());
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn calculate_transport_fees() {
|
||||||
|
let sender_country = String::from("Spain");
|
||||||
|
let recipient_country = String::from("Spain");
|
||||||
|
|
||||||
|
let cents_per_gram = 3;
|
||||||
|
|
||||||
|
let package = Package::new(sender_country, recipient_country, 1500);
|
||||||
|
|
||||||
|
assert_eq!(package.get_fees(cents_per_gram), 4500);
|
||||||
|
assert_eq!(package.get_fees(cents_per_gram * 2), 9000);
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -1,10 +1,10 @@
|
|||||||
# Enums
|
# Enums
|
||||||
|
|
||||||
Rust allows you to define types called "enums" which enumerate possible values.
|
Rust allows you to define types called "enums" which enumerate possible values.
|
||||||
Enums are a feature in many languages, but their capabilities differ in each language. Rust’s enums are most similar to algebraic data types in functional languages, such as F#, OCaml, and Haskell.
|
Enums are a feature in many languages, but their capabilities differ in each language. Rust's enums are most similar to algebraic data types in functional languages, such as F#, OCaml, and Haskell.
|
||||||
Useful in combination with enums is Rust's "pattern matching" facility, which makes it easy to run different code for different values of an enumeration.
|
Useful in combination with enums is Rust's "pattern matching" facility, which makes it easy to run different code for different values of an enumeration.
|
||||||
|
|
||||||
## Further information
|
## Further information
|
||||||
|
|
||||||
- [Enums](https://doc.rust-lang.org/book/ch06-00-enums.html)
|
- [Enums](https://doc.rust-lang.org/book/ch06-00-enums.html)
|
||||||
- [Pattern syntax](https://doc.rust-lang.org/book/ch18-03-pattern-syntax.html)
|
- [Pattern syntax](https://doc.rust-lang.org/book/ch19-03-pattern-syntax.html)
|
||||||
@ -1,16 +1,12 @@
|
|||||||
// enums1.rs
|
|
||||||
// No hints this time! ;)
|
|
||||||
|
|
||||||
// I AM NOT DONE
|
|
||||||
|
|
||||||
#[derive(Debug)]
|
#[derive(Debug)]
|
||||||
enum Message {
|
enum Message {
|
||||||
// TODO: define a few types of messages as used below
|
// TODO: Define a few types of messages as used below.
|
||||||
}
|
}
|
||||||
|
|
||||||
fn main() {
|
fn main() {
|
||||||
println!("{:?}", Message::Quit);
|
println!("{:?}", Message::Resize);
|
||||||
println!("{:?}", Message::Echo);
|
|
||||||
println!("{:?}", Message::Move);
|
println!("{:?}", Message::Move);
|
||||||
|
println!("{:?}", Message::Echo);
|
||||||
println!("{:?}", Message::ChangeColor);
|
println!("{:?}", Message::ChangeColor);
|
||||||
|
println!("{:?}", Message::Quit);
|
||||||
}
|
}
|
||||||
@ -1,22 +1,27 @@
|
|||||||
// enums2.rs
|
#[derive(Debug)]
|
||||||
// Execute `rustlings hint enums2` or use the `hint` watch subcommand for a hint.
|
struct Point {
|
||||||
|
x: u64,
|
||||||
// I AM NOT DONE
|
y: u64,
|
||||||
|
}
|
||||||
|
|
||||||
#[derive(Debug)]
|
#[derive(Debug)]
|
||||||
enum Message {
|
enum Message {
|
||||||
// TODO: define the different variants used below
|
// TODO: Define the different variants used below.
|
||||||
}
|
}
|
||||||
|
|
||||||
impl Message {
|
impl Message {
|
||||||
fn call(&self) {
|
fn call(&self) {
|
||||||
println!("{:?}", self);
|
println!("{self:?}");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fn main() {
|
fn main() {
|
||||||
let messages = [
|
let messages = [
|
||||||
Message::Move { x: 10, y: 30 },
|
Message::Resize {
|
||||||
|
width: 10,
|
||||||
|
height: 30,
|
||||||
|
},
|
||||||
|
Message::Move(Point { x: 10, y: 15 }),
|
||||||
Message::Echo(String::from("hello world")),
|
Message::Echo(String::from("hello world")),
|
||||||
Message::ChangeColor(200, 255, 255),
|
Message::ChangeColor(200, 255, 255),
|
||||||
Message::Quit,
|
Message::Quit,
|
||||||
88
exercises/08_enums/enums3.rs
Normal file
88
exercises/08_enums/enums3.rs
Normal file
@ -0,0 +1,88 @@
|
|||||||
|
struct Point {
|
||||||
|
x: u64,
|
||||||
|
y: u64,
|
||||||
|
}
|
||||||
|
|
||||||
|
enum Message {
|
||||||
|
Resize { width: u64, height: u64 },
|
||||||
|
Move(Point),
|
||||||
|
Echo(String),
|
||||||
|
ChangeColor(u8, u8, u8),
|
||||||
|
Quit,
|
||||||
|
}
|
||||||
|
|
||||||
|
struct State {
|
||||||
|
width: u64,
|
||||||
|
height: u64,
|
||||||
|
position: Point,
|
||||||
|
message: String,
|
||||||
|
// RGB color composed of red, green and blue.
|
||||||
|
color: (u8, u8, u8),
|
||||||
|
quit: bool,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl State {
|
||||||
|
fn resize(&mut self, width: u64, height: u64) {
|
||||||
|
self.width = width;
|
||||||
|
self.height = height;
|
||||||
|
}
|
||||||
|
|
||||||
|
fn move_position(&mut self, point: Point) {
|
||||||
|
self.position = point;
|
||||||
|
}
|
||||||
|
|
||||||
|
fn echo(&mut self, s: String) {
|
||||||
|
self.message = s;
|
||||||
|
}
|
||||||
|
|
||||||
|
fn change_color(&mut self, red: u8, green: u8, blue: u8) {
|
||||||
|
self.color = (red, green, blue);
|
||||||
|
}
|
||||||
|
|
||||||
|
fn quit(&mut self) {
|
||||||
|
self.quit = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
fn process(&mut self, message: Message) {
|
||||||
|
// TODO: Create a match expression to process the different message
|
||||||
|
// variants using the methods defined above.
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fn main() {
|
||||||
|
// You can optionally experiment here.
|
||||||
|
}
|
||||||
|
|
||||||
|
#[cfg(test)]
|
||||||
|
mod tests {
|
||||||
|
use super::*;
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn test_match_message_call() {
|
||||||
|
let mut state = State {
|
||||||
|
width: 0,
|
||||||
|
height: 0,
|
||||||
|
position: Point { x: 0, y: 0 },
|
||||||
|
message: String::from("hello world"),
|
||||||
|
color: (0, 0, 0),
|
||||||
|
quit: false,
|
||||||
|
};
|
||||||
|
|
||||||
|
state.process(Message::Resize {
|
||||||
|
width: 10,
|
||||||
|
height: 30,
|
||||||
|
});
|
||||||
|
state.process(Message::Move(Point { x: 10, y: 15 }));
|
||||||
|
state.process(Message::Echo(String::from("Hello world!")));
|
||||||
|
state.process(Message::ChangeColor(255, 0, 255));
|
||||||
|
state.process(Message::Quit);
|
||||||
|
|
||||||
|
assert_eq!(state.width, 10);
|
||||||
|
assert_eq!(state.height, 30);
|
||||||
|
assert_eq!(state.position.x, 10);
|
||||||
|
assert_eq!(state.position.y, 15);
|
||||||
|
assert_eq!(state.message, "Hello world!");
|
||||||
|
assert_eq!(state.color, (255, 0, 255));
|
||||||
|
assert!(state.quit);
|
||||||
|
}
|
||||||
|
}
|
||||||
9
exercises/09_strings/strings1.rs
Normal file
9
exercises/09_strings/strings1.rs
Normal file
@ -0,0 +1,9 @@
|
|||||||
|
// TODO: Fix the compiler error without changing the function signature.
|
||||||
|
fn current_favorite_color() -> String {
|
||||||
|
"blue"
|
||||||
|
}
|
||||||
|
|
||||||
|
fn main() {
|
||||||
|
let answer = current_favorite_color();
|
||||||
|
println!("My current favorite color is {answer}");
|
||||||
|
}
|
||||||
@ -1,18 +1,14 @@
|
|||||||
// strings2.rs
|
// TODO: Fix the compiler error in the `main` function without changing this function.
|
||||||
// Make me compile without changing the function signature!
|
fn is_a_color_word(attempt: &str) -> bool {
|
||||||
// Execute `rustlings hint strings2` or use the `hint` watch subcommand for a hint.
|
attempt == "green" || attempt == "blue" || attempt == "red"
|
||||||
|
}
|
||||||
// I AM NOT DONE
|
|
||||||
|
|
||||||
fn main() {
|
fn main() {
|
||||||
let word = String::from("green"); // Try not changing this line :)
|
let word = String::from("green"); // Don't change this line.
|
||||||
|
|
||||||
if is_a_color_word(word) {
|
if is_a_color_word(word) {
|
||||||
println!("That is a color word I know!");
|
println!("That is a color word I know!");
|
||||||
} else {
|
} else {
|
||||||
println!("That is not a color word I know.");
|
println!("That is not a color word I know.");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fn is_a_color_word(attempt: &str) -> bool {
|
|
||||||
attempt == "green" || attempt == "blue" || attempt == "red"
|
|
||||||
}
|
|
||||||
46
exercises/09_strings/strings3.rs
Normal file
46
exercises/09_strings/strings3.rs
Normal file
@ -0,0 +1,46 @@
|
|||||||
|
fn trim_me(input: &str) -> &str {
|
||||||
|
// TODO: Remove whitespace from both ends of a string.
|
||||||
|
}
|
||||||
|
|
||||||
|
fn compose_me(input: &str) -> String {
|
||||||
|
// TODO: Add " world!" to the string! There are multiple ways to do this.
|
||||||
|
}
|
||||||
|
|
||||||
|
fn replace_me(input: &str) -> String {
|
||||||
|
// TODO: Replace "cars" in the string with "balloons".
|
||||||
|
}
|
||||||
|
|
||||||
|
fn main() {
|
||||||
|
// You can optionally experiment here.
|
||||||
|
}
|
||||||
|
|
||||||
|
#[cfg(test)]
|
||||||
|
mod tests {
|
||||||
|
use super::*;
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn trim_a_string() {
|
||||||
|
assert_eq!(trim_me("Hello! "), "Hello!");
|
||||||
|
assert_eq!(trim_me(" What's up!"), "What's up!");
|
||||||
|
assert_eq!(trim_me(" Hola! "), "Hola!");
|
||||||
|
assert_eq!(trim_me("Hi!"), "Hi!");
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn compose_a_string() {
|
||||||
|
assert_eq!(compose_me("Hello"), "Hello world!");
|
||||||
|
assert_eq!(compose_me("Goodbye"), "Goodbye world!");
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn replace_a_string() {
|
||||||
|
assert_eq!(
|
||||||
|
replace_me("I think cars are cool"),
|
||||||
|
"I think balloons are cool",
|
||||||
|
);
|
||||||
|
assert_eq!(
|
||||||
|
replace_me("I love to look at cars"),
|
||||||
|
"I love to look at balloons",
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
37
exercises/09_strings/strings4.rs
Normal file
37
exercises/09_strings/strings4.rs
Normal file
@ -0,0 +1,37 @@
|
|||||||
|
// Calls of this function should be replaced with calls of `string_slice` or `string`.
|
||||||
|
fn placeholder() {}
|
||||||
|
|
||||||
|
fn string_slice(arg: &str) {
|
||||||
|
println!("{arg}");
|
||||||
|
}
|
||||||
|
|
||||||
|
fn string(arg: String) {
|
||||||
|
println!("{arg}");
|
||||||
|
}
|
||||||
|
|
||||||
|
// TODO: Here are a bunch of values - some are `String`, some are `&str`.
|
||||||
|
// Your task is to replace `placeholder(…)` with either `string_slice(…)`
|
||||||
|
// or `string(…)` depending on what you think each value is.
|
||||||
|
fn main() {
|
||||||
|
placeholder("blue");
|
||||||
|
|
||||||
|
placeholder("red".to_string());
|
||||||
|
|
||||||
|
placeholder(String::from("hi"));
|
||||||
|
|
||||||
|
placeholder("rust is fun!".to_owned());
|
||||||
|
|
||||||
|
placeholder("nice weather".into());
|
||||||
|
|
||||||
|
placeholder(format!("Interpolation {}", "Station"));
|
||||||
|
|
||||||
|
// WARNING: This is byte indexing, not character indexing.
|
||||||
|
// Character indexing can be done using `s.chars().nth(INDEX)`.
|
||||||
|
placeholder(&String::from("abc")[0..1]);
|
||||||
|
|
||||||
|
placeholder(" hello there ".trim());
|
||||||
|
|
||||||
|
placeholder("Happy Monday!".replace("Mon", "Tues"));
|
||||||
|
|
||||||
|
placeholder("mY sHiFt KeY iS sTiCkY".to_lowercase());
|
||||||
|
}
|
||||||
@ -1,8 +1,4 @@
|
|||||||
// modules1.rs
|
// TODO: Fix the compiler error about calling a private function.
|
||||||
// Execute `rustlings hint modules1` or use the `hint` watch subcommand for a hint.
|
|
||||||
|
|
||||||
// I AM NOT DONE
|
|
||||||
|
|
||||||
mod sausage_factory {
|
mod sausage_factory {
|
||||||
// Don't let anybody outside of this module see this!
|
// Don't let anybody outside of this module see this!
|
||||||
fn get_secret_recipe() -> String {
|
fn get_secret_recipe() -> String {
|
||||||
26
exercises/10_modules/modules2.rs
Normal file
26
exercises/10_modules/modules2.rs
Normal file
@ -0,0 +1,26 @@
|
|||||||
|
// You can bring module paths into scopes and provide new names for them with
|
||||||
|
// the `use` and `as` keywords.
|
||||||
|
|
||||||
|
mod delicious_snacks {
|
||||||
|
// TODO: Add the following two `use` statements after fixing them.
|
||||||
|
// use self::fruits::PEAR as ???;
|
||||||
|
// use self::veggies::CUCUMBER as ???;
|
||||||
|
|
||||||
|
mod fruits {
|
||||||
|
pub const PEAR: &str = "Pear";
|
||||||
|
pub const APPLE: &str = "Apple";
|
||||||
|
}
|
||||||
|
|
||||||
|
mod veggies {
|
||||||
|
pub const CUCUMBER: &str = "Cucumber";
|
||||||
|
pub const CARROT: &str = "Carrot";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fn main() {
|
||||||
|
println!(
|
||||||
|
"favorite snacks: {} and {}",
|
||||||
|
delicious_snacks::fruit,
|
||||||
|
delicious_snacks::veggie,
|
||||||
|
);
|
||||||
|
}
|
||||||
13
exercises/10_modules/modules3.rs
Normal file
13
exercises/10_modules/modules3.rs
Normal file
@ -0,0 +1,13 @@
|
|||||||
|
// You can use the `use` keyword to bring module paths from modules from
|
||||||
|
// anywhere and especially from the standard library into your scope.
|
||||||
|
|
||||||
|
// TODO: Bring `SystemTime` and `UNIX_EPOCH` from the `std::time` module into
|
||||||
|
// your scope. Bonus style points if you can do it with one line!
|
||||||
|
// use ???;
|
||||||
|
|
||||||
|
fn main() {
|
||||||
|
match SystemTime::now().duration_since(UNIX_EPOCH) {
|
||||||
|
Ok(n) => println!("1970-01-01 00:00:00 UTC was {} seconds ago!", n.as_secs()),
|
||||||
|
Err(_) => panic!("SystemTime before UNIX EPOCH!"),
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -1,6 +1,7 @@
|
|||||||
# Hashmaps
|
# Hashmaps
|
||||||
|
|
||||||
A *hash map* allows you to associate a value with a particular key.
|
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),
|
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.
|
[*dictionary* in Python](https://docs.python.org/3/tutorial/datastructures.html#dictionaries) or an *associative array* in other languages.
|
||||||
|
|
||||||
This is the other data structure that we've been talking about before, when
|
This is the other data structure that we've been talking about before, when
|
||||||
@ -1,30 +1,27 @@
|
|||||||
// hashmaps1.rs
|
// A basket of fruits in the form of a hash map needs to be defined. The key
|
||||||
// A basket of fruits in the form of a hash map needs to be defined.
|
// represents the name of the fruit and the value represents how many of that
|
||||||
// The key represents the name of the fruit and the value represents
|
// particular fruit is in the basket. You have to put at least 3 different
|
||||||
// how many of that particular fruit is in the basket. You have to put
|
// types of fruits (e.g. apple, banana, mango) in the basket and the total count
|
||||||
// at least three different types of fruits (e.g apple, banana, mango)
|
// of all the fruits should be at least 5.
|
||||||
// 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.
|
|
||||||
|
|
||||||
// I AM NOT DONE
|
|
||||||
|
|
||||||
use std::collections::HashMap;
|
use std::collections::HashMap;
|
||||||
|
|
||||||
fn fruit_basket() -> HashMap<String, u32> {
|
fn fruit_basket() -> HashMap<String, u32> {
|
||||||
let mut basket = // TODO: declare your hash map here.
|
// TODO: Declare the hash map.
|
||||||
|
// let mut basket =
|
||||||
|
|
||||||
// Two bananas are already given for you :)
|
// Two bananas are already given for you :)
|
||||||
basket.insert(String::from("banana"), 2);
|
basket.insert(String::from("banana"), 2);
|
||||||
|
|
||||||
// TODO: Put more fruits in your basket here.
|
// TODO: Put more fruits in your basket.
|
||||||
|
|
||||||
basket
|
basket
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn main() {
|
||||||
|
// You can optionally experiment here.
|
||||||
|
}
|
||||||
|
|
||||||
#[cfg(test)]
|
#[cfg(test)]
|
||||||
mod tests {
|
mod tests {
|
||||||
use super::*;
|
use super::*;
|
||||||
97
exercises/11_hashmaps/hashmaps2.rs
Normal file
97
exercises/11_hashmaps/hashmaps2.rs
Normal file
@ -0,0 +1,97 @@
|
|||||||
|
// 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 the fruits that are already in the basket (Apple,
|
||||||
|
// Mango, and Lychee).
|
||||||
|
|
||||||
|
use std::collections::HashMap;
|
||||||
|
|
||||||
|
#[derive(Hash, PartialEq, Eq, Debug)]
|
||||||
|
enum Fruit {
|
||||||
|
Apple,
|
||||||
|
Banana,
|
||||||
|
Mango,
|
||||||
|
Lychee,
|
||||||
|
Pineapple,
|
||||||
|
}
|
||||||
|
|
||||||
|
fn fruit_basket(basket: &mut HashMap<Fruit, u32>) {
|
||||||
|
let fruit_kinds = [
|
||||||
|
Fruit::Apple,
|
||||||
|
Fruit::Banana,
|
||||||
|
Fruit::Mango,
|
||||||
|
Fruit::Lychee,
|
||||||
|
Fruit::Pineapple,
|
||||||
|
];
|
||||||
|
|
||||||
|
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!
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fn main() {
|
||||||
|
// You can optionally experiment here.
|
||||||
|
}
|
||||||
|
|
||||||
|
#[cfg(test)]
|
||||||
|
mod tests {
|
||||||
|
use super::*;
|
||||||
|
|
||||||
|
// Don't modify this function!
|
||||||
|
fn get_fruit_basket() -> HashMap<Fruit, u32> {
|
||||||
|
let content = [(Fruit::Apple, 4), (Fruit::Mango, 2), (Fruit::Lychee, 5)];
|
||||||
|
HashMap::from_iter(content)
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn test_given_fruits_are_not_modified() {
|
||||||
|
let mut basket = get_fruit_basket();
|
||||||
|
fruit_basket(&mut basket);
|
||||||
|
assert_eq!(*basket.get(&Fruit::Apple).unwrap(), 4);
|
||||||
|
assert_eq!(*basket.get(&Fruit::Mango).unwrap(), 2);
|
||||||
|
assert_eq!(*basket.get(&Fruit::Lychee).unwrap(), 5);
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn at_least_five_types_of_fruits() {
|
||||||
|
let mut basket = get_fruit_basket();
|
||||||
|
fruit_basket(&mut basket);
|
||||||
|
let count_fruit_kinds = basket.len();
|
||||||
|
assert!(count_fruit_kinds >= 5);
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn greater_than_eleven_fruits() {
|
||||||
|
let mut basket = get_fruit_basket();
|
||||||
|
fruit_basket(&mut basket);
|
||||||
|
let count = basket.values().sum::<u32>();
|
||||||
|
assert!(count > 11);
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn all_fruit_types_in_basket() {
|
||||||
|
let fruit_kinds = [
|
||||||
|
Fruit::Apple,
|
||||||
|
Fruit::Banana,
|
||||||
|
Fruit::Mango,
|
||||||
|
Fruit::Lychee,
|
||||||
|
Fruit::Pineapple,
|
||||||
|
];
|
||||||
|
|
||||||
|
let mut basket = get_fruit_basket();
|
||||||
|
fruit_basket(&mut basket);
|
||||||
|
|
||||||
|
for fruit_kind in fruit_kinds {
|
||||||
|
let Some(amount) = basket.get(&fruit_kind) else {
|
||||||
|
panic!("Fruit kind {fruit_kind:?} was not found in basket");
|
||||||
|
};
|
||||||
|
assert!(*amount > 0);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
77
exercises/11_hashmaps/hashmaps3.rs
Normal file
77
exercises/11_hashmaps/hashmaps3.rs
Normal file
@ -0,0 +1,77 @@
|
|||||||
|
// 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, the total
|
||||||
|
// number of goals the team scored, and the total number of goals the team
|
||||||
|
// conceded.
|
||||||
|
|
||||||
|
use std::collections::HashMap;
|
||||||
|
|
||||||
|
// A structure to store the goal details of a team.
|
||||||
|
#[derive(Default)]
|
||||||
|
struct TeamScores {
|
||||||
|
goals_scored: u8,
|
||||||
|
goals_conceded: u8,
|
||||||
|
}
|
||||||
|
|
||||||
|
fn build_scores_table(results: &str) -> HashMap<&str, TeamScores> {
|
||||||
|
// The name of the team is the key and its associated struct is the value.
|
||||||
|
let mut scores = HashMap::<&str, TeamScores>::new();
|
||||||
|
|
||||||
|
for line in results.lines() {
|
||||||
|
let mut split_iterator = line.split(',');
|
||||||
|
// NOTE: We use `unwrap` because we didn't deal with error handling yet.
|
||||||
|
let team_1_name = split_iterator.next().unwrap();
|
||||||
|
let team_2_name = split_iterator.next().unwrap();
|
||||||
|
let team_1_score: u8 = split_iterator.next().unwrap().parse().unwrap();
|
||||||
|
let team_2_score: u8 = split_iterator.next().unwrap().parse().unwrap();
|
||||||
|
|
||||||
|
// TODO: Populate the scores table with the extracted details.
|
||||||
|
// Keep in mind that goals scored by team 1 will be the number of goals
|
||||||
|
// conceded by team 2. Similarly, goals scored by team 2 will be the
|
||||||
|
// number of goals conceded by team 1.
|
||||||
|
}
|
||||||
|
|
||||||
|
scores
|
||||||
|
}
|
||||||
|
|
||||||
|
fn main() {
|
||||||
|
// You can optionally experiment here.
|
||||||
|
}
|
||||||
|
|
||||||
|
#[cfg(test)]
|
||||||
|
mod tests {
|
||||||
|
use super::*;
|
||||||
|
|
||||||
|
const RESULTS: &str = "England,France,4,2
|
||||||
|
France,Italy,3,1
|
||||||
|
Poland,Spain,2,0
|
||||||
|
Germany,England,2,1
|
||||||
|
England,Spain,1,0";
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn build_scores() {
|
||||||
|
let scores = build_scores_table(RESULTS);
|
||||||
|
|
||||||
|
assert!(["England", "France", "Germany", "Italy", "Poland", "Spain"]
|
||||||
|
.into_iter()
|
||||||
|
.all(|team_name| scores.contains_key(team_name)));
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn validate_team_score_1() {
|
||||||
|
let scores = build_scores_table(RESULTS);
|
||||||
|
let team = scores.get("England").unwrap();
|
||||||
|
assert_eq!(team.goals_scored, 6);
|
||||||
|
assert_eq!(team.goals_conceded, 4);
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn validate_team_score_2() {
|
||||||
|
let scores = build_scores_table(RESULTS);
|
||||||
|
let team = scores.get("Spain").unwrap();
|
||||||
|
assert_eq!(team.goals_scored, 0);
|
||||||
|
assert_eq!(team.goals_conceded, 3);
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -1,7 +1,8 @@
|
|||||||
# Options
|
# Options
|
||||||
|
|
||||||
Type Option represents an optional value: every Option is either Some and contains a value, or None, and does not.
|
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:
|
Option types are very common in Rust code, as they have a number of uses:
|
||||||
|
|
||||||
- Initial values
|
- Initial values
|
||||||
- Return values for functions that are not defined over their entire input range (partial functions)
|
- 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
|
- Return value for otherwise reporting simple errors, where None is returned on error
|
||||||
@ -13,7 +14,7 @@ Option types are very common in Rust code, as they have a number of uses:
|
|||||||
|
|
||||||
## Further Information
|
## Further Information
|
||||||
|
|
||||||
- [Option Enum Format](https://doc.rust-lang.org/stable/book/ch10-01-syntax.html#in-enum-definitions)
|
- [Option Enum Format](https://doc.rust-lang.org/book/ch10-01-syntax.html#in-enum-definitions)
|
||||||
- [Option Module Documentation](https://doc.rust-lang.org/std/option/)
|
- [Option Module Documentation](https://doc.rust-lang.org/std/option/)
|
||||||
- [Option Enum Documentation](https://doc.rust-lang.org/std/option/enum.Option.html)
|
- [Option Enum Documentation](https://doc.rust-lang.org/std/option/enum.Option.html)
|
||||||
- [if let](https://doc.rust-lang.org/rust-by-example/flow_control/if_let.html)
|
- [if let](https://doc.rust-lang.org/rust-by-example/flow_control/if_let.html)
|
||||||
36
exercises/12_options/options1.rs
Normal file
36
exercises/12_options/options1.rs
Normal file
@ -0,0 +1,36 @@
|
|||||||
|
// This function returns how much ice cream there is left in the fridge.
|
||||||
|
// If it's before 22:00 (24-hour system), then 5 scoops are left. At 22:00,
|
||||||
|
// someone eats it all, so no ice cream is left (value 0). Return `None` if
|
||||||
|
// `hour_of_day` is higher than 23.
|
||||||
|
fn maybe_ice_cream(hour_of_day: u16) -> Option<u16> {
|
||||||
|
// TODO: Complete the function body.
|
||||||
|
}
|
||||||
|
|
||||||
|
fn main() {
|
||||||
|
// You can optionally experiment here.
|
||||||
|
}
|
||||||
|
|
||||||
|
#[cfg(test)]
|
||||||
|
mod tests {
|
||||||
|
use super::*;
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn raw_value() {
|
||||||
|
// TODO: Fix this test. How do you get the value contained in the
|
||||||
|
// Option?
|
||||||
|
let ice_creams = maybe_ice_cream(12);
|
||||||
|
|
||||||
|
assert_eq!(ice_creams, 5); // Don't change this line.
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn check_ice_cream() {
|
||||||
|
assert_eq!(maybe_ice_cream(0), Some(5));
|
||||||
|
assert_eq!(maybe_ice_cream(9), Some(5));
|
||||||
|
assert_eq!(maybe_ice_cream(18), Some(5));
|
||||||
|
assert_eq!(maybe_ice_cream(22), Some(0));
|
||||||
|
assert_eq!(maybe_ice_cream(23), Some(0));
|
||||||
|
assert_eq!(maybe_ice_cream(24), None);
|
||||||
|
assert_eq!(maybe_ice_cream(25), None);
|
||||||
|
}
|
||||||
|
}
|
||||||
39
exercises/12_options/options2.rs
Normal file
39
exercises/12_options/options2.rs
Normal file
@ -0,0 +1,39 @@
|
|||||||
|
fn main() {
|
||||||
|
// You can optionally experiment here.
|
||||||
|
}
|
||||||
|
|
||||||
|
#[cfg(test)]
|
||||||
|
mod tests {
|
||||||
|
#[test]
|
||||||
|
fn simple_option() {
|
||||||
|
let target = "rustlings";
|
||||||
|
let optional_target = Some(target);
|
||||||
|
|
||||||
|
// TODO: Make this an if-let statement whose value is `Some`.
|
||||||
|
word = optional_target {
|
||||||
|
assert_eq!(word, target);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn layered_option() {
|
||||||
|
let range = 10;
|
||||||
|
let mut optional_integers: Vec<Option<i8>> = vec![None];
|
||||||
|
|
||||||
|
for i in 1..=range {
|
||||||
|
optional_integers.push(Some(i));
|
||||||
|
}
|
||||||
|
|
||||||
|
let mut cursor = range;
|
||||||
|
|
||||||
|
// TODO: Make this a while-let statement. Remember that `Vec::pop()`
|
||||||
|
// adds another layer of `Option`. You can do nested pattern matching
|
||||||
|
// in if-let and while-let statements.
|
||||||
|
integer = optional_integers.pop() {
|
||||||
|
assert_eq!(integer, cursor);
|
||||||
|
cursor -= 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
assert_eq!(cursor, 0);
|
||||||
|
}
|
||||||
|
}
|
||||||
17
exercises/12_options/options3.rs
Normal file
17
exercises/12_options/options3.rs
Normal file
@ -0,0 +1,17 @@
|
|||||||
|
#[derive(Debug)]
|
||||||
|
struct Point {
|
||||||
|
x: i32,
|
||||||
|
y: i32,
|
||||||
|
}
|
||||||
|
|
||||||
|
fn main() {
|
||||||
|
let optional_point = Some(Point { x: 100, y: 200 });
|
||||||
|
|
||||||
|
// TODO: Fix the compiler error by adding something to this match statement.
|
||||||
|
match optional_point {
|
||||||
|
Some(p) => println!("Coordinates are {},{}", p.x, p.y),
|
||||||
|
_ => panic!("No match!"),
|
||||||
|
}
|
||||||
|
|
||||||
|
println!("{optional_point:?}"); // Don't change this line.
|
||||||
|
}
|
||||||
@ -1,7 +1,8 @@
|
|||||||
# Error handling
|
# Error handling
|
||||||
Most errors aren’t serious enough to require the program to stop entirely.
|
|
||||||
Sometimes, when a function fails, it’s for a reason that you can easily interpret and respond to.
|
Most errors aren't serious enough to require the program to stop entirely.
|
||||||
For example, if you try to open a file and that operation fails because the file doesn’t exist, you might want to create the file instead of terminating the process.
|
Sometimes, when a function fails, it's for a reason that you can easily interpret and respond to.
|
||||||
|
For example, if you try to open a file and that operation fails because the file doesn't exist, you might want to create the file instead of terminating the process.
|
||||||
|
|
||||||
## Further information
|
## Further information
|
||||||
|
|
||||||
41
exercises/13_error_handling/errors1.rs
Normal file
41
exercises/13_error_handling/errors1.rs
Normal file
@ -0,0 +1,41 @@
|
|||||||
|
// TODO: 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 returning `None`. Thankfully, Rust has a similar
|
||||||
|
// construct to `Option` that can be used to express error conditions. Change
|
||||||
|
// the function signature and body to return `Result<String, String>` instead
|
||||||
|
// of `Option<String>`.
|
||||||
|
fn generate_nametag_text(name: String) -> Option<String> {
|
||||||
|
if name.is_empty() {
|
||||||
|
// Empty names aren't allowed
|
||||||
|
None
|
||||||
|
} else {
|
||||||
|
Some(format!("Hi! My name is {name}"))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fn main() {
|
||||||
|
// You can optionally experiment here.
|
||||||
|
}
|
||||||
|
|
||||||
|
#[cfg(test)]
|
||||||
|
mod tests {
|
||||||
|
use super::*;
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn generates_nametag_text_for_a_nonempty_name() {
|
||||||
|
assert_eq!(
|
||||||
|
generate_nametag_text("Beyoncé".to_string()).as_deref(),
|
||||||
|
Ok("Hi! My name is Beyoncé"),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn explains_why_generating_nametag_text_fails() {
|
||||||
|
assert_eq!(
|
||||||
|
generate_nametag_text(String::new())
|
||||||
|
.as_ref()
|
||||||
|
.map_err(|e| e.as_str()),
|
||||||
|
Err("Empty names aren't allowed"),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -1,37 +1,39 @@
|
|||||||
// errors2.rs
|
|
||||||
// Say we're writing a game where you can buy items with tokens. All items cost
|
// 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
|
// 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,
|
// token. A player of the game will type in how many items they want to buy, and
|
||||||
// and the `total_cost` function will calculate the total number of tokens.
|
// the `total_cost` function will calculate the total cost of the items. Since
|
||||||
// Since the player typed in the quantity, though, we get it as a string-- and
|
// the player typed in the quantity, we get it as a string. They might have
|
||||||
// they might have typed anything, not just numbers!
|
// typed anything, not just numbers!
|
||||||
|
//
|
||||||
// Right now, this function isn't handling the error case at all (and isn't
|
// Right now, this function isn't handling the error case at all. What we want
|
||||||
// handling the success case properly either). What we want to do is:
|
// to do is: If we call the `total_cost` function on a string that is not a
|
||||||
// if we call the `parse` function on a string that is not a number, that
|
// number, that function will return a `ParseIntError`. In that case, we want to
|
||||||
// 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
|
||||||
// immediately return that error from our function and not try to multiply
|
// add.
|
||||||
// and add.
|
//
|
||||||
|
// There are at least two ways to implement this that are both correct. But one
|
||||||
// There are at least two ways to implement this that are both correct-- but
|
// is a lot shorter!
|
||||||
// one is a lot shorter!
|
|
||||||
// Execute `rustlings hint errors2` or use the `hint` watch subcommand for a hint.
|
|
||||||
|
|
||||||
// I AM NOT DONE
|
|
||||||
|
|
||||||
use std::num::ParseIntError;
|
use std::num::ParseIntError;
|
||||||
|
|
||||||
pub fn total_cost(item_quantity: &str) -> Result<i32, ParseIntError> {
|
fn total_cost(item_quantity: &str) -> Result<i32, ParseIntError> {
|
||||||
let processing_fee = 1;
|
let processing_fee = 1;
|
||||||
let cost_per_item = 5;
|
let cost_per_item = 5;
|
||||||
|
|
||||||
|
// TODO: Handle the error case as described above.
|
||||||
let qty = item_quantity.parse::<i32>();
|
let qty = item_quantity.parse::<i32>();
|
||||||
|
|
||||||
Ok(qty * cost_per_item + processing_fee)
|
Ok(qty * cost_per_item + processing_fee)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn main() {
|
||||||
|
// You can optionally experiment here.
|
||||||
|
}
|
||||||
|
|
||||||
#[cfg(test)]
|
#[cfg(test)]
|
||||||
mod tests {
|
mod tests {
|
||||||
use super::*;
|
use super::*;
|
||||||
|
use std::num::IntErrorKind;
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn item_quantity_is_a_valid_number() {
|
fn item_quantity_is_a_valid_number() {
|
||||||
@ -41,8 +43,8 @@ mod tests {
|
|||||||
#[test]
|
#[test]
|
||||||
fn item_quantity_is_an_invalid_number() {
|
fn item_quantity_is_an_invalid_number() {
|
||||||
assert_eq!(
|
assert_eq!(
|
||||||
total_cost("beep boop").unwrap_err().to_string(),
|
total_cost("beep boop").unwrap_err().kind(),
|
||||||
"invalid digit found in string"
|
&IntErrorKind::InvalidDigit,
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -1,31 +1,31 @@
|
|||||||
// errors3.rs
|
|
||||||
// This is a program that is trying to use a completed version of the
|
// 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!
|
// `total_cost` function from the previous exercise. It's not working though!
|
||||||
// Why not? What should we do to fix it?
|
// Why not? What should we do to fix it?
|
||||||
// Execute `rustlings hint errors3` or use the `hint` watch subcommand for a hint.
|
|
||||||
|
|
||||||
// I AM NOT DONE
|
|
||||||
|
|
||||||
use std::num::ParseIntError;
|
use std::num::ParseIntError;
|
||||||
|
|
||||||
fn main() {
|
// Don't change this function.
|
||||||
let mut tokens = 100;
|
fn total_cost(item_quantity: &str) -> Result<i32, ParseIntError> {
|
||||||
let pretend_user_input = "8";
|
|
||||||
|
|
||||||
let cost = total_cost(pretend_user_input)?;
|
|
||||||
|
|
||||||
if cost > tokens {
|
|
||||||
println!("You can't afford that many!");
|
|
||||||
} else {
|
|
||||||
tokens -= cost;
|
|
||||||
println!("You now have {} tokens.", tokens);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
pub fn total_cost(item_quantity: &str) -> Result<i32, ParseIntError> {
|
|
||||||
let processing_fee = 1;
|
let processing_fee = 1;
|
||||||
let cost_per_item = 5;
|
let cost_per_item = 5;
|
||||||
let qty = item_quantity.parse::<i32>()?;
|
let qty = item_quantity.parse::<i32>()?;
|
||||||
|
|
||||||
Ok(qty * cost_per_item + processing_fee)
|
Ok(qty * cost_per_item + processing_fee)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// TODO: Fix the compiler error by changing the signature and body of the
|
||||||
|
// `main` function.
|
||||||
|
fn main() {
|
||||||
|
let mut tokens = 100;
|
||||||
|
let pretend_user_input = "8";
|
||||||
|
|
||||||
|
// Don't change this line.
|
||||||
|
let cost = total_cost(pretend_user_input)?;
|
||||||
|
|
||||||
|
if cost > tokens {
|
||||||
|
println!("You can't afford that many!");
|
||||||
|
} else {
|
||||||
|
tokens -= cost;
|
||||||
|
println!("You now have {tokens} tokens.");
|
||||||
|
}
|
||||||
|
}
|
||||||
38
exercises/13_error_handling/errors4.rs
Normal file
38
exercises/13_error_handling/errors4.rs
Normal file
@ -0,0 +1,38 @@
|
|||||||
|
#[derive(PartialEq, Debug)]
|
||||||
|
enum CreationError {
|
||||||
|
Negative,
|
||||||
|
Zero,
|
||||||
|
}
|
||||||
|
|
||||||
|
#[derive(PartialEq, Debug)]
|
||||||
|
struct PositiveNonzeroInteger(u64);
|
||||||
|
|
||||||
|
impl PositiveNonzeroInteger {
|
||||||
|
fn new(value: i64) -> Result<Self, CreationError> {
|
||||||
|
// TODO: This function shouldn't always return an `Ok`.
|
||||||
|
// Read the tests below to clarify what should be returned.
|
||||||
|
Ok(Self(value as u64))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fn main() {
|
||||||
|
// You can optionally experiment here.
|
||||||
|
}
|
||||||
|
|
||||||
|
#[cfg(test)]
|
||||||
|
mod tests {
|
||||||
|
use super::*;
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn test_creation() {
|
||||||
|
assert_eq!(
|
||||||
|
PositiveNonzeroInteger::new(10),
|
||||||
|
Ok(PositiveNonzeroInteger(10)),
|
||||||
|
);
|
||||||
|
assert_eq!(
|
||||||
|
PositiveNonzeroInteger::new(-10),
|
||||||
|
Err(CreationError::Negative),
|
||||||
|
);
|
||||||
|
assert_eq!(PositiveNonzeroInteger::new(0), Err(CreationError::Zero));
|
||||||
|
}
|
||||||
|
}
|
||||||
56
exercises/13_error_handling/errors5.rs
Normal file
56
exercises/13_error_handling/errors5.rs
Normal file
@ -0,0 +1,56 @@
|
|||||||
|
// This exercise is an altered version of the `errors4` exercise. It 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.
|
||||||
|
//
|
||||||
|
// 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`.
|
||||||
|
|
||||||
|
use std::error::Error;
|
||||||
|
use std::fmt;
|
||||||
|
|
||||||
|
#[derive(PartialEq, Debug)]
|
||||||
|
enum CreationError {
|
||||||
|
Negative,
|
||||||
|
Zero,
|
||||||
|
}
|
||||||
|
|
||||||
|
// This is required so that `CreationError` can implement `Error`.
|
||||||
|
impl fmt::Display for CreationError {
|
||||||
|
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
|
||||||
|
let description = match *self {
|
||||||
|
CreationError::Negative => "number is negative",
|
||||||
|
CreationError::Zero => "number is zero",
|
||||||
|
};
|
||||||
|
f.write_str(description)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl Error for CreationError {}
|
||||||
|
|
||||||
|
#[derive(PartialEq, Debug)]
|
||||||
|
struct PositiveNonzeroInteger(u64);
|
||||||
|
|
||||||
|
impl PositiveNonzeroInteger {
|
||||||
|
fn new(value: i64) -> Result<PositiveNonzeroInteger, CreationError> {
|
||||||
|
match value {
|
||||||
|
x if x < 0 => Err(CreationError::Negative),
|
||||||
|
0 => Err(CreationError::Zero),
|
||||||
|
x => Ok(PositiveNonzeroInteger(x as u64)),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// TODO: Add the correct return type `Result<(), Box<dyn ???>>`. What can we
|
||||||
|
// use to describe both errors? Is there a trait which both errors implement?
|
||||||
|
fn main() {
|
||||||
|
let pretend_user_input = "42";
|
||||||
|
let x: i64 = pretend_user_input.parse()?;
|
||||||
|
println!("output={:?}", PositiveNonzeroInteger::new(x)?);
|
||||||
|
Ok(())
|
||||||
|
}
|
||||||
89
exercises/13_error_handling/errors6.rs
Normal file
89
exercises/13_error_handling/errors6.rs
Normal file
@ -0,0 +1,89 @@
|
|||||||
|
// Using catch-all error types like `Box<dyn 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.
|
||||||
|
|
||||||
|
use std::num::ParseIntError;
|
||||||
|
|
||||||
|
#[derive(PartialEq, Debug)]
|
||||||
|
enum CreationError {
|
||||||
|
Negative,
|
||||||
|
Zero,
|
||||||
|
}
|
||||||
|
|
||||||
|
// A custom error type that we will be using in `PositiveNonzeroInteger::parse`.
|
||||||
|
#[derive(PartialEq, Debug)]
|
||||||
|
enum ParsePosNonzeroError {
|
||||||
|
Creation(CreationError),
|
||||||
|
ParseInt(ParseIntError),
|
||||||
|
}
|
||||||
|
|
||||||
|
impl ParsePosNonzeroError {
|
||||||
|
fn from_creation(err: CreationError) -> Self {
|
||||||
|
Self::Creation(err)
|
||||||
|
}
|
||||||
|
|
||||||
|
// TODO: Add another error conversion function here.
|
||||||
|
// fn from_parse_int(???) -> Self { ??? }
|
||||||
|
}
|
||||||
|
|
||||||
|
#[derive(PartialEq, Debug)]
|
||||||
|
struct PositiveNonzeroInteger(u64);
|
||||||
|
|
||||||
|
impl PositiveNonzeroInteger {
|
||||||
|
fn new(value: i64) -> Result<Self, CreationError> {
|
||||||
|
match value {
|
||||||
|
x if x < 0 => Err(CreationError::Negative),
|
||||||
|
0 => Err(CreationError::Zero),
|
||||||
|
x => Ok(Self(x as u64)),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fn parse(s: &str) -> Result<Self, ParsePosNonzeroError> {
|
||||||
|
// TODO: change this to return an appropriate error instead of panicking
|
||||||
|
// when `parse()` returns an error.
|
||||||
|
let x: i64 = s.parse().unwrap();
|
||||||
|
Self::new(x).map_err(ParsePosNonzeroError::from_creation)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fn main() {
|
||||||
|
// You can optionally experiment here.
|
||||||
|
}
|
||||||
|
|
||||||
|
#[cfg(test)]
|
||||||
|
mod test {
|
||||||
|
use super::*;
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn test_parse_error() {
|
||||||
|
assert!(matches!(
|
||||||
|
PositiveNonzeroInteger::parse("not a number"),
|
||||||
|
Err(ParsePosNonzeroError::ParseInt(_)),
|
||||||
|
));
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn test_negative() {
|
||||||
|
assert_eq!(
|
||||||
|
PositiveNonzeroInteger::parse("-555"),
|
||||||
|
Err(ParsePosNonzeroError::Creation(CreationError::Negative)),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn test_zero() {
|
||||||
|
assert_eq!(
|
||||||
|
PositiveNonzeroInteger::parse("0"),
|
||||||
|
Err(ParsePosNonzeroError::Creation(CreationError::Zero)),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn test_positive() {
|
||||||
|
let x = PositiveNonzeroInteger::new(42).unwrap();
|
||||||
|
assert_eq!(x.0, 42);
|
||||||
|
assert_eq!(PositiveNonzeroInteger::parse("42"), Ok(x));
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -1,11 +1,11 @@
|
|||||||
# Generics
|
# Generics
|
||||||
|
|
||||||
Generics is the topic of generalizing types and functionalities to broader cases.
|
Generics is the topic of generalizing types and functionalities to broader cases.
|
||||||
This is extremely useful for reducing code duplication in many ways, but can call for rather involving syntax.
|
This is extremely useful for reducing code duplication in many ways, but can call for some rather involved syntax.
|
||||||
Namely, being generic requires taking great care to specify over which types a generic type is actually considered valid.
|
Namely, being generic requires taking great care to specify over which types a generic type is actually considered valid.
|
||||||
The simplest and most common use of generics is for type parameters.
|
The simplest and most common use of generics is for type parameters.
|
||||||
|
|
||||||
## Further information
|
## Further information
|
||||||
|
|
||||||
- [Generic Data Types](https://doc.rust-lang.org/stable/book/ch10-01-syntax.html)
|
- [Generic Data Types](https://doc.rust-lang.org/book/ch10-01-syntax.html)
|
||||||
- [Bounds](https://doc.rust-lang.org/rust-by-example/generics/bounds.html)
|
- [Bounds](https://doc.rust-lang.org/rust-by-example/generics/bounds.html)
|
||||||
18
exercises/14_generics/generics1.rs
Normal file
18
exercises/14_generics/generics1.rs
Normal file
@ -0,0 +1,18 @@
|
|||||||
|
// `Vec<T>` is generic over the type `T`. In most cases, the compiler is able to
|
||||||
|
// infer `T`, for example after pushing a value with a concrete type to the vector.
|
||||||
|
// But in this exercise, the compiler needs some help through a type annotation.
|
||||||
|
|
||||||
|
fn main() {
|
||||||
|
// TODO: Fix the compiler error by annotating the type of the vector
|
||||||
|
// `Vec<T>`. Choose `T` as some integer type that can be created from
|
||||||
|
// `u8` and `i8`.
|
||||||
|
let mut numbers = Vec::new();
|
||||||
|
|
||||||
|
// Don't change the lines below.
|
||||||
|
let n1: u8 = 42;
|
||||||
|
numbers.push(n1.into());
|
||||||
|
let n2: i8 = -1;
|
||||||
|
numbers.push(n2.into());
|
||||||
|
|
||||||
|
println!("{numbers:?}");
|
||||||
|
}
|
||||||
@ -1,20 +1,20 @@
|
|||||||
// This powerful wrapper provides the ability to store a positive integer value.
|
// This powerful wrapper provides the ability to store a positive integer value.
|
||||||
// Rewrite it using generics so that it supports wrapping ANY type.
|
// TODO: Rewrite it using a generic so that it supports wrapping ANY type.
|
||||||
|
|
||||||
// Execute `rustlings hint generics2` or use the `hint` watch subcommand for a hint.
|
|
||||||
|
|
||||||
// I AM NOT DONE
|
|
||||||
|
|
||||||
struct Wrapper {
|
struct Wrapper {
|
||||||
value: u32,
|
value: u32,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// TODO: Adapt the struct's implementation to be generic over the wrapped value.
|
||||||
impl Wrapper {
|
impl Wrapper {
|
||||||
pub fn new(value: u32) -> Self {
|
fn new(value: u32) -> Self {
|
||||||
Wrapper { value }
|
Wrapper { value }
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn main() {
|
||||||
|
// You can optionally experiment here.
|
||||||
|
}
|
||||||
|
|
||||||
#[cfg(test)]
|
#[cfg(test)]
|
||||||
mod tests {
|
mod tests {
|
||||||
use super::*;
|
use super::*;
|
||||||
@ -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.
|
In this way, traits are somewhat similar to Java interfaces and C++ abstract classes.
|
||||||
|
|
||||||
Some additional common Rust traits include:
|
Some additional common Rust traits include:
|
||||||
|
|
||||||
- `Clone` (the `clone` method)
|
- `Clone` (the `clone` method)
|
||||||
- `Display` (which allows formatted display via `{}`)
|
- `Display` (which allows formatted display via `{}`)
|
||||||
- `Debug` (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.
|
Because traits indicate shared behavior between data types, they are useful when writing generics.
|
||||||
|
|
||||||
|
|
||||||
## Further information
|
## Further information
|
||||||
|
|
||||||
- [Traits](https://doc.rust-lang.org/book/ch10-02-traits.html)
|
- [Traits](https://doc.rust-lang.org/book/ch10-02-traits.html)
|
||||||
30
exercises/15_traits/traits1.rs
Normal file
30
exercises/15_traits/traits1.rs
Normal file
@ -0,0 +1,30 @@
|
|||||||
|
// The trait `AppendBar` has only one function which appends "Bar" to any object
|
||||||
|
// implementing this trait.
|
||||||
|
trait AppendBar {
|
||||||
|
fn append_bar(self) -> Self;
|
||||||
|
}
|
||||||
|
|
||||||
|
impl AppendBar for String {
|
||||||
|
// TODO: Implement `AppendBar` for the type `String`.
|
||||||
|
}
|
||||||
|
|
||||||
|
fn main() {
|
||||||
|
let s = String::from("Foo");
|
||||||
|
let s = s.append_bar();
|
||||||
|
println!("s: {s}");
|
||||||
|
}
|
||||||
|
|
||||||
|
#[cfg(test)]
|
||||||
|
mod tests {
|
||||||
|
use super::*;
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn is_foo_bar() {
|
||||||
|
assert_eq!(String::from("Foo").append_bar(), "FooBar");
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn is_bar_bar() {
|
||||||
|
assert_eq!(String::from("").append_bar().append_bar(), "BarBar");
|
||||||
|
}
|
||||||
|
}
|
||||||
22
exercises/15_traits/traits2.rs
Normal file
22
exercises/15_traits/traits2.rs
Normal file
@ -0,0 +1,22 @@
|
|||||||
|
trait AppendBar {
|
||||||
|
fn append_bar(self) -> Self;
|
||||||
|
}
|
||||||
|
|
||||||
|
// TODO: Implement the trait `AppendBar` for a vector of strings.
|
||||||
|
// `append_bar` should push the string "Bar" into the vector.
|
||||||
|
|
||||||
|
fn main() {
|
||||||
|
// You can optionally experiment here.
|
||||||
|
}
|
||||||
|
|
||||||
|
#[cfg(test)]
|
||||||
|
mod tests {
|
||||||
|
use super::*;
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn is_vec_pop_eq_bar() {
|
||||||
|
let mut foo = vec![String::from("Foo")].append_bar();
|
||||||
|
assert_eq!(foo.pop().unwrap(), "Bar");
|
||||||
|
assert_eq!(foo.pop().unwrap(), "Foo");
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -1,15 +1,8 @@
|
|||||||
// traits3.rs
|
trait Licensed {
|
||||||
//
|
// TODO: Add a default implementation for `licensing_info` so that
|
||||||
// Your task is to implement the Licensed trait for
|
// implementors like the two structs below can share that default behavior
|
||||||
// both structures and have them return the same
|
// without repeating the function.
|
||||||
// information without writing the same function twice.
|
// The default license information should be the string "Default license".
|
||||||
//
|
|
||||||
// Consider what you can add to the Licensed trait.
|
|
||||||
// Execute `rustlings hint traits3` or use the `hint` watch subcommand for a hint.
|
|
||||||
|
|
||||||
// I AM NOT DONE
|
|
||||||
|
|
||||||
pub trait Licensed {
|
|
||||||
fn licensing_info(&self) -> String;
|
fn licensing_info(&self) -> String;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -21,8 +14,12 @@ struct OtherSoftware {
|
|||||||
version_number: String,
|
version_number: String,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl Licensed for SomeSoftware {} // Don't edit this line
|
impl Licensed for SomeSoftware {} // Don't edit this line.
|
||||||
impl Licensed for OtherSoftware {} // Don't edit this line
|
impl Licensed for OtherSoftware {} // Don't edit this line.
|
||||||
|
|
||||||
|
fn main() {
|
||||||
|
// You can optionally experiment here.
|
||||||
|
}
|
||||||
|
|
||||||
#[cfg(test)]
|
#[cfg(test)]
|
||||||
mod tests {
|
mod tests {
|
||||||
@ -30,7 +27,7 @@ mod tests {
|
|||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn is_licensing_info_the_same() {
|
fn is_licensing_info_the_same() {
|
||||||
let licensing_info = String::from("Some information");
|
let licensing_info = "Default license";
|
||||||
let some_software = SomeSoftware { version_number: 1 };
|
let some_software = SomeSoftware { version_number: 1 };
|
||||||
let other_software = OtherSoftware {
|
let other_software = OtherSoftware {
|
||||||
version_number: "v2.0.0".to_string(),
|
version_number: "v2.0.0".to_string(),
|
||||||
35
exercises/15_traits/traits4.rs
Normal file
35
exercises/15_traits/traits4.rs
Normal file
@ -0,0 +1,35 @@
|
|||||||
|
trait Licensed {
|
||||||
|
fn licensing_info(&self) -> String {
|
||||||
|
"Default license".to_string()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
struct SomeSoftware;
|
||||||
|
struct OtherSoftware;
|
||||||
|
|
||||||
|
impl Licensed for SomeSoftware {}
|
||||||
|
impl Licensed for OtherSoftware {}
|
||||||
|
|
||||||
|
// TODO: Fix the compiler error by only changing the signature of this function.
|
||||||
|
fn compare_license_types(software1: ???, software2: ???) -> bool {
|
||||||
|
software1.licensing_info() == software2.licensing_info()
|
||||||
|
}
|
||||||
|
|
||||||
|
fn main() {
|
||||||
|
// You can optionally experiment here.
|
||||||
|
}
|
||||||
|
|
||||||
|
#[cfg(test)]
|
||||||
|
mod tests {
|
||||||
|
use super::*;
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn compare_license_information() {
|
||||||
|
assert!(compare_license_types(SomeSoftware, OtherSoftware));
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn compare_license_information_backwards() {
|
||||||
|
assert!(compare_license_types(OtherSoftware, SomeSoftware));
|
||||||
|
}
|
||||||
|
}
|
||||||
39
exercises/15_traits/traits5.rs
Normal file
39
exercises/15_traits/traits5.rs
Normal file
@ -0,0 +1,39 @@
|
|||||||
|
trait SomeTrait {
|
||||||
|
fn some_function(&self) -> bool {
|
||||||
|
true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
trait OtherTrait {
|
||||||
|
fn other_function(&self) -> bool {
|
||||||
|
true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
struct SomeStruct;
|
||||||
|
impl SomeTrait for SomeStruct {}
|
||||||
|
impl OtherTrait for SomeStruct {}
|
||||||
|
|
||||||
|
struct OtherStruct;
|
||||||
|
impl SomeTrait for OtherStruct {}
|
||||||
|
impl OtherTrait for OtherStruct {}
|
||||||
|
|
||||||
|
// TODO: Fix the compiler error by only changing the signature of this function.
|
||||||
|
fn some_func(item: ???) -> bool {
|
||||||
|
item.some_function() && item.other_function()
|
||||||
|
}
|
||||||
|
|
||||||
|
fn main() {
|
||||||
|
// You can optionally experiment here.
|
||||||
|
}
|
||||||
|
|
||||||
|
#[cfg(test)]
|
||||||
|
mod tests {
|
||||||
|
use super::*;
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn test_some_func() {
|
||||||
|
assert!(some_func(SomeStruct));
|
||||||
|
assert!(some_func(OtherStruct));
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -3,15 +3,20 @@
|
|||||||
Lifetimes tell the compiler how to check whether references live long
|
Lifetimes tell the compiler how to check whether references live long
|
||||||
enough to be valid in any given situation. For example lifetimes say
|
enough to be valid in any given situation. For example lifetimes say
|
||||||
"make sure parameter 'a' lives as long as parameter 'b' so that the return
|
"make sure parameter 'a' lives as long as parameter 'b' so that the return
|
||||||
value is valid".
|
value is valid".
|
||||||
|
|
||||||
They are only necessary on borrows, i.e. references,
|
They are only necessary on borrows, i.e. references,
|
||||||
since copied parameters or moves are owned in their scope and cannot
|
since copied parameters or moves are owned in their scope and cannot
|
||||||
be referenced outside. Lifetimes mean that calling code of e.g. functions
|
be referenced outside. Lifetimes mean that calling code of e.g. functions
|
||||||
can be checked to make sure their arguments are valid. Lifetimes are
|
can be checked to make sure their arguments are valid. Lifetimes are
|
||||||
restrictive of their callers.
|
restrictive of their callers.
|
||||||
|
|
||||||
|
If you'd like to learn more about lifetime annotations, the
|
||||||
|
[lifetimekata](https://tfpk.github.io/lifetimekata/) project
|
||||||
|
has a similar style of exercises to Rustlings, but is all about
|
||||||
|
learning to write lifetime annotations.
|
||||||
|
|
||||||
## Further information
|
## Further information
|
||||||
|
|
||||||
- [Validating References with Lifetimes](https://doc.rust-lang.org/book/ch10-03-lifetime-syntax.html)
|
|
||||||
- [Lifetimes (in Rust By Example)](https://doc.rust-lang.org/stable/rust-by-example/scope/lifetime.html)
|
- [Lifetimes (in Rust By Example)](https://doc.rust-lang.org/stable/rust-by-example/scope/lifetime.html)
|
||||||
|
- [Validating References with Lifetimes](https://doc.rust-lang.org/book/ch10-03-lifetime-syntax.html)
|
||||||
28
exercises/16_lifetimes/lifetimes1.rs
Normal file
28
exercises/16_lifetimes/lifetimes1.rs
Normal file
@ -0,0 +1,28 @@
|
|||||||
|
// 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?
|
||||||
|
|
||||||
|
// TODO: Fix the compiler error by updating the function signature.
|
||||||
|
fn longest(x: &str, y: &str) -> &str {
|
||||||
|
if x.len() > y.len() {
|
||||||
|
x
|
||||||
|
} else {
|
||||||
|
y
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fn main() {
|
||||||
|
// You can optionally experiment here.
|
||||||
|
}
|
||||||
|
|
||||||
|
#[cfg(test)]
|
||||||
|
mod tests {
|
||||||
|
use super::*;
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn test_longest() {
|
||||||
|
assert_eq!(longest("abcd", "123"), "abcd");
|
||||||
|
assert_eq!(longest("abc", "1234"), "1234");
|
||||||
|
}
|
||||||
|
}
|
||||||
Some files were not shown because too many files have changed in this diff Show More
Loading…
x
Reference in New Issue
Block a user