+# This file is automatically @generated by Cargo.
+# It is not intended for manual editing.
+version = 3
+
[[package]]
name = "rust-101"
version = "0.1.0"
-
@sed 's|^\(\s*//\)@|\1|;s|\s*/\*@\*/$$||;s|\(\s*\)\S.*/\*@@\*/|\1unimplemented!()|' $< | sed -f dup-unimpl.sed > $@
docs/%.html: .tmp/docs/%.rs
- @./pycco-rs $<
+ ~/.local/pipx/venvs/pycco/bin/python pycco-rs $<
## Workspace
# The generated files are shipped only for the benefit of Windows users, who
This documents Rust-101, a tutorial for the [Rust
language](http://www.rust-lang.org/).
+**Note that this tutorial was written for Rust 1.3 in 2015, and the language evolved a lot since then.
+Some of the idioms presented here may no longer reflect current practice.**
+
## Online tutorial
The most accessible form of the tutorial is its
## Offline Usage
You can either read through the sources in `src/`, or generate the
-HTML in `docs/` using `make docs` (this step needs
-[Pycco](https://pycco-docs.github.io/pycco/)).
+HTML in `docs/` using `make docs`. This steps assumes `pipx install pycco` has
+been run before; it will use the pipx-created venv to import pycco.
The files `workspace/src/part*.rs` are generated by `make workspace`.
//
// * [The Rust Book](https://doc.rust-lang.org/stable/book/)
// * [The Rustonomicon](https://doc.rust-lang.org/nightly/nomicon/)
-// * [Rust by Example](http://rustbyexample.com/)
+// * [Rust by Example](https://doc.rust-lang.org/rust-by-example/)
// * The [Rust Subreddit](https://www.reddit.com/r/rust/)
// * A [collection of links](https://github.com/ctjhoa/rust-learning) to blog posts, articles,
// videos, etc. for learning Rust.
//@ methods on an `enum` (and also on `struct`, which we will learn about later)
//@ is independent of the definition of the type. `self` is like `this` in other
//@ languages, and its type is always implicit. So `print` is now a method that
-//@ takes as first argument a `NumberOrNothing`, just like `print_number_or_nothing`.
+//@ takes `NumberOrNothing` as the first argument, just like `print_number_or_nothing`.
//@
//@ Try making `number_or_default` from above an inherent method as well!
//@ their official name.
//@ As an example, consider a function which increments every element of a vector by 1.
-//@ The type `&mut Vec<i32>` is the type of mutable references to `vec<i32>`. Because the reference
+//@ The type `&mut Vec<i32>` is the type of mutable references to `Vec<i32>`. Because the reference
//@ is mutable, we can use a mutable iterator, providing mutable references to the elements.
fn vec_inc(v: &mut Vec<i32>) {
for e in v.iter_mut() {
//@ have aliasing (of `first` and `v`) and mutation. But this time, the bug is hidden behind the
//@ call to `head`. How does Rust solve this? If we translate the code above to Rust, it doesn't
//@ compile, so clearly we are good - but how and why?
-//@ (Notice that have to explicitly assert using //@ `unwrap` that `first` is not `None`, whereas
-//@ the C++ code above would silently dereference a //@ `NULL`-pointer. But that's another point.)
+//@ (Notice that we use `unwrap` to explicitly assert that `first` is not `None`, whereas
+//@ the C++ code above would silently dereference a `NULL`-pointer. But that's another point.)
fn rust_foo(mut v: Vec<i32>) -> i32 {
let first: Option<&i32> = head(&v);
/* v.push(42); */
+# This file is automatically @generated by Cargo.
+# It is not intended for manual editing.
+version = 3
+
[[package]]
name = "rust-101-workspace"
version = "0.0.0"
-