рдЬрдВрдЧред Iterators рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЙрдзрд╛рд░рдХрд░реНрддрд╛ рдЪреЗрдХ

рдирдорд╕реНрдХрд╛рд░, рд╣реЗрдмреНрд░!

рдореИрдВ рд▓рдЧрднрдЧ рдПрдХ рд╕рд╛рд▓ рд╕реЗ рдЕрдзреНрдпрдпрди рдХрд░ рд░рд╣рд╛ рд╣реВрдВ рдФрд░, рдЕрдкрдиреЗ рдЦрд╛рд▓реА рд╕рдордп рдореЗрдВ, рдореИрдВ рд░реИрд╕реНрдЯ рдкрд░ рд▓рд┐рдЦрддрд╛ рд╣реВрдВред рдореБрдЭреЗ рдкрд╕рдВрдж рд╣реИ рдХрд┐ рдХреИрд╕реЗ рдЗрд╕рдХреЗ рд▓реЗрдЦрдХреЛрдВ рдиреЗ рд╕реНрдореГрддрд┐ рдкреНрд░рдмрдВрдзрди рдХреА рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╣рд▓ рдХрд┐рдпрд╛ рдФрд░ рдХрдЪрд░реЗ рдХреЗ рд╕рдВрдЧреНрд░рд╣рдХрд░реНрддрд╛ рдХреЗ рд╕рд╛рде рд╡рд┐рд╡рд╛рдж рдХрд┐рдпрд╛ - рдЙрдзрд╛рд░ рдХреА рдЕрд╡рдзрд╛рд░рдгрд╛ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗред рдЗрд╕ рд▓реЗрдЦ рдореЗрдВ рдореИрдВ рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐рдпреЛрдВ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЗрд╕ рд╡рд┐рдЪрд╛рд░ рд╕реЗ рд╕рдВрдкрд░реНрдХ рдХрд░реВрдВрдЧрд╛ред

рд╣рд╛рд▓ рд╣реА рдореЗрдВ, рд╕реНрдХрд╛рд▓рд╛ рдореЗрд░реА рдореБрдЦреНрдп рднрд╛рд╖рд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЗрд╕рдХреЗ рд╕рд╛рде рддреБрд▓рдирд╛ рдХреА рдЬрд╛рдПрдЧреА, рд▓реЗрдХрд┐рди рдЙрдирдореЗрдВ рд╕реЗ рдХрдИ рдирд╣реАрдВ рд╣реИрдВ рдФрд░ рд╕рдм рдХреБрдЫ рд╕рд╣рдЬ рд╣реИ, рдЬрд╛рджреВ рдХреЗ рдмрд┐рдирд╛ :)

рд▓реЗрдЦ рдЙрди рд▓реЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП рдбрд┐рдЬрд╝рд╛рдЗрди рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ рдЬрд┐рдиреНрд╣реЛрдВрдиреЗ рдЬрдВрдЧ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреБрдЫ рд╕реБрдирд╛, рд▓реЗрдХрд┐рди рд╡рд┐рд╡рд░рдг рдореЗрдВ рдирд╣реАрдВ рдЧрдПред


рд▓реА рдЧрдИ рддрд╕реНрд╡реАрд░реЛрдВ рдХреЗ рдпрд╣рд╛рдВ рд╕реЗ рдФрд░ рдпрд╣рд╛рдВ рд╕реЗ

рдкреНрд░рд╕реНрддрд╛рд╡рдирд╛


рдЬреЗрд╡реАрдПрдо рднрд╛рд╖рд╛рдУрдВ рдореЗрдВ, рд▓рд┐рдВрдХ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХреЛ рдЫрд┐рдкрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдкреНрд░рдерд╛рдЧрдд рд╣реИ, рдЕрд░реНрдерд╛рддреН, рд╣рдо рд▓рдЧрднрдЧ рд╣рдореЗрд╢рд╛ рд╕рдВрджрд░реНрдн рдбреЗрдЯрд╛ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рд╣рдордиреЗ рдПрдореНрдкрд░рд╕реИрдВрдб (рдФрд░) рдХреЛ рдЫрд┐рдкрд╛рдиреЗ рдХрд╛ рдлреИрд╕рд▓рд╛ рдХрд┐рдпрд╛ред

рд░реИрд╕реНрдЯрд╛ рдореЗрдВ рд╕реНрдкрд╖реНрдЯ рд▓рд┐рдВрдХ рд╣реЛрддреЗ рд╣реИрдВ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рдкреВрд░реНрдгрд╛рдВрдХ - `рдФрд░ i32`, рд▓рд┐рдВрдХ рдХреЛ '*' рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдбреАрд░рдПрдлрд╝рд░ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рд▓рд┐рдВрдХ рдХреЗ рд▓рд┐рдП рд▓рд┐рдВрдХ рднреА рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдФрд░ рдлрд┐рд░ рдЗрд╕реЗ рджреЛ рдмрд╛рд░ рдбрд┐рд░реЗрд▓ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред

рдЗрдЯрд░реЗрдЯрд░


рдХреЛрдб рд▓рд┐рдЦрддреЗ рд╕рдордп, рдмрд╣реБрдд рдмрд╛рд░ рдЖрдкрдХреЛ рд╕рдВрдЧреНрд░рд╣ рдХреЛ рдПрдХ рд╢рд░реНрдд (рд╡рд┐рдзреЗрдп) рджреНрд╡рд╛рд░рд╛ рдлрд╝рд┐рд▓реНрдЯрд░ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рддрддреНрд╡реЛрдВ рдХреЛ рд▓реЗрдиреЗ рдХреЗ рд▓рд┐рдП рдЪрдЯреНрдЯрд╛рди рдореЗрдВ рдХреБрдЫ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦреЗрдЧрд╛:

    val vec = Vector(1,2,3,4)
    val result = vec.filter(e => e % 2 == 0)

рдЖрдЗрдП рдЗрд╕ рдкреНрд░рдХрд╛рд░ рджреЗрдЦреЗрдВ:

  private[scala] def filterImpl(p: A => Boolean, isFlipped: Boolean): Repr = {
    val b = newBuilder
    for (x <- this)
      if (p(x) != isFlipped) b += x

    b.result
  }

`NewBuilder` рдХреЗ рд╡рд┐рд╡рд░рдг рдореЗрдВ рдЬрд╛рдиреЗ рдХреЗ рдмрд┐рдирд╛, рдпрд╣ рд╕реНрдкрд╖реНрдЯ рд╣реИ рдХрд┐ рдПрдХ рдирдпрд╛ рд╕рдВрдЧреНрд░рд╣ рдмрдирд╛рдпрд╛ рдЬрд╛ рд░рд╣рд╛ рд╣реИ, рд╣рдо рдкреБрд░рд╛рдиреЗ рдкрд░ рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐ рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдпрджрд┐ рд╡рд┐рдзреЗрдп рд╕рд╣реА рд╣реИ, рддреЛ рдПрдХ рддрддреНрд╡ рдЬреЛрдбрд╝реЗрдВред рдЗрд╕ рддрдереНрдп рдХреЗ рдмрд╛рд╡рдЬреВрдж рдХрд┐ рд╕рдВрдЧреНрд░рд╣ рдирдпрд╛ рд╣реИ, рдЗрд╕рдХреЗ рддрддреНрд╡ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдкрд╣рд▓реЗ рд╕рдВрдЧреНрд░рд╣ рд╕реЗ рддрддреНрд╡реЛрдВ рдХреЗ рд▓рд┐рдВрдХ рд╣реИрдВ, рдФрд░ рдпрджрд┐, рдЕрдЪрд╛рдирдХ, рдпреЗ рддрддреНрд╡ рдкрд╛рд░рд╕реНрдкрд░рд┐рдХ рд╣реИрдВ, рддреЛ рдЙрдиреНрд╣реЗрдВ рдмрджрд▓рдирд╛ рджреЛрдиреЛрдВ рд╕рдВрдЧреНрд░рд╣ рдХреЗ рд▓рд┐рдП рд╕рд╛рдорд╛рдиреНрдп рд╣реЛрдЧрд╛ред

рдЕрдм рд░реИрд╕реНрдЯ рдореЗрдВ рднреА рдРрд╕рд╛ рд╣реА рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рддреЗ рд╣реИрдВред рдореИрдВ рддреБрд░рдВрдд рдПрдХ рдХрд╛рдо рдХрд░рдиреЗ рдХрд╛ рдЙрджрд╛рд╣рд░рдг рджреВрдВрдЧрд╛, рдФрд░ рдлрд┐рд░ рдореИрдВ рдорддрднреЗрджреЛрдВ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реВрдВрдЧрд╛ред

    let v: Vec<i32> = vec![1, 2, 3, 4];
    let result: Vec<&i32> = v.iter().filter(|e| **e % 2 == 0).collect();

рд╡рд╛рд╣, рд╡рд╛рд╣ рдХреНрдпрд╛? рдбрдмрд▓ рдкреЙрдЗрдВрдЯрд░ рдбреЗрд░реЗрдлрд╝рд░рд┐рдВрдЧ? рдмрд╕ рд╡реЗрдХреНрдЯрд░ рдХреЛ рдлрд╝рд┐рд▓реНрдЯрд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП? рдХрдард┐рди :( рд▓реЗрдХрд┐рди рдЗрд╕рдХреЗ рдХрд╛рд░рдг рд╣реИрдВред

рдЖрдЗрдП рд╣рдо рдмрддрд╛рддреЗ рд╣реИрдВ рдХрд┐ рдпрд╣ рдХреЛрдб рдЪрдЯреНрдЯрд╛рди рд╕реЗ рдХреИрд╕реЗ рдЕрд▓рдЧ рд╣реИ:

  1. рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рд╡реЗрдХреНрдЯрд░ рдкрд░ рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐ рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВ (`iter ()`)
  2. рдХрд┐рд╕реА рдХрд╛рд░реНрдп рдХреЗ рд▓рд┐рдП, рдХрд┐рд╕реА рдХрд╛рд░рдг рд╕реЗ, рд╣рдо рд╕реВрдЪрдХ рдХреЛ рджреЛ рдмрд╛рд░ рд░реЛрдХрддреЗ рд╣реИрдВ
  3. рдХреЙрд▓ `рдЗрдХрдЯреНрдард╛ ()`
  4. рдпрд╣ рд╕рдВрджрд░реНрдн рдкреНрд░рдХрд╛рд░ Vec <& i32> рдХреЗ рд╡реЗрдХреНрдЯрд░ рдХреЗ рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк рд╣реБрдЖ, рди рдХрд┐ рд╕рд╛рдзрд╛рд░рдг рдЗрдиреНрдЯреНрд╕ рдореЗрдВ

рдЙрдзрд╛рд░ рдЪреЗрдХ рдХрд░рдиреЗ рд╡рд╛рд▓рд╛


рдХреНрдпреЛрдВ рд╕рдВрдЧреНрд░рд╣ рдкрд░ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ `iter ()` рдХрд╣рддреЗ рд╣реИрдВ? рдпрд╣ рдХрд┐рд╕реА рднреА рд░реЙрдХрдореИрди рдХреЗ рд▓рд┐рдП рд╕реНрдкрд╖реНрдЯ рд╣реИ рдХрд┐ рдпрджрд┐ рдЖрдк `.рдлрд┐рд▓реНрдЯрд░ (...)` рдХрд╣рддреЗ рд╣реИрдВ, рддреЛ рдЖрдкрдХреЛ рд╕рдВрдЧреНрд░рд╣ рдкрд░ рдкреБрдирд░рд╛рд╡реГрддрд┐ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдПрдХ рд░реИрд╕реНрдЯ рдореЗрдВ рдХреНрдпреЛрдВ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рд▓рд┐рдЦреЗрдВ рдХрд┐ рдХреНрдпрд╛ рдирд┐рд╣рд┐рддрд╛рд░реНрде рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ? рдХреНрдпреЛрдВрдХрд┐ рддреАрди рдЕрд▓рдЧ-рдЕрд▓рдЧ рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐рдпрд╛рдБ рд╣реИрдВ!



рдпрд╣ рдЬрд╛рдирдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐ рддреАрди рдХреНрдпреЛрдВ? рдмреЙрд░реЛ (рдЙрдзрд╛рд░, рдЙрдзрд╛рд░) рдЪреЗрдХрд░ рдкрд░ рдЫреВрдиреЗ рдХреА рдЬрд░реВрд░рдд рд╣реИ 'рдПред рдмрд╣реБрдд рд╕реА рдЪреАрдЬ рдЬрд┐рд╕рдХреЗ рдХрд╛рд░рдг rast рдмрд┐рдирд╛ GC рдФрд░ рдмрд┐рдирд╛ рд╕реНрдкрд╖реНрдЯ рдореЗрдореЛрд░реА рдПрд▓реЛрдХреЗрд╢рди / рдбреАрд▓рд▓реЛрдХреЗрд╢рди рдХреЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред

рдЗрд╕рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХреНрдпреЛрдВ рд╣реИ?

  1. рд╕реНрдерд┐рддрд┐рдпреЛрдВ рд╕реЗ рдмрдЪрдиреЗ рдХреЗ рд▓рд┐рдП рдЬрдм рдХрдИ рдкреЙрдЗрдВрдЯрд░реНрд╕ рдПрдХ рд╣реА рдореЗрдореЛрд░реА рдХреНрд╖реЗрддреНрд░ рдХреА рдУрд░ рдЗрд╢рд╛рд░рд╛ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдЖрдк рдЗрд╕реЗ рдмрджрд▓ рд╕рдХрддреЗ рд╣реИрдВред рдпрд╣ рдПрдХ рджреМрдбрд╝ рдХреА рд╕реНрдерд┐рддрд┐ рд╣реИред
  2. рдЖрджреЗрд╢ рдореЗрдВ рдПрдХ рд╣реА рд╕реНрдореГрддрд┐ рдХреЛ рдХрдИ рдмрд╛рд░ рдбреАрд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдирд╣реАрдВред

рдпрд╣ рдХреИрд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ?

рд╕реНрд╡рд╛рдорд┐рддреНрд╡ рдХреА рдЕрд╡рдзрд╛рд░рдгрд╛ рдХреЗ рдХрд╛рд░рдгред

рд╕рд╛рдорд╛рдиреНрдп рддреМрд░ рдкрд░, рд╕реНрд╡рд╛рдорд┐рддреНрд╡ рдХреА рдЕрд╡рдзрд╛рд░рдгрд╛ рд╕рд░рд▓ рд╣реИ - рдХреЗрд╡рд▓ рдПрдХ рд╣реА рдХреБрдЫ (рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рдЕрдВрддрд░реНрдЬреНрдЮрд╛рди) рдХрд╛ рдорд╛рд▓рд┐рдХ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред

рдорд╛рд▓рд┐рдХ рдмрджрд▓ рд╕рдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рд╡рд╣ рд╣рдореЗрд╢рд╛ рдЕрдХреЗрд▓рд╛ рд╣реЛрддрд╛ рд╣реИред рдЬрдм рд╣рдо `рд▓реЗрдЯ x: i32 = 25` рд▓рд┐рдЦрддреЗ рд╣реИрдВ, рддреЛ рдЗрд╕рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ 32 рдмрд┐рдЯ рдЗрдВрдЯ рдХреЗ рд▓рд┐рдП рдПрдХ рдореЗрдореЛрд░реА рдПрд▓реЛрдХреЗрд╢рди рдерд╛ рдФрд░ рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рдПрдХреНрд╕ рдПрдХреНрд╕ рдЗрд╕рдХреЗ рдорд╛рд▓рд┐рдХ рдереЗред рд╕реНрд╡рд╛рдорд┐рддреНрд╡ рдХрд╛ рд╡рд┐рдЪрд╛рд░ рдХреЗрд╡рд▓ рд╕рдВрдХрд▓рдХ рдХреЗ рджрд┐рдорд╛рдЧ рдореЗрдВ рдореМрдЬреВрдж рд╣реИ, рдЙрдзрд╛рд░рдХрд░реНрддрд╛ рдЪреЗрдХрд░ рдореЗрдВред рдЬрдм рдорд╛рд▓рд┐рдХ, рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, `x` рд╕реНрдХреЛрдк рдЫреЛрдбрд╝ рджреЗрддрд╛ рд╣реИ (рд╕реНрдХреЛрдк рд╕реЗ рдмрд╛рд╣рд░ рдЪрд▓рд╛ рдЬрд╛рддрд╛ рд╣реИ), рддреЛ рдЙрд╕рдХреА рдЬреЛ рд╕реНрдореГрддрд┐ рд╣реИ, рд╡рд╣ рд╕рд╛рдл рд╣реЛ рдЬрд╛рдПрдЧреАред

рдпрд╣рд╛рдБ рдПрдХ рдХреЛрдб рд╣реИ рдЬреЛ рдЙрдзрд╛рд░рдХрд░реНрддрд╛ рдХреЛ рдпрд╛рдж рдирд╣реАрдВ рд╣реЛрдЧрд╛:


struct X; // 

fn test_borrow_checker () -> X {
    let first = X; //  
    let second = first; //  
    let third = first; //   ,   first   
//    value used here after move

    return third;
}

`рд╕реНрдЯреНрд░рдХреНрдЪрд░ рдПрдХреНрд╕` рдХреБрдЫ рдРрд╕рд╛ рд╣реИ рдЬреИрд╕реЗ` рдХреЗрд╕ рдХреНрд▓рд╛рд╕ рдПрдХреНрд╕ () `- рдПрдХ рд╕реАрдорд╛ рд░рд╣рд┐рдд рд╕рдВрд░рдЪрдирд╛ рд╣реИред

рдпрд╣ рд╡реНрдпрд╡рд╣рд╛рд░ рд╕реБрдкрд░ рдХрд╛рдЙрдВрдЯрд░рд┐рдВрдЯрд┐рд╡ рд╣реИ, рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ, рд╕рднреА рдХреЗ рд▓рд┐рдПред рдореИрдВ рдЕрдиреНрдп рднрд╛рд╖рд╛рдУрдВ рдХреЛ рдирд╣реАрдВ рдЬрд╛рдирддрд╛, рдЬрд┐рдирдореЗрдВ рджреЛ рдмрд╛рд░ рдПрдХ рд╣реА "рдЪрд░" рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЕрд╕рдВрднрд╡ рд╣реЛрдЧрд╛ред рдЗрд╕ рдХреНрд╖рдг рдХреЛ рдорд╣рд╕реВрд╕ рдХрд░рдирд╛ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИред рдкрд╣рд▓реЗ рдПрдХреНрд╕ рдХреЗ рд╕рдВрджрд░реНрдн рдореЗрдВ рдмрд┐рд▓реНрдХреБрд▓ рдирд╣реАрдВ рд╣реИ, рдпрд╣ рдЗрд╕рдХрд╛ рдорд╛рд▓рд┐рдХ рд╣реИ ред рдорд╛рд▓рд┐рдХ рдХреЛ рдмрджрд▓рддреЗ рд╣реБрдП, рд╣рдо рдкрд┐рдЫрд▓реЗ рдПрдХ рдХреЛ рдорд╛рд░рддреЗ рд╣реИрдВ, рдЙрдзрд╛рд░ рд▓реЗрдиреЗ рд╡рд╛рд▓рд╛ рдЪреЗрдХрд░ рдЗрд╕рдХреЗ рдЙрдкрдпреЛрдЧ рдХреА рдЕрдиреБрдорддрд┐ рдирд╣реАрдВ рджреЗрдЧрд╛ред

рдЖрдкрдХреЛ рдЕрдкрдиреА рдЦреБрдж рдХреА рд╕рдВрд░рдЪрдирд╛ рдмрдирд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХреНрдпреЛрдВ рдереА, рдирд┐рдпрдорд┐рдд рдкреВрд░реНрдгрд╛рдВрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХреНрдпреЛрдВ рдирд╣реАрдВ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП?
тАФ (`struct X`), , , integer. , , :


fn test_borrow_checker () -> i32 {
    let first = 32;
    let second = first; 
    let third = first; 

    return third;
}

, borrow checker, , . Copy, . `i32` second , ( ), - third . X Copy, .

. , , ┬л┬╗ . Clone, , . copy clone.

рд╡рд╛рдкрд╕ рдЪрд▓рдиреЗ рд╡рд╛рд▓реЛрдВ рдХреЗ рд▓рд┐рдПред рдЙрдирдореЗрдВ рд╕реЗ "рдХреИрдкреНрдЪрд░" рдХреА рдЕрд╡рдзрд╛рд░рдгрд╛ IntoIter рд╣реИ ред рд╡рд╣ рдЕрдкрдиреЗ рддрддреНрд╡реЛрдВ рдХреЛ рдХрдмреНрдЬреЗ рдореЗрдВ рд▓реЗрдХрд░, рд╕рдВрдЧреНрд░рд╣ рдХреЛ "рдирд┐рдЧрд▓" рд▓реЗрддрд╛ рд╣реИред рдХреЛрдб рдореЗрдВ, рдпрд╣ рд╡рд┐рдЪрд╛рд░ рдЗрд╕ рддрд░рд╣ рдкрд░рд┐рд▓рдХреНрд╖рд┐рдд рд╣реЛрдЧрд╛:


let coll_1 = vec![1,2,3];
let coll_2: Vec<i32> = coll_1.into_iter().collect();
//coll_1 doesn't exists anymore

рдХреЙрд▓ рдХрд░рдХреЗ рдХреЙрд▓ рдореЗрдВ `k_iter ()` рдХреЛ coll_1 рдкрд░ рд╣рдордиреЗ рдЗрд╕реЗ рдЗрдЯреНрд░реЗрдЯрд░ рдореЗрдВ рдмрджрд▓ рджрд┐рдпрд╛, рдЗрд╕рдХреЗ рд╕рднреА рддрддреНрд╡реЛрдВ рдХреЛ рдЕрд╡рд╢реЛрд╖рд┐рдд рдХрд░ рд▓рд┐рдпрд╛, рдЬреИрд╕рд╛ рдХрд┐ рдкрд┐рдЫрд▓реЗ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ, `рджреВрд╕рд░рд╛` рдХреЛ рдЕрд╡рд╢реЛрд╖рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред рдЙрд╕рдХреЗ рдмрд╛рдж, рд╕рдВрдХрд▓рди рдХреЗ рджреМрд░рд╛рди coll_1 рдкрд░ рдХреЙрд▓ рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдХрд┐рд╕реА рднреА рдХреЙрд▓ рдХреЛ рдЙрдзрд╛рд░рдХрд░реНрддрд╛ рджреНрд╡рд╛рд░рд╛ рджрдВрдбрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рдлрд┐рд░ рд╣рдордиреЗ рдЗрди рддрддреНрд╡реЛрдВ рдХреЛ `рдПрдХрддреНрд░рд┐рдд` рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд╕рд╛рде рдПрдХрддреНрд░ рдХрд┐рдпрд╛, рдПрдХ рдирдпрд╛ рд╡реЗрдХреНрдЯрд░ рдмрдирд╛ред рдПрдХ рд╕рдВрдЧреНрд░рд╣рдХрд░реНрддрд╛ рд╕реЗ рдПрдХ рд╕рдВрдЧреНрд░рд╣ рдПрдХрддреНрд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП `рдХрд▓реЗрдХреНрдЯ` рдлрд╝рдВрдХреНрд╢рди рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ, рдЗрд╕рдХреЗ рд▓рд┐рдП рдЖрдкрдХреЛ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдЙрд╕ рдкреНрд░рдХрд╛рд░ рдХреЛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ рдЬрд┐рд╕реЗ рд╣рдо рдЗрдХрдЯреНрдард╛ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВред рдЗрд╕рд▓рд┐рдП, coll_2 рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдкреНрд░рдХрд╛рд░ рдХреЛ рдЗрдВрдЧрд┐рдд рдХрд░рддрд╛ рд╣реИред

рдареАрдХ рд╣реИ, рд╕рд╛рдорд╛рдиреНрдп рддреМрд░ рдкрд░, рдКрдкрд░ рд╡рд░реНрдгрд┐рдд рдПрдХ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рднрд╛рд╖рд╛ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рд╣реИ, рд▓реЗрдХрд┐рди рд╣рд░ рдмрд╛рд░ рдЬрдм рд╣рдо рдЙрдиреНрд╣реЗрдВ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рддреЛ рдбреЗрдЯрд╛ рд╕рдВрд░рдЪрдирд╛рдУрдВ рдХреА рдкреНрд░рддрд┐рд▓рд┐рдкрд┐ рдмрдирд╛рдирд╛ / рдХреНрд▓реЛрди рдХрд░рдирд╛ рдмрд╣реБрдд рдХреБрд╢рд▓ рдирд╣реАрдВ рд╣реЛрдЧрд╛, рдФрд░ рдЖрдкрдХреЛ рдХреБрдЫ рдмрджрд▓рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдиреЗ рдХреА рднреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рддреЛ рд╣рдо рд╕рдВрдХреЗрдд рдХрд░рддреЗ рд╣реИрдВред

рд╕рдВрдХреЗрдд


рдорд╛рд▓рд┐рдХ, рдЬреИрд╕рд╛ рдХрд┐ рд╣рдордиреЗ рдкрд╛рдпрд╛ рд╣реИ, рдХреЗрд╡рд▓ рдПрдХ рд╣реА рд╣реЛ рд╕рдХрддрд╛ рд╣реИред рд▓реЗрдХрд┐рди рдЖрдкрдХреЗ рдкрд╛рд╕ рдХрд┐рд╕реА рднреА рд╕рдВрдЦреНрдпрд╛ рдореЗрдВ рд▓рд┐рдВрдХ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВред


#[derive(Debug)]
struct Y; // 

fn test_borrow_checker() -> Y {
    let first = Y; //  
    let second: &Y = &first; //   ,     
    let third = &first; //    

// 
    println!("{:?}", second);
    println!("{:?}", third);

    return first;
}


рдпрд╣ рдХреЛрдб рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдорд╛рдиреНрдп рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдорд╛рд▓рд┐рдХ рдЕрднреА рднреА рдПрдХ рд╣реИред рд╕рднреА рд╕реНрд╡рд╛рдорд┐рддреНрд╡ рддрд░реНрдХ рдХреЗрд╡рд▓ рд╕рдВрдХрд▓рди рдЪрд░рдг рдореЗрдВ рдЬрд╛рдВрдЪреЗ рдЬрд╛рддреЗ рд╣реИрдВ, рдмрд┐рдирд╛ рдореЗрдореЛрд░реА рдЖрд╡рдВрдЯрди / рдореВрд╡рд┐рдВрдЧ рдХреЛ рдкреНрд░рднрд╛рд╡рд┐рдд рдХрд┐рдПред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рджреВрд╕рд░реЗ рдХрд╛ рдкреНрд░рдХрд╛рд░ рдмрджрд▓рдХрд░ `& Y` рд╣реЛ рдЧрдпрд╛ рд╣реИ! рдпрд╣реА рд╣реИ, рд╕реНрд╡рд╛рдорд┐рддреНрд╡ рдФрд░ рд▓рд┐рдВрдХ рдХреЗ рд╢рдмреНрджрд╛рд░реНрде рдкреНрд░рдХрд╛рд░реЛрдВ рдореЗрдВ рдкрд░рд┐рд▓рдХреНрд╖рд┐рдд рд╣реЛрддреЗ рд╣реИрдВ, рдЬреЛ рдЖрдкрдХреЛ рд╕рдВрдХрд▓рди рдХреЗ рджреМрд░рд╛рди рдЬрд╛рдВрдЪрдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рджреМрдбрд╝ рдХреА рд╕реНрдерд┐рддрд┐ рдХреА рдЕрдиреБрдкрд╕реНрдерд┐рддрд┐ред

рдореИрдВ рд╕рдВрдХрд▓рди рд╕рдордп рдкрд░ рджреМрдбрд╝ рдХреА рд╕реНрдерд┐рддрд┐ рд╕реЗ рдХреИрд╕реЗ рдмрдЪрд╛ рд╕рдХрддрд╛ рд╣реВрдВ?

рдкрд░рд┐рд╡рд░реНрддрдирд╢реАрд▓ рд▓рд┐рдВрдХ рдХреА рд╕рдВрдЦреНрдпрд╛ рдкрд░ рдПрдХ рд╕реАрдорд╛ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рдХреЗ!

рдПрдХ рд╕рдордп рдореЗрдВ рдПрдХ рдкрд░рд┐рд╡рд░реНрддрдирд╢реАрд▓ рд▓рд┐рдВрдХ рдПрдХ рдФрд░ рдХреЗрд╡рд▓ рдПрдХ (рдЕрдкрд░рд┐рд╡рд░реНрддрдиреАрдп рдХреЗ рдмрд┐рдирд╛) рд╣реЛ рд╕рдХрддрд╛ рд╣реИред рд╡рд╣ рд╣реИ, рдпрд╛ рддреЛ рдПрдХ / рдХрдИ рдЕрдкрд░рд┐рд╡рд░реНрддрдиреАрдп, рдпрд╛ рдПрдХ рдкрд░рд╕реНрдкрд░ред рдХреЛрдб рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрддрд╛ рд╣реИ:


// 
struct X {
    x: i32,
} 

fn test_borrow_checker() -> X {
    let mut first = X { x: 20 }; //  
    let second: &mut X = &mut first; //   
    let third: &mut X = &mut first; //    .        `second`        - .
//    second.x = 33;  //    ,             ,    
    third.x = 33;

    return first;
}

рдЖрдЗрдП рд╕рд╛рдкреЗрдХреНрд╖ рдкрд┐рдЫрд▓реЗ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрди рдкрд░ рдЬрд╛рдПрдВред рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рд╣рдордиреЗ рдПрдХ рдХреНрд╖реЗрддреНрд░ рдХреЛ рд╕рдВрд░рдЪрдирд╛ рдореЗрдВ рдЬреЛрдбрд╝рд╛, рддрд╛рдХрд┐ рдмрджрд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдХреБрдЫ рд╣реЛ, рдХреНрдпреЛрдВрдХрд┐ рд╣рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрдирд╢реАрд▓рддрд╛ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рджреВрд╕рд░реА рдмрд╛рдд, `рдЙрддреНрдкрд░рд┐рд╡рд░реНрддрди рдЪрд░ рдХреА рдШреЛрд╖рдгрд╛ рдореЗрдВ рджрд┐рдЦрд╛рдИ рджрд┐рдпрд╛` рдЪрд▓реЛ рдкрд╣рд▓реЗ = ... `, рдпрд╣ рд╕рдВрдХрд▓рдХ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕рдВрдХрд▓рдХ рдХреЗ рд▓рд┐рдП рдПрдХ рдорд╛рд░реНрдХрд░ рд╣реИ, рдЬреИрд╕реЗ рдЪрдЯреНрдЯрд╛рди рдореЗрдВ` рд╡рд▓` рдФрд░ `рд╡рд░`ред рддреАрд╕рд░рд╛, рд╕рднреА рд▓рд┐рдВрдХ рдиреЗ рдЕрдкрдиреЗ рдкреНрд░рдХрд╛рд░ рдХреЛ `& X` рд╕реЗ рдмрджрд▓рдХрд░` & mut X` рдХрд░ рджрд┐рдпрд╛ рд╣реИ (рдпрд╣ рджрд┐рдЦрддрд╛ рд╣реИ, рдЬрд╝рд╛рд╣рд┐рд░ рд╣реИ, рд░рд╛рдХреНрд╖рд╕реАред рдФрд░ рдпрд╣ рдЬреАрд╡рди рд╕рдордп рдХреЗ рдмрд┐рдирд╛ рд╣реИ ...), рдЕрдм рд╣рдо рд▓рд┐рдВрдХ рджреНрд╡рд╛рд░рд╛ рд╕рдВрдЧреНрд░рд╣реАрдд рдорд╛рди рдХреЛ рдмрджрд▓ рд╕рдХрддреЗ рд╣реИрдВред

рд▓реЗрдХрд┐рди рдореИрдВрдиреЗ рдХрд╣рд╛ рдХрд┐ рд╣рдо рдХрдИ рдкрд░рд╕реНрдкрд░ рд▓рд┐рдВрдХ рдирд╣реАрдВ рдмрдирд╛ рд╕рдХрддреЗ, рд╡реЗ рдХрд╣рддреЗ рд╣реИрдВ рдХрд┐ рдЙрдзрд╛рд░ рд▓реЗрдиреЗ рд╡рд╛рд▓рд╛ рдЪреЗрдХрд░ рдЗрд╕реЗ рдирд╣реАрдВ рджреЗрдЧрд╛, рд▓реЗрдХрд┐рди рдореИрдВрдиреЗ рдЦреБрдж рджреЛ рдмрдирд╛рдП! рд╣рд╛рдБ, рд▓реЗрдХрд┐рди рд╡рд╣рд╛рдБ рдХреА рдЬрд╛рдБрдЪ рдмрд╣реБрдд рдореБрд╢реНрдХрд┐рд▓ рд╣реИ, рдпрд╣реА рд╡рдЬрд╣ рд╣реИ рдХрд┐ рдХрднреА-рдХрднреА рдпрд╣ рд╕реНрдкрд╖реНрдЯ рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИ рдХрд┐ рд╕рдВрдХрд▓рдХ рдХреНрдпреЛрдВ рд╢рдкрде рд▓реЗрддрд╛ рд╣реИред рд╡рд╣ рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрдбрд╝реА рдореЗрд╣рдирдд рдХрд░ рд░рд╣рд╛ рд╣реИ рдХрд┐ рдЖрдкрдХрд╛ рдХрд╛рд░реНрдпрдХреНрд░рдо рд╕рдВрдХрд▓рд┐рдд рдХрд░рддрд╛ рд╣реИ рдФрд░ рдЕрдЧрд░ рдирд┐рдпрдореЛрдВ рдХреЛ рдкреВрд░рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреЛрдИ рд╡рд┐рдХрд▓реНрдк рдирд╣реАрдВ рд╣реИрдВ, рддреЛ рдПрдХ рдЧрд▓рддреА, рдФрд░ рд╢рд╛рдпрдж рд╡рд╣ рдирд╣реАрдВ рдЬрд┐рд╕рдХрд╛ рдЖрдк рдЗрдВрддрдЬрд╛рд░ рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рд╡рд╣ рдЬреЛ рдЕрдкрдиреЗ рдЖрдЦрд┐рд░реА рдкреНрд░рдпрд╛рд╕ рдХрд╛ рдЙрд▓реНрд▓рдВрдШрди рдХрд░рддрд╛ рд╣реИ, рд╕рдмрд╕реЗ рд╣рддрд╛рд╢ рдФрд░ рд╢реБрд░реБрдЖрдд рдХреЗ рд▓рд┐рдП рд╕реНрдкрд╖реНрдЯ рдирд╣реАрдВ: ) рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рд╕реВрдЪрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдХрд┐ рд╕рдВрд░рдЪрдирд╛ рдХреЙрдкреА рд╡рд┐рд╢реЗрд╖рддрд╛ рдХреЛ рд▓рд╛рдЧреВ рдирд╣реАрдВ рдХрд░рддреА рд╣реИ, рд╣рд╛рд▓рд╛рдБрдХрд┐ рдЖрдкрдиреЗ рдХрд╣реАрдВ рднреА рдХрд┐рд╕реА рднреА рдкреНрд░рддрд┐рд▓рд┐рдкрд┐ рдХреЛ рдХреЙрд▓ рдирд╣реАрдВ рдХрд┐рдпрд╛ рд╣реИред

рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рджреЛ рдкрд░рд┐рд╡рд░реНрддрдирд╢реАрд▓ рд▓рд┐рдВрдХ рдХреЗ рдЕрд╕реНрддрд┐рддреНрд╡ рдХреЛ рдПрдХ рд╕рд╛рде рдЕрдиреБрдорддрд┐ рджреА рдЬрд╛рддреА рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рд╣рдо рдХреЗрд╡рд▓ рдПрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рдЕрд░реНрдерд╛рдд, рджреВрд╕рд░рд╛ рдлреЗрдВрдХ рджрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдФрд░ рдХреБрдЫ рднреА рдирд╣реАрдВ рдмрджрд▓реЗрдЧрд╛ред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛ `рджреВрд╕рд░реЗ` рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИрдПрдХ `рддреАрд╕рд░рд╛` рдмрдирд╛рдПрдБ рдФрд░ рдлрд┐рд░ рд╕рдмрдХреБрдЫ рдареАрдХ рд╣реЛ рдЬрд╛рдПрдЧрд╛ред рд▓реЗрдХрд┐рди, рдпрджрд┐ рдЖрдк `рд╕реЗрдХрдВрдб.рдПрдХреНрд╕ = 33;` рдХреЛ рдЕрдирдХрдВрдлрд░реНрдЯ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдпрд╣ рдкрддрд╛ рдЪрд▓рддрд╛ рд╣реИ рдХрд┐ рджреЛ рдкрд░рд╕реНрдкрд░ рд▓рд┐рдВрдХ рдПрдХ рд╕рд╛рде рдореМрдЬреВрдж рд╣реИрдВ рдФрд░ рдЖрдк рд╡реИрд╕реЗ рднреА рдпрд╣рд╛рдВ рд╕реЗ рдирд╣реАрдВ рдирд┐рдХрд▓ рд╕рдХрддреЗ - рд╕рдордп рддреНрд░реБрдЯрд┐ рдХрд╛ рд╕рдВрдХрд▓рди рдХрд░реЗрдВред

iterators


рдЗрд╕рд▓рд┐рдП, рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рддреАрди рдкреНрд░рдХрд╛рд░ рдХреЗ рдЯреНрд░рд╛рдВрд╕рдорд┐рд╢рди рд╣реИрдВ:

  1. рдЕрд╡рд╢реЛрд╖рдг, рдЙрдзрд╛рд░, рдЪрд▓рддреА рд╣реИ
  2. рд╕рдВрдкрд░реНрдХ
  3. рдкрд░рд╕реНрдкрд░ рд▓рд┐рдВрдХ

рдкреНрд░рддреНрдпреЗрдХ рдкреНрд░рдХрд╛рд░ рдХреЛ рдЕрдкрдиреЗ рд╕реНрд╡рдпрдВ рдХреЗ рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред

  1. IntoIter рдореВрд▓ рд╕рдВрдЧреНрд░рд╣ рд╕реЗ рд╡рд╕реНрддреБрдУрдВ рдХреЛ рдЕрд╡рд╢реЛрд╖рд┐рдд рдХрд░рддрд╛ рд╣реИ
  2. Iter рдСрдмреНрдЬреЗрдХреНрдЯ рд▓рд┐рдВрдХ рдкрд░ рдЪрд▓рддрд╛ рд╣реИ
  3. IterMut рдЙрддреНрдкрд░рд┐рд╡рд░реНрддрдиреАрдп рд╡рд╕реНрддреБ рд╕рдВрджрд░реНрднреЛрдВ рдкрд░ рдЪрд▓рддрд╛ рд╣реИ

рд╕рд╡рд╛рд▓ рдЙрдарддрд╛ рд╣реИ - рдХрдм рдХреМрди рд╕рд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╣реИред рдХреЛрдИ рдЪрд╛рдВрджреА рдХреА рдЧреЛрд▓реА рдирд╣реАрдВ рд╣реИ - рдЖрдкрдХреЛ рдЕрднреНрдпрд╛рд╕ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдХрд┐рд╕реА рдФрд░ рдХреЗ рдХреЛрдб рдХреЛ рдкрдврд╝рдирд╛, рд▓реЗрдЦред рдореИрдВ рд╡рд┐рдЪрд╛рд░ рдХрд╛ рдкреНрд░рджрд░реНрд╢рди рдХрд░рдиреЗ рд╡рд╛рд▓рд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг рджреВрдВрдЧрд╛ред

рдорд╛рди рд▓реАрдЬрд┐рдП рдХрд┐ рдПрдХ рд╕реНрдХреВрд▓ рд╣реИ, рдЗрд╕рдореЗрдВ рдПрдХ рдХрдХреНрд╖рд╛ рд╣реИ, рдФрд░ рдХрдХреНрд╖рд╛ рдореЗрдВ рдЫрд╛рддреНрд░ рд╣реИрдВред


#[derive(PartialEq, Eq)]
enum Sex {
    Male,
    Female
}

struct Scholar {
    name: String,
    age: i32,
    sex: Sex
}

let scholars: Vec<Scholar> = ...;

рд╣рдордиреЗ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдбреЗрдЯрд╛рдмреЗрд╕ рдХреА рдХреНрд╡реЗрд░реА рдХрд░рдХреЗ рд╕реНрдХреВрд▓реА рдмрдЪреНрдЪреЛрдВ рдХреЗ рд╡реЗрдХреНрдЯрд░ рдХреЛ рд▓рд┐рдпрд╛ред рдЖрдЧреЗ, рдореБрдЭреЗ рдХрдХреНрд╖рд╛ рдореЗрдВ рд▓рдбрд╝рдХрд┐рдпреЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рдЧрд┐рдирдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдереАред рдпрджрд┐ рд╣рдо рд╡реЗрдХреНрдЯрд░ рдХреЛ `in_iter ()` рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдирд┐рдЧрд▓рддреЗ рд╣реИрдВ, рддреЛ рдЧрд┐рдирддреА рдХреЗ рдмрд╛рдж рд╣рдо рд▓рдбрд╝рдХреЛрдВ рдХреЛ рдЧрд┐рдирдиреЗ рдХреЗ рд▓рд┐рдП рдЗрд╕ рд╕рдВрдЧреНрд░рд╣ рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:


fn bad_idea() {
    let scholars: Vec<Scholar> = Vec::new();
    let girls_c = scholars
        .into_iter()
        .filter(|s| (*s).sex == Sex::Female)
        .count();

    let boys_c = scholars 
        .into_iter()
        .filter(|s| (*s).sex == Sex::Male)
        .count();
}

рд▓рдбрд╝рдХреЛрдВ рдХреА рдЧрд┐рдирддреА рдХреЗ рд▓рд┐рдП рд▓рд╛рдЗрди рдкрд░ "рдореВрд╡ рдХреЗ рдмрд╛рдж рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд┐рдпрд╛ рдЬрд╛рдиреЗ рд╡рд╛рд▓рд╛ рдореВрд▓реНрдп" рдПрдХ рддреНрд░реБрдЯрд┐ рд╣реЛрдЧреАред рдпрд╣ рднреА рд╕реНрдкрд╖реНрдЯ рд╣реИ рдХрд┐ рдЙрддреНрдкрд░рд┐рд╡рд░реНрддрд┐рдд рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐ рд╣рдорд╛рд░реЗ рд▓рд┐рдП рдХрд┐рд╕реА рдХрд╛рдо рдХреА рдирд╣реАрдВ рд╣реИред рдЗрд╕рд▓рд┐рдП рдпрд╣ рд╕рд┐рд░реНрдл `iter ()` рд╣реИ рдФрд░ рдПрдХ рджреЛрд╣рд░реЗ рд▓рд┐рдВрдХ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░ рд░рд╣рд╛ рд╣реИ:


fn good_idea() {
    let scholars: Vec<Scholar> = Vec::new();
    let girls_c = scholars.iter().filter(|s| (**s).sex == Sex::Female).count();
    let boys_c = scholars.iter().filter(|s| (**s).sex == Sex::Male).count();
}

рдпрд╣рд╛рдВ, рджреЗрд╢ рдореЗрдВ рд╕рдВрднрд╛рд╡рд┐рдд рднрд░реНрддрд┐рдпреЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рдмрдврд╝рд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рдПрдХ рдЙрддреНрдкрд░рд┐рд╡рд░реНрддреА рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЖрд╡рд╢реНрдпрдХ рд╣реИ:


fn very_good_idea() {
    let mut scholars: Vec<Scholar> = Vec::new();
    scholars.iter_mut().for_each(|s| (*s).sex = Sex::Male);
}

рдЗрд╕ рд╡рд┐рдЪрд╛рд░ рдХреЛ рд╡рд┐рдХрд╕рд┐рдд рдХрд░рддреЗ рд╣реБрдП, рд╣рдо рд╕реИрдирд┐рдХреЛрдВ рдХреЛ "рд▓реЛрдЧреЛрдВ" рд╕реЗ рдмрд╛рд╣рд░ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ "рдЕрд╡рд╢реЛрд╖рд┐рдд" рдкреБрдирд░рд╛рд╡реГрддреНрдд рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:


impl Scholar {
    fn to_soldier(self) -> Soldier {
        Soldier { forgotten_name: self.name, number: some_random_number_generator() }
    }
}

struct Soldier {
    forgotten_name: String,
    number: i32
}

fn good_bright_future() {
    let mut scholars: Vec<Scholar> = Vec::new();
    scholars.iter_mut().for_each(|s| (*s).sex = Sex::Male);
    let soldiers: Vec<Soldier> = scholars.into_iter().map(|s| s.to_soldier()).collect();
    //   scholars,    
}

рдЗрд╕ рдЕрджреНрднреБрдд рдиреЛрдЯ рдкрд░, рд╢рд╛рдпрдж рдпрд╣ рд╕рдм рд╣реИред

рдЖрдЦрд┐рд░реА рд╕рд╡рд╛рд▓ рд░рд╣рддрд╛ рд╣реИ - `рдлрд┐рд▓реНрдЯрд░` рдореЗрдВ рд▓рд┐рдВрдХ рдХреА рдбрдмрд▓ рдбреАрдлреНрд░реЗрдВрд╕рд┐рдВрдЧ рдХрд╣рд╛рдВ рд╕реЗ рд╣реБрдИред рддрдереНрдп рдпрд╣ рд╣реИ рдХрд┐ рдПрдХ рд╡рд┐рдзреЗрдп рдПрдХ рдлрд╝рдВрдХреНрд╢рди рд╣реИ рдЬреЛ рдПрдХ рддрд░реНрдХ рдХрд╛ рд╕рдВрджрд░реНрдн рд▓реЗрддрд╛ рд╣реИ (рдЗрд╕рд▓рд┐рдП рдЗрд╕реЗ рдХреИрдкреНрдЪрд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдирд╣реАрдВ):


    fn filter<P>(self, predicate: P) -> Filter<Self, P> where
        Self: Sized, P: FnMut(&Self::Item) -> bool,

рд╡рд┐рдзреЗрдп FnMut рд╣реИ (рдореЛрдЯреЗ рддреМрд░ рдкрд░ рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдмреЛрд▓ рд░рд╣рд╛ рд╣реИ), рдЬреЛ рдЗрд╕рдХреЗ (рд╕реНрд╡) рдЖрдЗрдЯрдо рдХрд╛ рд╕рдВрджрд░реНрдн рд▓реЗрддрд╛ рд╣реИ рдФрд░ рдмреВрд▓ рджреЗрддрд╛ рд╣реИред рдЪреВрдБрдХрд┐ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдкреБрдирд░рд╛рд╡реГрддреНрдд `.iter ()` рд╕реЗ рдПрдХ рд▓рд┐рдВрдХ рдерд╛, рджреВрд╕рд░рд╛ рдлрд╝рд┐рд▓реНрдЯрд░ рдореЗрдВ рджрд┐рдЦрд╛рдИ рджрд┐рдпрд╛ред рдЬрдм рдПрдХ рдЗрдЯреНрд░реЗрдЯрд░ (`__iter`) рджреНрд╡рд╛рд░рд╛ рдЕрд╡рд╢реЛрд╖рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рд▓рд┐рдВрдХ рдХреА рдбрдмрд▓ рдбреАрдлреНрд░реЗрдВрд╕рд┐рдВрдЧ рдПрдХ рдирд┐рдпрдорд┐рдд рд░реВрдк рд╕реЗ рдмрджрд▓ рдЬрд╛рддреА рд╣реИред

рд╡рд┐рд╕реНрддрд╛рд░


рдореБрдЭреЗ рд▓реЗрдЦ рд▓рд┐рдЦрдиреЗ рдХрд╛ рдЕрдзрд┐рдХ рдЕрдиреБрднрд╡ рдирд╣реАрдВ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдореБрдЭреЗ рдЖрд▓реЛрдЪрдирд╛ рдХрд░рдиреЗ рдореЗрдВ рдЦреБрд╢реА рд╣реЛрдЧреАред
рдЕрдЧрд░ рджрд┐рд▓рдЪрд╕реНрдкреА рд╣реИ, рддреЛ рдореИрдВ рдЬрд╛рд░реА рд░рдЦ рд╕рдХрддрд╛ рд╣реВрдВред рд╡рд┐рд╖рдпреЛрдВ рдХреЗ рд▓рд┐рдП рд╡рд┐рдХрд▓реНрдк:

  • рдореЗрдореЛрд░реА рдбреАрд▓реЛрдХреЗрд╢рди рдХреИрд╕реЗ рдФрд░ рдХрдм рд╣реЛрддрд╛ рд╣реИ
  • рд▓рд┐рдВрдХ рдЬреАрд╡рди рднрд░
  • рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ
  • рдПрдХ рдЫреЛрдЯреА рд╕реА рд╡реЗрдм рд╕реЗрд╡рд╛ рд▓рд┐рдЦрдирд╛, рдЖрдк рдПрдкреАрдЖрдИ рднреА рдкреНрд░рджрд╛рди рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ

рд▓рд┐рдВрдХ


  • рдЬрдВрдЧ рдХреА рдХрд┐рддрд╛рдм
  • рд╕реНрд╡рд╛рдорд┐рддреНрд╡ рдХреА рдЕрд╡рдзрд╛рд░рдгрд╛ рдХреЗ рдХрд╛рд░рдг, рдЗрд╕ рддрд░рд╣ рдХреА рдмреБрдирд┐рдпрд╛рджреА рдЪреАрдЬреЛрдВ рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдПрдХ рд▓рд┐рдВрдХ рдХреА рдЧрдИ рд╕реВрдЪреА рдЕрдм рддреБрдЪреНрдЫ рдирд╣реАрдВ рд╣реИред рдЙрдиреНрд╣реЗрдВ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рдХрдИ рддрд░реАрдХреЗ рдпрд╣рд╛рдВ рджрд┐рдП рдЧрдП рд╣реИрдВ ред

All Articles