11. Les attributs▲
Un attribut est une méta-donnée pouvant être appliqué à plusieurs sortes d'éléments (e.g. mod
ules, crate
s). 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.
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
.
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.
$
rustc lib.rs
$
ls lib*
library.rlib
11-3. L'attribut cfg▲
La compilation conditionnelle est possible grâce à deux opérateurs :
- L'attribut cfg :
#[cfg(…)]
; - La macro
cfg!
:cfg!
(…) en tant qu'expression booléenne.
Tous deux possèdent la même syntaxe :
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.
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é :
$
rustc custom.rs &&
./custom
No such file or directory (
os error 2
)
Avec le flag personnalisé :
$
rustc --cfg some_condition custom.rs &&
./custom
condition met!