IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)

Rust par l'exemple


précédentsommairesuivant

11. Les attributs

Un attribut est une méta-donnée pouvant être appliqué à plusieurs sortes d'éléments (e.g. modules, crates). Ces méta-données peuvent être utilisées pour :

  • Ajouter des conditions à la compilation;
  • Établir le nom, la version et le type (i.e. exécutable ou bibliothèque) d'une crate ;
  • Désactiver certains avertissements de l'analyse;
  • Activer des fonctionnalités (e.g. macros, imports globaux) propres au compilateur ;
  • Importer une bibliothèque d'un autre langage (i.e. FFI);
  • Signaler des fonctions utilisées pour exécuter des tests unitaires ;
  • Signaler des fonctions utilisées dans le cadre d'un benchmark.

Quand les attributs sont appliqués à une crate toute entière, leur syntaxe est la suivante #![crate_attribute]. Lorsqu'ils sont appliqués à un module ou un autre élément, la syntaxe est la suivante #[item_attribute](vous noterez la disparation du point d'exclamation).

Les attributs peuvent prendre des arguments sous différentes syntaxes :

  • #[attribute = "value"] ;
  • #[attribute(key = "value")] ;
  • #[attribute(value)].

11-1. L'avertissement dead_code

La compilateur fournit la lintdead_code qui vous avertira lorsqu'une instruction (ou une fonction) ne sera jamais exécutée. Un attribut peut être utilisé pour désactiver cette lint.

 
Sélectionnez
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
fn used_function() {}

// L'attribut `#[allow(dead_code)]` désactive la lint `dead_code`.
#[allow(dead_code)]
fn unused_function() {}

fn noisy_unused_function() {}
// FIXME ^ Ajoutez un attribut pour supprimer l'avertissement.

fn main() {
    used_function();
}

Gardez tout de même à l'esprit que, dans un programme destiné à être mis en production, il est préférable de supprimer le code mort. Ici, le code mort sera conservé simplement pour l'exemple.

11-2. Méta-données relatives aux crates

L'attribut crate_type peut être utilisé pour renseigner au compilateur le type de la crate (i.e. exécutable ou bibliothèque(et quel type de bibliothèque)) et l'attribut crate_name est utilisé pour renseigner le nom de la crate.

 
Sélectionnez
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
// Dans le fichier lib.rs
// Cette crate est une bibliothèque.
#![crate_type = "lib"]
// Cette bibliothèque est nommée "rary".
#![crate_name = "rary"]

pub fn public_function() {
    println!("called rary's `public_function()`");
}

fn private_function() {
    println!("called rary's `private_function()`");
}

pub fn indirect_access() {
    print!("called rary's `indirect_access()`, that\n> ");

    private_function();
}

Lorsque l'attribut crate_type est utilisé vous n'avez, bien entendu, plus besoin de passer le flag --crate-type à rustc.

 
Sélectionnez
$ rustc lib.rs
$ ls lib*
library.rlib

11-3. L'attribut cfg

La compilation conditionnelle est possible grâce à deux opérateurs :

  1. L'attribut cfg : #[cfg(…)] ;
  2. La macro cfg! : cfg!(…) en tant qu'expression booléenne.

Tous deux possèdent la même syntaxe :

 
Sélectionnez
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
// Cette fonction ne sera compilée que sur des distributions Linux.
#[cfg(target_os = "linux")]
fn are_you_on_linux() {
    println!("You are running linux!")
}

// Et cette fonction sera compilée seulement sur des plateformes qui ne sont 
// *pas* des distributions Linux.
#[cfg(not(target_os = "linux"))]
fn are_you_on_linux() {
    println!("You are *not* running linux!")
}

fn main() {
    are_you_on_linux();

    println!("Are you sure?");
    if cfg!(target_os = "linux") {
        println!("Yes. It's definitely linux!");
    } else {
        println!("Yes. It's definitely *not* linux!");
    }
}

Voir aussi

La référence de l'attribut cfg, std::cfg! et les macros.

11-3-1. Condition personnalisée

Certaines conditions (e.g. target_os) sont fournies par rustc. Il est toutefois possible de passer des conditions personnalisées à rustc en utilisant le flag --cfg.

 
Sélectionnez
1.
2.
3.
4.
5.
6.
7.
8.
9.
// Dans le fichier custom.rs
#[cfg(some_condition)]
fn conditional_function() {
    println!("condition met!")
}

fn main() {
    conditional_function();
}

Sans le flag personnalisé :

 
Sélectionnez
$ rustc custom.rs && ./custom
No such file or directory (os error 2)

Avec le flag personnalisé :

 
Sélectionnez
$ rustc --cfg some_condition custom.rs && ./custom
condition met!

précédentsommairesuivant

Licence Creative Commons
Le contenu de cet article est rédigé par Rust Core Team et est mis à disposition selon les termes de la Licence Creative Commons Attribution 3.0 non transposé.
Les logos Developpez.com, en-tête, pied de page, css, et look & feel de l'article sont Copyright © 2013 Developpez.com.