Mozilla's systems programming language Rust


Traits are designed for code abstraction across data type borders. They ensure that developers use generic functions similarly to typeclasses of the Haskell [5] functional programming language.

Listing 3 creates the trait Dimension, which in line 2 only sets the signature of the method volume(). Implementations follow in line 9 for a sphere (data type Sphere) and in line 15 for a cube (data type Cube).

Listing 3

Body Calculations (


The signature (line 2) is relevant because it affects the method volume(), which the code in lines 10-12 defines for the data type Sphere. Line 11 calculates the sphere volume and reads the required radius from the field of the same name. The same approach is taken in lines 19-23 for the Cube data type.

The program's main routine in lines 33-36 invokes the generic function print_volume() with a value for the data types Sphere and Cube in each case. All values whose corresponding data type is implemented by Dimension can be adopted here. The trait is named in line 25 after the abstract type variable T and the colon.

If the program then invokes print_volume(), the volume() method runs against a matching data type. The println macro outputs the results.


Macros generate code at compilation time that often greatly reduces programming effort. The programmer can use macros like println very much like a function. However, an exclamation mark follows the name of a macro, as shown in line 8 of Listing 4.

Listing 4

Macros (macro.js)


Macros differ even more clearly from functions in terms of their syntax. The first five lines of Listing 4 show the code of the invoked macro length. The name of the macro follows the keyword macro_rules!.

Rust matches ($expression:expr) for each call with the parameters transferred. The pattern is, however, so generic that it works for any value. At the same time, it stores the transferred value in the metavariable $expression. The specification :expr qualifies the value in the variable as a Rust expression.

If Rust notes a match while comparing, the block from line 2 evaluates it. In line 3, the stringify macro converts the value from the metavariable to a character string whose length, as before, is output by println. Anyone who compiles and executes the file macro.js with

rustc macro.js && ./macro

will see the message The length of the expression is: 5 as the result.


Like Gems [6] in Ruby or Pip [7] in Python, Rust also has its own package manager, Cargo [8], which generates and manages Rust packages at the command line. The Rust community currently offers around 2,200 finished packages [9] (Figure 1). The command

curl -sSf | sh

installs not only the latest stable binary version of the Rust compiler on Linux, but Cargo as well. The

cargo new test

command builds the directory structure shown in Listing 5 as a frame for the Rust package test in the same folder.

Listing 5

Typical Directory Structure


Figure 1: The Rust community is working hard on additional software for the programming language.

The file Cargo.toml (Listing 6) backs up the metadata for the package. GitHub describes the format of the Toml [10] language used in this specification. The configuration file contains the name, version, and the authors, where appropriate, as well as the package dependencies in INI style.

Listing 6



The file (Listing 7) contains the Rust code for the package, which you can include in your Rust programs later with the help of the assignment use test;. You can then cd test to enter the package directory and compile the project using cargo build with the rustc Rust compiler.

Listing 7


Using cargo test (Figure 2), you can filter test functions such as gt_zero() out of the package and then execute them. The Rust option #[test] reveals gt_zero() as the test function. Supported by the macro assert, it generates the test result for the test 1>0.

Figure 2: Cargo automatically executes test functions from the program code.

Buy this article as PDF

Express-Checkout as PDF
Price $2.95
(incl. VAT)

Buy Linux Magazine

Get it on Google Play

US / Canada

Get it on Google Play

UK / Australia

Related content

  • Rust

    Largely unnoticed by the public, the Mozilla Foundation is tinkering with its own programming language, Rust, which is intended to make writing reliable, fast, and concurrently running applications easier. For this purpose, the developers are borrowing generously from other languages.

  • Kernel News

    This month in Kernel News: Shared Processes with Hyper-Threading; Cleaning Up printk(); and Rust in the Kernel.

  • Two Types of Round Trip

    Due to the COVID-19 lockdown, Charly has time to devote to gadgets like graphical ping tools, flashing space stations, and space walks.

  • Optimizing Vector Graphics

    Inkscape creates W3C-compliant SVG files, but they are usually larger than they need to be for the web. We'll show you how to optimize SVG files for faster load times.

  • FOSSPicks

    After building a 3D printer last month, Graham's home is now filled with cup holders, phone holders, cable holders, and tiny PLA boats. This month, Graham explores Zrythm, Mumble 1.3, NoteKit, Kirogi, monolith, pastel, Nu Shell, PacVim, Stunt Car Racer Remake, and more!

comments powered by Disqus

Direct Download

Read full article as PDF:

Price $2.95