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:?}"); }
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` را امتحان کنید تا ببینید پیام خطا چه چیزی را نشان میدهد.