Crates and Modules

Rust Has A Module System

  • Better than most, not as good as SML
  • Name-based, but with inter-module typechecking
  • Two kinds of thing
    • "Crates": self-contained packages
    • "Modules": namespaces within a package
  • http://crates.io is the big repository of published crates

Library and Binary Crates

  • A crate can correspond to a program that can be installed
  • A crate can correspond to a library that can be published
  • By default, directory structure gives Cargo what it needs
    • src/lib.rs is a library
    • src/main.rs is a binary
    • src/mod.rs is a module top-level for a library
  • You can override all of this in Cargo.toml

Cargo Fetches Crates

  • The [dependencies] section of Cargo.toml allows specifying other crates used by this crate
  • This is by far the sanest way to do separate compilation
  • Can specify
    • crates.io crates: foo = "0.4.*"
    • Github crates: foo = { git = "http://github.com/something/foo.git" }
    • Local crates: `foo = { path = "/local/src/foo" }

Namespaces

  • Rust 2015 had extern crate foo. It's not needed now.
  • Namespaces are :: separated as in some other languages
    • std::io::stdin()
    • use std::io::stdin; stdin(); io::stdin()
  • The mod directive introduces a new namespace in the current spot
    • Can make a block a module
    • Can make a file a module with a bare mod directive at top
  • Most of this machinery, but not all, is available in any scope

Making Things pub

  • By default, nothing in a module is visible outside the module/crate in which it is declared
  • You can put pub in front of an item to make it externally visible
  • For things like structs and enums, the visibility of the thing and its fields is controlled separately
  • The compiler will whine at you about an unused thing unless it is pub, in which case it assumes you just know

A Note About Rustup

  • https://rustup.rs
  • Manages various compiler versions
  • Easiest way to make everything current / sane

Semantic Versioning

  • Three-part version numbers: breaking.major.minor
  • Supposedly improves stability
  • Cargo.lock preserves versioning

Docs and Testing

  • Doc comments have an extra slash
  • Mostly usable with libraries
  • Formatted with Markdown
  • Doc comments
  • Tests and the #[test] and #[cfg(test)] and stuff

An Example: woodpieces

Last modified: Wednesday, 10 July 2019, 10:13 AM