Méthodes
Orestis Malaspinas
fn.Struct (ou d’un Enum ou d’un trait object).self qui est une instance de la structure sur laquelle la méthode est appelée.struct)self (1/2)
#[derive(Debug)]
struct Rectangle {
width: usize,
height: usize,
}
impl Rectangle { // les méthodes de Rectangle se trouvent dans un bloc impl
// on définit la méthode area qui prend une référence vers une instance d'un Rectangle
fn area(&self) -> usize {
self.width * self.height
}
}
fn main() {
let rect = Rectangle {width: 10, height: 5};
println!("La surface d'un {:?} est donnée par {}", rect, rect.area());
}
area est appelée avec la syntaxe rect.area().&self se réfère immutablement à l’instance rect.Si area prenait d’autres paramètres ils iraient entre les parenthèses.
Question: que se passerait-il si on enlevait le & de la définition de area?
self (2/2)
#[derive(Debug)]
struct Rectangle {
width: usize,
height: usize,
}
impl Rectangle { // les méthodes de Rectangle se trouvent dans un bloc impl
// on définit la méthode set_width qui prend une référence vers self, et une largeur
fn set_width(&mut self, width: usize) {
self.width = width;
}
}
fn main() {
let mut rect = Rectangle {width: 10, height: 5}; // rect doit être mutable
rect.set_width(1_000_000); // pour que cette ligne compile
println!("On a modifié width. L'instance de rectanle est {:?}.", rect);
}
set_width est appelée avec la syntaxe rect.set_width(1_000_000).&mut self se réfère à l’instance rect et est mutable.Si area prenait d’autres paramètres ils iraient entre les parenthèses.
Question: que se passerait-il si on enlevait le & de la définition de set_width?
struct Rectangle ne sont visible que via ses instances.pub).self dans chaque signature de fonctions.enum)struct on définit une méthode dans un bloc impl.struct on le premier paramètre d’une méthode est self.is_some
enum Option<T> {
None,
Some(T),
}
impl<T> Option <T> {
// teste si l'option est Some
pub fn is_some(&self) -> bool {
match *self { // on déréférence pour faire le match
Some(_) => true,
None => false,
}
}
}
impl qui n’ont pas self en paramètre: les fonctions associées:
Vec::new(), String::from("texte"), …::.struct.
#[derive(Debug)]
struct Rectangle {
width: usize,
height: usize,
}
impl Rectangle { // les fonctions associées se trouvent dans un bloc impl
fn default() -> Rectangle {
Rectangle{ width: 10, height: 100 }
}
fn square(side: usize) -> Self { // Self se réfère au type du bloc impl
Rectangle{ width: side, height: side}
}
// on peut rajouter autant de méthodes qu'on veut dans le bloc.
}
fn main() {
let rect_def = Rectangle::default();
let square = Rectangle::square(10);
println!("Un rectangle par défaut: {:?}.", rect_def);
println!("Un carré est un rectangle particulier: {:?}.", square);
}