impl Trait

مشابه با محدودیت‌های trait، می‌توان از impl Trait syntax در آرگومان‌های تابع و مقادیر بازگشتی استفاده کرد:

// 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
}

fn pair_of(x: u32) -> impl std::fmt::Debug {
    (x + 1, x - 1)
}

fn main() {
    let many = add_42_millions(42_i8);
    println!("{many}");
    let many_more = add_42_millions(10_000_000);
    println!("{many_more}");
    let debuggable = pair_of(27);
    println!("قابل دیباگ: {debuggable:?}");
}
This slide should take about 5 minutes.

impl Trait به شما اجازه می‌دهد با تایپ‌هایی کار کنید که نمی‌توانید نام ببرید. معنی impl Trait در موقعیت‌های مختلف کمی متفاوت است.

  • برای یک پارامتر، impl Trait شبیه به یک پارامتر generic ناشناخته با یک محدودیت trait است.

  • برای تایپ بازگشتی، به این معناست که تایپ بازگشتی تایپ مشخصی است که trait را پیاده‌سازی می‌کند، بدون اینکه تایپ را نام ببرید. این می‌تواند زمانی مفید باشد که نمی‌خواهید تایپ مشخص را در یک API عمومی افشا کنید.

    Inference در موقعیت بازگشتی دشوار است. تابعی که impl Foo را برمی‌گرداند، تایپ مشخصی را که برمی‌گرداند انتخاب می‌کند، بدون اینکه آن را به طور صریح در منبع بنویسد. تابعی که تایپ generic مانند collect<B>() -> B را برمی‌گرداند، می‌تواند هر تایپ که B را برآورده می‌کند بازگرداند، و ممکن است فراخوانی‌کننده نیاز به انتخاب یکی از آن‌ها داشته باشد، مانند let x: Vec<_> = foo.collect() یا با استفاده از ()<turbofish، foo.collect::<Vec<_>.

نوع debuggable چیست؟ سعی کنید .. = () :let debuggable` را امتحان کنید تا ببینید پیام خطا چه چیزی را نشان می‌دهد.