impl Trait

ΠŸΠΎΠ΄Ρ–Π±Π½ΠΎ Π΄ΠΎ ΠΌΠ΅ΠΆ Ρ‚Ρ€Π΅ΠΉΡ‚Ρ–Π², синтаксис impl Trait ΠΌΠΎΠΆΠ½Π° використовувати Π² Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π°Ρ… Ρ„ΡƒΠ½ΠΊΡ†Ρ–Ρ— Ρ‚Π° значСннях, Ρ‰ΠΎ ΠΏΠΎΠ²Π΅Ρ€Ρ‚Π°ΡŽΡ‚ΡŒΡΡ:

// Бинтаксичний Ρ†ΡƒΠΊΠΎΡ€ для:
//   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: {debuggable:?}");
}
This slide should take about 5 minutes.

impl Trait дозволяє ΠΏΡ€Π°Ρ†ΡŽΠ²Π°Ρ‚ΠΈ Π· Ρ‚ΠΈΠΏΠ°ΠΌΠΈ, які Π²ΠΈ Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π½Π°Π·Π²Π°Ρ‚ΠΈ. ЗначСння impl Trait Π΄Π΅Ρ‰ΠΎ Π²Ρ–Π΄Ρ€Ρ–Π·Π½ΡΡ”Ρ‚ΡŒΡΡ Ρƒ Ρ€Ρ–Π·Π½ΠΈΡ… позиціях.

  • Π£ Π²ΠΈΠΏΠ°Π΄ΠΊΡƒ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π°, impl Trait - Ρ†Π΅ як Π°Π½ΠΎΠ½Ρ–ΠΌΠ½ΠΈΠΉ загальний ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€p Π· обмСТСнням Ρ‚Ρ€Π΅ΠΉΡ‚Ρƒ.

  • Для Ρ‚ΠΈΠΏΡƒ, Ρ‰ΠΎ ΠΏΠΎΠ²Π΅Ρ€Ρ‚Π°Ρ”Ρ‚ΡŒΡΡ, Ρ†Π΅ ΠΎΠ·Π½Π°Ρ‡Π°Ρ”, Ρ‰ΠΎ Ρ‚ΠΈΠΏ, Ρ‰ΠΎ ΠΏΠΎΠ²Π΅Ρ€Ρ‚Π°Ρ”Ρ‚ΡŒΡΡ, Ρ” дСяким ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½ΠΈΠΌ Ρ‚ΠΈΠΏΠΎΠΌ, який Ρ€Π΅Π°Π»Ρ–Π·ΡƒΡ” Ρ‚Ρ€Π΅ΠΉΡ‚, Π±Π΅Π· Π½Π°Π·Π²ΠΈ Ρ‚ΠΈΠΏΡƒ. Π¦Π΅ ΠΌΠΎΠΆΠ΅ Π±ΡƒΡ‚ΠΈ корисно, ΠΊΠΎΠ»ΠΈ Π²ΠΈ Π½Π΅ Ρ…ΠΎΡ‡Π΅Ρ‚Π΅ Π²ΠΈΠΊΡ€ΠΈΠ²Π°Ρ‚ΠΈ ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½ΠΈΠΉ Ρ‚ΠΈΠΏ Ρƒ ΠΏΡƒΠ±Π»Ρ–Ρ‡Π½ΠΎΠΌΡƒ API.

    Π£ ΠΏΠΎΠ·ΠΈΡ†Ρ–Ρ— повСрнСння вивСдСння Ρ” складним. Ѐункція, Ρ‰ΠΎ ΠΏΠΎΠ²Π΅Ρ€Ρ‚Π°Ρ” impl Foo, Π²ΠΈΠ±ΠΈΡ€Π°Ρ” ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½ΠΈΠΉ Ρ‚ΠΈΠΏ, який Π²ΠΎΠ½Π° ΠΏΠΎΠ²Π΅Ρ€Ρ‚Π°Ρ”, Π½Π΅ Π·Π°ΠΏΠΈΡΡƒΡŽΡ‡ΠΈ ΠΉΠΎΠ³ΠΎ Ρƒ Π²ΠΈΡ…Ρ–Π΄Π½ΠΎΠΌΡƒ ΠΊΠΎΠ΄Ρ–. Ѐункція, Ρ‰ΠΎ ΠΏΠΎΠ²Π΅Ρ€Ρ‚Π°Ρ” ΡƒΠ·Π°Π³Π°Π»ΡŒΠ½Π΅Π½ΠΈΠΉ Ρ‚ΠΈΠΏ, Π½Π°ΠΏΡ€ΠΈΠΊΠ»Π°Π΄, collect<B>() -> B, ΠΌΠΎΠΆΠ΅ ΠΏΠΎΠ²Π΅Ρ€Π½ΡƒΡ‚ΠΈ Π±ΡƒΠ΄ΡŒ-який Ρ‚ΠΈΠΏ, Ρ‰ΠΎ Π·Π°Π΄ΠΎΠ²ΠΎΠ»ΡŒΠ½ΡΡ” B, Ρ– користувачСві ΠΌΠΎΠΆΠ΅ знадобитися Π²ΠΈΠ±Ρ€Π°Ρ‚ΠΈ ΠΎΠ΄ΠΈΠ½ Π· Π½ΠΈΡ…, Π½Π°ΠΏΡ€ΠΈΠΊΠ»Π°Π΄, Π·Π° допомогою let x: Vec<_> = foo.collect() Π°Π±ΠΎ turbofish, foo.collect::<Vec<_>>().

Π―ΠΊΠΈΠΉ Ρ‚ΠΈΠΏ debuggable? Π‘ΠΏΡ€ΠΎΠ±ΡƒΠΉΡ‚Π΅ let debuggable: () = .., Ρ‰ΠΎΠ± ΠΏΠΎΠ±Π°Ρ‡ΠΈΡ‚ΠΈ повідомлСння ΠΏΡ€ΠΎ ΠΏΠΎΠΌΠΈΠ»ΠΊΡƒ.