Translate

viernes, 20 de octubre de 2023

Trait Bounds en Rust


Cuando se trabaja con genéricos, a menudo se puede solicitar que los tipos implementen algún Trait, de modo que pueda llamar a los métodos de este Trait.

Puedes hacer esto con T: Trait o impl Trait:


fn duplicate<T: Clone>(a: T) -> (T, T) {

    (a.clone(), a.clone())

}


// Syntactic sugar for:

//   fn add_42_millions<T: Into<i32>>(x: T) -> i32 {

fn add_42_millions(x: impl Into<i32>) -> i32 {

    x.into() + 42_000_000

}


// struct NotClonable;

fn main() {

    let foo = String::from("foo");

    let pair = duplicate(foo);

    println!("{pair:?}");


    let many = add_42_millions(42_i8);

    println!("{many}");

    let many_more = add_42_millions(10_000_000);

    println!("{many_more}");

}


Se puede tambien usar la sentencia where


fn duplicate<T>(a: T) -> (T, T)

where

    T: Clone,

{

    (a.clone(), a.clone())

}