рдпрд╣ рд╡рд┐рд╢реЗрд╖рдЬреНрдЮрддрд╛ рдХреЗ рд▓рд┐рдП рдПрдХ рдЯреНрд░реИрдХрд┐рдВрдЧ рдореБрджреНрджрд╛ рд╣реИ (рдЬрдВрдЧ-рд▓рдВрдЧ / rfcs # 1210)ред
рдкреНрд░рдореБрдЦ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХрджрдо:
default impl
(https://github.com/rust-lang/rust/issues/37653)default
рд╕рджрд╕реНрдп рдирд╣реАрдВ рд╣реЛрдиреЗ рдкрд░ рд╣рдореЗрдВ рдЦрд╛рд▓реА рдЗрдореНрдкреНрд▓рд╛рдВрдЯ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдиреА рдЪрд╛рд╣рд┐рдП? https://github.com/rust-lang/rust/issues/48444RFC рд╕реЗ рдЕрдирд╕реБрд▓рдЭреЗ рдкреНрд░рд╢реНрди:
default type
рдХрдм рдкреНрд░рдХрдЯ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП? рдЯрд╛рдЗрдкрдХ рдХреЗ рджреМрд░рд╛рди рдХрднреА рдирд╣реАрдВ? рдпрд╛ рдЬрдм рдореЛрдиреЛрдореЛрд░реНрдлрд┐рдХ?default
(рдЕрд░реНрдерд╛рдд рд╡рд┐рд╢реЗрд╖) рдорд╛рдирд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП?default impl
(рдЬрд╣рд╛рдВ рд╕рднреА рдЖрдЗрдЯрдо default
) рдпрд╛ partial impl
(рдЬрд╣рд╛рдВ default
рдСрдкреНрдЯ-рдЗрди рд╣реИ); рджреЗрдЦрд┐рдП https://github.com/rust-lang/rust/issues/37653#issuecomment -616116577 рдХреЗ рдХреБрдЫ рдкреНрд░рд╛рд╕рдВрдЧрд┐рдХ рдЙрджрд╛рд╣рд░рдгреЛрдВ рдХреЗ рд▓рд┐рдП рдЬрд╣рд╛рдВ default impl
рд╕реАрдорд┐рдд рд╣реИредрдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рд╡рд░реНрддрдорд╛рди рдореЗрдВ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЧрдпрд╛ specialization
рдлрд╝реАрдЪрд░ рдЕрд╕рддреНрдп рд╣реИ , рдЬрд┐рд╕рдХрд╛ рдЕрд░реНрде рд╣реИ рдХрд┐ рдпрд╣ unsafe
рдХреЛрдб рдХреЗ рдмрд┐рдирд╛ рдЕрдкрд░рд┐рднрд╛рд╖рд┐рдд рд╡реНрдпрд╡рд╣рд╛рд░ рдХрд╛ рдХрд╛рд░рдг рдмрди рд╕рдХрддрд╛ рд╣реИред min_specialization
рдЕрдзрд┐рдХрд╛рдВрд╢ рдиреБрдХрд╕рд╛рди рд╕реЗ рдмрдЪрд╛ рдЬрд╛рддрд╛ рд╣реИ ред
рдХреБрдЫ рдЕрддрд┐рд░рд┐рдХреНрдд рдЦреБрд▓реЗ рдкреНрд░рд╢реНрди:
рдореБрдЭреЗ рдпрдХреАрди рдирд╣реАрдВ рд╣реИ рдХрд┐ рд╡рд┐рд╢реЗрд╖рдЬреНрдЮрддрд╛ рдЕрдирд╛рде рдирд┐рдпрдореЛрдВ рдХреЛ рдмрджрд▓ рджреЗрддреА рд╣реИ:
рдЗрд╕рд╕реЗ рднреА рдмрджрддрд░, "рднрд╡рд┐рд╖реНрдп рдХреА рдЕрдиреБрдХреВрд▓рддрд╛" рдЕрдирд╛рде рдирд┐рдпрдо рдмрд╣реБрдд рднрд╛рд░реА рдирд┐рдпрдВрддреНрд░рдг рдореЗрдВ рдХреНрд░реЙрд╕-рдЯреЛрдХрд░рд╛ рд╡рд┐рд╢реЗрд╖рдЬреНрдЮрддрд╛ рд░рдЦрддреЗ рд╣реИрдВред рдЙрдирдХреЗ рдмрд┐рдирд╛, рдЙрдирдХреЗ рддрд░реАрдХреЛрдВ рдХреЛ рдЦреБрд▓рд╛ рдЫреЛрдбрд╝рдиреЗ рдХреЗ рдбрд┐рдлрд╝реЙрд▓реНрдЯ-рдмрд╣реБрдд рдЕрдзрд┐рдХ рдмреБрд░реЗ рд╣реЛ рдЬрд╛рддреЗ рд╣реИрдВред
рдореБрдЭреЗ рд╕реНрдкрд╖реНрдЯ рдирдХрд╛рд░рд╛рддреНрдордХ рддрд░реНрдХ рдкрд╕рдВрдж рдирд╣реАрдВ рдЖрдпрд╛ред рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдХреБрд▓ рдирдХрд╛рд░рд╛рддреНрдордХ рддрд░реНрдХ рд╡рд┐рд╢реЗрд╖рдЬреНрдЮрддрд╛ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИ рдПрдХ рдЕрдЪреНрдЫрд╛ рд╕рдордЭреМрддрд╛ рд╣реИред
рдХреНрдпрд╛ рдЗрд╕ рдирд┐рд╣рд┐рддрд╛рд░реНрде рдХреЛ рд╡рд┐рд╢реЗрд╖рдЬреНрдЮрддрд╛ рдХреЗ рд╕рд╛рде рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП? рдпрд╛ рдХреНрдпрд╛ рдореИрдВ рдХреБрдЫ рди рдХреБрдЫ рднреВрд▓ рд░рд╣рд╛ рд╣реВрдВ?
http://is.gd/3Ul0pe
рдЗрд╕ рдПрдХ рдХреЗ рд╕рд╛рде рднреА, рдпрд╣ рд╕рдВрдХрд▓рди рдХрд░рдиреЗ рдХреА рдЙрдореНрдореАрдж рдХреА рд╣реЛрдЧреА: http://is.gd/RyFIEl
рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЬрдм рд╕рдВрдмрдВрдзрд┐рдд рдкреНрд░рдХрд╛рд░ рд╢рд╛рдорд┐рд▓ рд╣реЛрддреЗ рд╣реИрдВ рддреЛ рдУрд╡рд░рд▓реИрдк рдХрд╛ рдирд┐рд░реНрдзрд╛рд░рдг рдХрд░рдиреЗ рдореЗрдВ рдХреБрдЫ рд╡рд┐рдЪрд┐рддреНрд░рддрд╛рдПрдБ рд╣реЛрддреА рд╣реИрдВред рдпрд╣ рд╕рдВрдХрд▓рд┐рдд рдХрд░рддрд╛ рд╣реИ: http://is.gd/JBPzIX , рдЬрдмрдХрд┐ рдпрд╣ рдкреНрд░рднрд╛рд╡реА рд░реВрдк рд╕реЗ рд╕рдорд╛рди рдХреЛрдб рдирд╣реАрдВ рд╣реИ: http://is.gd/0JLLX
рдпрд╣рд╛рдБ рд╡рд┐рд╢реЗрд╖рдЬреНрдЮрддрд╛ рдХреЗ рд╕рд╛рде рд╕рдВрдХрд▓рди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдкреЗрдХреНрд╖рд┐рдд рдХреЛрдб рдХрд╛ рдПрдХ рдЯреБрдХрдбрд╝рд╛ рд╣реИ:
#![feature(specialization)]
use std::str::FromStr;
struct Error;
trait Simple<'a> {
fn do_something(s: &'a str) -> Result<Self, Error>;
}
impl<'a> Simple<'a> for &'a str {
fn do_something(s: &'a str) -> Result<Self, Error> {
Ok(s)
}
}
impl<'a, T: FromStr> Simple<'a> for T {
fn do_something(s: &'a str) -> Result<Self, Error> {
T::from_str(s).map_err(|_| Error)
}
}
fn main() {
// Do nothing. Just type check.
}
рдХрдВрдкрд╛рдЗрд▓рд░ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╕рдВрдШрд░реНрд╖реЛрдВ рдХрд╛ рд╣рд╡рд╛рд▓рд╛ рджреЗрддреЗ рд╣реБрдП рдХрдВрдкрд╛рдЗрд▓рд░ рдХреЗ рд╕рд╛рде рд╡рд┐рдлрд▓ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИред рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ &str
FromStr
рд▓рд╛рдЧреВ рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╡рд┐рд░реЛрдз рдирд╣реАрдВ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред
@sgrif
рдореЗрд░реЗ рдкрд╛рд╕ рдкрд╣рд▓реЗ рджреЛ рдЙрджрд╛рд╣рд░рдгреЛрдВ рдХреЛ рджреЗрдЦрдиреЗ рдХрд╛ рд╕рдордп рдерд╛ред рдпрд╣рд╛рдБ рдореЗрд░реЗ рдиреЛрдЯреНрд╕ рд╣реИрдВред
рдкрд╣рд▓рд╛ рдорд╛рдорд▓рд╛, рдЖрдкрдХреЗ рдкрд╛рд╕ рд╣реИ:
FromSqlRow<ST, DB> for T where T: FromSql<ST, DB>
FromSqlRow<(ST, SU), DB> for (T, U) where T: FromSqlRow<ST, DB>, U: FromSqlRow<SU, DB>,
рд╕рдорд╕реНрдпрд╛ рдпрд╣ рд╣реИ рдХрд┐ рдпреЗ рдУрд╡рд░рд▓реИрдк рдХрд░рддреЗ рд╣реИрдВ рд▓реЗрдХрд┐рди рди рддреЛ рдЕрдиреНрдп рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдЕрдзрд┐рдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рд╣реИрдВ:
T: FromSql<ST, DB>
рдЬрд╣рд╛рдБ T
рдПрдХ рдЬреЛрдбрд╝реА рдирд╣реАрдВ рд╣реИ (рдЗрд╕рд▓рд┐рдП рдпрд╣ рдкрд╣рд▓реА рдмрд╛рд░ рдХреЗ рдирд┐рд╣рд┐рддрд╛рд░реНрде рд╕реЗ рдореЗрд▓ рдЦрд╛рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рджреВрд╕рд░реЗ рд╕реЗ рдирд╣реАрдВ)ред(T, U)
:T: FromSqlRow<ST, DB>
,U: FromSqlRow<SU, DB>
, рд▓реЗрдХрд┐рди _not_(T, U): FromSql<(ST, SU), DB>
(T, U)
рдРрд╕реЗ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ:T: FromSqlRow<ST, DB>
U: FromSqlRow<SU, DB>
(T, U): FromSql<(ST, SU), DB>
рдпрд╣ рдЗрд╕ рддрд░рд╣ рдХреА рд╕реНрдерд┐рддрд┐ рд╣реИ рдХрд┐ рдЬрд╛рд▓реА рдХреЗ рдкреНрд░рддреНрдпрд╛рд░реЛрдкрдг рдХреА рдЕрдиреБрдорддрд┐ рд╣реЛрдЧреА - рдЖрдкрдХреЛ рдУрд╡рд░рд▓реИрдкрд┐рдВрдЧ рдХреЗ рдорд╛рдорд▓реЗ рдХреЗ рд▓рд┐рдП рддреАрд╕рд░рд╛ рдкреНрд░рддреНрдпрд╛рд░реЛрдкрдг рд▓рд┐рдЦрдирд╛ рд╣реЛрдЧрд╛, рдФрд░ рдХрд╣реЗрдВрдЧреЗ рдХрд┐ рдЗрд╕реЗ рдХреНрдпрд╛ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред рд╡реИрдХрд▓реНрдкрд┐рдХ рд░реВрдк рд╕реЗ, рдирдХрд╛рд░рд╛рддреНрдордХ рд▓рдХреНрд╖рдг рдЖрдЪреНрдЫрд╛рджрди рдЖрдкрдХреЛ рдУрд╡рд░рд▓реИрдк рдпрд╛ рдЕрдиреНрдпрдерд╛ рдорд┐рд▓рд╛рди рдХрд░рдиреЗ рдХрд╛ рдПрдХ рддрд░реАрдХрд╛ рджреЗ рд╕рдХрддрд╛ рд╣реИ рдЬреЛ рдореИрдЪ рд╕рдВрднрд╡ рд╣реИрдВред
рдЖрдкрдХреЗ рдкрд╛рд╕:
Queryable<ST, DB> for T where T: FromSqlRow<ST, DB>
Queryable<Nullable<ST>, DB> for Option<T> where T: Queryable<ST, DB>
рдпреЗ рдУрд╡рд░рд▓реИрдк рдХреНрдпреЛрдВрдХрд┐ рдЖрдкрдХреЗ рдкрд╛рд╕ Option<T>
рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ:
T: Queryable<ST, DB>
Option<T>: FromSqlRow<Nullable<ST>, DB>
рд▓реЗрдХрд┐рди рди рддреЛ рдирд┐рд╣рд┐рдд рдЕрдзрд┐рдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рд╣реИ:
T
рдРрд╕реЗ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ, рдЬреЛ T: FromSqlRow<ST, DB>
рд▓реЗрдХрд┐рди T
Option<U>
(рдорд┐рд▓рд╛рди рдкрд╣рд▓реЗ рдирд┐рд╣рд┐рдд рд▓реЗрдХрд┐рди рджреВрд╕рд░реЗ рдирд╣реАрдВ)Option<T>
рдРрд╕реЗ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ, рдЬреЛ T: Queryable<ST, DB>
рд▓реЗрдХрд┐рди Option<T>: FromSqlRow<Nullable<ST>, DB>
@SergioBenitez
рдХрдВрдкрд╛рдЗрд▓рд░ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╕рдВрдШрд░реНрд╖реЛрдВ рдХрд╛ рд╣рд╡рд╛рд▓рд╛ рджреЗрддреЗ рд╣реБрдП рдХрдВрдкрд╛рдЗрд▓рд░ рдХреЗ рд╕рд╛рде рд╡рд┐рдлрд▓ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИред рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐
&str
FromStr
рд▓рд╛рдЧреВ рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╡рд┐рд░реЛрдз рдирд╣реАрдВ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред
рд╕рдорд╕реНрдпрд╛ рдпрд╣ рд╣реИ рдХрд┐ рд╕рдВрдХрд▓рдХ рд░реВрдврд╝рд┐рд╡рд╛рджреА рд░реВрдк рд╕реЗ рдпрд╣ рдорд╛рди рд░рд╣рд╛ рд╣реИ рдХрд┐ &str
рднрд╡рд┐рд╖реНрдп рдореЗрдВ FromStr
рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖ рд╕рдХрддрд╛ рд╣реИред рдпрд╣ рдЗрд╕ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рдореВрд░реНрдЦрддрд╛рдкреВрд░реНрдг рд▓рдЧ рд╕рдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рд╕рд╛рдорд╛рдиреНрдп рддреМрд░ рдкрд░, рд╣рдо рд╣рд░ рд╕рдордп рдирдП рдЗрдореНрдкреНрд▓реЙрдЗрдЬ рдЬреЛрдбрд╝рддреЗ рд╣реИрдВ, рдФрд░ рдЬрдм рд╣рдо рдЙрди рдЗрдореНрдкреНрд▓рд╛рдВрдЯреНрд╕ рдХреЛ рдЬреЛрдбрд╝рддреЗ рд╣реИрдВ рддреЛ рд╣рдо рдбрд╛рдЙрдирд╕реНрдЯреНрд░реАрдо рдХреЛрдб рдХреЛ рдЯреВрдЯрдиреЗ рд╕реЗ рдмрдЪрд╛рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВред
рдпрд╣ рдПрдХ рд░реВрдврд╝рд┐рд╡рд╛рджреА рд╡рд┐рдХрд▓реНрдк рд╣реИ, рдФрд░ рдХреБрдЫ рдРрд╕рд╛ рд╣реИ рдЬрд┐рд╕реЗ рд╣рдо рд╕рдордп рдХреЗ рд╕рд╛рде рдЖрд░рд╛рдо рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВред рдЖрдк рдпрд╣рд╛рдБ рдкреГрд╖реНрдарднреВрдорд┐ рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:
рдЙрди рджреЛ рдорд╛рдорд▓реЛрдВ рдХреЛ рд╕реНрдкрд╖реНрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рджред рдпрд╣ рдЕрдм рдкреВрд░реНрдг рд╕рдордЭ рдореЗрдВ рдЖрддрд╛ рд╣реИ
Tue, Mar 22, 2016 рдХреЛ, 6:34 рдЕрдкрд░рд╛рд╣реНрди рдЖрд░реЛрди рддреБрд░реЙрди рд╕реВрдЪрдирд╛рдПрдБ @ithub.com рдиреЗ рд▓рд┐рдЦрд╛:
@SergioBenitez https://github.com/SergioBenitez
рдХрдВрдкрд╛рдЗрд▓рд░ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╕рдВрдШрд░реНрд╖реЛрдВ рдХрд╛ рд╣рд╡рд╛рд▓рд╛ рджреЗрддреЗ рд╣реБрдП рдХрдВрдкрд╛рдЗрд▓рд░ рдХреЗ рд╕рд╛рде рд╡рд┐рдлрд▓ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИред рдзреНрдпрд╛рди рджреЗрдВ
рд╡рд╣ рдФрд░ рд╕реНрдЯреНрд░рд┐рдВрдЧ FromStr рдХреЛ рд▓рд╛рдЧреВ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдХреЛрдИ рд╡рд┐рд░реЛрдз рдирд╣реАрдВ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПредрд╕рдорд╕реНрдпрд╛ рдпрд╣ рд╣реИ рдХрд┐ рд╕рдВрдХрд▓рдХ рд░реВрдврд╝рд┐рд╡рд╛рджреА рд░реВрдк рд╕реЗ рдпрд╣ рдорд╛рди рд░рд╣рд╛ рд╣реИ рдХрд┐ str
рднрд╡рд┐рд╖реНрдп рдореЗрдВ FromStr рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖ рд╕рдХрддрд╛ рд╣реИред рдпрд╣ рдореВрд░реНрдЦрддрд╛рдкреВрд░реНрдг рд▓рдЧ рд╕рдХрддрд╛ рд╣реИ
рдпрд╣ рдЙрджрд╛рд╣рд░рдг рд╣реИ, рд▓реЗрдХрд┐рди рд╕рд╛рдорд╛рдиреНрдп рддреМрд░ рдкрд░, рд╣рдо рд╣рд░ рд╕рдордп рдирдП рдЗрдореНрдкреНрд▓рд╛рдВрдЯ рдЬреЛрдбрд╝рддреЗ рд╣реИрдВ, рдФрд░ рд╣рдо рдЪрд╛рд╣рддреЗ рд╣реИрдВ
рдЬрдм рд╣рдо рдЙрди рдЖрдХреГрддрд┐рдпреЛрдВ рдХреЛ рдЬреЛрдбрд╝рддреЗ рд╣реИрдВ рддреЛ рдбрд╛рдЙрдирд╕реНрдЯреНрд░реАрдо рдХреЛрдб рдХреЛ рдЯреВрдЯрдиреЗ рд╕реЗ рдмрдЪрд╛рддреЗ рд╣реИрдВредрдпрд╣ рдПрдХ рд░реВрдврд╝рд┐рд╡рд╛рджреА рд╡рд┐рдХрд▓реНрдк рд╣реИ, рдФрд░ рдХреБрдЫ рдРрд╕рд╛ рд╣реИ рдЬрд┐рд╕реЗ рд╣рдо рдЖрд░рд╛рдо рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ
рдЕрдзрд┐рдХ рд╕рдордп рддрдХред рдЖрдк рдпрд╣рд╛рдБ рдкреГрд╖реНрдарднреВрдорд┐ рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:-
http://smallcultfollowing.com/babysteps/blog/2015/01/14/little-orphan-impls/
- рдЬрдВрдЧ-рд▓рдВрдЧ / rfcs # 1023 https://github.com/rust-lang/rfcs/pull/1023
- рдЬрдВрдЧ-рд▓рдВрдЧ / rfcs # 1053 https://github.com/rust-lang/rfcs/issues/1053
- рдЬрдВрдЧ-рд▓рдВрдЧ / rfcs # 1148 https://github.com/rust-lang/rfcs/pull/1148
-
рдЖрдк рдЗрд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрд░ рд░рд╣реЗ рд╣реИрдВ рдХреНрдпреЛрдВрдХрд┐ рдЖрдкрдХрд╛ рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред
рдЗрд╕ рдИрдореЗрд▓ рдХрд╛ рдЙрддреНрддрд░ рд╕реАрдзреЗ рджреЗрдВ рдпрд╛ рдЗрд╕реЗ GitHub рдкрд░ рджреЗрдЦреЗрдВ
https://github.com/rust-lang/rust/issues/31844#issuecomment -200093757
@aturon
рд╕рдорд╕реНрдпрд╛ рдпрд╣ рд╣реИ рдХрд┐ рд╕рдВрдХрд▓рдХ рд░реВрдврд╝рд┐рд╡рд╛рджреА рд░реВрдк рд╕реЗ рдпрд╣ рдорд╛рдирдХрд░ рдЪрд▓ рд░рд╣рд╛ рд╣реИ рдХрд┐ рднрд╡рд┐рд╖реНрдп рдореЗрдВ FromStr рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП str рдЖ рд╕рдХрддрд╛ рд╣реИред рдпрд╣ рдЗрд╕ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рдореВрд░реНрдЦрддрд╛рдкреВрд░реНрдг рд▓рдЧ рд╕рдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рд╕рд╛рдорд╛рдиреНрдп рддреМрд░ рдкрд░, рд╣рдо рд╣рд░ рд╕рдордп рдирдП рдЗрдореНрдкреНрд▓реЙрдЗрдЬ рдЬреЛрдбрд╝рддреЗ рд╣реИрдВ, рдФрд░ рдЬрдм рд╣рдо рдЙрди рдЗрдореНрдкреНрд▓рд╛рдВрдЯреНрд╕ рдХреЛ рдЬреЛрдбрд╝рддреЗ рд╣реИрдВ рддреЛ рд╣рдо рдбрд╛рдЙрдирд╕реНрдЯреНрд░реАрдо рдХреЛрдб рдХреЛ рдЯреВрдЯрдиреЗ рд╕реЗ рдмрдЪрд╛рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВред
рдХреНрдпрд╛ рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдХреНрдпрд╛ рд╡рд┐рд╢реЗрд╖рдЬреНрдЮрддрд╛ рдХреЛ рд╕рдВрдмреЛрдзрд┐рдд рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдирд╣реАрдВ рд╣реИ? рд╡рд┐рд╢реЗрд╖рдЬреНрдЮрддрд╛ рдХреЗ рд╕рд╛рде, рдореИрдВ рдЙрдореНрдореАрдж рдХрд░реВрдВрдЧрд╛ рдХрд┐ рднрд╡рд┐рд╖реНрдп рдореЗрдВ FromStr
&str
рдХрд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╣реЛрдиреЗ рдкрд░ рднреА, Simple
&str
рд▓рд┐рдП Simple
рдХрд╛ рдкреНрд░рддреНрдпрдХреНрд╖ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд▓рд╛рдЧреВ рд╣реЛред рдкреВрд░реНрд╡рддрд╛ рд▓реЗрдирд╛ рд╣реЛрдЧрд╛ред
@SergioBenitez рдЖрдкрдХреЛ рдЕрдзрд┐рдХ рд╕рд╛рдорд╛рдиреНрдп рдирд┐рд╣рд┐рддрд╛рд░реНрде рдореЗрдВ default fn
рдбрд╛рд▓рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рддреБрдореНрд╣рд╛рд░реА
рдЙрджрд╛рд╣рд░рдг рд╡рд┐рд╢реЗрд╖ рдирд╣реАрдВ рд╣реИред
Tue рдкрд░, рдорд╛рд░реНрдЪ 22, 2016, 6:54 PM рд╕рд░реНрдЬрд┐рдпреЛ рдмреЗрдирд┐рдЯреЗрдЬрд╝ рдиреЛрдЯрд┐рдлрд┐рдХреЗрд╢рди @github.com
рд▓рд┐рдЦрд╛ рдерд╛:
@aturon https://github.com/aturon
рд╕рдорд╕реНрдпрд╛ рдпрд╣ рд╣реИ рдХрд┐ рд╕рдВрдХрд▓рдХ рд░реВрдврд╝рд┐рд╡рд╛рджреА рд░реВрдк рд╕реЗ рдпрд╣ рдорд╛рди рд░рд╣рд╛ рд╣реИ рдХрд┐ str
рднрд╡рд┐рд╖реНрдп рдореЗрдВ FromStr рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖ рд╕рдХрддрд╛ рд╣реИред рдЗрд╕рдХреЗ рд▓рд┐рдП рд╡рд╣ рдореВрд░реНрдЦрддрд╛рдкреВрд░реНрдг рд▓рдЧ рд╕рдХрддрд╛ рд╣реИ
рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд▓реЗрдХрд┐рди рд╕рд╛рдорд╛рдиреНрдп рддреМрд░ рдкрд░, рд╣рдо рд╣рд░ рд╕рдордп рдирдП рдЗрдореНрдкреНрд▓рд╛рдВрдЯ рдЬреЛрдбрд╝рддреЗ рд╣реИрдВ, рдФрд░ рд╣рдо рдЪрд╛рд╣рддреЗ рд╣реИрдВ
рдЬрдм рд╣рдо рдЙрди рдЖрдХреГрддрд┐рдпреЛрдВ рдХреЛ рдЬреЛрдбрд╝рддреЗ рд╣реИрдВ рддреЛ рдбрд╛рдЙрдирд╕реНрдЯреНрд░реАрдо рдХреЛрдб рдХреЛ рдЯреВрдЯрдиреЗ рд╕реЗ рдмрдЪрд╛рддреЗ рд╣реИрдВредрдХреНрдпрд╛ рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдХреНрдпрд╛ рд╡рд┐рд╢реЗрд╖рдЬреНрдЮрддрд╛ рдХреЛ рд╕рдВрдмреЛрдзрд┐рдд рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдирд╣реАрдВ рд╣реИ? рд╕рд╛рде рдореЗрдВ
рд╡рд┐рд╢реЗрд╖рдЬреНрдЮрддрд╛, рдореБрдЭреЗ рдЙрдореНрдореАрдж рд╣реИ рдХрд┐ рднрд▓реЗ рд╣реА FromStr рдХрд╛ рдПрдХ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди
рднрд╡рд┐рд╖реНрдп рдХреЗ рд▓рд┐рдП & str рдХреЛ рдЬреЛрдбрд╝рд╛ рдЧрдпрд╛, рдХреЗ рд▓рд┐рдП рдкреНрд░рддреНрдпрдХреНрд╖ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди
& str рдХреЗ рд▓рд┐рдП рд╡рд┐рд╢реЗрд╖рддрд╛ рдкреВрд░реНрд╡рддрд╛ рд▓реЗ рдЬрд╛рдПрдЧрд╛ред-
рдЖрдк рдЗрд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрд░ рд░рд╣реЗ рд╣реИрдВ рдХреНрдпреЛрдВрдХрд┐ рдЖрдкрдХрд╛ рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред
рдЗрд╕ рдИрдореЗрд▓ рдХрд╛ рдЙрддреНрддрд░ рд╕реАрдзреЗ рджреЗрдВ рдпрд╛ рдЗрд╕реЗ GitHub рдкрд░ рджреЗрдЦреЗрдВ
https://github.com/rust-lang/rust/issues/31844#issuecomment -200097995
рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ "рдбрд┐рдлрд╝реЙрд▓реНрдЯ" рд╡рд┐рд╢реЗрд╖рддрд╛ рдЖрдЗрдЯрдореЛрдВ рдХреЛ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ default
рдзреНрд╡рдирд┐рдпреЛрдВ рдХреЛ рднреНрд░рдорд┐рдд рдХрд░рдиреЗ рд╡рд╛рд▓рд╛ рдорд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИред рдЖрдк impl
s рдХреЛ рдЖрд╕рд╛рди рдмрдирд╛рдиреЗ рдХреЗ рд╕рд╛рде-рд╕рд╛рде Haskell, рдЖрджрд┐ рдЬреИрд╕реЗ рдЧреБрдг рдХреЗ рд▓рд┐рдП рджреЛрдиреЛрдВ рд╕рдорд░реВрдкрддрд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдЖрдк рдЖрд╕рд╛рдиреА рд╕реЗ grep
рдЙрдирдХреЗ рд▓рд┐рдП рдРрд╕рд╛ рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ рдЬреИрд╕реЗ рдЖрдк default
рд▓рд┐рдП рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдпрд╣ рджреЛрдиреЛрдВ default
рдХреАрд╡рд░реНрдб рдХреЗ рд▓рд┐рдП рдХрдард┐рди рдирд╣реАрдВ рд╣реИ рдФрд░ рдПрдХ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рджреЗрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЙрдиреНрд╣реЗрдВ рдЕрд▓рдЧ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдпрджрд┐ рдХреЛрдИ рднрд╛рд╖рд╛ рдХреЛ рд╕реНрдкрд╖реНрдЯ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реИ, рддреЛ рдЗрди "рдбрд┐рдлрд╝реЙрд▓реНрдЯ" рд╡рд┐рд╢реЗрд╖рддрд╛ рд╡рд╕реНрддреБрдУрдВ рдХрд╛ рдирд╛рдо рдмрджрд▓рдХрд░ "рдкреНрд░рд╕реНрддрд╛рд╡рд┐рдд рдкреНрд░рд╕реНрддрд╛рд╡рд┐рдд" рдЖрдЗрдЯрдо рджрд╕реНрддрд╛рд╡реЗрдЬрд╝реАрдХрд░рдг рдореЗрдВ рд░рдЦрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред
# 32999 (рдЯрд┐рдкреНрдкрдгреА) рд╕реЗ рдзреНрдпрд╛рди рджреЗрдВ: рдпрджрд┐ рд╣рдо рдЬрд╛рд▓реА рдирд┐рдпрдо рдХреЗ рд╕рд╛рде рдЬрд╛рддреЗ рд╣реИрдВ (рдпрд╛ рдирдХрд╛рд░рд╛рддреНрдордХ рдмрд╛рдзрд╛рдУрдВ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддреЗ рд╣реИрдВ), рддреЛ рдХрд┐рд╕реА рдЪреАрдЬрд╝ рдХреЗ рдЖрдЧреЗ рд╡рд┐рд╢реЗрд╖рдЬреНрдЮрддрд╛ рдХреЛ рд░реЛрдХрдиреЗ рдХреЗ рд▓рд┐рдП "рдПрдХ рдордзреНрдпрд╡рд░реНрддреА рд╡рд┐рд╢реЗрд╖рддрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ" рдЪрд╛рд▓ рдЕрдм рдХрд╛рдо рдирд╣реАрдВ рдХрд░реЗрдЧреАред
@Stebalien
рдпрд╣ рдХрд╛рдо рдХреНрдпреЛрдВ рдирд╣реАрдВ рдХрд░реЗрдЧрд╛? рдЪрд╛рд▓ рд╡рд┐рд╢реЗрд╖рдЬреНрдЮрддрд╛ рдХреЛ рдПрдХ рдирд┐рдЬреА рд╡рд┐рд╢реЗрд╖рддрд╛ рддрдХ рд╕реАрдорд┐рдд рдХрд░рддреА рд╣реИред рдпрджрд┐ рдЖрдк рдЗрд╕реЗ рдПрдХреНрд╕реЗрд╕ рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рддреЛ рдЖрдк рдирд┐рдЬреА рд╡рд┐рд╢реЗрд╖рддрд╛ рдХрд╛ рд╡рд┐рд╢реЗрд╖рдЬреНрдЮ рдирд╣реАрдВ рдмрди рд╕рдХрддреЗред
@ arielb1 рдЖрд╣ред рдЕрдЪреНрдЫреА рдмрд╛рддред рдореЗрд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рд╡рд┐рд╢реЗрд╖рддрд╛ рдирд┐рдЬреА рдирд╣реАрдВ рд╣реИред
рдореБрдЭреЗ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ "рдмрд╛рд╣реНрдп рд╡рд┐рд╢реЗрд╖рдЬреНрдЮ рд╡рд┐рд╢реЗрд╖рдЬреНрдЮ рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ рдХреНрдпреЛрдВрдХрд┐ рдЕрдирд╛рде рдЖрдЧреЗ-рд╕рдВрдЧрддрддрд╛ + рд╕реБрд╕рдВрдЧрддрддрд╛" рддрд░реНрдХ рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рджрд┐рд▓рдЪрд╕реНрдк рдпрд╛ рдЙрдкрдпреЛрдЧреА рд╣реИред рдЦрд╛рд╕рдХрд░ рдЬрдм рд╣рдо рдЕрдкрдиреЗ рд╡рд┐рд╢рд┐рд╖реНрдЯ рд╕реБрд╕рдВрдЧрдд рдирд┐рдпрдореЛрдВ рдХреЗ рд▓рд┐рдП рдкреНрд░рддрд┐рдмрджреНрдз рдирд╣реАрдВ рд╣реЛрддреЗ рд╣реИрдВред
рдХреНрдпрд╛ рдПрдХ рдУрд╡рд░рд░рд╛рдЗрдб default impl
рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рдПрдХ рддрд░реАрдХрд╛ рд╣реИ? рдпрджрд┐ рд╣рд╛рдВ, рддреЛ рдпрд╣ рдкрд░реАрдХреНрд╖рдг рдХреЗ рдирд┐рд░реНрдорд╛рдг рдореЗрдВ рд╕рд╣рд╛рдпрддрд╛ рдХрд░ рд╕рдХрддрд╛ рд╣реИред рдЕрдиреБрдмрдВрдз рдФрд░ libhoare рджреНрд╡рд╛рд░рд╛ рдбрд┐рдЬрд╛рдЗрди рджреЗрдЦреЗрдВред
рдЯрд╛рдЗрдк-рдЪреЗрдХрд┐рдВрдЧ рдХреЗ рджреМрд░рд╛рди рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд╕рдВрдмрджреНрдз рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рдкреНрд░рдХреНрд╖реЗрдкрдг рд╕реЗ рд╕рдВрдХрд▓рди-рд╕рдордп рдкрд░ рдкреНрд░рдХрд╛рд░ рдХреА рдЕрд╕рдорд╛рдирддрд╛ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рдорд┐рд▓реЗрдЧреА: https://gist.github.com/7c081574958d22f89d434a97b626b1b4
#![feature(specialization)]
pub trait NotSame {}
pub struct True;
pub struct False;
pub trait Sameness {
type Same;
}
mod internal {
pub trait PrivSameness {
type Same;
}
}
use internal::PrivSameness;
impl<A, B> Sameness for (A, B) {
type Same = <Self as PrivSameness>::Same;
}
impl<A, B> PrivSameness for (A, B) {
default type Same = False;
}
impl<A> PrivSameness for (A, A) {
type Same = True;
}
impl<A, B> NotSame for (A, B) where (A, B): Sameness<Same=False> {}
fn not_same<A, B>() where (A, B): NotSame {}
fn main() {
// would compile
not_same::<i32, f32>();
// would not compile
// not_same::<i32, i32>();
}
рдкреНрд░рддрд┐ рдЯрд┐рдкреНрдкрдгреА @burdges рд╕рдВрдкрд╛рджрд┐рдд рдХреА рдЧрдИ
рдмрд╕ fyi @rphmeier рдХрд┐рд╕реА рдХреЛ рд╕рдВрднрд╡рддрдГ is.gd рд╕реЗ рдмрдЪрдирд╛ рдЪрд╛рд╣рд┐рдП рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ CloudFlare рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рдХрд╛рд░рдг Tor рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЗ рд▓рд┐рдП рд╣рд▓ рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИред GitHub рдкреВрд░реНрдг URL рдХреЗ рд╕рд╛рде рдареАрдХ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред рдФрд░ play.rust-lang.org рдЯреЛрд░ рдкрд░ рдареАрдХ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред
@burdges FWIW play.rust-lang.org рдЦреБрдж рдЕрдкрдиреЗ "рд╢реЙрд░реНрдЯрди" рдмрдЯрди рдХреЗ рд▓рд┐рдП is.gd рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИред
рдЗрд╕реЗ рд╕рдВрднрд╡рддрдГ рдмрджрд▓рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рд╣рд╛рд▓рд╛рдВрдХрд┐: https://github.com/rust-lang/rust-playpen/blob/9777ef59b/static/web.js#L333
рдЗрд╕ рддрд░рд╣ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ (https://is.gd/Ux6FNs):
#![feature(specialization)]
pub trait Foo {}
pub trait Bar: Foo {}
pub trait Baz: Foo {}
pub trait Trait {
type Item;
}
struct Staff<T> { }
impl<T: Foo> Trait for Staff<T> {
default type Item = i32;
}
impl<T: Foo + Bar> Trait for Staff<T> {
type Item = i64;
}
impl<T: Foo + Baz> Trait for Staff<T> {
type Item = f64;
}
fn main() {
let _ = Staff { };
}
рддреНрд░реБрдЯрд┐:
error: conflicting implementations of trait `Trait` for type `Staff<_>`: [--explain E0119]
--> <anon>:20:1
20 |> impl<T: Foo + Baz> Trait for Staff<T> {
|> ^
note: conflicting implementation is here:
--> <anon>:16:1
16 |> impl<T: Foo + Bar> Trait for Staff<T> {
|> ^
error: aborting due to previous error
рдХреНрдпрд╛ рдпрд╣ specialization
рд╕рдорд░реНрдерди рдХрд░рддрд╛ рд╣реИ, рдФрд░ рдХреНрдпрд╛ рд╡рд░реНрддрдорд╛рди рдореЗрдВ рдХрд┐рд╕реА рдЕрдиреНрдп рдкреНрд░рдХрд╛рд░ рдХрд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╣реИ?
@zitsen
рдЗрди рдкреНрд░рддреНрдпрд╛рд░реЛрдкрдгреЛрдВ рдХреЛ рд╡рд░реНрддрдорд╛рди рд╡рд┐рд╢реЗрд╖рдЬреНрдЮрддрд╛ рдбрд┐рдЬрд╛рдЗрди рджреНрд╡рд╛рд░рд╛ рдЕрдиреБрдорддрд┐ рдирд╣реАрдВ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ T: Foo + Bar
рдпрд╛ T: Foo + Baz
рдЕрдиреНрдп рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдЕрдзрд┐рдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдирд╣реАрдВ рд╣реИред рдпрд╣реА рд╣реИ, рдЕрдЧрд░ рдЖрдкрдХреЗ рдкрд╛рд╕ рдХреБрдЫ T: Foo + Bar + Baz
, рддреЛ рдпрд╣ рд╕реНрдкрд╖реНрдЯ рдирд╣реАрдВ рд╣реИ рдХрд┐ рдХреМрди рд╕рд╛ "рдЬреАрдд" рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред
рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдПрдХ рдЕрдзрд┐рдХ рдЕрднрд┐рд╡реНрдпрдВрдЬрдХ рдкреНрд░рдгрд╛рд▓реА рдкрд░ рдХреБрдЫ рд╡рд┐рдЪрд╛рд░ рд╣реИрдВ, рдЬреЛ рдЖрдкрдХреЛ _also_ рдХреЛ T: Foo + Bar + Baz
рд▓рд┐рдП рдПрдХ рдирд┐рд╣рд┐рддрд╛рд░реНрде рджреЗрдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдЧрд╛ рдФрд░ рдЗрд╕ рддрд░рд╣ рд╕реЗ рдЕрд╕реНрд╡реАрдХрд╛рд░ рдХрд░ рджреЗрдЧрд╛, рд▓реЗрдХрд┐рди рдпрд╣ рдЕрднреА рддрдХ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдкреНрд░рд╕реНрддрд╛рд╡рд┐рдд рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред
рдпрджрд┐ рдЛрдгрд╛рддреНрдордХ рдЧреБрдг trait Baz: !Bar
рдХрднреА рднреВрдорд┐ рдХреА рд╕реАрдорд╛ рдмрдирд╛рддреЗ рд╣реИрдВ, рддреЛ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рд╡рд┐рд╢реЗрд╖рдЬреНрдЮрддрд╛ рдХреЗ рд╕рд╛рде рднреА рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рддрд╛рдХрд┐ рдпрд╣ рд╕рд╛рдмрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХреЗ рдХрд┐ рдмрд╛рд░ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдкреНрд░рдХрд╛рд░ рдФрд░ рдмрд╛рдЬ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдкреНрд░рдХрд╛рд░ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдФрд░ рд╡реНрдпрдХреНрддрд┐рдЧрдд рд░реВрдк рд╕реЗ рд╡рд┐рд╢рд┐рд╖реНрдЯ рд╣реИрдВред
рд▓рдЧрддрд╛ рд╣реИ @rphmeier рдХрд╛ рдЬрд╡рд╛рдм рд╣реИ рдХрд┐ рдореИрдВ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдХреНрдпрд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдБ, T: Foo + Bar + Baz
рд▓рд┐рдП рднреА рдорджрдж рдорд┐рд▓реЗрдЧреАред
рдмрд╕ рдЗрд╕реЗ рдЕрдирджреЗрдЦрд╛ рдХрд░реЗрдВ, рдореЗрд░реЗ рдкрд╛рд╕ рдЕрднреА рднреА рдореЗрд░реЗ рдорд╛рдорд▓реЗ рдХреЗ рд╕рд╛рде рдХреБрдЫ рдХрд░рдирд╛ рд╣реИ, рдФрд░ рд╣рдореЗрд╢рд╛ specialization
рдФрд░ рдЕрдиреНрдп рд╕реБрд╡рд┐рдзрд╛рдУрдВ рдХреЗ рд▓реИрдВрдбрд┐рдВрдЧ рдХреЗ рд▓рд┐рдП рд░реЛрдорд╛рдВрдЪрдХ рд╣реИред
рд╢реБрдХреНрд░рд┐рдпрд╛ @aturon @rphmeier
рдореИрдВ рд╣рд╛рд▓ рд╣реА рдореЗрдВ рд╡рд┐рд╢реЗрд╖рдЬреНрдЮрддрд╛ рдХреЗ рд╕рд╛рде рдЦреЗрд▓ рд░рд╣рд╛ рд╣реВрдВ, рдФрд░ рдореИрдВ рдЗрд╕ рдЕрдЬреАрдм рдорд╛рдорд▓реЗ рдореЗрдВ рдЖрдпрд╛ рд╣реВрдВ:
#![feature(specialization)]
trait Marker {
type Mark;
}
trait Foo { fn foo(&self); }
struct Fizz;
impl Marker for Fizz {
type Mark = ();
}
impl Foo for Fizz {
fn foo(&self) { println!("Fizz!"); }
}
impl<T> Foo for T
where T: Marker, T::Mark: Foo
{
default fn foo(&self) { println!("Has Foo marker!"); }
}
struct Buzz;
impl Marker for Buzz {
type Mark = Fizz;
}
fn main() {
Fizz.foo();
Buzz.foo();
}
рд╕рдВрдХрд▓рдХ рдЙрддреНрдкрд╛рджрди:
error: conflicting implementations of trait `Foo` for type `Fizz`: [--explain E0119]
--> <anon>:19:1
19 |> impl<T> Foo for T
|> ^
note: conflicting implementation is here:
--> <anon>:15:1
15 |> impl Foo for Fizz {
|> ^
рдореЗрд░рд╛ рдорд╛рдирдирд╛ тАЛтАЛрд╣реИ рдХрд┐ рдЙрдкрд░реЛрдХреНрдд _should_ рд╕рдВрдХрд▓рди, рдФрд░ рджреЛ рджрд┐рд▓рдЪрд╕реНрдк рднрд┐рдиреНрдирддрд╛рдПрдВ рд╣реИрдВ рдЬреЛ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдХрд╛рдо-рдХреЗ рд░реВрдк рдореЗрдВ рдХрд░рддреЗ рд╣реИрдВ:
1) where T::Mark: Fizz
рдмрд╛рдЙрдВрдб рдХреЛ рдирд┐рдХрд╛рд▓рдирд╛:
impl<T> Foo for T
where T: Marker //, T::Mark: Fizz
{
// ...
}
2) рдПрдХ "рд╡рд┐рд╢реЗрд╖рддрд╛ рдмрд╛рдзреНрдп рдЙрдкрдирд╛рдо" рдЬреЛрдбрд╝рдирд╛:
trait FooMarker { }
impl<T> FooMarker for T where T: Marker, T::Mark: Foo { }
impl<T> Foo for T where T: FooMarker {
// ...
}
(рдЬреЛ _doesn't_ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, рддреЛ Marker
(рдПрдХ рдЕрд▓рдЧ рдЯреЛрдХрд░рд╛ рдореЗрдВ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ!), рджреЗрдЦрдиреЗ рдХреЗ рдЗрд╕ рдЙрджрд╛рд╣рд░рдг рд░реЗрдкреЛ )
рдореЗрд░рд╛ рдпрд╣ рднреА рдорд╛рдирдирд╛ тАЛтАЛрд╣реИ рдХрд┐ рдпрд╣ рдореБрджреНрджрд╛ рдХрд┐рд╕реА рддрд░рд╣ # 20400 рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рд╣реЛ рд╕рдХрддрд╛ рд╣реИ
рд╕рдВрдкрд╛рджрд┐рдд рдХрд░реЗрдВ : рдореИрдВрдиреЗ рдЗрд╕ рдмрд╛рд░реЗ рдореЗрдВ рдПрдХ рдореБрджреНрджрд╛ рдЦреЛрд▓рд╛ рд╣реИ: # 36587
рдореИрдВ рд╡рд┐рд╢реЗрд╖рдЬреНрдЮрддрд╛ рдХреЗ рд╕рд╛рде рдПрдХ рд╕рдорд╕реНрдпрд╛ рдХрд╛ рд╕рд╛рдордирд╛ рдХрд░ рд░рд╣рд╛ рд╣реВрдВред рдирд┐рд╢реНрдЪрд┐рдд рдирд╣реАрдВ рд╣реИ рдХрд┐ рдпрд╣ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреА рд╕рдорд╕реНрдпрд╛ рд╣реИ рдпрд╛ рд╡рд┐рд╢реЗрд╖рдЬреНрдЮрддрд╛ рдХреЗ рддрд░реАрдХреЗ рдореЗрдВ рдХреЛрдИ рд╕рдорд╕реНрдпрд╛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рд╣реИред
use std::vec::IntoIter as VecIntoIter;
pub trait ClonableIterator: Iterator {
type ClonableIter;
fn clonable(self) -> Self::ClonableIter;
}
impl<T> ClonableIterator for T where T: Iterator {
default type ClonableIter = VecIntoIter<T::Item>;
default fn clonable(self) -> VecIntoIter<T::Item> {
self.collect::<Vec<_>>().into_iter()
}
}
impl<T> ClonableIterator for T where T: Iterator + Clone {
type ClonableIter = T;
#[inline]
fn clonable(self) -> T {
self
}
}
( рдкреНрд▓реЗрдкреЗрди )
(рд╡реИрд╕реЗ, рдпрд╣ рдЕрдЪреНрдЫрд╛ рд╣реЛрдЧрд╛ рдпрджрд┐ рдпрд╣ рдХреЛрдб рдЕрдВрддрддрдГ рдПрдХ рджрд┐рди stdlib рдореЗрдВ рдЙрддрд░рд╛)
рдпрд╣ рдХреЛрдб рдЗрд╕рдХреЗ рд╕рд╛рде рд╡рд┐рдлрд▓ рд╣реЛрддрд╛ рд╣реИ:
error: method `clonable` has an incompatible type for trait:
expected associated type,
found struct `std::vec::IntoIter` [--explain E0053]
--> <anon>:14:5
|>
14 |> default fn clonable(self) -> VecIntoIter<T::Item> {
|> ^
рд╡рд╛рдкрд╕реА рдореВрд▓реНрдп рдХреЛ Self::ClonableIter
рдмрджрд▓рдиреЗ рд╕реЗ рдирд┐рдореНрди рддреНрд░реБрдЯрд┐ рд╣реЛрддреА рд╣реИ:
error: mismatched types [--explain E0308]
--> <anon>:15:9
|>
15 |> self.collect::<Vec<_>>().into_iter()
|> ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ expected associated type, found struct `std::vec::IntoIter`
note: expected type `<T as ClonableIterator>::ClonableIter`
note: found type `std::vec::IntoIter<<T as std::iter::Iterator>::Item>`
рдЬрд╛рд╣рд┐рд░рд╛ рддреМрд░ рдкрд░ рдЖрдк рдПрдХ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд╕рдВрдмрджреНрдз рдкреНрд░рдХрд╛рд░ рдХреЗ рдареЛрд╕ рдкреНрд░рдХрд╛рд░ рдХреЛ рд╕рдВрджрд░реНрднрд┐рдд рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЬреЛ рдореБрдЭреЗ рдХрд╛рдлреА рд╕реАрдорд┐рдд рд▓рдЧрддрд╛ рд╣реИред
@tomaka рдпрд╣ рдХрд╛рдо рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП, RFC рдкрд╛рда рдореЗрдВ рдпрд╣ рд╣реИ:
impl<T> Example for T {
default type Output = Box<T>;
default fn generate(self) -> Box<T> { Box::new(self) }
}
impl Example for bool {
type Output = bool;
fn generate(self) -> bool { self }
}
(Https://github.com/rust-lang/rfcs/blob/master/text/1210-impl-specialization.md#the-default-keyword)
рдЬреЛ рдкреНрд░рд╛рд╕рдВрдЧрд┐рдХ рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП рдЖрдкрдХреЗ рдорд╛рдорд▓реЗ рдХреЗ рд╕рдорд╛рди рдкрд░реНрдпрд╛рдкреНрдд рд▓рдЧрддрд╛ рд╣реИред
@ рдЗрд╕ рдЙрджрд╛рд╣рд░рдг рдЙрджрд╛рд╣рд░рдг рд╡рд┐рд╢реЗрд╖рддрд╛ рдХреЗ рд▓рд┐рдП рд╕рд╣рдЬ рдкрд░рд┐рднрд╛рд╖рд╛ рдХреЗ рд╕рд╛рде рд╕рдВрдХрд▓рди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкреНрд░рддреАрдд рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИ: https://play.rust-lang.org/?gist=97ff3c2f7f3e3b50bd3aef000dbfa2ca4a&version=nightly&backtrace=0
рд╡рд┐рд╢реЗрд╖рдЬреНрдЮрддрд╛ рдХреЛрдб рдЗрд╕реЗ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдЕрд╕реНрд╡реАрдХрд╛рд░ рдХрд░ рджреЗрддрд╛ рд╣реИ - # 33481 рджреЗрдЦреЗрдВ, рдЬреЛ рдореИрдВрдиреЗ рд╢реБрд░реВ рдореЗрдВ рд╕реЛрдЪрд╛ рдерд╛ рдХрд┐ рдПрдХ рддреНрд░реБрдЯрд┐ рдереА рд▓реЗрдХрд┐рди рдПрдХ рдирд┐рджрд╛рди рдореБрджреНрджрд╛ рдирд┐рдХрд▓рд╛ред рдореЗрд░реЗ рдирд┐рджрд╛рдиреЛрдВ рдХреЛ рд╕реБрдзрд╛рд░рдиреЗ рдХреЗ рд▓рд┐рдП рдореЗрд░реЗ рдкреАрдЖрд░рдУрдВ рдкрд░ рдХрд┐рд╕реА рдХрд╛ рдзреНрдпрд╛рди рдирд╣реАрдВ рдЧрдпрд╛ рдФрд░ рдореИрдВрдиреЗ рдЙрдиреНрд╣реЗрдВ рдХреБрдЫ рд╕рдордп рдХреЗ рд▓рд┐рдП рдирд╡реАрдирддрдо рд╕реНрд╡рд╛рдореА рдХреЗ рдкрд╛рд╕ рдирд╣реАрдВ рд░рдЦрд╛ред
@ Rphmeier RFC рдкрд╛рда рдмрддрд╛рддрд╛ рд╣реИ рдХрд┐ рдЗрд╕реЗ рдЕрдиреБрдорддрд┐ рджреА рдЬрд╛рдиреА рдЪрд╛рд╣рд┐рдП, рд╣рд╛рд▓рд╛рдВрдХрд┐, рдЗрд╕рдХрд╛ рдЙрджрд╛рд╣рд░рдг рдЗрд╕рд╕реЗ рдХреЙрдкреА рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред
рдореЗрд░рд╛ рдХреБрдЫ рдХреЛрдб рдХреЗ рд╕рд╛рде рдПрдХ рдирд╛рдЯрдХ рдерд╛ рдЬреЛ рд╡рд┐рд╢реЗрд╖рдЬреНрдЮрддрд╛ рд╕реЗ рд▓рд╛рднрд╛рдиреНрд╡рд┐рдд рд╣реЛ рд╕рдХрддрд╛ рдерд╛ред рдореБрдЭреЗ рджреГрдврд╝рддрд╛ рд╕реЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╣рдореЗрдВ рдЬрд╛рд▓реА рд╢рд╛рд╕рди рдХреЗ рд▓рд┐рдП рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП, рдмрд▓реНрдХрд┐ рдпрд╣ рд╕реНрд╡рд╛рднрд╛рд╡рд┐рдХ рд▓рдЧрддрд╛ рд╣реИ рдФрд░ рдореБрдЭреЗ рдЬрд┐рд╕ рд▓рдЪреАрд▓реЗрдкрди рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдереА рдЙрд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХрд╛ рдПрдХрдорд╛рддреНрд░ рддрд░реАрдХрд╛ (afaict) рдерд╛ред
рдпрджрд┐ рд╣рдо default
impl
рд╕рд╛рде-рд╕рд╛рде рд╡реНрдпрдХреНрддрд┐рдЧрдд рд╡рд╕реНрддреБрдУрдВ рдкрд░ рднреА рдЧрдП, рддреЛ рдХреНрдпрд╛ рд╣рдо рдпрд╣ рд▓рд╛рдЧреВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдпрджрд┐ рдХреЛрдИ рд╡рд╕реНрддреБ рдУрд╡рд░рд░рд╛рдЗрдб рд╣реИ рддреЛ рд╡реЗ рд╕рднреА рд╣реЛрдиреА рдЪрд╛рд╣рд┐рдП? рдпрд╣ рд╣рдореЗрдВ рдЕрдиреНрдп рдорджреЛрдВ рдореЗрдВ рдПрдХ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдПрд╢реЛрдХ рдкреНрд░рдХрд╛рд░ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП) рдХреЗ рд╕рдЯреАрдХ рдкреНрд░рдХрд╛рд░ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рддрд░реНрдХ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдЧрд╛, рдЬреЛ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдореЗрдВ рдПрдХ рдЙрдкрдпреЛрдЧреА рдмрдврд╝рд╛рд╡рд╛ рдХреА рддрд░рд╣ рд▓рдЧрддрд╛ рд╣реИред
рдХреНрдпрд╛ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХреА рдЕрдиреБрдорддрд┐ рджреА рдЬрд╛рдиреА рдЪрд╛рд╣рд┐рдП? рдореИрдВ рдПрдХ рдкреНрд░рдХрд╛рд░ рдХрд╛ рд╡рд┐рд╢реЗрд╖рдЬреНрдЮ рдмрдирд╛рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ рддрд╛рдХрд┐ ArrayVec Copy
рдЬрдм рдЗрд╕рдХрд╛ рддрддреНрд╡ рдкреНрд░рдХрд╛рд░ рдкреНрд░рддрд┐рд▓рд┐рдкрд┐ рд╣реЛ, рдФрд░ рдпрд╣ рдХрд┐ рдЗрд╕рдореЗрдВ рдПрдХ рд╡рд┐рдзреНрд╡рдВрд╕рдХ рд╣реЛред рдореИрдВ рдПрдХ рдЖрдВрддрд░рд┐рдХ рдХреНрд╖реЗрддреНрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЗрд╕реЗ рдкреВрд░рд╛ рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ рдЬрд┐рд╕реЗ рд╡рд┐рд╢реЗрд╖рдЬреНрдЮрддрд╛ рджреНрд╡рд╛рд░рд╛ рдмрджрд▓ рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред
рдореБрдЭреЗ рдЖрд╢рд╛ рд╣реИ рдХрд┐ рдпрд╣ рд╕рдВрдХрд▓рд┐рдд рдХрд░реЗрдЧрд╛, рдЕрд░реНрдерд╛рдд рдпрд╣ ArrayVec<A>
рдлрд╝реАрд▓реНрдб рдлрд╝реАрд▓реНрдбреНрд╕ рд╕реЗ A: Copy + Array
рдмрд╛рдЙрдВрдб (рдЦреЗрд▓ рдХреЗ рдореИрджрд╛рди рдкрд░ рд╕рдВрдХрд▓рд┐рдд рд╕реНрдирд┐рдкреЗрдЯ) рджреНрд╡рд╛рд░рд╛ рдЪреБрдиреА рдЧрдИ рдХреА рдХреЙрдкреА рдХрд░рдиреЗ рдпреЛрдЧреНрдпрддрд╛ рдХреЛ рдШрдЯрд╛рддрд╛ рд╣реИред
impl<A: Copy + Array> Copy for ArrayVec<A>
//where <A as Repr>::Data: Copy
{ }
рдХрдореЗрдВрдЯ-рдЖрдЙрдЯ рдЬрд╣рд╛рдВ рдХреНрд▓реЙрдЬрд╝ рдирд╣реАрдВ рдЪрд╛рд╣рддрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдореЗрдВ рдПрдХ рдирд┐рдЬреА рдкреНрд░рдХрд╛рд░ Repr
рдХреЛ рдЙрдЬрд╛рдЧрд░ рдХрд░рддрд╛ рд╣реИред (рдпрд╣ рд╡реИрд╕реЗ рднреА ICEs рд╣реИ)ред
рд╕рдВрдкрд╛рджрд┐рдд рдХрд░реЗрдВ: рдореИрдВ рднреВрд▓ рдЧрдпрд╛ рдерд╛ рдХрд┐ рдореИрдВрдиреЗ рдкрд╣рд▓реЗ рд╣реА рдЗрд╕ рдмрд╛рд░реЗ рдореЗрдВ # 33162 рдЬрд╛рд░реА рдХрд┐рдпрд╛ рдерд╛, рдореБрдЭреЗ рдХреНрд╖рдорд╛ рдХрд░реЗрдВред
рдореЗрд░реА рдЯрд┐рдкреНрдкрдгреА, рдореЗрд░реЗ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдЙрдкрдпреЛрдЧ рдХреЗ рдорд╛рдорд▓реЗ рдХрд╛ рдкрд╛рд▓рди рдХрд░реЗрдВ:
// Ideal version
trait Scannable {}
impl<T: FromStr> Scannable for T {}
impl<T: FromStr> Scannable for Result<T, ()> {}
// But this doesn't follow from the specialisation rules because Result: !FromStr
// Lattice rule would allow filling in that gap or negative reasoning would allow specifying it.
// Second attempt
trait FromResult {
type Ok;
fn from(r: Result<Self::Ok, ()>) -> Self;
}
impl<T> Scannable for T {
default type Ok = T;
default fn from(r: Result<T, ()>) -> Self {...} // error can't assume Ok == T, could do this if we had `default impl`
}
impl<T> Scannable for Result<T, ()> {
type Ok = T;
default fn from(r: Result<T, ()>) -> Self { r }
}
fn scan_from_str<T: FromResult>(x: &str) -> T
where <T as FromResult>::Ok: FromStr // Doesn't hold for T: FromStr because of the default on T::Ok
{ ... }
// Can also add the FromStr bound to FromResult::Ok, but doesn't help
// Third attempt
trait FromResult<Ok> {
fn from(r: Result<Ok, ()>) -> Self;
}
impl<T> FromResult<T> for T {
default fn from(r: Result<Self, ()>) -> Self { ... }
}
impl<T> FromResult<T> for Result<T, ()> {
fn from(r: Result<T, ())>) -> Self { r }
}
fn scan_from_str<U: FromStr, T: FromResult<U>>(x: &str) -> T { ... }
// Error because we can't infer that U == String
let mut x: Result<String, ()> = scan_from_str("dsfsf");
@tomaka @Aatch
рд╡рд╣рд╛рдБ рд╕рдорд╕реНрдпрд╛ рдпрд╣ рд╣реИ рдХрд┐ рдЖрдкрдХреЛ рдЕрдиреНрдп рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд╡рд╕реНрддреБрдУрдВ рдХреЗ рдореВрд▓реНрдп рдкрд░ рднрд░реЛрд╕рд╛ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рдирд╣реАрдВ рд╣реИред рддреЛ рдЬрдм рдЖрдкрдХреЗ рдкрд╛рд╕ рдпрд╣ рдирд┐рд╣рд┐рдд рд╣реИ:
impl<T> ClonableIterator for T where T: Iterator {
default type ClonableIter = VecIntoIter<T::Item>;
default fn clonable(self) -> VecIntoIter<T::Item> {
// ^^^^^^^^^^^^^^^^^^^^
self.collect::<Vec<_>>().into_iter()
}
}
рдЬрд┐рд╕ рд╕реНрдерд╛рди рдкрд░ рдореИрдВрдиреЗ рдкреНрд░рдХрд╛рд╢ рдбрд╛рд▓рд╛, clonable
Self::ClonableIter
рдкрд░ рдирд┐рд░реНрднрд░ рд╣реИ, рд▓реЗрдХрд┐рди рдХреНрдпреЛрдВрдХрд┐ CloneableIter
рдХреЛ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдШреЛрд╖рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдЖрдк рдРрд╕рд╛ рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗред рдЪрд┐рдВрддрд╛ рдпрд╣ рд╣реИ рдХрд┐ рдХреЛрдИ рд╡реНрдпрдХреНрддрд┐ CloneableIter
рд▓реЗрдХрд┐рди _not_ clonable
рдУрд╡рд░рд░рд╛рдЗрдб рдХрд░ рд╕рдХрддрд╛ рд╣реИред
рд╣рдордиреЗ рдпрд╣рд╛рдВ рдХреБрдЫ рд╕рдВрднрд╛рд╡рд┐рдд рдЙрддреНрддрд░реЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХреА рдереАред рдЙрдирдореЗрдВ рд╕реЗ рдПрдХ рдерд╛ рдХрд┐ рдЖрдк default
рдХрд╛ рдЙрдкрдпреЛрдЧ рдЙрди рд╡рд╕реНрддреБрдУрдВ рдХреЛ рдПрдХ рд╕рд╛рде рд╕рдореВрд╣ рдореЗрдВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд░рддреЗ рд╣реИрдВ, рдЬрд╣рд╛рдБ рдпрджрд┐ рдЖрдк рдПрдХ рдХреЛ рдУрд╡рд░рд░рд╛рдЗрдб рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдЖрдкрдХреЛ рдЗрд╕реЗ рдкреВрд░рд╛ рдХрд░рдирд╛ рд╣реЛрдЧрд╛:
impl<T> ClonableIterator for T where T: Iterator {
default {
type ClonableIter = VecIntoIter<T::Item>;
fn clonable(self) -> VecIntoIter<T::Item> { ... }
}
}
рдпрд╣ рдареАрдХ рд╣реИ, рд▓реЗрдХрд┐рди рдереЛрдбрд╝рд╛ "рд░рд╛рдЗрдЯ-рдбреНрд░рд┐рдлреНрдЯ рдЗрдВрдбреАрд╢рд┐рдВрдЧ"ред default
рднреА рдПрдХ рдирд╛рдордХрд░рдг рдХреНрд╖реЗрддреНрд░ рдХреА рддрд░рд╣ рджрд┐рдЦрддрд╛ рд╣реИ, рдЬреЛ рдпрд╣ рдирд╣реАрдВ рд╣реИред рдХреБрдЫ рд╕рд░рд▓ рд╕рдВрд╕реНрдХрд░рдг рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ рдЬреЛ рдЖрдкрдХреЛ рдХреЗрд╡рд▓ "рдУрд╡рд░рд░рд╛рдЗрдб-рдХреЛрдИ" (рдЖрдЬ рдХреЗ рдЕрдиреБрд╕рд╛рд░) рдмрдирд╛рдо "рдУрд╡рд░рд░рд╛рдЗрдб-рдСрд▓" (рдЖрдкрдХреЛ рдХреНрдпрд╛ рдЪрд╛рд╣рд┐рдП) рдХреЗ рдмреАрдЪ рдЯреЙрдЧрд▓ рдХрд░рдиреЗ рджреЗрддрд╛ рд╣реИред
рд╣рдордиреЗ рдпрд╣ рднреА рдЖрд╢рд╛ рдХреА рдереА рдХрд┐ рд╣рдо impl Trait
рд▓рд╛рдн рдЙрдард╛ рд╕рдХрддреЗ рд╣реИрдВред рд╡рд┐рдЪрд╛рд░ рдпрд╣ рд╣реЛрдЧрд╛ рдХрд┐ рдпрд╣ рд╕рдмрд╕реЗ рдЕрдзрд┐рдХ рдмрд╛рд░ рдЖрддрд╛ рд╣реИ, рдЬреИрд╕рд╛ рдХрд┐ рдпрд╣рд╛рдВ рд╣реИ, рдЬрдм рдЖрдк рд╡рд╛рдкрд╕реА рдкреНрд░рдХрд╛рд░ рдХреЛ рдЕрдиреБрдХреВрд▓рд┐рдд рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВред рддреЛ рд╢рд╛рдпрдж рдЕрдЧрд░ рдЖрдк impl Trait
рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╡рд┐рд╢реЗрд╖рддрд╛ рдХреЛ рдлрд┐рд░ рд╕реЗ рд▓рд┐рдЦ рд╕рдХреЗрдВ:
pub trait ClonableIterator: Iterator {
fn clonable(self) -> impl Iterator;
}
рдпрд╣ рдкреНрд░рднрд╛рд╡реА рд░реВрдк рд╕реЗ рдПрдХ рдкреНрд░рдХрд╛рд░ рдХрд╛ рд╢реЙрд░реНрдЯрд╣реИрдВрдб рд╣реЛрдЧрд╛ рдЬрдм рдЯрд╛рдЗрдк рдФрд░ fn рд╡рд╛рд▓реЗ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд╕рдореВрд╣ рдХреЗ рд▓рд┐рдП рдХрд╛рд░реНрдпрд╛рдиреНрд╡рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред (рдореБрдЭреЗ рдпрдХреАрди рдирд╣реАрдВ рд╣реИ рдХрд┐ рдЕрдЧрд░ рд╡рд┐рд╢реБрджреНрдз рд░реВрдк рд╕реЗ рдЗрд╕ рдЖрд░реЛрдк рдореЗрдВ рдРрд╕рд╛ рдХрд░рдиреЗ рдХрд╛ рдХреЛрдИ рддрд░реАрдХрд╛ рд╣реЛрдЧрд╛ред)
рдкреБрдирд╢реНрдЪ, рдЖрдкрдХреЗ рд╕рдВрджреЗрд╢реЛрдВ рдХрд╛ рдЬрд╡рд╛рдм рджреЗрдиреЗ рдореЗрдВ рд▓рдВрдмреЗ рд╕рдордп рддрдХ рджреЗрд░реА рдХреЗ рд▓рд┐рдП рдЦреЗрдж рд╣реИ, рдЬреЛ рдореБрдЭреЗ _July_ рд╕реЗ рджрд┐рдирд╛рдВрдХ рджрд┐рдЦрд╛рдИ рджреЗрддрд╛ рд╣реИред
рдЬрдмрдХрд┐ рдЯреНрд░рд╛рдИрдЯ рдЯреНрд░реЗрдЯ рдХреА рдорджрдж рдХрд░рддрд╛ рд╣реИ, рдХреЛрдИ рдЖрд░рдПрдлрд╕реА рдирд╣реАрдВ рд╣реИ рдЬрд┐рд╕реЗ рд╕реНрд╡реАрдХрд╛рд░ рдпрд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ рдЬреЛ рдЗрд╕реЗ рдХрд┐рд╕реА рднреА рд░реВрдк рдореЗрдВ рд╡рд┐рд╢реЗрд╖рддрд╛ рдирд┐рдХрд╛рдпреЛрдВ рдХреЗ рд╕рд╛рде рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЗрд╕ рдЖрд░рдПрдлрд╕реА рдХреЗ рд▓рд┐рдП рдЗрд╕реЗ рджреЗрдЦрдирд╛ рдереЛрдбрд╝рд╛ рдЕрдЬреАрдм рд▓рдЧрддрд╛ рд╣реИред
рдореИрдВ default impl
рдлрд╝реАрдЪрд░ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдореЗрдВ рд░реБрдЪрд┐ рд░рдЦрддрд╛ рд╣реВрдВ (рдЬрд╣рд╛рдВ рд╕рднреА рдЖрдЗрдЯрдо default
)ред
рдХреНрдпрд╛ рдЖрдк рдЙрд╕ рдкрд░ рдпреЛрдЧрджрд╛рди рд╕реНрд╡реАрдХрд╛рд░ рдХрд░реЗрдВрдЧреЗ?
@ рд╡рдлрд╛рджрд╛рд░реА рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ! рдореИрдВ рдХрд╛рдо рдХреЗ рд░реВрдк рдореЗрдВ рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдорджрдж рдХрд░рдиреЗ рдореЗрдВ рдЦреБрд╢реА рд╣реЛрдЧреАред
рдХреНрдпрд╛ рд╡рд░реНрддрдорд╛рди рдореЗрдВ рдЗрд╕ рдкрд░ рдХреЛрдИ рдирд┐рд╖реНрдХрд░реНрд╖ рд╣реИ рдХрд┐ рдХреНрдпрд╛ рд╕рдВрдмрдВрдзрд┐рдд рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЛ рд╡рд┐рд╢реЗрд╖ рдпреЛрдЧреНрдп рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП?
рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдореЗрд░реЗ рдЙрдкрдпреЛрдЧ-рдорд╛рдорд▓реЗ рдХрд╛ рдПрдХ рд╕рд░рд▓реАрдХрд░рдг рд╣реИ, рдЬреЛ рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рдкреНрд░рдХрд╛рд░реЛрдВ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХреЛ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рддрд╛ рд╣реИред
рдореЗрд░реЗ рдкрд╛рд╕ рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рдбреЗрдЯрд╛ рд╕рдВрд░рдЪрдирд╛ рд╣реИ, Foo
рдХрд╣рдирд╛ рд╣реИ, рдЬреЛ рдХрдВрдЯреЗрдирд░ рд╡рд┐рд╢реЗрд╖рддрд╛ рд╡рд╕реНрддреБрдУрдВ ( &trait::Property
) рдХреЗ рд╕рдВрдЧреНрд░рд╣ рдХрд╛ рд╕рдордиреНрд╡рдп рдХрд░рддрд╛ рд╣реИред рд╡рд┐рд╢реЗрд╖рддрд╛ trait::Property
рджреЛрдиреЛрдВ Property<T>
( Vec<T>
рджреНрд╡рд╛рд░рд╛ рд╕рдорд░реНрдерд┐рдд) рдФрд░ PropertyBits
( BitVec
, рдПрдХ рдмрд┐рдЯ рд╡реЗрдХреНрдЯрд░ рджреНрд╡рд╛рд░рд╛ рд╕рдорд░реНрдерд┐рдд) рджреНрд╡рд╛рд░рд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рд┐рдд рдХреА рдЬрд╛рддреА рд╣реИред
Foo
рдкрд░ рд╕рд╛рдорд╛рдиреНрдп рддрд░реАрдХреЛрдВ рдореЗрдВ, рдореИрдВ рд╕рдВрдмрджреНрдз рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ T
рд▓рд┐рдП рд╕рд╣реА рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рдбреЗрдЯрд╛ рд╕рдВрд░рдЪрдирд╛ рдХрд╛ рдирд┐рд░реНрдзрд╛рд░рдг рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ, рд▓реЗрдХрд┐рди рдЗрд╕рдХреЗ рд▓рд┐рдП рдЧреИрд░-рд╡рд┐рд╢реЗрд╖ рдорд╛рдорд▓реЛрдВ рдХреЗ рд▓рд┐рдП рдПрдХ рдХрдВрдмрд▓ рдирд┐рд╣рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╡рд┐рд╢реЗрд╖рдЬреНрдЮрддрд╛ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рд╣реИред
trait ContainerFor {
type P: trait::Property;
}
impl<T> ContainerFor for T {
default type P = Property<T>; // default to the `Vec`-based version
}
impl ContainerFor for bool {
type P = PropertyBits; // specialize to optimize for space
}
impl Foo {
fn add<T>(&mut self, name: &str) {
self.add_trait_obj(name, Box::new(<T as ContainerFor>::P::new())));
}
fn get<T>(&mut self, name: &str) -> Option<&<T as ContainerFor>::P> {
self.get_trait_obj(name).and_then(|prop| prop.downcast::<_>());
}
}
рдереИрдВрдХреНрд╕ @ рдиреНрдпреВрдЯреНрд░реЙрди !
рдореВрд▓ рд░реВрдк рд╕реЗ рдореИрдВ ast::ItemKind::Impl
рд╕рдВрд░рдЪрдирд╛ рдореЗрдВ рдПрдХ рдирдИ "рдбрд┐рдлрд╝реЙрд▓реНрдЯрддрд╛" рд╡рд┐рд╢реЗрд╖рддрд╛ рдЬреЛрдбрд╝рдХрд░ рдХрд╛рдо рдХрд░ рд░рд╣рд╛ рд╣реВрдВ (рдФрд░ рдлрд┐рд░ рдирд┐рд╣рд┐рдд рдЖрдЗрдЯрдо "рдбрд┐рдлрд╝реЙрд▓реНрдЯрддрд╛" рд╡рд┐рд╢реЗрд╖рддрд╛ рдХреЗ рд╕рд╛рде рдПрдХ рд╕рд╛рде рдирдП рд╡рд┐рд╢реЗрд╖рддрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реВрдВ) рд▓реЗрдХрд┐рди рдПрдХ рддреНрд╡рд░рд┐рдд рдФрд░ рдЖрд╕рд╛рди рднреА рд╣реИ
рд╕рдВрднрд╛рд╡рдирд╛ рд╣реИ рдХрд┐ рдкрд╛рд░реНрд╕рд┐рдВрдЧ рдХреЗ рджреМрд░рд╛рди default impl
рдХреЗ рд╕рднреА рдирд┐рд╣рд┐рдд рдорджреЛрдВ рдХреЗ рд▓рд┐рдП рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд╕реЗрдЯ рдХрд░рдиреЗ рдкрд░ред
рдореЗрд░реЗ рд▓рд┐рдП рдпрд╣ рдПрдХ "рдкреВрд░реНрдг" рд╕рдорд╛рдзрд╛рди рдирд╣реАрдВ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рд╣рдордиреЗ рдпрд╣ рдЬрд╛рдирдХрд╛рд░реА рдЦреЛ рджреА рд╣реИ рдХрд┐ "рдбрд┐рдлрд╝реЙрд▓реНрдЯрддрд╛" рдХрд╛ рддрд╛рддреНрдкрд░реНрдп рдлрд┐рдЧрд░ рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рд╣реИ, рди рдХрд┐ рдЗрдореНрдкреНрд▓рд┐рдореЗрдВрдЯ рдХреЗ рдкреНрд░рддреНрдпреЗрдХ рдЖрдЗрдЯрдо рд╕реЗ,
рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛ рдЕрдЧрд░ рдХреЛрдИ partial impl
рдкреЗрд╢ рдХрд░рдиреЗ рдХреА рдпреЛрдЬрдирд╛ рд╣реИ, рддреЛ рдкрд╣рд▓рд╛ рд╕рдорд╛рдзрд╛рди рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдПрдХ рд╡рд┐рд╢реЗрд╖рддрд╛ рдкреНрд░рджрд╛рди рдХрд░реЗрдЧрд╛ рдЬрд┐рд╕рдХрд╛ рдЙрдкрдпреЛрдЧ default
рдФрд░ рд╕рд╛рде рд╣реА partial
рдХреЛ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рд▓реЗрдХрд┐рди рд╕рд┐рд░реНрдл рдпрдХреАрди рдФрд░
рд╕рдордп рдмрд░реНрдмрд╛рдж рдирд╣реАрдВ рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рдЖрдк рдХреНрдпрд╛ рд╕реЛрдЪрддреЗ рд╣реИрдВ?
@giannicic @aturon рдХреНрдпрд╛ рд╣рдо рдкреНрд░рд╕реНрддрд╛рд╡ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рд╣рдо default impl
рдкрд░ рдЪрд░реНрдЪрд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдореБрджреНрджрд╛ рдмрдирд╛рдПрдБ?
рдХреЛрдИ рдмрд╛рдд рдирд╣реАрдВ, рдореИрдВрдиреЗ рдПрдХ рдмрдирд╛рдпрд╛: https://github.com/rust-lang/rust/issues/37653
рдХреНрдпрд╛ рдЬрд╛рд▓реА рдирд┐рдпрдо рдореБрдЭреЗ рджреЗ рд╕рдХрддрд╛ рд╣реИ:
trait Foo {}
trait A {}
trait B {}
trait C {}
// ...
рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рд╕рдмрд╕реЗрдЯ рдХреЗ рд▓рд┐рдП Foo
рдХрд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдЬреЛрдбрд╝реЗрдВ рдЬреЛ A
, B
, C
, ... рдХреЗ рдХреБрдЫ рд╕рдВрдпреЛрдЬрди рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддреЗ рд╣реИрдВ:
impl Foo for T where T: A { ... }
impl Foo for T where T: B { ... }
impl Foo for T where T: A + B { ... }
impl Foo for T where T: B + C { ... }
// ...
рдФрд░ рдореБрдЭреЗ рдХреБрдЫ рд╕рдВрдпреЛрдЬрдиреЛрдВ рдХреЛ "рдирд┐рд╖рд┐рджреНрдз" рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдВ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, A + C
рдХрднреА рдирд╣реАрдВ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП:
impl Foo for T where T: A + C = delete;
?
рдкреНрд░рд╕рдВрдЧ: рдореИрдВ рд╡рд┐рднрд┐рдиреНрди рдкреНрд░рдХрд╛рд░ рдХреА рдЖрдХреГрддрд┐рдпреЛрдВ (рдЕрдВрдХ, рдХреНрдпреВрдмреНрд╕, рдмрд╣реБрднреБрдЬ, ...) рдХреЗ рд▓рд┐рдП ApproxEqual(Shape, Shape)
рд╡рд┐рд╢реЗрд╖рддрд╛ рд▓рд╛рдЧреВ рдХрд░рддреЗ рд╣реБрдП рдпрд╣ рдЪрд╛рд╣рдиреЗ рд▓рдЧрд╛ рд╣реВрдВ рдХрд┐ рдпреЗ рд╕рднреА рд▓рдХреНрд╖рдг рдХрд╣рд╛рдВ рд╣реИрдВред рдореБрдЭреЗ рдЗрд╕реЗ рдЕрд▓рдЧ-рдЕрд▓рдЧ рд▓рдХреНрд╖рдгреЛрдВ рдореЗрдВ рдмрджрд▓рдХрд░ рдЗрд╕рдХреЗ рдЖрд╕рдкрд╛рд╕ рдХрд╛рдо рдХрд░рдирд╛ рдкрдбрд╝рд╛, рдЬреИрд╕реЗ, рдкрд░рд╕реНрдкрд░ рд╡рд┐рд░реЛрдзреА рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╕реЗ рдмрдЪрдиреЗ рдХреЗ рд▓рд┐рдП ApproxEqualPoint(Point, Point)
ред
@gnzlbg
рдФрд░ рдореБрдЭреЗ рдХреБрдЫ рд╕рдВрдпреЛрдЬрдиреЛрдВ рдХреЛ "рдирд┐рд╖рд┐рджреНрдз" рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдВ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдП + рд╕реА рдХрднреА рдирд╣реАрдВ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП:
рдирд╣реАрдВ, рдпрд╣ рдХреБрдЫ рдРрд╕рд╛ рдирд╣реАрдВ рд╣реИ рдЬреЛ рдЬрд╛рд▓реА рдирд┐рдпрдо рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдЧрд╛ред рдпрд╣ рдХреБрдЫ рдЖрдХрд╛рд░ рдпрд╛ рдкреНрд░рдХрд╛рд░ рдореЗрдВ "рдирдХрд╛рд░рд╛рддреНрдордХ рддрд░реНрдХ" рдХрд╛ рдЕрдзрд┐рдХ рдбреЛрдореЗрди рд╣реЛрдЧрд╛ред
рдкреНрд░рд╕рдВрдЧ: рдореИрдВ рд╡рд┐рднрд┐рдиреНрди рдкреНрд░рдХрд╛рд░ рдХреЗ рдЖрдХреГрддрд┐рдпреЛрдВ (рдЕрдВрдХ, рдХреНрдпреВрдмреНрд╕, рдмрд╣реБрднреБрдЬ, ...) рдХреЗ рд▓рд┐рдП рдПрдХ ApproxEqual (рдЖрдХреГрддрд┐, рдЖрдХреГрддрд┐) рд╡рд┐рд╢реЗрд╖рддрд╛ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддреЗ рд╕рдордп рдпрд╣ рдЪрд╛рд╣рдиреЗ рдореЗрдВ рдЙрддрд░ рдЧрдпрд╛ рдХрд┐ рдпреЗ рд╕рднреА рд▓рдХреНрд╖рдг рдХрд╣рд╛рдВ рд╣реИрдВред рдкрд░рд╕реНрдкрд░ рд╡рд┐рд░реЛрдзреА рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╕реЗ рдмрдЪрдиреЗ рдХреЗ рд▓рд┐рдП, рдореБрдЭреЗ рдЗрд╕реЗ рдЕрд▓рдЧ-рдЕрд▓рдЧ рд▓рдХреНрд╖рдгреЛрдВ, рдЬреИрд╕реЗ, ApproxEqualPoint (рдкреНрд╡рд╛рдЗрдВрдЯ, рдкреЙрдЗрдВрдЯ) рдореЗрдВ рдмрджрд▓рдХрд░ рдЗрд╕рдХреЗ рдЖрд╕рдкрд╛рд╕ рдХрд╛рдо рдХрд░рдирд╛ рдерд╛ред
рддреЛ @withoutboats "рдмрд╣рд┐рд╖реНрдХрд░рдг рд╕рдореВрд╣реЛрдВ" рдХреЗ рд╡рд┐рдЪрд╛рд░ рдХреЛ рдмрдврд╝рд╛рд╡рд╛ рджреЗ рд░рд╣рд╛ рд╣реИ, рдЬрд╣рд╛рдБ рдЖрдк рдпрд╣ рдШреЛрд╖рдгрд╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рд▓рдХреНрд╖рдгреЛрдВ рдХрд╛ рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рд╕рдореВрд╣ рдкрд╛рд░рд╕реНрдкрд░рд┐рдХ рд░реВрдк рд╕реЗ рдЕрдирдиреНрдп рд╣реИ (рдпрд╛рдиреА, рдЖрдк рдЙрдирдореЗрдВ рд╕реЗ рдЕрдзрд┐рдХрд╛рдВрд╢ рдкрд░ рд▓рд╛рдЧреВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ)ред рдореИрдВ рдЗрд╕реЗ рдПрдХ рдПрдирдо рдХреА рддрд░рд╣ рд╣реЛрдиреЗ рдХреЗ рд░реВрдк рдореЗрдВ рдХрд▓реНрдкрдирд╛ рдХрд░рддрд╛ рд╣реВрдВ (рдпрд╛рдиреА, рд▓рдХреНрд╖рдг рд╕рднреА рдПрдХ рд╕рд╛рде рдШреЛрд╖рд┐рдд рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВ)ред рдореБрдЭреЗ рдЗрд╕рдХрд╛ рд╡рд┐рдЪрд╛рд░ рдкрд╕рдВрдж рд╣реИ, рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ (рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ!) рдпрд╣ рдирдХрд╛рд░рд╛рддреНрдордХ рддрд░реНрдХ рдХреЗ рдХреБрдЫ рдЕрдзрд┐рдХ рдЦрддрд░рдирд╛рдХ рдкрд╣рд▓реБрдУрдВ рд╕реЗ рдмрдЪрдиреЗ рдореЗрдВ рдорджрдж рдХрд░рддрд╛ рд╣реИред рд▓реЗрдХрд┐рди рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЗрд╕ рдореЛрд░реНрдЪреЗ рдкрд░ рдЕрдзрд┐рдХ рд╡рд┐рдЪрд╛рд░ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ - рдФрд░ рдпрд╣ рднреА рдПрдХ рдЕрдЪреНрдЫрд╛ рд░рд╛рдЗрдЯрдЕрдк рд╣реИ рдЬреЛ рдирдХрд╛рд░рд╛рддреНрдордХ рддрд░реНрдХ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕реЛрдЪрдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рддреИрд░рдиреЗ рд╡рд╛рд▓реЗ рд╕рднреА "рдбреЗрдЯрд╛" рдХреЛ рд╕рдВрдХреНрд╖реЗрдк рдореЗрдВ рдкреНрд░рд╕реНрддреБрдд рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рддрд╛ рд╣реИред рд╢рд╛рдпрдж рдЕрдм рд╣реИ рдХрд┐ рдореИрдВ (рдЬреНрдпрд╛рджрд╛рддрд░) рдореЗрд░реЗ рдПрдЪрдЯреАрдЯреА рдФрд░ рд╡рд┐рд╢реЗрд╖рдЬреНрдЮрддрд╛ рд╢реНрд░реГрдВрдЦрд▓рд╛ рдХреЛ рд▓рдкреЗрдЯрддрд╛ рд╣реВрдВ рдореИрдВ рдЙрд╕ рдмрд╛рд░реЗ рдореЗрдВ рд╕реЛрдЪ рд╕рдХрддрд╛ рд╣реВрдВ ...
@nikomatsakis :
рддреЛ @withoutboats "рдмрд╣рд┐рд╖реНрдХрд░рдг рд╕рдореВрд╣реЛрдВ" рдХреЗ рд╡рд┐рдЪрд╛рд░ рдХреЛ рдмрдврд╝рд╛рд╡рд╛ рджреЗ рд░рд╣рд╛ рд╣реИ, рдЬрд╣рд╛рдБ рдЖрдк рдпрд╣ рдШреЛрд╖рдгрд╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рд▓рдХреНрд╖рдгреЛрдВ рдХрд╛ рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рд╕рдореВрд╣ рдкрд╛рд░рд╕реНрдкрд░рд┐рдХ рд░реВрдк рд╕реЗ рдЕрдирдиреНрдп рд╣реИ (рдпрд╛рдиреА, рдЖрдк рдЙрдирдореЗрдВ рд╕реЗ рдЕрдзрд┐рдХрд╛рдВрд╢ рдкрд░ рд▓рд╛рдЧреВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ)ред рдореИрдВ рдЗрд╕реЗ рдПрдХ рдПрдирдо рдХреА рддрд░рд╣ рд╣реЛрдиреЗ рдХреЗ рд░реВрдк рдореЗрдВ рдХрд▓реНрдкрдирд╛ рдХрд░рддрд╛ рд╣реВрдВ (рдпрд╛рдиреА, рд▓рдХреНрд╖рдг рд╕рднреА рдПрдХ рд╕рд╛рде рдШреЛрд╖рд┐рдд рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВ)ред рдореБрдЭреЗ рдЗрд╕рдХрд╛ рд╡рд┐рдЪрд╛рд░ рдкрд╕рдВрдж рд╣реИ, рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ (рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ!) рдпрд╣ рдирдХрд╛рд░рд╛рддреНрдордХ рддрд░реНрдХ рдХреЗ рдХреБрдЫ рдЕрдзрд┐рдХ рдЦрддрд░рдирд╛рдХ рдкрд╣рд▓реБрдУрдВ рд╕реЗ рдмрдЪрдиреЗ рдореЗрдВ рдорджрдж рдХрд░рддрд╛ рд╣реИред рд▓реЗрдХрд┐рди рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЗрд╕ рдореЛрд░реНрдЪреЗ рдкрд░ рдЕрдзрд┐рдХ рд╡рд┐рдЪрд╛рд░ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ - рдФрд░ рдпрд╣ рднреА рдПрдХ рдЕрдЪреНрдЫрд╛ рд░рд╛рдЗрдЯрдЕрдк рд╣реИ рдЬреЛ рдирдХрд╛рд░рд╛рддреНрдордХ рддрд░реНрдХ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕реЛрдЪрдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рддреИрд░рдиреЗ рд╡рд╛рд▓реЗ рд╕рднреА "рдбреЗрдЯрд╛" рдХреЛ рд╕рдВрдХреНрд╖реЗрдк рдореЗрдВ рдкреНрд░рд╕реНрддреБрдд рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рддрд╛ рд╣реИред рд╢рд╛рдпрдж рдЕрдм рд╣реИ рдХрд┐ рдореИрдВ (рдЬреНрдпрд╛рджрд╛рддрд░) рдореЗрд░реЗ рдПрдЪрдЯреАрдЯреА рдФрд░ рд╡рд┐рд╢реЗрд╖рдЬреНрдЮрддрд╛ рд╢реНрд░реГрдВрдЦрд▓рд╛ рдХреЛ рд▓рдкреЗрдЯрддрд╛ рд╣реВрдВ рдореИрдВ рдЙрд╕ рдмрд╛рд░реЗ рдореЗрдВ рд╕реЛрдЪ рд╕рдХрддрд╛ рд╣реВрдВ ...
рдореИрдВрдиреЗ рдЗрд╕реЗ рд▓рд┐рдЦрддреЗ рд╕рдордп рдмрд╣рд┐рд╖реНрдХрд░рдг рд╕рдореВрд╣реЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕реЛрдЪрд╛ (рдЖрдкрдиреЗ рджреВрд╕рд░реЗ рджрд┐рди рдордВрдЪреЛрдВ рдореЗрдВ рдЗрд╕рдХрд╛ рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛), рд▓реЗрдХрд┐рди рдореБрдЭреЗ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ рд╡реЗ рдЗрд╕ рд╡рд┐рд╢реЗрд╖ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ рдХрд╛рдо рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдХреНрдпреЛрдВрдХрд┐ рд╕рднреА рд▓рдХреНрд╖рдг рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдЕрдирдиреНрдп рдирд╣реАрдВ рд╣реИрдВред рд╕рдмрд╕реЗ рддреБрдЪреНрдЫ рдЙрджрд╛рд╣рд░рдг Point
рдФрд░ Float
рд▓рдХреНрд╖рдг рд╣реИ: Float
_can_ рдПрдХ 1D рдмрд┐рдВрджреБ рд╣реИ, рдЗрд╕рд▓рд┐рдП ApproxEqualPoint(Point, Point)
рдФрд░ ApproxEqualFloat(Float, Float)
рдирд╣реАрдВ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдЕрдирдиреНрдпред рдЕрдиреНрдп рдЙрджрд╛рд╣рд░рдг рд╣реИрдВ рдЬреИрд╕реЗ Square
рдФрд░ Polygon
, рдпрд╛ Box
| Cube
рдФрд░ AABB
(рдЕрдХреНрд╖-рд╕рдВрд░реЗрдЦрд┐рдд рдмрд╛рдЙрдВрдбрд┐рдВрдЧ рдмреЙрдХреНрд╕) рдЬрд╣рд╛рдВ "рд╡рд┐рд╢реЗрд╖рддрд╛ рдкрджрд╛рдиреБрдХреНрд░рдо" рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЕрдзрд┐рдХ рдЬрдЯрд┐рд▓ рдмрд╛рдзрд╛рдУрдВ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред
рдирд╣реАрдВ, рдпрд╣ рдХреБрдЫ рдРрд╕рд╛ рдирд╣реАрдВ рд╣реИ рдЬреЛ рдЬрд╛рд▓реА рдирд┐рдпрдо рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдЧрд╛ред рдпрд╣ рдХреБрдЫ рдЖрдХрд╛рд░ рдпрд╛ рдкреНрд░рдХрд╛рд░ рдореЗрдВ "рдирдХрд╛рд░рд╛рддреНрдордХ рддрд░реНрдХ" рдХрд╛ рдЕрдзрд┐рдХ рдбреЛрдореЗрди рд╣реЛрдЧрд╛ред
рдореИрдВ рдХрдо рд╕реЗ рдХрдо рдХрд┐рд╕реА рд╡рд┐рд╢реЗрд╖ рдорд╛рдорд▓реЗ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдКрдВрдЧрд╛ рдФрд░ рдЙрд╕рдореЗрдВ unimplemented!()
рдбрд╛рд▓реВрдВрдЧрд╛ред рдпрд╣ рдкрд░реНрдпрд╛рдкреНрдд рд╣реЛрдЧрд╛, рд▓реЗрдХрд┐рди рдЬрд╛рд╣рд┐рд░ рд╣реИ рдХрд┐ рдореИрдВ рдЗрд╕реЗ рдФрд░ рдЕрдзрд┐рдХ рдкрд╕рдВрдж рдХрд░реВрдВрдЧрд╛ рдпрджрд┐ рд╕рдВрдХрд▓рдХ рдЙрди рдорд╛рдорд▓реЛрдВ рдХреЛ рд╕рд╛рдВрдЦреНрдпрд┐рдХреАрдп рд░реВрдк рд╕реЗ рдкрдХрдбрд╝ рд▓реЗрдЧрд╛, рдЬрд┐рд╕рдореЗрдВ рдореИрдВ unimplemented!()
рд╕рд╛рде рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдХреЙрд▓ рдХрд░рддрд╛ рд╣реВрдВ (рдФрд░ рдЗрд╕ рдмрд┐рдВрджреБ рдкрд░, рд╣рдо рдлрд┐рд░ рд╕реЗ рдирдХрд╛рд░рд╛рддреНрдордХ рддрд░реНрдХ рднреВрдорд┐ рдореЗрдВ рд╣реИрдВ) ред
@gnzlbg рдЬрд╛рд▓реА рд╡рд┐рд╢реЗрд╖рдЬреНрдЮрддрд╛ рдЖрдкрдХреЛ рдЙрд╕ рдирд┐рд╣рд┐рдд рдЖрддрдВрдХ рдХреЛ рдмрдирд╛рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдЧреА, рд▓реЗрдХрд┐рди рдРрд╕рд╛ рдХрд░рдиреЗ рдХрд╛ рд╡рд┐рдЪрд╛рд░ рдореБрдЭреЗ рдмрдирд╛рддрд╛ рд╣реИ: рд░реЛрдирд╛:ред
"рдЕрдкрд╡рд░реНрдЬрди рд╕рдореВрд╣реЛрдВ" рдХрд╛ рд╡рд┐рдЪрд╛рд░ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд╕рд┐рд░реНрдл рдирдХрд╛рд░рд╛рддреНрдордХ рд╕реБрдкрд░рд╕рдЯреНрд░реЗрдЯ рд╕реАрдорд╛ рд╣реИред рдПрдХ рдЪреАрдЬ рдЬрд┐рд╕реЗ рд╣рдордиреЗ рдмрд╣реБрдд рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдирд╣реАрдВ рд╕рдордЭрд╛ рд╣реИ, рд╡рд╣ рд╣реИ рд░рд┐рд╡рд░реНрд╕ рдкреЛрд▓рд░рд┐рдЯреА рд╕реНрдкреЗрд╢рд▓рд╛рдЗрдЬреЗрд╢рди рдХреА рдзрд╛рд░рдгрд╛ - рдЖрдкрдХреЛ рдПрдХ рд╡рд┐рд╢реЗрд╖ рдЗрдореНрдкреНрд▓рд╛рдВрдЯ рд▓рд┐рдЦрдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ рдЬреЛ рдХрд┐ рд░рд┐рд╡рд░реНрд╕ рдХрдо рдкреЛрд▓рд░рд┐рдЯреА рдХрд╛ рд╣реЛрддрд╛ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ рдЖрдк рдмрд╕ рд▓рд┐рдЦреЗрдВрдЧреЗ:
impl<T> !Foo for T where T: A + C { }
рдореБрдЭреЗ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдпрдХреАрди рдирд╣реАрдВ рд╣реИ рдХрд┐ рдЕрдиреБрдорддрд┐ рджреЗрдиреЗ рдХреЗ рдирд┐рд╣рд┐рддрд╛рд░реНрде рдХреНрдпрд╛ рд╣реИрдВред рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдЙрди рдореБрджреНрджреЛрдВ рд╕реЗ рдЬреБрдбрд╝рддрд╛ рд╣реИ рдЬреЛ рдирд┐рдХреЛ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЗрд╕ рдмрд╛рдд рдкрд░ рдкреНрд░рдХрд╛рд╢ рдбрд╛рд▓рддреЗ рд╣реИрдВ рдХрд┐ рд╡рд┐рд╢реЗрд╖рдЬреНрдЮрддрд╛ рдХрд┐рд╕ рддрд░рд╣ рд╕реЗ рдкреЙрд▓реАрдореЛрд░реНрдлрд┐рдЬрд╝реНрдо рдХреЗ рд╕рд╛рде рдХреЛрдб рдкреБрди: рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╣реИред
рдирдХрд╛рд░рд╛рддреНрдордХ рддрд░реНрдХ рдФрд░ рдирдХрд╛рд░рд╛рддреНрдордХ рдкреНрд░рднрд╛рд╡ рдХреА рдЗрд╕ рд╕рднреА рдЪрд░реНрдЪрд╛ рдХреЗ рд╕рд╛рде, рдореИрдВ рдлрд┐рд░ рд╕реЗ "рдЙрджрд╛рд╣рд░рдг рд╢реНрд░реГрдВрдЦрд▓рд╛" рдХреЗ рдкреБрд░рд╛рдиреЗ рд╣рд╛рд╕реНрдХреЗрд▓ рд╡рд┐рдЪрд╛рд░ рдХреЛ рд▓рд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдордЬрдмреВрд░ рдорд╣рд╕реВрд╕ рдХрд░рддрд╛ рд╣реВрдВ ( рдХрд╛рдЧрдЬ , рдХрд╛рдЧрдЬ , рдЬреАрдПрдЪрд╕реА рдореБрджреНрджрд╛ рдЯреНрд░реИрдХрд░ , рд░рд╕реНрдЯ рдкреНрд░реА-рдЖрд░рдПрдлрд╕реА ), рдкреНрд░реЗрд░рдгрд╛ рдХреЗ рд╕рдВрднрд╛рд╡рд┐рдд рд╕реНрд░реЛрдд рдХреЗ рд░реВрдк рдореЗрдВ рдЕрдЧрд░ рдХреБрдЫ рднреА рдирд╣реАрдВред рдЕрдиреНрдпред
рдЕрдирд┐рд╡рд╛рд░реНрдп рд░реВрдк рд╕реЗ рдпрд╣ рд╡рд┐рдЪрд╛рд░ рд╣реИ рдХрд┐ рдХрд╣реАрдВ рднреА рдЖрдк trait
рдирд┐рд╣рд┐рддрд╛рд░реНрде рд▓рд┐рдЦ рд╕рдХрддреЗ рд╣реИрдВ, рдЖрдк рдХрд┐рд╕реА рдФрд░ рд╕рдВрдЦреНрдпрд╛ рдХреЛ "рдФрд░ рднреА рд▓рд┐рдЦ рд╕рдХрддреЗ рд╣реИрдВ рдпрджрд┐ рдПрдХ рдЕрд▓рдЧ impl
рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдирд╛ рд╣реИ рдЬреЛ рдкрд┐рдЫрд▓реЗ рдПрдХ (рдорд╛рдорд▓реЗ) рдореЗрдВ рд▓рд╛рдЧреВ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП рдПрдХ рд╡реИрдХрд▓реНрдкрд┐рдХ рдЕрдВрддрд┐рдо "рдФрд░ рдХреНрд▓реЙрдЬ" рдХреЗ рд╕рд╛рде рдПрдХ рдирдХрд╛рд░рд╛рддреНрдордХ рдирд┐рд╣рд┐рддрд╛рд░реНрде рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдирд╣реАрдВ рдХрд┐рдпрд╛, (рдпрджрд┐ Trait
рд▓рд╛рдЧреВ рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП рдХреЛрдИ рднреА рдЦрдВрдб рдирд╣реАрдВ рд╣реИ, рддреЛ !Trait
рд▓рд╛рдЧреВ рд╣реЛрддрд╛ рд╣реИ)ред
@withoutboats
"рдЕрдкрд╡рд░реНрдЬрди рд╕рдореВрд╣реЛрдВ" рдХрд╛ рд╡рд┐рдЪрд╛рд░ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд╕рд┐рд░реНрдл рдирдХрд╛рд░рд╛рддреНрдордХ рд╕реБрдкрд░рд╕рдЯреНрд░реЗрдЯ рд╕реАрдорд╛ рд╣реИред
рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдореЗрд░реЗ рдЙрдкрдпреЛрдЧ рдХреЗ рдорд╛рдорд▓реЛрдВ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рд╣реЛрдЧрд╛ред
рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдЙрди рдореБрджреНрджреЛрдВ рд╕реЗ рдЬреБрдбрд╝рддрд╛ рд╣реИ рдЬреЛ рдирд┐рдХреЛ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЗрд╕ рдмрд╛рдд рдкрд░ рдкреНрд░рдХрд╛рд╢ рдбрд╛рд▓рддреЗ рд╣реИрдВ рдХрд┐ рд╡рд┐рд╢реЗрд╖рдЬреНрдЮрддрд╛ рдХрд┐рд╕ рддрд░рд╣ рд╕реЗ рдкреЙрд▓реАрдореЛрд░реНрдлрд┐рдЬрд╝реНрдо рдХреЗ рд╕рд╛рде рдХреЛрдб рдкреБрди: рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╣реИред
рдореБрдЭреЗ рдирд╣реАрдВ рдкрддрд╛ рдХрд┐ рдХреНрдпрд╛ рдпреЗ рдЕрд╕рдВрдЧрдд рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВред рдореИрдВ рдЪрд╛рд╣рддрд╛ рд╣реВрдБ:
impl
s рдХрд╛ рдПрдХ рдмрд╣реБрдд рдХреБрдЫ рдЬреЛрдбрд╝рдиреЗ рдХреЗ рдмрдЬрд╛рдп, рдореЗрд░реЗ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХреЛ рд╡реГрджреНрдзрд┐рд╢реАрд▓ рд░реВрдк рд╕реЗ рд▓рд┐рдЦрдиреЗ рдФрд░ рдкрд░реАрдХреНрд╖рдг рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛредрд╕рднреА рдорд╛рдорд▓реЛрдВ рдХреЛ рдХрд╡рд░ рдХрд░рдирд╛ рдХрдард┐рди рд╣реИ, рд▓реЗрдХрд┐рди рдЕрдЧрд░ рдХрдВрдкрд╛рдЗрд▓рд░ рдореБрдЭреЗ рд╕рднреА рдорд╛рдорд▓реЛрдВ рдХреЛ рдХрд╡рд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдордЬрдмреВрд░ рдХрд░рддрд╛ рд╣реИ:
trait Foo {}
trait A {}
trait B {}
impl<T> Foo for T where T: A { ... }
impl<T> Foo for T where T: B { ... }
// impl<T> Foo for T where T: A + B { ... } //< compiler: need to add this impl!
рдФрд░ рдореБрдЭреЗ рдирдХрд╛рд░рд╛рддреНрдордХ рдкреНрд░рднрд╛рд╡ рднреА рджреЗрддрд╛ рд╣реИ:
impl<T> !Foo for T where T: A + B { }
impl<T> !Foo for T where T: _ { } // _ => all cases not explicitly covered yet
рдЬрдм рдореБрдЭреЗ рдЙрдирдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ рддреЛ рдореИрдВ incrementally рдЗрдореНрдкреНрд▓рд╛рдВрдЯ рдЬреЛрдбрд╝ рд╕рдХреВрдВрдЧрд╛ рдФрд░ рдЬрдм рдореБрдЭреЗ рдХреЛрдИ рдЯрд╛рдЗрдк рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИ рддреЛ рдПрдХ рдЯрд╛рдЗрдк рдХреЗ рд╕рд╛рде рдПрдХ рдЯреНрд░реЗрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рдиреЗ рдкрд░ рдореБрдЭреЗ рдЕрдЪреНрдЫреЗ рдХрдВрдкрд╛рдЗрд▓рд░ рдПрд░рд░ рдорд┐рд▓рддреЗ рд╣реИрдВред
рдореБрдЭреЗ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдпрдХреАрди рдирд╣реАрдВ рд╣реИ рдХрд┐ рдЕрдиреБрдорддрд┐ рджреЗрдиреЗ рдХреЗ рдирд┐рд╣рд┐рддрд╛рд░реНрде рдХреНрдпрд╛ рд╣реИрдВред
рдирд┐рдХреЛ рдиреЗ рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛ рдХрд┐ рдирдХрд╛рд░рд╛рддреНрдордХ рддрд░реНрдХ рдХреЗ рд╕рд╛рде рд╕рдорд╕реНрдпрд╛рдПрдВ рд╣реИрдВред рдПрдлрдбрдмреНрд▓реНрдпреВрдЖрдИрдбрдмреНрд▓реНрдпреВ рдХреЗрд╡рд▓ рдПрдХ рдЪреАрдЬ рд╣реИ рдЬрд┐рд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдирдХрд╛рд░рд╛рддреНрдордХ рддрд░реНрдХ рдХреЗ рд▓рд┐рдП рдКрдкрд░ рджрд┐рдП рдЧрдП рдЙрджрд╛рд╣рд░рдг рдореЗрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдпрд╣ рдмрддрд╛рддрд╛ рд╣реИ рдХрд┐ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдЬрд╛рдирддрд╛ рд╣реИ рдХрд┐ рдХрд┐рд╕реА рд╡рд┐рд╢реЗрд╖ рдорд╛рдорд▓реЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдЗрдореНрдкреНрд▓рд╛рдВрдЯ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдЗрд╕рдХреЗ рд▓рд┐рдП рдПрдХ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдкреНрд░рджрд╛рди рдирд╣реАрдВ рдХрд░рдиреЗ рдХрд╛ рдлреИрд╕рд▓рд╛ рдХрд┐рдпрд╛ рд╣реИред
рдореИрдВ рд╕рд┐рд░реНрдл # 33017 рдорд╛рд░рд╛ рдФрд░ рдЗрд╕реЗ рдЕрднреА рддрдХ рдпрд╣рд╛рдВ рд▓рд┐рдВрдХ рдирд╣реАрдВ рджреЗрдЦрд╛ред рдЗрд╕реЗ рд╕рд╛рдЙрдВрдбрдиреЗрд╕ рд╣реЛрд▓ рдХреЗ рд░реВрдк рдореЗрдВ рдЪрд┐рд╣реНрдирд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдпрд╣рд╛рдВ рдЯреНрд░реИрдХ рдХрд░рдирд╛ рдЕрдЪреНрдЫрд╛ рд╣реЛрдЧрд╛ред
Https://github.com/dtolnay/quote/issues/7 рдХреЗ рд▓рд┐рдП рдореБрдЭреЗ RFC рд╕реЗ рдЗрд╕ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд╕рдорд╛рди рдХреБрдЫ рдЪрд╛рд╣рд┐рдП рдЬреЛ рдЕрднреА рддрдХ рдЙрдкрд▓рдмреНрдз рдирд╣реАрдВ рд╣реИред cc @tomaka @Aatch @rphmeier рдЬрд┐рдиреНрд╣реЛрдВрдиреЗ рдЗрд╕ рдмрд╛рд░реЗ рдореЗрдВ рдкрд╣рд▓реЗ рдЯрд┐рдкреНрдкрдгреА рдХреА рдереАред
trait Example {
type Output;
fn generate(self) -> Self::Output;
}
impl<T> Example for T {
default type Output = Box<T>;
default fn generate(self) -> Box<T> { Box::new(self) }
}
impl Example for bool {
type Output = bool;
fn generate(self) -> bool { self }
}
рдореИрдВ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд╡рд░реНрдХрдЕрд░рд╛рдЙрдВрдб рдкрд░ рдареЛрдХрд░ рдЦрд╛рдИ рдЬреЛ рдПрдХ рд╣реА рдмрд╛рдд рдХреЛ рд╡реНрдпрдХреНрдд рдХрд░рдиреЗ рдХрд╛ рдПрдХ рддрд░реАрдХрд╛ рджреЗрддрд╛ рд╣реИред
#![feature(specialization)]
use std::fmt::{self, Debug};
///////////////////////////////////////////////////////////////////////////////
trait Example: Output {
fn generate(self) -> Self::Output;
}
/// In its own trait for reasons, presumably.
trait Output {
type Output: Debug + Valid<Self>;
}
fn main() {
// true
println!("{:?}", Example::generate(true));
// box("s")
println!("{:?}", Example::generate("s"));
}
///////////////////////////////////////////////////////////////////////////////
/// Instead of `Box<T>` just so the "{:?}" in main() clearly shows the type.
struct MyBox<T: ?Sized>(Box<T>);
impl<T: ?Sized> Debug for MyBox<T>
where T: Debug
{
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
write!(f, "box({:?})", self.0)
}
}
///////////////////////////////////////////////////////////////////////////////
/// Return type of the impl containing `default fn`.
type DefaultOutput<T> = MyBox<T>;
impl Output for bool {
type Output = bool;
}
impl<T> Example for T where T: Pass {
default fn generate(self) -> Self::Output {
T::pass({
// This is the impl you wish you could write
MyBox(Box::new(self))
})
}
}
impl Example for bool {
fn generate(self) -> Self::Output {
self
}
}
///////////////////////////////////////////////////////////////////////////////
// Magic? Soundness exploit? Who knows?
impl<T: ?Sized> Output for T where T: Debug {
default type Output = DefaultOutput<T>;
}
trait Valid<T: ?Sized> {
fn valid(DefaultOutput<T>) -> Self;
}
impl<T: ?Sized> Valid<T> for DefaultOutput<T> {
fn valid(ret: DefaultOutput<T>) -> Self {
ret
}
}
impl<T> Valid<T> for T {
fn valid(_: DefaultOutput<T>) -> Self {
unreachable!()
}
}
trait Pass: Debug {
fn pass(DefaultOutput<Self>) -> <Self as Output>::Output;
}
impl<T: ?Sized> Pass for T where T: Debug, <T as Output>::Output: Valid<T> {
fn pass(ret: DefaultOutput<T>) -> <T as Output>::Output {
<T as Output>::Output::valid(ret)
}
}
рдореИрдВ рдЕрднреА рднреА https://github.com/dtolnay/quote/issues/7 рдкрд░ рдХрд╛рдо рдХрд░ рд░рд╣рд╛ рд╣реВрдВ рдФрд░ рд╣реАрд░реЗ рдХреЗ рдкреИрдЯрд░реНрди рдХреА рдЬрд░реВрд░рдд рд╣реИред рдпрд╣рд╛рдБ рдореЗрд░рд╛ рд╕рдорд╛рдзрд╛рди рд╣реИред cc @zitsen рдЬрд┐рдиреНрд╣реЛрдВрдиреЗ рдЗрд╕ рдмрд╛рд░реЗ рдореЗрдВ рдкрд╣рд▓реЗ рдкреВрдЫрд╛ рдФрд░ рдЬрд╡рд╛рдм рджреЗрдиреЗ рд╡рд╛рд▓реЗ @aturon рдФрд░
#![feature(specialization)]
/// Can't have these impls directly:
///
/// - impl<T> Trait for T
/// - impl<T> Trait for T where T: Clone
/// - impl<T> Trait for T where T: Default
/// - impl<T> Trait for T where T: Clone + Default
trait Trait {
fn print(&self);
}
fn main() {
struct A;
A.print(); // "neither"
#[derive(Clone)]
struct B;
B.print(); // "clone"
#[derive(Default)]
struct C;
C.print(); // "default"
#[derive(Clone, Default)]
struct D;
D.print(); // "clone + default"
}
trait IfClone: Clone { fn if_clone(&self); }
trait IfNotClone { fn if_not_clone(&self); }
impl<T> Trait for T {
default fn print(&self) {
self.if_not_clone();
}
}
impl<T> Trait for T where T: Clone {
fn print(&self) {
self.if_clone();
}
}
impl<T> IfClone for T where T: Clone {
default fn if_clone(&self) {
self.clone();
println!("clone");
}
}
impl<T> IfClone for T where T: Clone + Default {
fn if_clone(&self) {
self.clone();
Self::default();
println!("clone + default");
}
}
impl<T> IfNotClone for T {
default fn if_not_clone(&self) {
println!("neither");
}
}
impl<T> IfNotClone for T where T: Default {
fn if_not_clone(&self) {
Self::default();
println!("default");
}
}
рдПрдХ рдмрдЧ (рдпрд╛ рдореЗрд░реЗ рджреГрд╖реНрдЯрд┐рдХреЛрдг рд╕реЗ рдХрдо рд╕реЗ рдХрдо рдЕрдкреНрд░рддреНрдпрд╛рд╢рд┐рдд рд╡реНрдпрд╡рд╣рд╛рд░) рдХреЛ рд╡рд┐рд╢реЗрд╖рдЬреНрдЮрддрд╛ рдФрд░ рдкреНрд░рдХрд╛рд░ рдХреЗ рдЕрдиреБрдорд╛рди рд╕реЗ рдорд╛рд░реЛ: # 38167
рдЗрди рджреЛ рдЖрдХреГрддрд┐рдпреЛрдВ рдХреЛ рд╡рд┐рд╢реЗрд╖рдЬреНрдЮрддрд╛ рдХреЗ рд╕рд╛рде рдорд╛рдиреНрдп рд╣реЛрдиреЗ рдХреА рдЙрдореНрдореАрдж рдХреА рдЬрд╛рдиреА рдЪрд╛рд╣рд┐рдП, рд╣реИ рдирд╛? рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЗрд╕реЗ рд╕рдлрд▓рддрд╛рдкреВрд░реНрд╡рдХ рдирд╣реАрдВ рдЙрдард╛рдпрд╛ рдЬрд╛ рд░рд╣рд╛ рд╣реИред
impl<T, ST, DB> ToSql<Nullable<ST>, DB> for T where
T: ToSql<ST, DB>,
DB: Backend + HasSqlType<ST>,
ST: NotNull,
{
...
}
impl<T, ST, DB> ToSql<Nullable<ST>, DB> for Option<T> where
T: ToSql<ST, DB>,
DB: Backend + HasSqlType<ST>,
ST: NotNull,
{
...
}
рдореИрдВрдиреЗ рдХреБрдЫ рдЕрдирдкреЗрдХреНрд╖рд┐рдд рд╡реНрдпрд╡рд╣рд╛рд░ рдХреЗ рд▓рд┐рдП https://github.com/rust-lang/rust/issues/38516 рджрд╛рдпрд░ рдХрд┐рдпрд╛, рдЬреЛ рдореИрдВ рд╕рд░реНрдбреЗ рдореЗрдВ рд╡рд┐рд╢реЗрд╖рдЬреНрдЮрддрд╛ рдХреЗ рдирд┐рд░реНрдорд╛рдг рдкрд░ рдХрд╛рдо рдХрд░рддреЗ рд╣реБрдП рдЪрд▓рд╛ред Https://github.com/rust-lang/rust/issues/38167 рдХреЗ рд╕рдорд╛рди, рдпрд╣ рдПрдХ рдРрд╕рд╛ рдорд╛рдорд▓рд╛ рд╣реИ рдЬрд╣рд╛рдВ рдХрд╛рд░реНрдпрдХреНрд░рдо рд╡рд┐рд╢реЗрд╖ рдЖрд░реЗрдЦ рдХреЗ рдмрд┐рдирд╛ рд╕рдВрдХрд▓рд┐рдд рд╣реЛрддрд╛ рд╣реИ рдФрд░ рдЬрдм рдЗрд╕реЗ рдЬреЛрдбрд╝рд╛ рдЬрд╛рддрд╛ рд╣реИ рддреЛ рдПрдХ рдкреНрд░рдХрд╛рд░ рдХреА рддреНрд░реБрдЯрд┐ рд╣реЛрддреА рд╣реИред cc @bluss рдЬреЛ рдЗрд╕ рд╕реНрдерд┐рддрд┐ рд╕реЗ рдкрд╣рд▓реЗ рдЪрд┐рдВрддрд┐рдд рдереЗред
рдХреНрдпрд╛ рд╣реЛрдЧрд╛ рдпрджрд┐ рд╣рдо рдПрдХ рдПрдХрд▓ рдЯреЛрдХрд░реЗ рдХреЗ рднреАрддрд░ default
рдХреАрд╡рд░реНрдб рдХреЗ рдмрд┐рдирд╛ рд╡рд┐рд╢реЗрд╖рдЬреНрдЮрддрд╛ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддреЗ рд╣реИрдВ, рдЗрд╕реА рддрд░рд╣ рд╣рдо рдПрдХ рдПрдХрд▓ рдЯреЛрдХрд░реЗ рдХреЗ рднреАрддрд░ рдирдХрд╛рд░рд╛рддреНрдордХ рддрд░реНрдХ рдХреА рдЕрдиреБрдорддрд┐ рдХреИрд╕реЗ рджреЗрддреЗ рд╣реИрдВ?
рдореЗрд░рд╛ рдореБрдЦреНрдп рдФрдЪрд┐рддреНрдп рдпрд╣ рд╣реИ: "рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐рдпреЛрдВ рдФрд░ рд╡реИрдХреНрдЯрд░ рдкреИрдЯрд░реНрдиред" рдХрднреА-рдХрднреА, рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рд╕рднреА рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐рдпреЛрдВ рдФрд░ рд╡реИрдХреНрдЯрд░ рдХреЗ рд▓рд┐рдП рдХреБрдЫ рд▓рд╛рдЧреВ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ:
impl<I> Foo for I where I: Iterator<Item = u32> { ... }
impl Foo for Vec<u32> { ... }
(рдпрд╣ рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐рдпреЛрдВ рдФрд░ рд╡реИрдХреНрдЯрд░ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдЕрдиреНрдп рд╕реНрдерд┐рддрд┐рдпреЛрдВ рдХреЗ рд▓рд┐рдП рдкреНрд░рд╛рд╕рдВрдЧрд┐рдХ рд╣реИ, рдЬрд╝рд╛рд╣рд┐рд░ рд╣реИ, рдпрд╣ рд╕рд┐рд░реНрдл рдПрдХ рдЙрджрд╛рд╣рд░рдг рд╣реИред)
рдЖрдЬ рдпрд╣ рд╕рдВрдХрд▓рди рдирд╣реАрдВ рд╣реИ, рдФрд░ рджрд╛рдВрддреЛрдВ рдХрд╛ tsuris рдФрд░ gnashing рд╣реИред рд╡рд┐рд╢реЗрд╖рдЬреНрдЮрддрд╛ рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╣рд▓ рдХрд░рддреА рд╣реИ:
default impl<I> Foo for I where I: Iterator<Item = u32> { ... }
impl Foo for Vec<u32> { ... }
рд▓реЗрдХрд┐рди рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдореЗрдВ, рдЖрдкрдиреЗ рдЕрдкрдиреЗ рдЯреЛрдХрд░реЗ рдореЗрдВ рдПрдХ рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рдЕрдиреБрдмрдВрдз рдЬреЛрдбрд╝ рджрд┐рдпрд╛ рд╣реИ: Foo
рд╣реЛрдиреЗ рд╡рд╛рд▓реА рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐ рдХреЛ рд░реЛрдХрдирд╛ рд╕рдВрднрд╡ рд╣реИред рд╢рд╛рдпрдж рд╣рдо рдЖрдкрдХреЛ рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдордЬрдмреВрд░ рдирд╣реАрдВ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ - рдЗрд╕рд▓рд┐рдП, default
рдмрд┐рдирд╛ рд╕реНрдерд╛рдиреАрдп рд╡рд┐рд╢реЗрд╖рдЬреНрдЮрддрд╛ред
рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╕рд╡рд╛рд▓ рдпрд╣ рд╣реИ рдХрд┐ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ default
рдХреА рднреВрдорд┐рдХрд╛ рдХреНрдпрд╛ рд╣реИред default
рдереА, рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ, рдореВрд▓ рд░реВрдк рд╕реЗ рдПрдХ рдЧрд╡рд╛рд╣ рд╣реИ рдЬреЛ рдЧрд╡рд╛рд╣ рдФрд░ рд╕реНрд╡-рджрд╕реНрддрд╛рд╡реЗрдЬреАрдХрд░рдг рдХреЛрдб рдХреА рдУрд░ рдЗрд╢рд╛рд░рд╛ рдХрд░рддрд╛ рд╣реИред рдЬрд┐рд╕ рдкреНрд░рдХрд╛рд░ Rust code рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ рдЕрдкрд░рд┐рд╡рд░реНрддрдиреАрдп рд╣реИ, рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ рдирд┐рдЬреА, рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ рд╕реБрд░рдХреНрд╖рд┐рдд, рдпрд╣ рднреА рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ рдЕрдВрддрд┐рдо рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред рд╣рд╛рд▓рд╛рдБрдХрд┐, рдХреНрдпреЛрдВрдХрд┐ "рдиреЙрди-рдлрд╝рд╛рдЗрдирд▓рд┐рдЯреА" рдПрдХ рд╡реИрд╢реНрд╡рд┐рдХ рд╕рдВрдкрддреНрддрд┐ рд╣реИ, рдореИрдВ рдХрд┐рд╕реА рдЖрдЗрдЯрдо рдХреЛ рддрдм рддрдХ рд╡рд┐рд╢реЗрд╖рдЬреНрдЮ рдирд╣реАрдВ рдмрдирд╛ рд╕рдХрддрд╛ рдЬрдм рддрдХ рдХрд┐ рдореИрдВ рдЖрдкрдХреЛ рдХрд┐рд╕реА рдЖрдЗрдЯрдо рдХрд╛ рд╡рд┐рд╢реЗрд╖рдЬреНрдЮ рди рд╣реЛрдиреЗ рджреВрдВред
default
рдереА, рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ, рдореВрд▓ рд░реВрдк рд╕реЗ рдЦреЛрдЬрдХрд░реНрддрд╛ рдФрд░ рд╕реНрд╡-рджрд╕реНрддрд╛рд╡реЗрдЬреАрдХрд░рдг рдХреЛрдб рдХреА рдУрд░ рдЗрд╢рд╛рд░рд╛ рд╣реИред рд╣рд╛рд▓рд╛рдБрдХрд┐ [..] рдореИрдВ рдХрд┐рд╕реА рд╡рд╕реНрддреБ рдХреЛ рддрдм рддрдХ рд╡рд┐рд╢реЗрд╖рдЬреНрдЮ рдирд╣реАрдВ рдмрдирд╛ рд╕рдХрддрд╛ рдЬрдм рддрдХ рдХрд┐ рдореИрдВ рдЖрдкрдХреЛ рдХрд┐рд╕реА рд╡рд╕реНрддреБ рдХрд╛ рд╡рд┐рд╢реЗрд╖рдЬреНрдЮ рди рдмрдирд╛рдКрдБред
рд╣рд╛рд▓рд╛рдВрдХрд┐ рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЗрддрдирд╛ рдмреБрд░рд╛ рд╣реИ? рдпрджрд┐ рдЖрдк рдПрдХ рдирд┐рд╣рд┐рдд рд╡рд┐рд╢реЗрд╖рдЬреНрдЮ рдмрдирд╛рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рддреЛ рд╢рд╛рдпрдж рдЕрдиреНрдп рд▓реЛрдЧ рднреА рдЕрд╕реНрд╡рд╕реНрде рд╣реЛрдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВред
рдореБрдЭреЗ рдЪрд┐рдВрддрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдЗрд╕ RFC рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕реЛрдЪрдиреЗ рд╕реЗ рдореБрдЭреЗ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА C ++ рдХреЛрдбрдмреЗрд╕ рдореЗрдВ рдХрд╛рдо рдХрд░рдиреЗ рдХрд╛ PTSD рдлреНрд▓реИрд╢рдмреИрдХ рджреЗ рд░рд╣рд╛ рд╣реИ рдЬреЛ рдУрд╡рд░рд▓реЛрдбрд┐рдВрдЧ рдФрд░ рд╡рд┐рд░рд╛рд╕рдд рдХреА рдЕрд╢реНрд▓реАрд▓ рдорд╛рддреНрд░рд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдмрд┐рдирд╛ рдХрд┐рд╕реА рд╡рд┐рдЪрд╛рд░ рдХреЗ wtf рдХреЛрдб рдХреА рдХрд┐рд╕реА рднреА рдкрдВрдХреНрддрд┐ рдореЗрдВ рдЪрд▓ рд░рд╣реЗ рд╣реИрдВ, рдЬрд┐рд╕рдореЗрдВ рдПрдХ рд╡рд┐рдзрд┐ рдХреЙрд▓ рд╣реИред рдореИрдВ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЙрди рд▓рдВрдмрд╛рдИ рдХреА рд╕рд░рд╛рд╣рдирд╛ рдХрд░рддрд╛ рд╣реВрдВ рдЬреЛ @aturon рд╡рд┐рд╢реЗрд╖рдЬреНрдЮрддрд╛ рдФрд░ рд╕реНрдкрд╖реНрдЯ рдФрд░ рд╕реНрд╡-рджрд╕реНрддрд╛рд╡реЗрдЬреАрдХрд░рдг рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЧрдП рд╣реИрдВред
рд╣рд╛рд▓рд╛рдВрдХрд┐ рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЗрддрдирд╛ рдмреБрд░рд╛ рд╣реИ? рдпрджрд┐ рдЖрдк рдПрдХ рдирд┐рд╣рд┐рдд рд╡рд┐рд╢реЗрд╖рдЬреНрдЮ рдмрдирд╛рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рддреЛ рд╢рд╛рдпрдж рдЕрдиреНрдп рд▓реЛрдЧ рднреА рдЕрд╕реНрд╡рд╕реНрде рд╣реЛрдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВред
рдпрджрд┐ рдЕрдиреНрдп рд▓реЛрдЧ рдХреЗрд╡рд▓ "рд╢рд╛рдпрдж" рдЗрд╕реЗ рднреА рд╡рд┐рд╢реЗрд╖рдЬреНрдЮ рдмрдирд╛рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рдФрд░ рдЕрдЧрд░ рдРрд╕реЗ рдЕрдЪреНрдЫреЗ рдорд╛рдорд▓реЗ рд╣реИрдВ рдЬрд╣рд╛рдВ рд╣рдо рдЙрдиреНрд╣реЗрдВ рдирд╣реАрдВ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ рд╣рдореЗрдВ рдЗрд╕реЗ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдирд╛ рдЕрд╕рдВрднрд╡ рдирд╣реАрдВ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред (рдЗрдирдХреИрдкреНрд╕реБрд▓реЗрд╢рди рдХреЗ рд╕рдорд╛рди рдПрдХ рд╕рд╛: рдЖрдк рдХреБрдЫ рдбреЗрдЯрд╛ рдПрдХреНрд╕реЗрд╕ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдФрд░ рд╢рд╛рдпрдж рдХреБрдЫ рдЕрдиреНрдп рд▓реЛрдЧ рднреА рдЪрд╛рд╣рддреЗ рд╣реИрдВ - рдЗрд╕рд▓рд┐рдП рдЖрдк рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ _this data_ public рдХреЛ рдЪрд┐рд╣реНрдирд┐рдд рдХрд░рддреЗ рд╣реИрдВ, рдмрдЬрд╛рдп рд╕рднреА рдбреЗрдЯрд╛ рдХреЛ рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рдХрд░рдиреЗ рдХреЗред
рдореБрдЭреЗ рдЪрд┐рдВрддрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдЗрд╕ RFC рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕реЛрдЪрдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рд╣реА рдореБрдЭреЗ PTSD рдлреНрд▓реИрд╢рдмреИрдХ рджреЗ рд░рд╣рд╛ рд╣реИ ...
рд▓реЗрдХрд┐рди рдЗрд╕ рд╡рд┐рдирд┐рд░реНрджреЗрд╢рди рдХреЛ рдЕрд╕реНрд╡реАрдХрд╛рд░ рдХрд░рдиреЗ рд╕реЗ рдЗрди рдЪреАрдЬреЛрдВ рдХреЛ рд╣реЛрдиреЗ рд╕реЗ рдХреИрд╕реЗ рд░реЛрдХрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ?
рдпрджрд┐ рдРрд╕реЗ рдЕрдЪреНрдЫреЗ рдорд╛рдорд▓реЗ рд╣реИрдВ, рдЬрд╣рд╛рдВ рд╣рдо рдЙрдиреНрд╣реЗрдВ рдирд╣реАрдВ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ рд╣рдореЗрдВ рдЗрд╕реЗ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдирд╛ рдЕрд╕рдВрднрд╡ рдирд╣реАрдВ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред
рдпрд╣ рдЬрд░реВрд░реА рдирд╣реАрдВ рд╣реИ рдХрд┐ рдЬрдм рднреА рд╡реЗ рдЗрд╕рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрдЪреНрдЫрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рддреЛ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЛ рдПрдХ рд╢рдХреНрддрд┐ рджреЗрдирд╛ рдПрдХ рдЕрдЪреНрдЫрд╛ рд╡рд┐рдЪрд╛рд░ рд╣реИред рдРрд╕рд╛ рдирд╣реАрдВ рд╣реИ рдХрд┐ рдпрд╣ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЛ рднреНрд░рдорд┐рдд рдХреЛрдб рд▓рд┐рдЦрдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рдмрдирд╛рддрд╛ рд╣реИред
рд▓реЗрдХрд┐рди рдЗрд╕ рд╡рд┐рдирд┐рд░реНрджреЗрд╢рди рдХреЛ рдЕрд╕реНрд╡реАрдХрд╛рд░ рдХрд░рдиреЗ рд╕реЗ рдЗрди рдЪреАрдЬреЛрдВ рдХреЛ рд╣реЛрдиреЗ рд╕реЗ рдХреИрд╕реЗ рд░реЛрдХрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ?
рдорд╛рди рд▓реЗрдВ рдХрд┐ рдЖрдк foo.bar()
рдФрд░ рдЖрдк bar()
рдХреНрдпрд╛ рджреЗрдЦрдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВред рдЕрднреА, рдпрджрд┐ рдЖрдк рдПрдХ рдорд┐рд▓рд╛рди рдкреНрд░рдХрд╛рд░ рдкрд░ рд▓рд╛рдЧреВ рд╡рд┐рдзрд┐ рдкрд╛рддреЗ рд╣реИрдВ рдФрд░ рдпрд╣ default
рдЪрд┐рд╣реНрдирд┐рдд рдирд╣реАрдВ рд╣реИ, рддреЛ рдЖрдк рдЬрд╛рдирддреЗ рд╣реИрдВ рдХрд┐ рдЗрд╕рдХреА рд╡рд┐рдзрд┐ рдкрд░рд┐рднрд╛рд╖рд╛ рдЬрд┐рд╕реЗ рдЖрдк рдЦреЛрдЬ рд░рд╣реЗ рд╣реИрдВред @Withoutboats рдХреЗ рдкреНрд░рд╕реНрддрд╛рд╡ рдХреЗ рд╕рд╛рде рдпрд╣ рдЕрдм рд╕рдЪ рдирд╣реАрдВ рд╣реЛрдЧрд╛ - рдЗрд╕рдХреЗ рдмрдЬрд╛рдп рдЖрдкрдХреЛ рдХрднреА рднреА рдпрд╣ рдкрддрд╛ рдирд╣реАрдВ рдЪрд▓реЗрдЧрд╛ рдХрд┐ рдЖрдк рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЙрд╕ рдХреЛрдб рдХреЛ рджреЗрдЦ рд░рд╣реЗ рд╣реИрдВ рдЬрд┐рд╕реЗ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд░рд╣рд╛ рд╣реИред
рдЗрд╕рдХреЗ рдмрдЬрд╛рдп рдЖрдк рдХрднреА рднреА рдпрд╣ рдирд╣реАрдВ рдЬрд╛рди рдкрд╛рдПрдВрдЧреЗ рдХрд┐ рдЖрдк рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЙрд╕ рдХреЛрдб рдХреЛ рджреЗрдЦ рд░рд╣реЗ рд╣реИрдВ рдЬрд┐рд╕реЗ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд░рд╣рд╛ рд╣реИред
рдпрд╣ рд╕реНрдерд╛рдиреАрдп рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рд▓рд┐рдП рдЧреИрд░-рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдкреНрд░рддреНрдпрд╛рд░реЛрдкрдг рдХреА рд╡рд┐рд╢реЗрд╖рдЬреНрдЮрддрд╛ рдХреА рдЕрдиреБрдорддрд┐ рдХреЗ рдкреНрд░рднрд╛рд╡ рдХрд╛ рдХрд╛рдлреА рдЕрддрд┐рд╢рдпреЛрдХреНрддрд┐ рд╣реИред рдпрджрд┐ рдЖрдк рдПрдХ рдареЛрд╕ рдирд┐рд╣рд┐рддрд╛рд░реНрде рджреЗрдЦ рд░рд╣реЗ рд╣реИрдВ, рддреЛ рдЖрдк рдЬрд╛рдирддреЗ рд╣реИрдВ рдХрд┐ рдЖрдк рд╕рд╣реА рдкреНрд░рддреНрдпрд╛рд░реЛрдкрдг рджреЗрдЦ рд░рд╣реЗ рд╣реИрдВред рдФрд░ рдЖрдкрдХреЗ рдкрд╛рд╕ рдЗрд╕ рдЯреЛрдХрд░реЗ рдХреЗ рдкреВрд░реЗ рд╕реНрд░реЛрдд рддрдХ рдкрд╣реБрдВрдЪ рд╣реИ; рдЖрдк рдпрд╣ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдпрд╣ рдирд┐рд╣рд┐рдд рд╡рд┐рд╢реЗрд╖ рд╣реИ рдпрд╛ рдирд╣реАрдВ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдмрд╣реБрдд рдЬрд▓реНрджреА "рдХрднреА рдирд╣реАрдВред"
рдЗрд╕ рдмреАрдЪ, default
, рд╕рдорд╕реНрдпрд╛ рдмрдиреА рд╣реБрдИ рд╣реИ рдЬрдм рдПрдХ рдЕрдВрдЬреАрд░ рдХреЛ рдЕрдВрддрд┐рдо рд░реВрдк рдирд╣реАрдВ рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рдпрджрд┐ рд╕рд╣реА рдирд┐рд╣рд┐рддрд╛рд░реНрде рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ default
рдирд┐рд╣рд┐рдд рд╣реИ, рддреЛ рдЖрдк рдЕрдирд┐рд╢реНрдЪрд┐рдд рд╣реЛрдиреЗ рдХреА рдХрдард┐рдирд╛рдИ рдХреА рдПрдХ рд╣реА рд╕реНрдерд┐рддрд┐ рдореЗрдВ рд╣реИрдВ рдпрджрд┐ рдпрд╣ рд╕рд╣реА рдирд┐рд╣рд┐рдд рд╣реИред рдФрд░ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдпрджрд┐ рд╡рд┐рд╢реЗрд╖рдЬреНрдЮрддрд╛ рдХреЛ рдирд┐рдпреЛрдЬрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдпрд╣ рдЖрдорддреМрд░ рдкрд░ рдорд╛рдорд▓рд╛ рд╣реЛрдЧрд╛ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдпрд╣ рдЖрдЬ рд▓рдЧрднрдЧ ToString
рдкреНрд░рддреНрдпреЗрдХ рдирд┐рд╣рд┐рддрд╛рд░реНрде рдХреЗ рд▓рд┐рдП рдорд╛рдорд▓рд╛ рд╣реИ)ред
рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдПрдХ рдЧрдВрднреАрд░ рд╕рдорд╕реНрдпрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдореБрдЭреЗ рдпрдХреАрди рдирд╣реАрдВ рд╣реИ рдХрд┐ default
рдЗрд╕реЗ рд╣рд▓ рдХрд░рддрд╛ рд╣реИред рд╣рдореЗрдВ рдмреЗрд╣рддрд░ рдХреЛрдб рдиреЗрд╡рд┐рдЧреЗрд╢рди рдЯреВрд▓ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рд╡рд░реНрддрдорд╛рди рдореЗрдВ рд░реВрдбрдбреЙрдХ рдПрдХ рдмрд╣реБрдд 'рд╕рд░реНрд╡рд╢реНрд░реЗрд╖реНрда рдкреНрд░рдпрд╛рд╕' рджреГрд╖реНрдЯрд┐рдХреЛрдг рдмрдирд╛рддрд╛ рд╣реИ рдЬрдм рдпрд╣ рдЯреНрд░реЗрд╕ рдХреЗ рдирд┐рд╢рд╛рди рдХреА рдмрд╛рдд рдЖрддреА рд╣реИ - рдпрд╣ рдЙрдирдХреЗ рд╕реНрд░реЛрдд рд╕реЗ рд▓рд┐рдВрдХ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ рдФрд░ рдпрд╣ рдЙрди рд╕реВрдЪрд┐рдпреЛрдВ рдХреЛ рднреА рд╕реВрдЪреАрдмрджреНрдз рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ рдЬреЛ рдХрдВрдмрд▓ рдкреНрд░рддреНрдпрд╛рд░реЛрдкрдг рджреНрд╡рд╛рд░рд╛ рдкреНрд░рджрд╛рди рдХреА рдЬрд╛рддреА рд╣реИрдВред
рдореИрдВ рдпрд╣ рдирд╣реАрдВ рдХрд╣ рд░рд╣рд╛ рд╣реВрдБ рдХрд┐ рдпрд╣ рдкрд░рд┐рд╡рд░реНрддрди рдХрд┐рд╕реА рднреА рддрд░рд╣ рд╕реЗ рдПрдХ рд╕реНрд▓реИрдордбрдВрдХ рд╣реИ, рд▓реЗрдХрд┐рди рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдПрдХ рдЕрдзрд┐рдХ рд╕реВрдХреНрд╖реНрдо рд╡рд┐рдЪрд╛рд░ рдХреЗ рд▓рд╛рдпрдХ рд╣реИред
рдпрд╣ рдЬрд░реВрд░реА рдирд╣реАрдВ рд╣реИ рдХрд┐ рдЬрдм рднреА рд╡реЗ рдЗрд╕рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрдЪреНрдЫрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рддреЛ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЛ рдПрдХ рд╢рдХреНрддрд┐ рджреЗрдирд╛ рдПрдХ рдЕрдЪреНрдЫрд╛ рд╡рд┐рдЪрд╛рд░ рд╣реИред рдРрд╕рд╛ рдирд╣реАрдВ рд╣реИ рдХрд┐ рдпрд╣ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЛ рднреНрд░рдорд┐рдд рдХреЛрдб рд▓рд┐рдЦрдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рдмрдирд╛рддрд╛ рд╣реИред
рдмрд┐рд▓реНрдХреБрд▓, рдореИрдВ рдмрд┐рд▓реНрдХреБрд▓ рд╕рд╣рдордд рд╣реВрдВред рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдореИрдВ рдпрд╣рд╛рдВ рдПрдХ рдЕрд▓рдЧ "рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛" рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░ рд░рд╣рд╛ рд╣реВрдВ, рдЬреЛ рдЖрдкрдХреЗ рджреНрд╡рд╛рд░рд╛ рд▓рд┐рдЦреЗ рдЧрдП рдмрдХреНрд╕реЗ рдХрд╛ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рд╣реИред рдЖрдк рдирд╣реАрдВ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдХрд┐ рд╡реЗ рдЖрдкрдХреЗ рдЯреЛрдХрд░реЗ рдореЗрдВ рд╕реНрд╡рддрдВрддреНрд░ рд░реВрдк рд╕реЗ рд╡рд┐рд╢реЗрд╖рдЬреНрдЮ рд╣реЛрдВ (рд╕рдВрднрд╡рддрдГ рдЖрдкрдХреЗ рдЯреЛрдХрд░реЗ рдХреЗ рд╡реНрдпрд╡рд╣рд╛рд░ рдХреЛ рд╣реИрдХреА рддрд░реАрдХреЗ рд╕реЗ рдкреНрд░рднрд╛рд╡рд┐рдд рдХрд░ рд░рд╣реЗ рд╣реИрдВ)ред рджреВрд╕рд░реА рдУрд░, рд╣рдо рдЕрдзрд┐рдХ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЛ "рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛" рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрддрд╛ рд░рд╣реЗ рд╣реИрдВ, рдЬрд┐рд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЖрдк рдЯреЛрдХрд░рд╛ рд▓реЗрдЦрдХ рдХрд╣ рд░рд╣реЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди @withoutboats рдХреЗ рдкреНрд░рд╕реНрддрд╛рд╡ рдХреЗ рдмрд┐рдирд╛ рднреА, рдЖрдкрдХреЛ "рдбрд┐рдлрд╝реЙрд▓реНрдЯ" рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ рдФрд░ рдЙрд╕реА рд╕рдорд╕реНрдпрд╛ рдореЗрдВ рдЪрд▓рдирд╛ рд╣реЛрдЧрд╛ ред
рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ default
рдЗрд╕ рдЕрд░реНрде рдореЗрдВ рдорджрдж рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдпрджрд┐ рдЖрдк рдХрд┐рд╕реА рдХреЛрдб рдХреЛ рдкрдврд╝рдиреЗ рдХреЛ рд╕рд░рд▓ рдмрдирд╛рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рддреЛ рдЖрдк рдкреВрдЫ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдХреЛрдИ рднреА default
рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ рдпрд╛ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрдареЛрд░ рдкреНрд░рд▓реЗрдЦрди рдирд┐рдпрдо рд╕реНрдерд╛рдкрд┐рдд рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред рдЙрд╕ рдмрд┐рдВрджреБ рдкрд░, рдЖрдкрдХреЛ рдХреЗрд╡рд▓ default
s рд╕реЗ std
рдЪрд┐рдВрддрд╛ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдЬреЛ рд╕рдВрднрд╡рддрдГ рд▓реЛрдЧреЛрдВ рдХреЛ рдмреЗрд╣рддрд░ рд╕рдордЭ рдореЗрдВ рдЖрдПрдЧрд╛ред
рдореБрдЭреЗ рдпрд╣ рд╡рд┐рдЪрд╛рд░ рдпрд╛рдж рд╣реИ рдХрд┐ рдкреНрд░рд▓реЗрдЦрди рдирд┐рдпрдореЛрдВ рдХреЛ рд╡рд┐рд╢реЗрд╖рдЬреНрдЮрддрд╛ рдХреЗ usages рдкрд░ рд▓рдЧрд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдЬрд┐рд╕реЗ RFC рджреНрд╡рд╛рд░рд╛ рдЕрдиреБрдореЛрджрд┐рдд рд╡рд┐рд╢реЗрд╖рдЬреНрдЮрддрд╛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдореЗрдВ рдпреЛрдЧрджрд╛рди рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред
@withoutboats рдХреНрдпрд╛ рдореИрдВ default
рд╢рд┐рдерд┐рд▓рддрд╛ рдХреЗ рд▓рд┐рдП рдЖрдкрдХреА рдкреНрд░реЗрд░рдгрд╛ рдХреЛ рдкрдврд╝рдиреЗ рдореЗрдВ рд╕рд╣реА рд╣реВрдВ рдХреНрдпреЛрдВрдХрд┐ рдЖрдк default
рдХрд╛ рдПрдХ рдкреНрд░рддрд┐рдмрдВрдзрд┐рдд рд░реВрдк рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдЬрд┐рд╕рдХрд╛ рдЕрд░реНрде рд╣реИ "рдЕрддрд┐-рдпреЛрдЧреНрдп, рд▓реЗрдХрд┐рди рдХреЗрд╡рд▓ рдЗрд╕ рдЯреЛрдХрд░реЗ рдореЗрдВ" (рдпрд╛рдиреА, pub(crate)
рд▓реЗрдХрд┐рди default
)? рд╣рд╛рд▓рд╛рдВрдХрд┐, рдЗрд╕реЗ рдЖрд╕рд╛рди рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрдк рдХреЛ рдЫреЛрдбрд╝рддреЗ рд╣реБрдП рдХреЗ рд╢рдмреНрджреЛрдВ рдХреЛ рдмрджрд▓рдиреЗ рдХрд╛ рдкреНрд░рд╕реНрддрд╛рд╡ рдХрд░ рд░рд╣реЗ рд╣реИрдВ default
, рдмрдЬрд╛рдп рдХреЗ graduations рдЬреЛрдбрд╝рдиреЗ default
-рдиреЗрд╕?
рд╕рд╣реА рдмрд╛рддред default(crate)
рдЬреИрд╕рд╛ рдХреБрдЫ рдХрд░рдирд╛ рдУрд╡рд░рдХрд┐рд▓ рдЬреИрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИред
рдПрдХ рдкреНрд░рд╛рдердорд┐рдХрддрд╛, рдореИрдВ рдХрд▓реНрдкрдирд╛ рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВ рдХрд┐ рдХреЛрдИ рднреА рдЗрд╕рдХрд╛ рдЕрдиреБрдХрд░рдг рдХрд░ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдХреНрд░реЗрдЯ рдирд┐рд░реНрдпрд╛рдд рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ, рдирд╣реАрдВ? рдХреНрдпрд╛ рдРрд╕реА рдХреЛрдИ рд╕реНрдерд┐рддрд┐рдпрд╛рдБ рд╣реИрдВ рдЬрд╣рд╛рдБ рдЖрдк default
рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЗ рд╕рд╛рде рдПрдХ рдирд┐рдЬреА рд╕рд╣рд╛рдпрдХ рд╡рд┐рд╢реЗрд╖рддрд╛ рдХрд╛ рдкрд░рд┐рдЪрдп рдирд╣реАрдВ рджреЗ рд╕рдХреЗ рдФрд░ рдЗрд╕реЗ рдЕрдкрдиреЗ рдЕрдВрддрд┐рдо impl
s рд╕реЗ рдХреЙрд▓ рдХрд░реЗрдВ? рдЖрдк рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдХрд┐ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдЖрдкрдХреЗ default
s рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ рд▓реЗрдХрд┐рди рдЙрдирдХреА рд╕реНрд╡рдпрдВ рдХреА рдЖрдкреВрд░реНрддрд┐ рди рдХрд░реЗрдВ?
рд╕рд╣реА рдмрд╛рддред рдбрд┐рдлрд╝реЙрд▓реНрдЯ (рдЯреЛрдХрд░рд╛) рдХреА рддрд░рд╣ рдХреБрдЫ рдХрд░рдирд╛ рдУрд╡рд░рдХрд┐рд▓ рдХреА рддрд░рд╣ рд▓рдЧрддрд╛ рд╣реИред
рдореИрдВ рдЕрд╕рд╣рдордд рд╣реВрдВред рдореИрдВ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдХрд╛ рдкреНрд░рддрд┐рдмрдВрдзрд┐рдд рд░реВрдк рдЪрд╛рд╣рддрд╛ рд╣реВрдВред рдореБрдЭреЗ рдЗрд╕рдХрд╛ рдкреНрд░рд╕реНрддрд╛рд╡ рдХрд░рдиреЗ рдХрд╛ рдЕрд░реНрде рд╣реИред рдореЗрд░рд╛ рдЕрднрд┐рдкреНрд░рд╛рдп рдпрд╣ рд╣реИ рдХрд┐ рдХрднреА-рдХрднреА рдЪреМрд░рд╛рд╣реЗ рдХрд╛ рдЖрд╢рдп рдЖрджрд┐ рдЖрдкрдХреЛ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдЬреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдордЬрдмреВрд░ рдХрд░ рджреЗрдЧрд╛, рд▓реЗрдХрд┐рди рдЗрд╕рдХрд╛ рдорддрд▓рдм рдпрд╣ рдирд╣реАрдВ рд╣реИ рдХрд┐ рдЖрдк рдЕрдкрдиреЗ рд╡реНрдпрд╡рд╣рд╛рд░ рдХреЛ рдмрджрд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдордирдорд╛рдиреЗ рдмрдХреНрд╕реЗ рдХреЗ рд▓рд┐рдП рдЕрдиреБрдорддрд┐ рджреЗрдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВред рдХреНрд╖рдорд╛ рдХрд░реЗрдВ, рдПрдХ рдмреИрдардХ рд╣реИ, рдореИрдВ рдПрдХ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд╕рд╛рде рдереЛрдбрд╝рд╛ рд╡рд┐рд╕реНрддрд╛рд░ рд╕реЗ рдмрддрд╛рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВред
@nikomatsakis рдореЗрд░реЗ рдкрд╛рд╕ рдПрдХ рд╣реА рдкреНрд░реЗрд░рдгрд╛ рд╣реИ, рдЬреЛ рдореИрдВ рдкреНрд░рд╕реНрддрд╛рд╡ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ рд╡рд╣ рдпрд╣ рд╣реИ рдХрд┐ рд╣рдо рдХреЗрд╡рд▓ рдПрдХ рд╣реА рдЯреЛрдХрд░реЗ рдореЗрдВ рд╡рд┐рд╢реЗрд╖рдЬреНрдЮ рдХреЗ рд▓рд┐рдП рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХреЛ рд╣рдЯрд╛ рджреЗрдВ, рдХреНрдпреЛрдВрдХрд┐ рдЕрдзрд┐рдХ рд▓реАрд╡рд░ рдХреЛ рдЬреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдПред :-)
рд╕рдВрдпреЛрдЧ рд╕реЗ рдЗрд╕ рдЧреИрд░ рдирд┐рд░реНрдпрд╛рдд рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдЕрдзрд┐рдХ рдЖрдо рдЙрдкрдпреЛрдЧ рд╣реИ, рддреЛ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдПрдХ #[default_export]
рд╕реБрд╡рд┐рдзрд╛ рдХреЗ рд╕рд╛рде рддреБрд▓рдирд╛ рдХрд░рдХреЗ рдпрд╛рдж рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрд╕рд╛рди рд╣реЛрдЧрд╛ #[macro_export]
ред рдПрдХ рдордзреНрдпрд╡рд░реНрддреА рд╡рд┐рдХрд▓реНрдк pub use
рдпрд╛ pub mod
рд▓рд╛рдЗрдиреЛрдВ рдХреЗ рд▓рд┐рдП рдЗрд╕ рдирд┐рд░реНрдпрд╛рдд рд╕реБрд╡рд┐рдзрд╛ рдХреА рдЕрдиреБрдорддрд┐ рджреЗ рд╕рдХрддрд╛ рд╣реИред
pub
рдХреАрд╡рд░реНрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдмреЗрд╣рддрд░ рд╣реЛрдЧрд╛, рдХреНрдпреЛрдВрдХрд┐ рдореИрдХреНрд░реЛрдЬрд╝ 2.0 рд╕рд╛рдорд╛рдиреНрдп рд╡рд╕реНрддреБрдУрдВ рдХреЗ рд░реВрдк рдореЗрдВ рдореИрдХреНрд░реЛрдЬрд╝ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░реЗрдЧрд╛ рдФрд░ pub
рдмрдЬрд╛рдп #[macro_use]
ред рдмреЛрд░реНрдб рднрд░ рдореЗрдВ рджреГрд╢реНрдпрддрд╛ рдХреЛ рдЗрдВрдЧрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП pub
рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЗрд╕рдХреА рд╕реНрдерд┐рд░рддрд╛ рдХреЗ рд▓рд┐рдП рдПрдХ рдмрдбрд╝реА рдЬреАрдд рд╣реЛрдЧреАред
@withoutboats рдХреА рдкрд░рд╡рд╛рд╣ рдХрд┐рдП рдмрд┐рдирд╛, рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдХрднреА-рдХрднреА рдЖрдк рд╕реНрдерд╛рдиреАрдп рд╕реНрддрд░ рдкрд░ рд╡рд┐рд╢реЗрд╖рдЬреНрдЮ рдмрдирд╛рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдЬрд░реВрд░реА рдирд╣реАрдВ рдХрд┐ рд╕рднреА рдХреЗ рд▓рд┐рдП рджрд░рд╡рд╛рдЬреЗ рдЦреБрд▓реЗ рд╣реЛрдВ
рдкрдм рдХреАрд╡рд░реНрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдмреЗрд╣рддрд░ рд╣реЛрдЧрд╛
pub default fn
рдЕрд░реНрде рд╣реИ "рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рд░реВрдк рд╕реЗ fn рдХреА рдбрд┐рдлрд╝реЙрд▓реНрдЯрддрд╛ рдХреЛ рдирд┐рд░реНрдпрд╛рдд рдХрд░реЗрдВ" рдХреЗ рд░реВрдк рдореЗрдВ рдлрд╝рдВрдХреНрд╢рди рдХреА рджреГрд╢реНрдпрддрд╛ рдХреЛ рдкреНрд░рднрд╛рд╡рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЦреБрдж рдХреЛ рдирдП рд▓реЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП рд╕реБрдкрд░ рднреНрд░рд╛рдордХ рд╣реЛрдЧрд╛ред
@jimmycuadra рдпрд╣ рд╣реИ рдХрд┐ pub
рдХреАрд╡рд░реНрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рд╕реЗ рдЖрдкрдХрд╛ рдХреНрдпрд╛ рдорддрд▓рдм рд╣реИ? рдореИрдВ @sgrif рд╕реЗ рд╕рд╣рдордд
рд╢рд╛рдпрдж pub default fn
рдмрд┐рд▓реНрдХреБрд▓ рдирд╣реАрдВ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдЕрд╕реНрдкрд╖реНрдЯ рд╣реИ, рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рджреЛрдиреЛрдВ рдЙрд▓реНрд▓реЗрдЦ рдХрд░рддреЗ рд╣реИрдВред рдореИрдВ рдмрд╕ рдХрд╣ рд░рд╣рд╛ рдерд╛ рдХрд┐ pub
рд╕рд╛рд░реНрд╡рднреМрдорд┐рдХ рд╣реЛрдиреЗ рдХрд╛ рдорддрд▓рдм рд╣реИ "рдХреБрдЫ рдФрд░ рдЙрдЬрд╛рдЧрд░ рдХрд░реЗрдВ рдЕрдиреНрдпрдерд╛ рдмрд╛рд╣рд░ рдХреА рдУрд░ рдирд┐рдЬреАред" рд╕рдВрднрд╡рддрдГ pub
рдХреЛ рд╢рд╛рдорд┐рд▓ рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рд╕рд┐рдВрдЯреИрдХреНрд╕ рдХреЗ рдХреБрдЫ рд╕реВрддреНрд░ рд╣реИрдВ рдЬреЛ рдиреЗрддреНрд░рд╣реАрди рд░реВрдк рд╕реЗ рднрд┐рдиреНрди рд╣реЛрдВрдЧреЗ рддрд╛рдХрд┐ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рд╕реНрд╡рдпрдВ рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рдмрдирд╛рдиреЗ рдореЗрдВ рднреНрд░рдорд┐рдд рди рд╣реЛрдВред
рд╣рд╛рд▓рд╛рдВрдХрд┐ рдпрд╣ рдереЛрдбрд╝рд╛ рд╕рд╛ рд╡рд╛рдХреНрдпрд╡рд┐рдиреНрдпрд╛рд╕ рд╣реИ, рдореИрдВ default(foo)
pub(foo)
рддрд░рд╣ рдХрд╛рдо рдХрд░рдиреЗ рдХрд╛ рд╡рд┐рд░реЛрдз рдирд╣реАрдВ рдХрд░реВрдВрдЧрд╛ - рджреЛ рдХреЗ рдмреАрдЪ рд╕рдорд░реВрдкрддрд╛ рдореЗрд░реЗ рд▓рд┐рдП рд╕рд┐рдВрдЯреИрдХреНрд╕ рдХреА рдХрд╛рд▓реНрдкрдирд┐рдХрддрд╛ рдХреЛ рджрд░реНрд╢рд╛рддрд╛ рд╣реИред
Bikeshed рдЪреЗрддрд╛рд╡рдиреА: рдпрджрд┐ рд╣рдо рдЗрд╕реЗ рдмреБрд▓рд╛ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд┐рдпрд╛ рд╣реИ overridable
рдХреЗ рдмрдЬрд╛рдп default
? рдпрд╣ рдЕрдзрд┐рдХ рд╢рд╛рдмреНрджрд┐рдХ рд░реВрдк рд╕реЗ рд╡рд░реНрдгрдирд╛рддреНрдордХ рд╣реИ, рдФрд░ overridable(foo)
рдореБрдЭреЗ default(foo)
рд╕реЗ рдмреЗрд╣рддрд░ рдкрдврд╝рддрд╛ рд╣реИ - рдмрд╛рдж рд╡рд╛рд▓рд╛ рд╕реБрдЭрд╛рд╡ рджреЗрддрд╛ рд╣реИ "рдпрд╣ foo
рдХреЗ рджрд╛рдпрд░реЗ рдореЗрдВ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд╣реИ, рд▓реЗрдХрд┐рди рдХреБрдЫ рдФрд░ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдХрд╣реАрдВ рдФрд░ ", рдЬрдмрдХрд┐ рдкреВрд░реНрд╡ рдХрд╣рддрд╛ рд╣реИ" рдпрд╣ foo
"рдХреЗ рджрд╛рдпрд░реЗ рдореЗрдВ рдЕрддрд┐-рдпреЛрдЧреНрдп рд╣реИ, рдЬреЛ рд╕рд╣реА рд╣реИред
рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдкрд╣рд▓реЗ рджреЛ рдкреНрд░рд╢реНрди рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд╣реИрдВ: рдХреНрдпрд╛ default
ness рдХрд╛ рдирд┐рд░реНрдпрд╛рдд рдХрд░рдирд╛ рдпрд╛ рдирд╣реАрдВ рдХрд░рдирд╛ рдЖрдо рдмрд╛рдд рд╣реИ? default
рдиреЗрд╕ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд╡реНрдпрд╡рд╣рд╛рд░ рдирд╣реАрдВ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП?
рд╣рд╛рдБ рдорд╛рдорд▓рд╛: рдЖрдк рдирд┐рд░реНрдпрд╛рдд рдХреЗ рд╕рд╛рде рд╕рдорд╛рдирддрд╛ рдХреЛ рдХрд╣реАрдВ рдФрд░ рдмрдврд╝рд╛ рд╕рдХрддреЗ рд╣реИрдВ рдЬреИрд╕реЗ pub mod mymodule default;
рдФрд░ pub use mymodule::MyTrait default;
, рдпрд╛ рд╢рд╛рдпрдж overridable
ред рдпрджрд┐ рдЖрд╡рд╢реНрдпрдХ рд╣реЛ, рддреЛ рдЖрдк pub use MyModule::MyTrait::{methoda,methodb} default;
рд╕рд╛рде рдХреЗрд╡рд▓ рдХреБрдЫ рддрд░реАрдХреЛрдВ рдХреЗ рд▓рд┐рдП default
рдиреЗрд╕ рдирд┐рд░реНрдпрд╛рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ
рдХреЛрдИ рдорд╛рдорд▓рд╛ рдирд╣реАрдВ: рдЖрдкрдХреЛ рдирд┐рдЬреАрддрд╛ рд╡реНрдпрдХреНрдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рди рдХрд┐ рдкреНрд░рдЪрд╛рд░ рдХреА, рдЬреЛ рд░рд╕реНрдЯ рд╡реИрд╕реЗ рднреА рдХрд┐рд╕реА рднреА рдЪреАрдЬрд╝ рд╕реЗ рдХрд╛рдлреА рднрд┐рдиреНрди рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЕрдм default(crate)
рдЗрди рдирд┐рд░реНрдпрд╛рддреЛрдВ рдХреЛ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд░рдиреЗ рдХрд╛ рд╕рд╛рдорд╛рдиреНрдп рддрд░реАрдХрд╛ рдмрди рдЬрд╛рддрд╛ рд╣реИред
рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдЕрдЧрд░ default
рдиреЗрд╕ рдХрд╛ рдирд┐рд░реНрдпрд╛рдд рдФрд░ рдирд┐рд░реНрдпрд╛рдд рдХрд░рдирд╛ рд╕рдорд╛рди рд░реВрдк рд╕реЗ рд╕рд╛рдорд╛рдиреНрдп рдирд╣реАрдВ рд╣реИ, рддреЛ рдЖрдк рд▓реЛрдЧ рд╢рд╛рдпрдж рдордирдорд╛рдиреЗ рдврдВрдЧ рд╕реЗ рд╣рд╛рдБ рдпрд╛ рдирд╛ рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ рдЪреБрди рд╕рдХрддреЗ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рдлрд┐рд░ рд╕реЗ pub use MyModule::MyTrait::{methoda,methodb} default;
рдХрд╛рдо рдХрд░рдирд╛ рдареАрдХ рд╣реИред
рдпреЗ рд╕рднреА рд╕рдВрдХреЗрддрди рд╕рдВрдЧрдд рд╡реИрд╕реЗ рднреА рджрд┐рдЦрддреЗ рд╣реИрдВред рдПрдХ рдЕрдиреНрдп рд╡рд┐рдХрд▓реНрдк рдХреБрдЫ рд╡рд┐рд╢реЗрд╖ impl
рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдЬреЛ default
s рдмрдВрдж рд╣реЛ, рд▓реЗрдХрд┐рди рдпрд╣ рдЬрдЯрд┐рд▓ рдФрд░ рдЕрдЬреАрдм рд▓рдЧрддрд╛ рд╣реИред
@burdges рдХреНрдпрд╛ рдЖрдкрдХреЗ рдкрд╛рд╕ "рд╣рд╛рдВ рдХреЗрд╕" рдФрд░ "рдХреЛрдИ рдорд╛рдорд▓рд╛ рдирд╣реАрдВ" рд▓реЗрдмрд▓ рд╣реИ, рдпрд╛ рдЖрдк рдЬреЛ рдХрд╣ рд░рд╣реЗ рд╣реИрдВ, рдХреНрдпрд╛ рдореИрдВ рдЧрд▓рдд рд╕рдордЭ рд░рд╣рд╛ рд╣реВрдВ?
рд╣рд╛рдБ, рдЙрдлрд╝! рдлрд┐рдХреНрд╕реНрдб!
рд╣рдорд╛рд░реЗ рдкрд╛рд╕ impl<T> Borrow<T> for T where T: ?Sized
рддрд╛рдХрд┐ Borrow<T>
рдХреЗ рд╕реНрд╡рд╛рдорд┐рддреНрд╡ рд╡рд╛рд▓реЗ рдореВрд▓реНрдпреЛрдВ рдХрд╛ рдЗрд▓рд╛рдЬ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХреЗ рдЬреИрд╕реЗ рдХрд┐ рд╡реЗ рдЙрдзрд╛рд░ рд▓рд┐рдП рдЧрдП рдереЗред
рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╣рдо clone
Borrow<T>
рд╕реЗ рдХреЙрд▓ рдХреЛ рдЕрдиреБрдХреВрд▓рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╡рд┐рд╢реЗрд╖рдЬреНрдЮрддрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рд╣рд╛рдБ?
pub trait CloneOrTake<T> {
fn clone_or_take(self) -> T;
}
impl<B,T> CloneOrTake<T> for B where B: Borrow<T>, T: Clone {
#[inline]
default fn clone_or_take(b: B) -> T { b.clone() }
}
impl<T> CloneOrTake<T> for T {
#[inline]
fn clone_or_take(b: T) -> T { b };
}
рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ Borrow<T>
рдЕрдзрд┐рдХ рд╕реНрдерд┐рддрд┐рдпреЛрдВ рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдпреЛрдЧреНрдп рд╣реЛ рд╕рдХрддрд╛ рд╣реИред рдореИрдВ рдЧрд┐рд░рд╛ T: ?Sized
рдмрд╛рдзреНрдп рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдПрдХ рд╕рдВрднрд╡рддрдГ рдХреА рдЬрд░реВрд░рдд рд╣реИ Sized
рдЬрдм рд▓реМрдЯрдиреЗ T
ред
рдПрдХ рдФрд░ рддрд░реАрдХрд╛ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ
pub trait ToOwnedFinal : ToOwned {
fn to_owned_final(self) -> Self::Owned;
}
impl<B> ToOwnedFinal for B where B: ToOwned {
#[inline]
default fn to_owned_final(b: B) -> Self::Owned { b.to_owned() }
}
impl<T> ToOwnedFinal for T {
#[inline]
fn to_owned_final(b: T) -> T { b };
}
рд╣рдордиреЗ рдЖрдЬ рдХреБрдЫ рд╕рдВрднрд╛рд╡рд┐рдд рдЦреЛрдЬреЛрдВ рдХреЛ рдкрд░реЗрд╢рд╛рди рдХрд░ рджрд┐рдпрд╛ рд╣реИ, рдЖрдк рдпрд╣рд╛рдБ рдЖрдИрдЖрд░рд╕реА рд▓реЙрдЧ рдкрдврд╝ рд╕рдХрддреЗ рд╣реИрдВ: https://botbot.me/mozilla/rust-lang/
рдореИрдВ рд╕рднреА рдирд┐рд╖реНрдХрд░реНрд╖реЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ 100% рдЖрд╢реНрд╡рд╕реНрдд рдирд╣реАрдВ рд╣реВрдВ, рд╡рд┐рд╢реЗрд╖рдХрд░ рдирд┐рдХреЛ рдХреА рдЯрд┐рдкреНрдкрдгреА рдХреЗ рдмрд╛рдж, рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдирд┐рдХреЛ рдХреА рдЯрд┐рдкреНрдкрдгреА рдХреЗ рдмрд╛рдж рд╕реЗ рд╣рдо рд╕рднреА рдирд┐рд╖реНрдХрд░реНрд╖реЛрдВ рдкрд░ рдкрд╣реБрдВрдЪ рдЧрдП рд╣реИрдВред рдереЛрдбрд╝реА рджреЗрд░ рдХреЗ рд▓рд┐рдП рдпрд╣ рдореЗрд░реЗ рд▓рд┐рдП рдереЛрдбрд╝рд╛ рд╕рд░реНрд╡рдирд╛рд╢ рдХрд░рдиреЗ рд╡рд╛рд▓рд╛ рд▓рдЧ рд░рд╣рд╛ рдерд╛ред
рдПрдХ рдмрд╛рдд рдЬреЛ рдореБрдЭреЗ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдорд╣рд╕реВрд╕ рд╣реЛрддреА рд╣реИ, рд╡рд╣ рдпрд╣ рд╣реИ рдХрд┐ default
рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХреЛ рдЗрд╕ рдЧрд╛рд░рдВрдЯреА рдХреЗ рд╕рд╛рде рд╕рдВрдЧрдд рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдирдП default
рдЗрдВрдкреЛрдЬрд╝ рд╣рдореЗрд╢рд╛ рдкрд┐рдЫрдбрд╝реЗ рд╕рдВрдЧрдд рд╣реЛрддреЗ рд╣реИрдВред рдпрд╣рд╛рдБ рдкреНрд░рджрд░реНрд╢рди рд╣реИ:
parent
v 1.0.0
trait A { }
trait B { }
trait C {
fn foo(&self);
}
impl<T> C for T where T: B {
// No default, not specializable!
fn foo(&self) { panic!() }
}
client
( parent
рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддрд╛ рд╣реИ)extern crate parent;
struct Local;
impl parent::A for Local { }
impl parent::C for Local {
fn foo(&self) { }
}
рд╕реНрдерд╛рдиреАрдп рдФрдЬрд╛рд░ A
рдФрд░ C
рд▓реЗрдХрд┐рди B
ред рдпрджрд┐ рд╕реНрдерд╛рдиреАрдп B
рд▓рд╛рдЧреВ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ C
рдирд┐рд╣рд┐рддрд╛рд░реНрде C for T where T: B
рдХреЗ рдЧреИрд░-рд╡рд┐рд╢рд┐рд╖реНрдЯ рдХрдВрдмрд▓ рдХреЗ рд╕рд╛рде рд╕рдВрдШрд░реНрд╖ рд╣реЛрдЧрд╛ред
parent
v 1.1.0
// Same code as before, but add:
default impl<T> B for T where T: A { }
рдпрд╣ рдЗрдореНрдкреИрдХреНрдЯ рдЬреЛрдбрд╝ рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдФрд░ рдпрд╣ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдЗрдореНрдкреИрдХреНрдЯ рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╣рдордиреЗ рдХрд╣рд╛ рд╣реИ рдХрд┐ рдпрд╣ рдПрдХ рди рдЯреВрдЯрдиреЗ рд╡рд╛рд▓рд╛ рдмрджрд▓рд╛рд╡ рд╣реИред рд╣рд╛рд▓рд╛рдБрдХрд┐ , рдпрд╣ рдПрдХ рд╕рдХрд░реНрдордХ рдирд┐рд╣рд┐рддрд╛рд░реНрде рдкреИрджрд╛ рдХрд░рддрд╛ рд╣реИ - рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА "рд╕рднреА рдП рдирд┐рд╣рд┐рдд рдмреА (рд╡рд┐рд╢реЗрд╖рдиреАрдп рдирд╣реАрдВ)" рдерд╛, "рд╕рднреА рдП рдмреА рдмреА (рд╡рд┐рд╢реЗрд╖)" рдХреЛ рдЬреЛрдбрд╝рдХрд░, рд╣рдордиреЗ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдмрдпрд╛рди "рд╕рднреА рдП рдирд┐рд╣рд┐рдд рд╕реА" (рд╡рд┐рд╢реЗрд╖ рдирд╣реАрдВ) рдЬреЛрдбрд╝рд╛ рд╣реИред "ред рдЕрдм рдмрдЪреНрдЪрд╛ рдЯреЛрдХрд░рд╛ рдЕрдкрдЧреНрд░реЗрдб рдирд╣реАрдВ рдХрд░ рд╕рдХрддрд╛ рд╣реИред
рдпрд╣ рдорд╛рдорд▓рд╛ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдЧрд╛рд░рдВрдЯреА рджреЗрдиреЗ рдХрд╛ рд╡рд┐рдЪрд╛рд░ рд╣реИ рдХрд┐ рд╡рд┐рд╢реЗрд╖ рдпреЛрдЧреНрдп рдЬреЛрдбрд╝ рдЬреЛрдбрд╝рдиреЗ рд╕реЗ рдХреЛрдИ рдкрд░рд┐рд╡рд░реНрддрди рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЦрд┐рдбрд╝рдХреА рд╕реЗ рдмрд╛рд╣рд░ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдЖрд░реЛрди рдиреЗ рджрд┐рдЦрд╛рдпрд╛ (рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рдКрдкрд░ рджрд┐рдП рдЧрдП рд▓реЙрдЧ рдореЗрдВ рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ) рдХрд┐ рдЖрдк рдРрд╕реЗ рдЕрдиреБрдорд╛рди рд▓рд┐рдЦ рд╕рдХрддреЗ рд╣реИрдВ рдЬреЛ рдбрд┐рдлрд╝реЙрд▓реНрдЯрддрд╛ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕рдорд╛рди рдЧрд╛рд░рдВрдЯреА рджреЗрддреЗ рд╣реИрдВ ред рд╣рд╛рд▓рд╛рдВрдХрд┐, рдирд┐рдХреЛ рдХреА рдмрд╛рдж рдХреА рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдВ рдмрддрд╛рддреА рд╣реИрдВ рдХрд┐ рдЕрдирд╛рде рдирд┐рдпрдореЛрдВ рдХреЗ рддрд╣рдд рдЗрд╕ рддрд░рд╣ рдХреЗ рдЖрд░реЛрдкреЛрдВ рдХреЛ рдкреНрд░рддрд┐рдмрдВрдзрд┐рдд (рдпрд╛ рдХрдо рд╕реЗ рдХрдо рдирд┐рд╖реЗрдзрд╛рддреНрдордХ) рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред
рдореЗрд░реЗ рд▓рд┐рдП рдЕрдкрдиреЗ рдЕрдирд┐рд╢реНрдЪрд┐рдд рддреЛ 'impls рдЧреИрд░ рддреЛрдбрд╝рдиреЗ' рдЕрдЧрд░ рдЧрд╛рд░рдВрдЯреА salvageable рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рдирд┐рд╢реНрдЪрд┐рдд рд╣реИ рдХрд┐ рдпрд╣ impl рдЕрдВрддрд┐рдо рдкрд░ рд╕реНрдкрд╖реНрдЯ рдирд┐рдпрдВрддреНрд░рдг рдХреЗ рд╕рд╛рде рд╕рдВрдЧрдд рдирд╣реАрдВ рд╣реИред
рдХреНрдпрд╛ рдЗрд╕рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдиреЗ рдкрд░ рдХреЛрдИ рдпреЛрдЬрдирд╛ рд╣реИ?
struct Foo;
trait Bar {
fn bar<T: Read>(stream: &T);
}
impl Bar for Foo {
fn bar<T: Read>(stream: &T) {
let stream = BufReader::new(stream);
// Work with stream
}
fn bar<T: BufRead>(stream: &T) {
// Work with stream
}
}
рддреЛ рдЕрдирд┐рд╡рд╛рд░реНрдп рд░реВрдк рд╕реЗ рдПрдХ рдЯреЗрдореНрдкрд▓реЗрдЯ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд▓рд┐рдП рдПрдХ рд╡рд┐рд╢реЗрд╖рдЬреНрдЮрддрд╛, рдЬрд┐рд╕рдореЗрдВ A
рдмрд╛рдЙрдВрдб рдХреЗ рд╕рд╛рде рдПрдХ рдкреНрд░рдХрд╛рд░ рдХрд╛ рдкреИрд░рд╛рдореАрдЯрд░ рд╣реЛрддрд╛ рд╣реИ, рдЬрд╣рд╛рдВ рд╡рд┐рд╢реЗрд╖ рд╕рдВрд╕реНрдХрд░рдг рдореЗрдВ B
(рдЬрд┐рд╕рдореЗрдВ A
рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ) рдкрд░ рдмрд╛рдЙрдВрдб рд╣реЛрддрд╛ рд╣реИред
@torkleyy рд╡рд░реНрддрдорд╛рди рдореЗрдВ рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдЖрдк рдЗрд╕реЗ рдЧреБрдкреНрдд рд░реВрдк рд╕реЗ рдПрдХ рд╡рд┐рд╢реЗрд╖рддрд╛ рдмрдирд╛рдХрд░ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЬреЛ T: Read
рдФрд░ T: BufRead
рдФрд░ рдЖрдкрдХреЗ рдХреЛрдб рдХреЗ рдЙрди рд╣рд┐рд╕реНрд╕реЛрдВ рдХреЛ рд╢рд╛рдорд┐рд▓ рдХрд░рддрд╛ рд╣реИ рдЬрд┐рдиреНрд╣реЗрдВ рдЖрдк рдЙрд╕ рд╡рд┐рд╢реЗрд╖рддрд╛ рдХреЗ рдирд┐рд╣рд┐рддрд╛рд░реНрде рдореЗрдВ рд╡рд┐рд╢реЗрд╖рдЬреНрдЮ рдмрдирд╛рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВред рдЗрд╕реЗ рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ API рдореЗрдВ рджрд┐рдЦрд╛рдИ рджреЗрдиреЗ рдХреА рднреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред
рдмреИрдХрд╡рд░реНрдб рд╕рдВрдЧрддрддрд╛ рд╕рдорд╕реНрдпрд╛ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ, рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЕрдирд╛рде рдирд┐рдпрдореЛрдВ рдХреЗ рд▓рд┐рдП рд╣рдо рдЗрди рдирд┐рдпрдореЛрдВ рд╕реЗ рджреВрд░ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ:
_An рдЬреЛрдбрд╝ рдЬрдм рддрдХ рдкреАрдЫреЗ рдЬреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдВрдЧрдд рд╣реИ: _
рдпрд╣реА рд╣реИ, рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╕рднреА рд╕рдорд╕реНрдпрд╛рдЧреНрд░рд╕реНрдд рдЙрджрд╛рд╣рд░рдгреЛрдВ рдореЗрдВ рдЬреЛрдбрд╝рд╛ рдЧрдпрд╛ рдПрдХ рдХрдВрдмрд▓ рдирд┐рд╣рд┐рдд рд╣реИред рд╣рдо рдпрд╣ рдХрд╣рдирд╛ рдЪрд╛рд╣рддреЗ рдереЗ рдХрд┐ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдХрдВрдмрд▓ рдкреНрд░рддреНрдпрд╛рд░реЛрдкрдг рднреА рдареАрдХ рд╣реИ, рд▓реЗрдХрд┐рди рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╣рдореЗрдВ рд╕рд┐рд░реНрдл рдпрд╣ рдХрд╣рдирд╛ рд╣реИ рдХрд┐ рдореМрдЬреВрджрд╛ рдХрдВрдмрд▓ рдкреНрд░рддреНрдпрд╛рд░реЛрдкрдгреЛрдВ рдХреЛ рдЬреЛрдбрд╝рдирд╛ рдПрдХ рдкрд░рд┐рд╡рд░реНрддрди рд╣реЛ рд╕рдХрддрд╛ рд╣реИред
рд╕рд╡рд╛рд▓ рдпрд╣ рд╣реИ рдХрд┐ рд╣рдо рдЙрд╕ рдХреЗ рд╕рд╛рдордиреЗ рдХреНрдпрд╛ рдЧрд╛рд░рдВрдЯреА рджреЗрдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ - рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдПрдХ рдмрд╣реБрдд рдЕрдЪреНрдЫреА рд╕рдВрдкрддреНрддрд┐ рд╣реЛрдЧреА рдпрджрд┐ рдХрдо рд╕реЗ рдХрдо рдПрдХ рдХрдВрдмрд▓ рдХреЗрд╡рд▓ рдЖрдкрдХреЗ рдЯреЛрдХрд░реЗ рдореЗрдВ рдХреЛрдб рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдПрдХ рдмреНрд░реЗрдХрд┐рдВрдЧ рдкрд░рд┐рд╡рд░реНрддрди рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рддреЛ рдЖрдк рд╕рдореАрдХреНрд╖рд╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдЖрдкрдХреЗ рдЯреЛрдХрд░реЗ рдФрд░ рдирд┐рд╢реНрдЪрд┐рддрддрд╛ рдХреЗ рд╕рд╛рде рдЬрд╛рдирддреЗ рд╣реИрдВ рдХрд┐ рдЖрдкрдХреЛ рдкреНрд░рдореБрдЦ рд╕рдВрд╕реНрдХрд░рдг рдХреЛ рдмрдврд╝рд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдпрд╛ рдирд╣реАрдВред
@withoutboats
рдмреИрдХрд╡рд░реНрдб рд╕рдВрдЧрддрддрд╛ рд╕рдорд╕реНрдпрд╛ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ, рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЕрдирд╛рде рдирд┐рдпрдореЛрдВ рдХреЗ рд▓рд┐рдП рд╣рдо рдЗрди рдирд┐рдпрдореЛрдВ рд╕реЗ рджреВрд░ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ:
_An рдЬреЛрдбрд╝ рдЬрдм рддрдХ рдкреАрдЫреЗ рдЬреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдВрдЧрдд рд╣реИ: _
- _ рдпрд╣ рд▓рдХреНрд╖рдг рдирд┐рд╣рд┐рдд рд╣реИ рдПрдХ рдСрдЯреЛ рд╡рд┐рд╢реЗрд╖рддрд╛ рд╣реИ ред_
- _ рд░рд┐рд╕реАрд╡рд░ рдПрдХ рдкреНрд░рдХрд╛рд░ рдХрд╛ рдкреИрд░рд╛рдореАрдЯрд░ рд╣реИ, рдФрд░ рдирд┐рд╣рд┐рдд рдореЗрдВ рдкреНрд░рддреНрдпреЗрдХ рдЧреБрдг рдкрд╣рд▓реЗ рд╕реЗ рдореМрдЬреВрдж рд╣реИ ред_
рдпрд╣реА рд╣реИ, рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╕рднреА рд╕рдорд╕реНрдпрд╛рдЧреНрд░рд╕реНрдд рдЙрджрд╛рд╣рд░рдгреЛрдВ рдореЗрдВ рдЬреЛрдбрд╝рд╛ рдЧрдпрд╛ рдПрдХ рдХрдВрдмрд▓ рдирд┐рд╣рд┐рдд рд╣реИред рд╣рдо рдпрд╣ рдХрд╣рдирд╛ рдЪрд╛рд╣рддреЗ рдереЗ рдХрд┐ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдХрдВрдмрд▓ рдкреНрд░рддреНрдпрд╛рд░реЛрдкрдг рднреА рдареАрдХ рд╣реИ, рд▓реЗрдХрд┐рди рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╣рдореЗрдВ рд╕рд┐рд░реНрдл рдпрд╣ рдХрд╣рдирд╛ рд╣реИ рдХрд┐ рдореМрдЬреВрджрд╛ рдХрдВрдмрд▓ рдкреНрд░рддреНрдпрд╛рд░реЛрдкрдгреЛрдВ рдХреЛ рдЬреЛрдбрд╝рдирд╛ рдПрдХ рдкрд░рд┐рд╡рд░реНрддрди рд╣реЛ рд╕рдХрддрд╛ рд╣реИред
рдПрдХ рд╣рдлреНрддреЗ рдФрд░ рдХрдИ рдЪрд░реНрдЪрд╛рдУрдВ рдХреЗ рдмрд╛рдж, рдпрд╣ рджреБрд░реНрднрд╛рдЧреНрдп рд╕реЗ рдорд╛рдорд▓рд╛ рдирд╣реАрдВ рдирд┐рдХрд▓рд╛ рд╣реИред
рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдЬреЛ рдкрд░рд┐рдгрд╛рдо рд╣реИрдВ рд╡реЗ рд╣реИрдВ: crying_cat_face :,, рд▓реЗрдХрд┐рди рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдореИрдВрдиреЗ рдЬреЛ рд▓рд┐рдЦрд╛ рдерд╛ рд╡рд╣ рдЖрдкрдХреЗ рдирд┐рд╖реНрдХрд░реНрд╖ рдХреЗ рд╕рдорд╛рди рд╣реИред рдХрдВрдмрд▓ рдЗрдореНрдкреНрд▓рд╛рдВрдЯ рдЬреЛрдбрд╝рдирд╛ рдПрдХ рдкрд░рд┐рд╡рд░реНрддрди рд╣реИ, рдЪрд╛рд╣реЗ рдЬреЛ рднреА рд╣реЛред рд▓реЗрдХрд┐рди рдХреЗрд╡рд▓ рдХрдВрдмрд▓ рдирд┐рд╣рд┐рдд рд╣реИ (рдФрд░ рдСрдЯреЛ рд╡рд┐рд╢реЗрд╖рддрд╛ рдкреНрд░рддреНрдпрд╛рд░реЛрдкрдг); рдЬрд╣рд╛рдВ рддрдХ тАЛтАЛрдореБрдЭреЗ рдкрддрд╛ рд╣реИ рдХрд┐ рд╣рдореЗрдВ рдРрд╕рд╛ рдорд╛рдорд▓рд╛ рдирд╣реАрдВ рдорд┐рд▓рд╛ рд╣реИ, рдЬрд╣рд╛рдВ рдиреЙрди-рдХрдВрдмрд▓ рдЗрдореНрдкреНрд▓рд╛рдВрдЯ рдбрд╛рдЙрдирд╕реНрдЯреНрд░реАрдо рдХреЛрдб рдХреЛ рддреЛрдбрд╝ рд╕рдХреЗ (рдФрд░ рдпрд╣ рдмрд╣реБрдд рдмреБрд░рд╛ рд╣реЛрдЧрд╛)ред
рдореИрдВрдиреЗ рдПрдХ рдмрд┐рдВрджреБ рдкрд░ рд╕реЛрдЪрд╛ рдерд╛ рдХрд┐ рд╣рдо рдЕрдирд╛рде рдирд┐рдпрдореЛрдВ рдХреЛ рд╢рд┐рдерд┐рд▓ рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ рддрд╛рдХрд┐ рдЖрдк Vec<MyType>
рдЬреИрд╕реЗ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рд▓рд┐рдП рд▓рдХреНрд╖рдгреЛрдВ рдХреЛ рд▓рд╛рдЧреВ рдХрд░ рд╕рдХреЗрдВ, рд▓реЗрдХрд┐рди рдЕрдЧрд░ рд╣рдордиреЗ рдХрд┐рдпрд╛ рдХрд┐ рдпрд╣ рд╕реНрдерд┐рддрд┐ рддрдм рдареАрдХ рдЙрд╕реА рддрд░рд╣ рд╕реЗ рдЪрд▓реЗрдЧреА:
//crate A
trait Foo { }
// new impl
// impl<T> Foo for Vec<T> { }
// crate B
extern crate A;
use A::Foo;
trait Bar {
type Assoc;
}
// Sadly, this impl is not an orphan
impl<T> Bar for Vec<T> where Vec<T>: Foo {
type Assoc = ();
}
// crate C
struct Baz;
// Therefore, this impl must remain an orphan
impl Bar for Vec<Baz> {
type Assoc = bool;
}
@withoutboats рдЖрд╣, рдореИрдВ, рдХреЗ рд░реВрдк рдореЗрдВ рдпрд╛ рдХреЗ рдмрдЬрд╛рдп рдФрд░ рдЕрдкрдиреЗ рджреЛ рдмреБрд▓реЗрдЯ рд╕реВрдЪреА рд╕рдордЭрд╛ рдЬреЛ рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рддреБрдо рдХреНрдпрд╛ рдорддрд▓рдм рд╣реИ?
@ рдпреВрдЯреНрд░реЙрди рдпреЗ, рдореЗрд░рд╛ рдорддрд▓рдм рдерд╛ 'рдпрд╛' - рд╡реЗ рджреЛ рдорд╛рдорд▓реЗ рд╣реИрдВ рдЬрд╣рд╛рдВ рдпрд╣ рдПрдХ рдкрд░рд┐рд╡рд░реНрддрди рд╣реИред рдХреЛрдИ рднреА рдСрдЯреЛ рдирд┐рд╢рд╛рди, рдЪрд╛рд╣реЗ рдХрд┐рддрдирд╛ рднреА рдареЛрд╕ рдХреНрдпреЛрдВ рди рд╣реЛ, рдПрдХ рдмреНрд░реЗрдХрд┐рдВрдЧ рдЪреЗрдВрдЬ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдЬрд┐рд╕ рддрд░рд╣ рд╕реЗ рд╣рдо рдЙрдирдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдирдХрд╛рд░рд╛рддреНрдордХ рддрд░реНрдХ рджреЗрддреЗ рд╣реИрдВ, рдЙрд╕реЗ рдкреНрд░рдЪрд╛рд░рд┐рдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рд╣реИ: https://is.gd/k4Xtlp
рдпрд╣реА рд╣реИ, рдЬрдм рддрдХ рдХрд┐ рдЗрд╕рдореЗрдВ рдирдП рдирд╛рдо рди рд╣реЛрдВред AFAIK рдПрдХ рдирдпрд╛ рдирд╛рдо рд╣реИ рдХрд┐ рдПрдХ рдирд┐рд╣рд┐рдд рд╣реИ рдХрднреА рдирд╣реАрдВ рддреЛрдбрд╝ рд░рд╣рд╛ рд╣реИред
@withoutboats рдореБрдЭреЗ рдЖрд╢реНрдЪрд░реНрдп рд╣реЛрддрд╛ рд╣реИ рдХрд┐ рдЕрдЧрд░ рд╣рдо рдСрдЯреЛ-рд▓рдХреНрд╖рдг рдХреЗ рдЖрд╕рдкрд╛рд╕ рдирдХрд╛рд░рд╛рддреНрдордХ рддрд░реНрдХ рдкрд░ рднрд░реЛрд╕рд╛ рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рд▓реЛрдЧреЛрдВ рдХреЛ рд░реЛрдХ рд╕рдХрддреЗ рд╣реИрдВ / рдЪрд╛рд╣рд┐рдПред рдпрд╣реА рд╣реИ, рдЕрдЧрд░ рд╣рдордиреЗ рдХрд╣рд╛ рдХрд┐ рдСрдЯреЛ рдЯреНрд░реИрдХреНрдЯреНрд╕ рдХреЗ рдирдП рдЗрдореНрдкреНрд▓рд┐рдЯреНрд╕ рдХреЛ рдЬреЛрдбрд╝рдирд╛ рдПрдХ рдХрд╛рдиреВрдиреА рд░реВрдк рд╕реЗ рдЯреВрдЯрдиреЗ рд╡рд╛рд▓рд╛ рдмрджрд▓рд╛рд╡ рд╣реИ, рддреЛ рд╣рдо рдлрд┐рд░ рд╕реЗ рдЙрди рдЗрдореНрдкреНрд▓рд╛рдВрдЯреНрд╕ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЖрдЧрд╛рд╣ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЬрд┐рдиреНрд╣реЗрдВ рдЕрдкрд╕реНрдЯреНрд░реАрдо рдХреНрд░реЗрдЯ рджреНрд╡рд╛рд░рд╛ Send
рдЬреЛрдбрд╝рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдпрд╣ рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ рдХрд╛рдо рдХрд░реЗрдЧрд╛ рдЕрдЧрд░ рд╣рдорд╛рд░реЗ рдкрд╛рд╕:
default
рдЬреЛрдбрд╝рдХрд░ рдЪреЗрддрд╛рд╡рдирд┐рдпреЛрдВ рдХреЛ рдкрд╛рд░ рдХрд░ рд╕рдХрддрд╛ рд╣реИ (рдмрд╣реБрдд рд╕рдордп);Rc
рдЬреИрд╕реЗ рдкреНрд░рдХрд╛рд░ рдХрднреА рднреА Send
рд▓рд┐рдП рдЙрдирдХреЗ рдЗрд░рд╛рджреЗ рдХреА рдШреЛрд╖рдгрд╛ рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ - рд▓реЗрдХрд┐рди рдлрд┐рд░ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдСрдЯреЛ рд▓рдХреНрд╖рдгреЛрдВ рдХреЗ рд▓рд┐рдП рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╣рдо рдЙрдиреНрд╣реЗрдВ рдзреНрдпрд╛рди рдореЗрдВ рд░рдЦ рд╕рдХрддреЗ рд╣реИрдВредрдореБрдЭреЗ рдирд╣реАрдВ рдкрддрд╛ рдХрд┐ рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдЗрд╕ рдмрд╛рдд рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдордЬрдмреВрдд рдкреНрд░реЗрд░рдгрд╛ рд╣реИ рдпрд╛ рдирд╣реАрдВред рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рд╕рдВрднрд╛рд╡рдирд╛ рдирд╣реАрдВ рд╣реИ рдХрд┐ рдЖрдк рдорд╣рд╕реВрд╕ рдХрд░реЗрдВрдЧреЗ рдХрд┐ рдЖрдкрдХреЗ рджреНрд╡рд╛рд░рд╛ рдкрд╣рд▓реЗ рд╣реА рдЬрд╛рд░реА рдХрд┐рдП рдЬрд╛рдиреЗ рдХреЗ рдмрд╛рдж рдПрдХ рдкреНрд░рдХрд╛рд░ рдХрд╛ unsafe impl Send/Sync
рд╣реЛ рд╕рдХрддрд╛ рд╣реИ; рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЕрдзрд┐рдХрд╛рдВрд╢ рд╕рдордп рд╕реБрд░рдХреНрд╖рд┐рдд рд╣реЛрдЧрд╛, рдЖрдкрдиреЗ рдПрдХ рдкреНрд░рдХрд╛рд░ рд╕реЗ рд▓рд┐рдЦрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рд╕реБрд░рдХреНрд╖рд┐рдд рд╣реЛрдЧрд╛ (рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдкреНрд░рдХрд╛рд░ рдХрд╛ рдмрд┐рдВрджреБ рд╣реИ)ред
рдореИрдВ рд╣рд░ рд╕рдордп рддрдереНрдп рдХреЗ рдмрд╛рдж unsafe impl Send/Sync
рдЬреЛрдбрд╝рддрд╛ рд╣реВрдВред рдХрднреА-рдХрднреА рдХреНрдпреЛрдВрдХрд┐ рдореИрдВ рдЗрд╕реЗ рд╕реБрд░рдХреНрд╖рд┐рдд рдмрдирд╛рддрд╛ рд╣реВрдВ, рдХрднреА-рдХрднреА рдХреНрдпреЛрдВрдХрд┐ рдореБрдЭреЗ рдПрд╣рд╕рд╛рд╕ рд╣реЛрддрд╛ рд╣реИ рдХрд┐ рдЬрд┐рд╕ рд╕реА рдПрдкреАрдЖрдИ рдХреЗ рд╕рд╛рде рдореИрдВ рдЕрдВрддрд░ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ рд╡рд╣ рдереНрд░реЗрдбреНрд╕ рдореЗрдВ рд╕рд╛рдЭрд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдареАрдХ рд╣реИ, рдФрд░ рдХрднреА-рдХрднреА рдпрд╣ рд╕рд┐рд░реНрдл рдЗрд╕рд▓рд┐рдП рд╣реИ рдХрд┐ рдХреНрдпрд╛ рдХреБрдЫ Send
/ Sync
isn рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП рдЬрдм рдореИрдВ рдПрдХ рдкреНрд░рдХрд╛рд░ рдХрд╛ рдкрд░рд┐рдЪрдп рджреЗрддрд╛ рд╣реВрдВ, рддреЛ рдореИрдВ рдХреНрдпрд╛ рд╕реЛрдЪ рд░рд╣рд╛ рд╣реВрдВред
рдореИрдВ рд╕реА рдПрдкреАрдЖрдИ рдХреЛ рдмрд╛рдВрдзрддреЗ рд╕рдордп рдЗрд╕ рддрдереНрдп рдХреЗ рдмрд╛рдж рднреА рдЙрдиреНрд╣реЗрдВ рдЬреЛрдбрд╝рддрд╛ рд╣реВрдВ - рдЕрдХреНрд╕рд░ рдХреНрдпреЛрдВрдХрд┐ рдХреЛрдИ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдЙрди рд╕реАрдорд╛рдУрдВ рдХреЗ рд▓рд┐рдП рдкреВрдЫрддрд╛ рд╣реИ рдЗрд╕рд▓рд┐рдП рдореИрдВ рдлрд┐рд░ рд╕реЗ рдЧреБрдЬрд░рддрд╛ рд╣реВрдВ рдФрд░ рдЬрд╛рдВрдЪрддрд╛ рд╣реВрдВ рдХрд┐ рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХреНрдпрд╛ рдЧрд╛рд░рдВрдЯреА рджреЗрддрд╛ рд╣реИред
рдПрдХ рдмрд╛рдд рдореБрдЭреЗ рдкрд╕рдВрдж рдирд╣реАрдВ рд╣реИ рдХрд┐ рдХреИрд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рд▓рдХреНрд╖рдг рдЕрднреА рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВ, рдпрд╣ рдкреИрдЯрд░реНрди рдХрд╛рдо рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ:
trait Buffer: Read {
type Buffered: BufRead;
fn buffer(self) -> impl BufRead;
}
impl<T: Read> Buffer for T {
default type Buffered = BufReader<T>;
default fn buffer(self) -> BufReader<T> {
BufReader::new(self)
}
}
impl<T: BufRead> Buffer for T {
type Buffered = Self;
fn buffer(self) -> T {
self
}
}
рдРрд╕рд╛ рдЗрд╕рд▓рд┐рдП рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рд╡рд░реНрддрдорд╛рди рдкреНрд░рдгрд╛рд▓реА рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рд╣реИ рдХрд┐ рдпрд╣ рдирд┐рд╣рд┐рдд рдорд╛рдиреНрдп рд╣реЛ:
impl Buffer for SomeRead {
type Buffered = SomeBufRead;
// no overriding of fn buffer, it no longer returns Self::Buffered
}
impl Trait
рдореЗрдВ рд▓рдХреНрд╖рдг рдЗрд╕ рддрд░рд╣ рдХреЗ рдкреИрдЯрд░реНрди рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рд╕рд╛рд░реА рдЗрдЪреНрдЫрд╛рдПрдВ рдЬрд╛рд░реА рдХрд░реЗрдВрдЧреЗ, рд▓реЗрдХрд┐рди рдореБрдЭреЗ рдЖрд╢реНрдЪрд░реНрдп рд╣реИ рдХрд┐ рдЕрдЧрд░ рдХреЛрдИ рдмреЗрд╣рддрд░ рд╕рдорд╛рдзрд╛рди рдирд╣реАрдВ рд╣реИ рдЬрд╣рд╛рдВ рдЬреЗрдиреЗрд░рд┐рдХ рдирд┐рд╣рд┐рдд рдорд╛рдиреНрдп рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рд╡рд┐рд╢реЗрд╖рдЬреНрдЮрддрд╛ рдХрд╛рдо рдирд╣реАрдВ рдХрд░рддреА рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдПрдХ рдкреНрд░рдХрд╛рд░ рдХреА рддреНрд░реБрдЯрд┐ рдХрд╛ рдкрд░рд┐рдЪрдп рджреЗрддрд╛ рд╣реИ ?
@withoutboats рд╣рд╛рдБ, рдпрд╣ рдбрд┐рдЬрд╝рд╛рдЗрди рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдореБрдЦреНрдп рдЕрдирд╕реБрд▓рдЭреЗ рдкреНрд░рд╢реНрдиреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рд╣реИ (рдЬреЛ рдореИрдВ рд╣рд╛рд▓рд┐рдпрд╛ рдЪрд░реНрдЪрд╛рдУрдВ рдореЗрдВ рд▓рд╛рдирд╛ рднреВрд▓ рдЧрдпрд╛ рд╣реВрдБ)ред рдореВрд▓ RFC рдереНрд░реЗрдб рдкрд░ рдЗрд╕ рдмрд╛рд░реЗ рдореЗрдВ рдЙрдЪрд┐рдд рдЪрд░реНрдЪрд╛ рд╣реБрдИ рд╣реИ, рд▓реЗрдХрд┐рди рдореИрдВ рдЬрд▓реНрдж рд╣реА рд╡рд┐рдХрд▓реНрдкреЛрдВ / рдЯреНрд░реЗрдбрдСрдл рдХрд╛ рд╕рд╛рд░рд╛рдВрд╢ рд▓рд┐рдЦрдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░реВрдВрдЧрд╛ред
@aturon рд╡рд░реНрддрдорд╛рди рд╕рдорд╛рдзрд╛рди рд╕рдмрд╕реЗ рд░реВрдврд╝рд┐рд╡рд╛рджреА рд╣реИ (рд╣рдо рдЬреЛ рднреА рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдЙрд╕рдХреЗ рд╕рд╛рде рд╕рдВрдЧрдд рд╣реИ) рдпрд╛ рдпрд╣ рдПрдХ рдРрд╕рд╛ рдирд┐рд░реНрдгрдп рд╣реИ рдЬрд┐рд╕реЗ рд╣рдореЗрдВ рд╕реНрдерд┐рд░ рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдХрд░рдирд╛ рд╣реЛрдЧрд╛?
рдореИрдВ рд╡реНрдпрдХреНрддрд┐рдЧрдд рд░реВрдк рд╕реЗ рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рдХрд╛ рдПрдХрдорд╛рддреНрд░ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рд╕рдорд╛рдзрд╛рди рд╕рдордЭрддрд╛ рд╣реВрдВ рдХрд┐ @withoutboats рдиреЗ рдЖрдЗрдЯрдо рдХреЛ "рд╕рдореВрд╣реАрдХреГрдд" рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рддрдм рджреА рдЬрдм рдЖрдк default
рдЯреИрдЧ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рддреЗ рд╣реИрдВред рдпрд╣ рдмреЗрд╣рддрд░-рдмреЗрд╣рддрд░-рдмреЗрд╣рддрд░ рд╕рдорд╛рдзрд╛рди рдХреА рддрд░рд╣ рд╣реИ, рд▓реЗрдХрд┐рди рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЗрд╕рд╕реЗ рднреА рдмрджрддрд░-рдмреЗрд╣рддрд░ рд╕рдВрд╕реНрдХрд░рдг (рдХрд┐рд╕реА рднреА рддрд░рд╣ рд╕реЗ рдУрд╡рд░рд░рд╛рдЗрдб рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рд╕рднреА рдХреЛ рдУрд╡рд░рд░рд╛рдЗрдб рдХрд░рдирд╛) рдХрд╛рдлреА рдЦрд░рд╛рдм рд╣реИред (рд▓реЗрдХрд┐рди рдЕрд╕рд▓ рдореЗрдВ @withoutboats рдЬрд┐рд╕ рддрд░рд╣ рд╕реЗ рдЖрдк рдиреЗ рд▓рд┐рдЦрд╛ рд╣реИ рдЗрд╕ рдХреЛрдб рдХреЛ рднреНрд░рдорд┐рдд рдХрд░ рд░рд╣рд╛ рд╣реИред рдореИрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рдХреЗ рд╕реНрдерд╛рди рдкрд░ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ impl BufRead
рдХреА рд╡рд╛рдкрд╕реА рдкреНрд░рдХрд╛рд░ рдХреЗ рд░реВрдк рдореЗрдВ Buffer
, рдЖрдк рдорддрд▓рдм Self::BufReader
, рд╣реИ рдирд╛?)
рдЙрд╕ рд╕реНрдерд┐рддрд┐ рдореЗрдВ, рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХреА рдЕрдиреБрдорддрд┐ рд╣реЛрдЧреА:
trait Buffer: Read {
type Buffered: BufRead;
fn buffer(self) -> impl BufRead;
}
impl<T: Read> Buffer for T {
default {
type Buffered = BufReader<T>;
fn buffer(self) -> BufReader<T> {
BufReader::new(self)
}
}
}
impl<T: BufRead> Buffer for T {
type Buffered = Self;
fn buffer(self) -> T {
self
}
}
рд▓реЗрдХрд┐рди рд╢рд╛рдпрдж рд╣рдо рдЗрди рд╕рдореВрд╣реЛрдВ рдХрд╛ рдЕрдиреБрдорд╛рди рд▓рдЧрд╛ рд╕рдХрддреЗ рд╣реИрдВ? рдореИрдВрдиреЗ рдЗрд╕реЗ рдмрд╣реБрдд рд╕реЛрдЪрд╛ рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЖрдЗрдЯрдо рдХреА рдЪреВрдХ "рдЙрд▓рдЭрд╛ рд╣реБрдЖ" рд╣реИ, рдЬреЛ рдХрд┐ рд╕реНрдкрд╖реНрдЯ рд╣реИред
рд▓реЗрдХрд┐рди рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ @withoutboats рдЬрд┐рд╕ рддрд░рд╣ рд╕реЗ рдЖрдкрдиреЗ рдЗрд╕ рдХреЛрдб рдХреЛ рд▓рд┐рдЦрд╛ рд╣реИ рд╡рд╣ рднреНрд░рдорд┐рдд рдХрд░рдиреЗ рд╡рд╛рд▓рд╛ рд╣реИред рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ BufRead рдХреЛ рдмрдлрд╝рд░ рдХреЗ рд░рд┐рдЯрд░реНрди рдкреНрд░рдХрд╛рд░ рдХреЗ рд░реВрдк рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд╕реНрдерд╛рди рдкрд░, рдЖрдкрдХрд╛ рдорддрд▓рдм рд╣реИ :: :: BufReader, рд╕рд╣реА рд╣реИ?
рд╣рд╛рдВ, рдореИрдВрдиреЗ рдЯреНрд░реИрдк рдЖрдзрд╛рд░рд┐рдд рдПрдХ рдХреЗ рд╕рдорд╛рдзрд╛рди рдХреЛ рд╕рдВрд╢реЛрдзрд┐рдд рдХрд┐рдпрд╛ рдерд╛ рдФрд░ рдлрд┐рд░ рд╡рд╛рдкрд╕ рд╕реНрд╡рд┐рдЪ рдХрд░ рджрд┐рдпрд╛ рдерд╛, рд▓реЗрдХрд┐рди рд░рд┐рдЯрд░реНрди рдЯрд╛рдЗрдк рдХреЛ рд╡рд┐рд╢реЗрд╖рддрд╛ рдореЗрдВ рдпрд╛рдж рдХрд┐рдпрд╛ред
рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдЗрд╕ рднрд╛рд╖рд╛ рдХреА рдкреНрд░рдХрд╛рд░ рдкреНрд░рдгрд╛рд▓реА рдХреА рддрд░рд╣ рдХреБрдЫ рднреА рджрд┐рд▓рдЪрд╕реНрдк рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рд░реБрд╕реНрдЯреНрд╕ рдХреЗ рд╕рдорд╛рди рд▓рдЧрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдХреБрдЫ рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдХреЗ рд╕рд╛рде, рдЬреЛ рд╡рд░реНрддрдорд╛рди рд╕рдорд╕реНрдпрд╛рдУрдВ рдХреЛ рд╣рд▓ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
( A <: B
рд░реБрд╕реНрдЯ рдореЗрдВ рд╕рдЪ рд╣реЛрдЧрд╛ рдЬрдм A
рдПрдХ рд╕рдВрд░рдЪрдирд╛ рд╣реИ рдФрд░ B
, рдпрд╛ рдЬрдм A
рдПрдХ рд╡рд┐рд╢реЗрд╖рддрд╛ рд╣реИ, рдФрд░ рд╡рд╕реНрддреБрдУрдВ рдХреА рд╡рд╕реНрддреБрдУрдВ рдХреЗ рд▓рд┐рдП рд╕рд╛рдорд╛рдиреНрдп рдЬрд╛рдирдХрд╛рд░реА рдпрд╣ рд╡рд┐рд╢реЗрд╖рддрд╛ рдореМрдЬреВрдж рд╣реИ, рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ)
рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╡рд┐рд╢реЗрд╖рдЬреНрдЮрддрд╛ рдХреЗ рд▓рд┐рдП Display
рд╡рд┐рд╢реЗрд╖рддрд╛ рдХреЗ рд╕рд╛рде рдПрдХ рдореБрджреНрджрд╛ рд╣реИред
рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдпрд╣ рдЙрджрд╛рд╣рд░рдг рд╕рдВрдХрд▓рд┐рдд рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ:
use std::fmt::Display;
pub trait Print {
fn print(&self);
}
impl<T: Display> Print for T {
default fn print(&self) {
println!("Value: {}", self);
}
}
impl Print for () {
fn print(&self) {
println!("No value");
}
}
fn main() {
"Hello, world!".print();
().print();
}
рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рддреНрд░реБрдЯрд┐ рдХреЗ рд╕рд╛рде:
error[E0119]: conflicting implementations of trait `Print` for type `()`:
--> src/main.rs:41:1
|
35 | impl<T: Display> Print for T {
| _- starting here...
36 | | default fn print(&self) {
37 | | println!("Value: {}", self);
38 | | }
39 | | }
| |_- ...ending here: first implementation here
40 |
41 | impl Print for () {
| _^ starting here...
42 | | fn print(&self) {
43 | | println!("No value");
44 | | }
45 | | }
| |_^ ...ending here: conflicting implementation for `()`
рдЗрд╕ рд╕рдВрдХрд▓рди рдХреЗ рджреМрд░рд╛рди:
pub trait Print {
fn print(&self);
}
impl<T: Default> Print for T {
default fn print(&self) {
}
}
impl Print for () {
fn print(&self) {
println!("No value");
}
}
fn main() {
"Hello, world!".print();
().print();
}
рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рдХреЛ рдареАрдХ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рджред
@antoyo рдХреНрдпрд╛ рдЖрдкрдХреЛ рдпрдХреАрди рд╣реИ рдХрд┐ Display
рд╡рд┐рд╢реЗрд╖ рд╣реИ, рдпрд╛ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ Display
tuples рдХреЗ рд▓рд┐рдП рд▓рд╛рдЧреВ рдирд╣реАрдВ рд╣реБрдЖ рд╣реИ рдЬрдмрдХрд┐ Default
рд╣реИ?
@shepmaster
рдореБрдЭреЗ рдирд╣реАрдВ рдкрддрд╛ рдХрд┐ рдпрд╣ рд▓рдЧрднрдЧ Display
, рд▓реЗрдХрд┐рди рдирд┐рдореНрди рдХрд╛рд░реНрдп Custom
рдЯреБрдкрд▓реНрд╕ рдХреЗ рд▓рд┐рдП рд▓рд╛рдЧреВ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ:
pub trait Custom { }
impl<'a> Custom for &'a str { }
pub trait Print {
fn print(&self);
}
impl<T: Custom> Print for T {
default fn print(&self) {
}
}
impl Print for () {
fn print(&self) {
println!("No value");
}
}
fn main() {
"Hello, world!".print();
().print();
}
рд╡реИрд╕реЗ, рдпрд╣рд╛рдБ рдЕрд╕рд▓реА рдЪреАрдЬрд╝ рд╣реИ рдЬрд┐рд╕реЗ рдореИрдВ рд╡рд┐рд╢реЗрд╖рдЬреНрдЮрддрд╛ рдХреЗ рд╕рд╛рде рд╣рд╛рд╕рд┐рд▓ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдБ:
pub trait Emit<C, R> {
fn emit(callback: C, value: Self) -> R;
}
impl<C: Fn(Self) -> R, R, T> Emit<C, R> for T {
default fn emit(callback: C, value: Self) -> R {
callback(value)
}
}
impl<C> Emit<C, C> for () {
fn emit(callback: C, _value: Self) -> C {
callback
}
}
рдореИрдВ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ рдХреЙрд▓ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ, рдпрд╛ рдпрджрд┐ рдкреИрд░рд╛рдореАрдЯрд░ рдпреВрдирд┐рдЯ рд╣реЛрдЧрд╛ рддреЛ рдПрдХ рдорд╛рди рд▓реМрдЯрд╛рдПрдВред
рдореБрдЭреЗ рдкрд░рд╕реНрдкрд░ рд╡рд┐рд░реЛрдзреА рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдПрдХ рд╣реА рддреНрд░реБрдЯрд┐ рдорд┐рд▓рддреА рд╣реИред
рд╡рд┐рд╢реЗрд╖рдЬреНрдЮрддрд╛ рдХреЗ рд╕рд╛рде рдРрд╕рд╛ рдХрд░рдирд╛ рд╕рдВрднрд╡ рд╣реИ (рдпрд╛ рдХреНрдпрд╛ рдпрд╣ рд╕рдВрднрд╡ рд╣реЛрдЧрд╛)?
рдпрджрд┐ рдирд╣реАрдВ, рддреЛ рд╡рд┐рдХрд▓реНрдк рдХреНрдпрд╛ рд╣реИрдВ?
рд╕рдВрдкрд╛рджрд┐рдд рдХрд░реЗрдВ: рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдореБрдЭреЗ рд╕рдордЭ рдореЗрдВ рдЖрдпрд╛ рдХрд┐ рдпрд╣ рд╕рдВрдХрд▓рди рдХреНрдпреЛрдВ рдирд╣реАрдВ рд╣реИ:
T
for T
()
for ()
рд╕реЗ рдЕрдзрд┐рдХ рд╕рд╛рдорд╛рдиреНрдп рд╣реИ ()
рдкрд╣рд▓реЗ impl
рд╡рд┐рд╢реЗрд╖рдЬреНрдЮрддрд╛ рдирд╣реАрдВ рд╣реЛ рд╕рдХрддреАред
рдФрд░ C
рд╕реЗ рдЕрдзрд┐рдХ рд╕рд╛рдорд╛рдиреНрдп рд╣реИ, C: Fn(Self) -> R
рджреВрд╕рд░рд╛ impl
рд╡рд┐рд╢реЗрд╖рдЬреНрдЮрддрд╛ рдирд╣реАрдВ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред
рдХреГрдкрдпрд╛ рдореБрдЭреЗ рдмрддрд╛рдПрдВ рдХрд┐ рдХреНрдпрд╛ рдореИрдВ рдЧрд▓рдд рд╣реВрдВред
рд▓реЗрдХрд┐рди рдореБрдЭреЗ рдЕрднреА рднреА рдРрд╕рд╛ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ рдпрд╣ Display
рд╕рд╛рде рдкрд╣рд▓реЗ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХреНрдпреЛрдВ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред
рдпрд╣ рд╡рд░реНрддрдорд╛рди рдореЗрдВ рд╕рд╣реА рд╡реНрдпрд╡рд╣рд╛рд░ рд╣реИред
Custom
рдЙрджрд╛рд╣рд░рдг рдореЗрдВ, рд╡рд┐рд╢реЗрд╖ рд╕реНрдерд╛рдиреАрдп рдирдХрд╛рд░рд╛рддреНрдордХ рддрд░реНрдХ рдХреЗ рдХрд╛рд░рдг рдЙрди рд▓реЛрдЧреЛрдВ рдХрд╛ рдУрд╡рд░рд▓реИрдк рдирд╣реАрдВ рд╣реЛрддрд╛ ()
рдЕрдиреБрдорд╛рди рд▓рдЧрд╛ рд╕рдХрддреЗ рд╣реИрдВ, рдЬрд┐рд╕рдореЗрдВ Custom
рдХрд╛ рдирд┐рд╣рд┐рддрд╛рд░реНрде рдирд╣реАрдВ рд╣реИ, T: Custom
рд╕рд╛рде рдУрд╡рд░рд▓реИрдк рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИред рдХреЛрдИ рд╡рд┐рд╢реЗрд╖рдЬреНрдЮрддрд╛ рдЖрд╡рд╢реНрдпрдХ рдирд╣реАрдВ рд╣реИред
рд╣рд╛рд▓рд╛рдБрдХрд┐, рд╣рдо рдЗрд╕ рдирдХрд╛рд░рд╛рддреНрдордХ рддрд░реНрдХ рдХреЛ рдЙрди рд▓рдХреНрд╖рдгреЛрдВ рдХреЗ рд▓рд┐рдП рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ рдЬреЛ рдЖрдкрдХреЗ рдЯреЛрдХрд░реЗ рд╕реЗ рдирд╣реАрдВ рд╣реИрдВред рдорд╛рдирдХ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдЕрдЧрд▓реА рд░рд┐рд▓реАрдЬ рдореЗрдВ Display for ()
рдЬреЛрдбрд╝ рд╕рдХрддрд╛ рд╣реИ, рдФрд░ рд╣рдо рдирд╣реАрдВ рдЪрд╛рд╣рддреЗ рдХрд┐ рдпрд╣ рдПрдХ рдмреНрд░реЗрдХрд┐рдВрдЧ рдкрд░рд┐рд╡рд░реНрддрди рд╣реЛред рд╣рдо рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдХрд┐ рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдХреЛ рдЙрди рдкреНрд░рдХрд╛рд░ рдХреЗ рдмрджрд▓рд╛рд╡ рдХрд░рдиреЗ рдХреА рд╕реНрд╡рддрдВрддреНрд░рддрд╛ рд╣реЛред рдЗрд╕рд▓рд┐рдП рднрд▓реЗ рд╣реА () рдкреНрд░рджрд░реНрд╢рди рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИ, рд╣рдо рдУрд╡рд░рд▓реИрдк рдЪреЗрдХ рдореЗрдВ рдЙрд╕ рдЬрд╛рдирдХрд╛рд░реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
рд▓реЗрдХрд┐рди рдпрд╣ рднреА, рдХреНрдпреЛрдВрдХрд┐ () рдкреНрд░рджрд░реНрд╢рди рдирд╣реАрдВ рд╣реИ, рдпрд╣ T: Display
рд╕реЗ рдЕрдзрд┐рдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдирд╣реАрдВ рд╣реИред рдпрд╣реА рдХрд╛рд░рдг рд╣реИ рдХрд┐ рд╡рд┐рд╢реЗрд╖рдЬреНрдЮрддрд╛ рдХрд╛рдо рдирд╣реАрдВ рдХрд░рддреА рд╣реИ, рдЬрдмрдХрд┐ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдорд╛рдорд▓реЗ рдореЗрдВ, (): Default
, рдЗрд╕рд▓рд┐рдП рдпрд╣ рдирд┐рд╣рд┐рдд рд╣реИ рдХрд┐ T: Default
рд╕реЗ рдЕрдзрд┐рдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рд╣реИред
рдЗрд╕ рддрд░рд╣ рдХреЗ рдЗрдВрдкреНрд▓рд╛рдВрдЯ 'рд▓рд┐рдореНрдмреЛ' рдореЗрдВ рдПрдХ рддрд░рд╣ рдХреЗ рд╣реЛрддреЗ рд╣реИрдВ, рдЬрд╣рд╛рдВ рд╣рдо рди рддреЛ рдпрд╣ рдорд╛рди рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдпрд╣ рдУрд╡рд░рд▓реИрдк рд╣реЛрддрд╛ рд╣реИ рдФрд░ рди рд╣реА рд╣реЛрддрд╛ рд╣реИред рд╣рдо рдЗрд╕ рдХрд╛рдо рдХреЛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд░рд╛рдЬрд╕реА рддрд░реАрдХреЗ рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдпрд╣ рд╡рд┐рд╢реЗрд╖рдЬреНрдЮрддрд╛ рдХрд╛ рдкрд╣рд▓рд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдирд╣реАрдВ рд╣реИ, рдпрд╣ рдмрд╛рдж рдореЗрдВ рдЖрдиреЗ рд╡рд╛рд▓реА рдЙрд╕ рд╕реБрд╡рд┐рдзрд╛ рдХреЗ рд▓рд┐рдП рдПрдХ рдкрд╢реНрдЪрдЧрд╛рдореА рд╕рдВрдЧрдд рд╡рд┐рд╕реНрддрд╛рд░ рд╣реИред
рдореИрдВрдиреЗ рдЖрдЬреАрд╡рди рд╕рдВрдмрдВрдзрд┐рдд рдзреНрд╡рдирд┐ рдореБрджреНрджреЗ рдХреЛ рдЯреНрд░реИрдХ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП # 40582 рджрд░реНрдЬ рдХрд┐рдпрд╛ред
рдореЗрд░реЗ рдкрд╛рд╕ рдПрдХ рдореБрджреНрджрд╛ рдерд╛ рдЬреЛ рд╡рд┐рд╢реЗрд╖рдЬреНрдЮрддрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░ рд░рд╣рд╛ рдерд╛, рдореБрдЭреЗ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ рдпрд╣ рд╡реИрд╕рд╛ рд╣реА рд╣реИ рдЬреИрд╕рд╛ @antoyo рдХреЗ рдкрд╛рд╕ рдерд╛, рдореИрдВрдиреЗ рдЗрд╕реЗ рдПрдХ рдЕрд▓рдЧ рдореБрджреНрджреЗ # 41140 рдХреЗ рд░реВрдк рдореЗрдВ рджрд░реНрдЬ рдХрд┐рдпрд╛ рдерд╛, рдореИрдВ рдЙрджрд╛рд╣рд░рдг рдХреЛрдб рдпрд╣рд╛рдВ рд╕реЗ рд▓рд╛ рд╕рдХрддрд╛ рд╣реВрдВ рдпрджрд┐ рдЖрд╡рд╢реНрдпрдХ рд╣реЛ
@ afonso360 рдирд╣реАрдВ, рдПрдХ рдЕрд▓рдЧ рдореБрджреНрджрд╛ рдареАрдХ рд╣реИред
рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рдмрд┐рдВрджреБ рдХреЗ рд░реВрдк рдореЗрдВ: рдЗрд╕ рдмрд┐рдВрджреБ рдкрд░ рд╡рд┐рд╢реЗрд╖рдЬреНрдЮрддрд╛ рдкрд░ рдЖрдЧреЗ рдХрд╛ рдХрд╛рдо рдЪрд╛рдХ рдкрд░ рдХрд╛рдо рдкрд░ рдЕрд╡рд░реБрджреНрдз рд╣реИ, рдЬрд┐рд╕рд╕реЗ рд╣рдореЗрдВ рдзреНрд╡рдирд┐ рдореБрджреНрджреЛрдВ рд╕реЗ рдирд┐рдкрдЯрдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рдорд┐рд▓рдиреА рдЪрд╛рд╣рд┐рдП рдФрд░ рдЖрдЬ рдЖрдИрд╕реАрдИ рдХреЗ рд╣рд┐рдЯ рд╣реЛрдиреЗ рдХреА рднреА рд╕рдВрднрд╛рд╡рдирд╛ рд╣реИред
рдХреНрдпрд╛ рдХреЛрдИ рд╕реНрдкрд╖реНрдЯ рдХрд░ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдХреНрдпрд╛ рдпрд╣ рдмрдЧ рд╣реИ, рдпрд╛ рдРрд╕рд╛ рдХреБрдЫ рд╣реИ рдЬреЛ рдЬрд╛рдирдмреВрдЭрдХрд░ рдирд┐рд╖рд┐рджреНрдз рд╣реИ? https://is.gd/pBvefi
@sgrif рдореЗрд░рд╛ рдорд╛рдирдирд╛ тАЛтАЛрд╣реИ рдХрд┐ рдпрд╣рд╛рдВ рдореБрджреНрджрд╛ рд╕рд┐рд░реНрдл рдпрд╣ рд╣реИ рдХрд┐ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд╕реЗ рдЬреБрдбрд╝реЗ рдкреНрд░рдХрд╛рд░реЛрдВ рдХрд╛ рдкреНрд░рдХреНрд╖реЗрдкрдг рдЕрд╕реНрд╡реАрдХреГрдд рд╣реИред рд╣рд╛рд▓рд╛рдВрдХрд┐ рдирд┐рджрд╛рди рдмреЗрд╣рддрд░ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ: https://github.com/rust-lang/rust/issues/33481
рдХреНрдпрд╛ рдЖрдк рдЗрд╕ рдмрд╛рд░реЗ рдореЗрдВ рд╡рд┐рд╕реНрддрд╛рд░ рд╕реЗ рдмрддрд╛ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдЗрд╕реЗ рдХреНрдпреЛрдВ рдЕрд╕реНрд╡реАрдХреГрдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ? рд╣рдо рдЬрд╛рдирддреЗ рд╣реИрдВ рдХрд┐ рдХреЛрдИ рднреА рдЕрдзрд┐рдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдкреНрд░рддреНрдпрд╛рд░реЛрдкрдг рдирд╣реАрдВ рдЬреЛрдбрд╝рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдЕрдирд╛рде рдирд┐рдпрдореЛрдВ рдХрд╛ рдЙрд▓реНрд▓рдВрдШрди рдХрд░реЗрдЧрд╛ред
рдЗрд╕ рдЯрд┐рдкреНрдкрдгреА рд╕реЗ рд╕рдВрдХреЗрдд рдорд┐рд▓рддрд╛ рд╣реИ рдХрд┐ рдХреБрдЫ рдорд╛рдорд▓реЛрдВ рдХреЗ рд▓рд┐рдП рдзреНрд╡рдирд┐ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ (рд╣рд╛рд▓рд╛рдВрдХрд┐ рдореБрдЭреЗ рдкрддрд╛ рдирд╣реАрдВ рдХреНрдпреЛрдВ) рдФрд░ рджреВрд╕рд░реЛрдВ рдореЗрдВ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЗ рдЙрдкрднреЛрдХреНрддрд╛рдУрдВ рдХреЛ рдЗрд╕реЗ рдПрдХ рдЕрдореВрд░реНрдд рдкреНрд░рдХрд╛рд░ рдХреЗ рд░реВрдк рдореЗрдВ рд╡реНрдпрд╡рд╣рд╛рд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдордЬрдмреВрд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП: https://github.com/rust- рд▓реИрдВрдЧ / рдЬрдВрдЧ / рдмреНрд▓реЙрдм / e5e664f / src / librustc / рд▓рдХреНрд╖рдг / project.rs # L41
рдХреНрдпрд╛ рдХреЛрдИ рднреА рдХрднреА https://github.com/rust-lang/rust/issues/31844#issuecomment -266221638 рдХреЛ рджреЗрдЦрдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рдерд╛? рдЙрди рдЕрдиреБрдорд╛рдиреЛрдВ рдХреЛ рд╡рд┐рд╢реЗрд╖рдЬреНрдЮрддрд╛ рдХреЗ рд╕рд╛рде рдорд╛рдиреНрдп рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП рдЬрд╣рд╛рдВ рддрдХ тАЛтАЛрдореИрдВ рдмрддрд╛ рд╕рдХрддрд╛ рд╣реВрдВред рдореЗрд░рд╛ рдорд╛рдирдирд╛ тАЛтАЛрд╣реИ рдХрд┐ рдПрдХ рдмрдЧ рд╣реИ рдЬреЛ рдЙрдиреНрд╣реЗрдВ рд░реЛрдХ рд░рд╣рд╛ рд╣реИред
@sgrif рдореБрдЭреЗ рд╡рд┐рд╢реНрд╡рд╛рд╕ рд╣реИ рдХрд┐ рдЖрдкрдХреЗ рдХреЛрдб рдХреЗ рд╕рд╛рде рд╕рдорд╕реНрдпрд╛ https://github.com/rust-lang/rust/issues/31844#issuecomment -284235369 рдореЗрдВ рдЗрд╕ рдореБрджреНрджреЗ рдХреЗ рд╕рдорд╛рди рд╣реЛ рд╕рдХрддреА рд╣реИ рдЬрд┐рд╕реЗ @withoutboats рдиреЗ https://github.com рдореЗрдВ рд╕рдордЭрд╛рдпрд╛ рд╣реИ @withoutboats рдХреА рдЯрд┐рдкреНрдкрдгреА рдХреЗ рдЖрдзрд╛рд░ рдкрд░, рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╡рд░реНрддрдорд╛рди рд╕реНрдерд╛рдиреАрдп рддрд░реНрдХ рдХреЛ рдЖрдкрдХреЗ рдЙрджрд╛рд╣рд░рдг рдХреЛ рд╕рдВрдХрд▓рд┐рдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдиреА рдЪрд╛рд╣рд┐рдП, рд▓реЗрдХрд┐рди рд╢рд╛рдпрдж рдореБрдЭрд╕реЗ рдЧрд▓рддреА рд╣реЛ рдЧрдИ рд╣реИ рдХрд┐ рдореБрдЭреЗ рдХреНрдпрд╛ рдХрд╛рдо рдХрд░рдиреЗ рдХреА рдЙрдореНрдореАрдж рд╣реИред
рдПрдХ рддрд░рдл рдХреЗ рд░реВрдк рдореЗрдВ, рдореИрдВрдиреЗ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХреА, рдЕрд╕рдлрд▓:
trait Optional<T> {
fn into_option(self) -> Option<T>;
}
impl<R, T: Into<R>> Optional<R> for T {
default fn into_option(self) -> Option<R> {
Some(self.into())
}
}
impl<R> Optional<R> for Option<R> {
fn into_option(self) -> Option<R> {
self
}
}
рдореИрдВ рд╕рд╣рдЬ рдЙрдореНрдореАрдж Option<R>
рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдЕрдзрд┐рдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рд╣реЛрдирд╛ <R, T: Into<R>> T
, рд▓реЗрдХрд┐рди рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ, рдХреБрдЫ рднреА рдирд╣реАрдВ рд░реЛрдХрддрд╛ рд╣реИ рдПрдХ impl<R> Into<R> for Option<R>
рднрд╡рд┐рд╖реНрдп рдореЗрдВред
рдореБрдЭреЗ рдпрдХреАрди рдирд╣реАрдВ рд╣реИ рдХрд┐ рдпрд╣ рдХреНрдпреЛрдВ рдЕрд╕реНрд╡реАрдХреГрдд рд╣реИ, рд╣рд╛рд▓рд╛рдВрдХрд┐ред рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рдЕрдЧрд░ рдПрдХ impl<R> Into<R> for Option<R>
рднрд╡рд┐рд╖реНрдп рдореЗрдВ рдЬреЛрдбрд╝рд╛ рдЧрдпрд╛ рдерд╛, рддрдм рднреА рдореИрдВ рд░реВрд╕реНрдЯ рд╕реЗ рдЧреИрд░- default
рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХрд╛ рдЪрдпрди рдХрд░рдиреЗ рдХреА рдЙрдореНрдореАрдж рдХрд░реВрдВрдЧрд╛, рдЬрд╣рд╛рдВ рддрдХ тАЛтАЛрдореИрдВ рджреЗрдЦ рд╕рдХрддрд╛ рд╣реВрдВ, рдЗрд╕ рдХреЛрдб рдХреЛ рдЖрдЧреЗ рдмрдврд╝рд╛рдиреЗ рдХрд╛ рдХреЛрдИ рдорддрд▓рдм рдирд╣реАрдВ рд╣реИ- рд╕рдВрдЧрддрддрд╛ред
рд╕рднреА рдореЗрдВ, рдореИрдВ рд╡рд┐рд╢реЗрд╖рдЬреНрдЮрддрд╛ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рдирд┐рд░рд╛рд╢рд╛ рд╣реЛрддреА рд╣реВрдВред рдореИрдВ рдЬреЛ рдХреБрдЫ рднреА рдХрд╛рдо рдХрд░рдиреЗ рдХреА рдЙрдореНрдореАрдж рдХрд░рддрд╛ рд╣реВрдВ рдЙрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╕ рдирд╣реАрдВред рдХреЗрд╡рд▓ рдРрд╕реЗ рдорд╛рдорд▓реЗ рдЬрд╣рд╛рдВ рдореБрдЭреЗ рд╡рд┐рд╢реЗрд╖рдЬреНрдЮрддрд╛ рдХреЗ рд╕рд╛рде рд╕рдлрд▓рддрд╛ рдорд┐рд▓реА рд╣реИ, рд╡реЗ рдмрд╣реБрдд рд╕рд░рд▓ рд╣реИрдВ, рдЬреИрд╕реЗ рдХрд┐ рджреЛ impl
s рдЬрд┐рд╕рдореЗрдВ T where T: A
рдФрд░ T where T: A + B
ред рдореЗрд░реЗ рдкрд╛рд╕ рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдХрдард┐рди рд╕рдордп рд╣реИ, рдФрд░ рддреНрд░реБрдЯрд┐ рд╕рдВрджреЗрд╢ рдЗрдВрдЧрд┐рдд рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ рдХрд┐ рд╡рд┐рд╢реЗрд╖рдЬреНрдЮ рдХрд╛рдо рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХреНрдпреЛрдВ рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВред рдмреЗрд╢рдХ, рдЕрднреА рднреА рдЖрдЧреЗ рдПрдХ рд╕рдбрд╝рдХ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдореБрдЭреЗ рдмрд╣реБрдд рдЙрдкрдпреЛрдЧреА рддреНрд░реБрдЯрд┐ рд╕рдВрджреЗрд╢реЛрдВ рдХреА рдЙрдореНрдореАрдж рдирд╣реАрдВ рд╣реИред рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдХреБрдЫ рдорд╛рдорд▓реЗ рдРрд╕реЗ рд╣реИрдВ рдЬрд╣рд╛рдБ рдореИрдВ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдХрд╛рдо рдХрд░рдиреЗ рдХреА рдЙрдореНрдореАрдж рдХрд░рддрд╛ рд╣реВрдБ (рдЬреИрд╕реЗ рдКрдкрд░) рд▓реЗрдХрд┐рди рдпрд╣ рдЕрднреА рдирд╣реАрдВ рд╣реИ, рдФрд░ рд╡рд░реНрддрдорд╛рди рдореЗрдВ рдореЗрд░реЗ рд▓рд┐рдП рдпрд╣ рдкрддрд╛ рд▓рдЧрд╛рдирд╛ рдХрд╛рдлреА рдореБрд╢реНрдХрд┐рд▓ рд╣реИ рдХрд┐ рдЕрдЧрд░ рдореБрдЭреЗ рдЧрд▓рдд рд╕рдордЭрд╛ рдЧрдпрд╛ рд╣реИ рддреЛ рдЗрд╕рдХреА рдЕрдиреБрдорддрд┐ рдХреНрдпрд╛ рд╣реИ (рдФрд░ рдЕрдзрд┐рдХ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдмрд╛рдд) рдХреНрдпреЛрдВ), рдЕрдЧрд░ рдХреБрдЫ рдЧрд▓рдд рд╣реИ, рдпрд╛ рдЕрдЧрд░ рдХреБрдЫ рдЕрднреА рддрдХ рд▓рд╛рдЧреВ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рдЗрд╕ рд╕реБрд╡рд┐рдзрд╛ рдХреЗ рд╕рд╛рде рдЬреЛ рдЪрд▓ рд░рд╣рд╛ рд╣реИ рдЙрд╕рдХрд╛ рдПрдХ рдЕрдЪреНрдЫрд╛ рдЕрд╡рд▓реЛрдХрди рдмрд╣реБрдд рдЙрдкрдпреЛрдЧреА рд╣реЛрдЧрд╛ред
рдореИрдВ рд╕рдХрд╛рд░рд╛рддреНрдордХ рдирд╣реАрдВ рд╣реВрдВ рдпрд╣ рд╕рд╣реА рдЬрдЧрд╣ рдкрд░ рд╣реИ, рд▓реЗрдХрд┐рди рд╣рдо рдЙрди рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЗ рдордВрдЪ рдкрд░ рдПрдХ рд╕рдорд╕реНрдпрд╛ рдореЗрдВ рднрд╛рдЧ рдЧрдП рдЬрд┐рдиреНрд╣реЗрдВ рдореИрдВ рдпрд╣рд╛рдВ рдЙрд▓реНрд▓реЗрдЦ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВред
рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХреЛрдб (рдЬреЛ рдпрд╣рд╛рдВ RFC рд╕реЗ рдЕрдиреБрдХреВрд▓рд┐рдд
#![feature(specialization)]
trait Example {
type Output;
fn generate(self) -> Self::Output;
}
default impl<T> Example for T {
type Output = Box<T>;
fn generate(self) -> Self::Output { Box::new(self) }
}
impl Example for bool {
type Output = bool;
fn generate(self) -> Self::Output { self }
}
рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдПрдХ рдЧрдбрд╝рдмрдбрд╝ рдХреА рддрд░рд╣ рдкреНрд░рддреАрдд рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдПрдХ рдкреНрд░рдпреЛрдЬреНрдп рд╕рдорд╕реНрдпрд╛ рдХреА рддрд░рд╣ рд╣реИ - рдпрджрд┐ рдПрдХ рдХрд╛рд▓реНрдкрдирд┐рдХ impl
рдХреЗрд╡рд▓ рдКрдкрд░ рджрд┐рдП рдЧрдП рдЙрджрд╛рд╣рд░рдг рдореЗрдВ рд╕рдВрдмрдВрдзрд┐рдд рдкреНрд░рдХрд╛рд░, defaulti impl
generate
рд╣реЛрдЧрд╛ред 'рдЯреА рдЯрд╛рдЗрдкреЗрдХреИрдЪред
рдпрд╣рд╛рдВ рдзрд╛рдЧреЗ рд╕реЗ рд▓рд┐рдВрдХ
@ burns47 рдпрд╣рд╛рдБ рдПрдХ рднреНрд░рд╛рдордХ рд▓реЗрдХрд┐рди рдЙрдкрдпреЛрдЧреА рдХрд╛рдо рд╣реИ: https://github.com/rust-lang/rust/issues/31844#issuecomment -263175793ред
@dtolnay рдХрд╛рдлреА рд╕рдВрддреЛрд╖рдЬрдирдХ рдирд╣реАрдВ рд╣реИ - рдХреНрдпрд╛ рд╣реЛрдЧрд╛ рдпрджрд┐ рд╣рдо рдЙрди рдЧреБрдгреЛрдВ рдкрд░ рд╡рд┐рд╢реЗрд╖рдЬреНрдЮрддрд╛ рдХрд░ рд░рд╣реЗ рд╣реИрдВ рдЬреЛ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдирд╣реАрдВ рд╣реИрдВ (рдФрд░ рд╕рдВрд╢реЛрдзрд┐рдд рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ)? рд╣рдореЗрдВ рдЗрд╕ IMO рдХреЛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд░реАрдлрд╝реНрд░реИрдХреНрдЯрд░ / рд░рд┐рдлреНрд▓реЗрдХреНрдЯрд░ рд╡рд┐рд╢реЗрд╖рддрд╛ рдХреЛ рдлрд┐рд░ рд╕реЗ рд▓рд┐рдЦрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред
рдХреНрдпрд╛ рдХреЛрдИ рдЯрд┐рдкреНрдкрдгреА рдХрд░ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдХреНрдпрд╛ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдореБрджреНрджреЗ рдХреЗ рдХреЛрдб рдХреЛ рдЬрд╛рдирдмреВрдЭрдХрд░ рдЦрд╛рд░рд┐рдЬ рдХрд░ рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ? https://github.com/rust-lang/rust/issues/45542
рд╡рд┐рд╢реЗрд╖рдЬреНрдЮрддрд╛ рдХреЗ рд▓рд┐рдП рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХреА рддрд░рд╣ рдХреБрдЫ рдЬреЛрдбрд╝рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рд╣реЛрдЧреА libcore?
impl<T: Ord> Eq for T {}
impl<T: Ord> PartialEq for T {
default fn eq(&self, other: &Self) -> bool {
self.cmp(other) == Ordering::Equal
}
}
impl<T: Ord> PartialOrd for T {
default fn partial_cmp(&self, other: &Self) -> Option<Ordering> {
Some(self.cmp(other))
}
}
рдЗрд╕ рддрд░рд╣ рдЖрдк рдЕрдкрдиреЗ рдХрд╕реНрдЯрдо рдкреНрд░рдХрд╛рд░ рдХреЗ рд▓рд┐рдП Ord
рд▓рд╛рдЧреВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ Eq
, PartialEq
, рдФрд░ PartialOrd
рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рд▓рд╛рдЧреВ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВред
рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ Ord
рдФрд░ рд╕рд╛рде рд╣реА PartialEq
рдпрд╛ PartialOrd
рдХрд░рдирд╛ рдЦрддрд░рдирд╛рдХ рд╣реИ рдФрд░ рдмрд╣реБрдд рд╕реВрдХреНрд╖реНрдо рдХреАрдбрд╝реЗ рдкреИрджрд╛ рдХрд░ рд╕рдХрддрд╛ рд╣реИ! рдЗрди рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдЖрдХреГрддрд┐рдпреЛрдВ рдХреЗ рд╕рд╛рде рдЖрдк рдЙрди рд▓рдХреНрд╖рдгреЛрдВ рдХреЛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрдо рд▓реБрднрд╛рдПрдВрдЧреЗ, рдЗрд╕рд▓рд┐рдП рд╕рдорд╕реНрдпрд╛ рдХреБрдЫ рд╣рдж рддрдХ рдХрдо рд╣реЛ рдЬрд╛рдПрдЧреАред
рд╡реИрдХрд▓реНрдкрд┐рдХ рд░реВрдк рд╕реЗ, рд╣рдо рд╡рд┐рд╢реЗрд╖рдЬреНрдЮрддрд╛ рдХрд╛ рд▓рд╛рдн рдЙрдард╛рдиреЗ рдХреЗ рд▓рд┐рдП рд╡реНрдпреБрддреНрдкрддреНрддрд┐ рдХреЛ рд╕рдВрд╢реЛрдзрд┐рдд рдХрд░рддреЗ рд╣реИрдВред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, #[derive(PartialOrd)]
struct Foo(String)
рдКрдкрд░ рд▓рд┐рдЦрдирд╛ рдирд┐рдореНрди рдХреЛрдб рдЙрддреНрдкрдиреНрди рдХрд░ рд╕рдХрддрд╛ рд╣реИ:
impl PartialOrd for Foo {
default fn partial_cmp(&self, other: &Foo) -> Option<Ordering> {
self.0.partial_cmp(&other.0)
}
}
impl PartialOrd for Foo where Foo: Ord {
fn partial_cmp(&self, other: &Self) -> Option<Ordering> {
Some(self.cmp(other))
}
}
рдпрджрд┐ Ord
рд▓рд╛рдЧреВ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рддреЛ рдЗрд╕ рддрд░рд╣ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдЗрдореНрдкреНрд▓рд╛рдВрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рд▓реЗрдХрд┐рди рдЕрдЧрд░ рдпрд╣ рд╣реИ, рддреЛ PartialOrd
Ord
рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддрд╛ рд╣реИред рджреБрд░реНрднрд╛рдЧреНрдп рд╕реЗ, рдпрд╣ рд╕рдВрдХрд▓рди рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ: error[E0119]: conflicting implementations of trait `std::cmp::PartialOrd` for type `Foo`
@stjepang рдореБрдЭреЗ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдЙрдореНрдореАрдж рд╣реИ рдХрд┐ рдЬреИрд╕реЗ рдХрдВрдмрд▓ рдХреЛ рдЬреЛрдбрд╝рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ - impl<T:Copy> Clone for T
рднреАред
рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ
impl<T: Ord> PartialEq for T
рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП
impl<T, U> PartialEq<U> for T where T : PartialOrd<U>
рдХреНрдпреЛрдВрдХрд┐ PartialOrd
рд▓рд┐рдП PartialEq
рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ рдФрд░ рдЗрд╕реЗ рднреА рдкреНрд░рджрд╛рди рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
рдЕрднреА, рдХреЛрдИ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд╕рдВрдмрджреНрдз рдкреНрд░рдХрд╛рд░реЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рд╕реА рд╡рд┐рд╢реЗрд╖рдЬреНрдЮрддрд╛ рдХреЛ рд╕реАрдорд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдирд╣реАрдВ рдХрд░ рд╕рдХрддрд╛ рд╣реИ , рдХреНрдпреЛрдВрдХрд┐ рджреЛрдиреЛрдВ рдХреЛ рд╡реЗ рдЕрдирд┐рдпреЛрдЬрд┐рдд рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐ рдХреЛ рдЯреНрд░рд┐рдЧрд░ рдХрд░рддреЗ рд╣реИрдВ ред Https://github.com/dhardy/rand/issues/18#issuecomment -358147645 рджреЗрдЦреЗрдВ
рдЖрдЦрд┐рд░рдХрд╛рд░, рдореИрдВ рдпрд╣ рджреЗрдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдкреНрдпрд╛рд░ рдХрд░рддрд╛ рд╣реВрдВ рдХрд┐ рдореИрдВ @nikomatsakis рджреНрд╡рд╛рд░рд╛ рдкреНрд░рд╕реНрддрд╛рд╡рд┐рдд рд╡рд╛рдХреНрдп рд░рдЪрдирд╛ рдХреЗ рд╕рд╛рде рд╡рд┐рд╢реЗрд╖рдЬреНрдЮрддрд╛ рд╕рдореВрд╣реЛрдВ рдХреЛ рдпрд╣рд╛рдВ рдХреНрдпрд╛ рдХрд╣ рд░рд╣рд╛ рд╣реВрдВ https://github.com/rust-lang/rust/issues/31844#issuecomment -249355357 рдФрд░ рд╕реНрд╡рддрдВрддреНрд░ рд░реВрдк рд╕реЗ рдореЗрд░реЗ рджреНрд╡рд╛рд░рд╛ред рдореИрдВ рдЙрд╕ рдкреНрд░рд╕реНрддрд╛рд╡ рдкрд░ рдмрд╛рдж рдореЗрдВ рдПрдХ RFC рд▓рд┐рдЦрдирд╛ рдкрд╕рдВрдж рдХрд░рддрд╛ рд╣реВрдВ рдЬрдм рд╣рдо рд╡рд┐рд╢реЗрд╖рдЬреНрдЮрддрд╛ рдХреЛ рд╕реНрдерд┐рд░ рдХрд░рдиреЗ рдХреЗ рдХрд░реАрдм рд╣реЛрддреЗ рд╣реИрдВред
рдмрд╕ рдЕрдЧрд░ рдХрд┐рд╕реА рдиреЗ рдЗрд╕реЗ рдирд╣реАрдВ рджреЗрдЦрд╛, рддреЛ рдпрд╣ рдмреНрд▓реЙрдЧ рдкреЛрд╕реНрдЯ рдЖрдЬреАрд╡рди рдЖрдзрд╛рд░рд┐рдд рдкреНрд░реЗрд╖рдг рдХреА рд╕реНрдерд┐рддрд┐ рдореЗрдВ рд╡рд┐рд╢реЗрд╖рдЬреНрдЮрддрд╛ рдзреНрд╡рдирд┐ рдмрдирд╛рдиреЗ рдХреЗ рдкреНрд░рд╕реНрддрд╛рд╡ рдХреЛ рдХрд╡рд░ рдХрд░рддрд╛ рд╣реИред
рдЬреИрд╕рд╛ рдХрд┐ рдХреЙрдкреА рдХреНрд▓реЛрдЬрд░ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдмреАрдЯрд╛ рдореЗрдВ рд╕реНрдЯреИрдмрд▓рд╛рдЗрдЬ рдХрд┐рдП рдЧрдП рдереЗ, рдбреЗрд╡рд▓рдкрд░реНрд╕ рдХреЛ рдЕрдм рд╡рд┐рд╢реЗрд╖рдЬреНрдЮрддрд╛ рдкрд░ рд╕реНрдерд┐рд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдзрд┐рдХ рдкреНрд░реЗрд░рдгрд╛ рд╣реИред рдХрд╛рд░рдг рдпрд╣ рд╣реИ рдХрд┐ Fn
рдФрд░ FnOnce + Clone
рдХреНрд▓реЛрдЬрд░ рдХреЗ рджреЛ рдЕрддрд┐рд╡реНрдпрд╛рдкреА рд╕реЗрдЯ рдХрд╛ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХрд░рддреЗ рд╣реИрдВ, рдФрд░ рдХрдИ рдорд╛рдорд▓реЛрдВ рдореЗрдВ рд╣рдореЗрдВ рдЙрди рджреЛрдиреЛрдВ рдХреЗ рд▓рд┐рдП рд▓рдХреНрд╖рдг рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред
рдмрд╕ рдпрд╣ рдкрддрд╛ рдХрд░реЗрдВ рдХрд┐ rfc 2132 рдХреЗ рд╢рдмреНрдж рдХрд╛ рдЕрд░реНрде рдпрд╣ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдХреЗрд╡рд▓ 5 рдкреНрд░рдХрд╛рд░ рдХреЗ рдХреНрд▓реЛрдЬрд░ рд╣реИрдВ:
FnOnce
( move
рд╕рднреА рдХреИрдкреНрдЪрд░ рдХрд┐рдП рдЧрдП рдЪрд░ рдХреЗ рд╕рд╛рде рди рддреЛ Copy
рдФрд░ рди рд╣реА Clone
)FnOnce + Clone
( move
рд╕рднреА рдкрдХрдбрд╝реЗ рдЧрдП рдЪрд░ рдХреЗ рд╕рд╛рде Clone
)FnOnce + Copy + Clone
( move
рд╕рднреА рдкрдХрдбрд╝реЗ рдЧрдП рдЪрд░ рдХреЗ рд╕рд╛рде Copy
рдФрд░ рдЗрд╕рд▓рд┐рдП Clone
)FnMut + FnOnce
(рдПрдХ рдЧреИрд░- move
рдЙрддреНрдкрд░рд┐рд╡рд░реНрддрд┐рдд рд╡реИрд░рд┐рдПрдмрд▓ рдХреЗ рд╕рд╛рде Fn + FnMut + FnOnce + Copy + Clone
(рдПрдХ рдЧреИрд░- move
рдмрдВрдж рдХрд┐рдП рдЧрдП рдмрд┐рдирд╛ рдкрд░рд┐рд╡рд░реНрддрди рдХрд┐рдП рдЧрдП рдЪрд░)рдЗрд╕рд▓рд┐рдП рдпрджрд┐ рдирд┐рдХрдЯ рднрд╡рд┐рд╖реНрдп рдореЗрдВ рд╡рд┐рдирд┐рд░реНрджреЗрд╢ рдЙрдкрд▓рдмреНрдз рдирд╣реАрдВ рд╣реИ, рддреЛ рд╢рд╛рдпрдж рд╣рдореЗрдВ Fn
рдХреА рдЕрдкрдиреА рдкрд░рд┐рднрд╛рд╖рд╛ рдХреЛ рдЕрдкрдбреЗрдЯ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП рддрд╛рдХрд┐ Fn
FnOnce + Clone
рд╕рд╛рде рдУрд╡рд░рд▓реИрдкрд┐рдВрдЧ рди рд╣реЛ?
рдореИрдВ рд╕рдордЭрддрд╛ рд╣реВрдВ рдХрд┐ рдХреЛрдИ рд╡реНрдпрдХреНрддрд┐ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА Fn
Copy/Clone
рдмрд┐рдирд╛
рдХреНрдпрд╛ рд╡рд┐рд╢реЗрд╖рдЬреНрдЮрддрд╛ рджреНрд╡рд╛рд░рд╛ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХреА рдЕрдиреБрдорддрд┐ рджреА рдЬрд╛рдиреА рдЪрд╛рд╣рд┐рдП ( default
рдХреА рдЕрдиреБрдкрд╕реНрдерд┐рддрд┐ рдкрд░ рдзреНрдпрд╛рди рджреЗрдВ) рдпрд╛ рдпрд╣ рдПрдХ рдмрдЧ рд╣реИ?
#![feature(specialization)]
mod ab {
pub trait A {
fn foo_a(&self) { println!("a"); }
}
pub trait B {
fn foo_b(&self) { println!("b"); }
}
impl<T: A> B for T {
fn foo_b(&self) { println!("ab"); }
}
impl<T: B> A for T {
fn foo_a(&self) { println!("ba"); }
}
}
use ab::B;
struct Foo;
impl B for Foo {}
fn main() {
Foo.foo_b();
}
рд╡рд┐рд╢реЗрд╖рдЬреНрдЮрддрд╛ рдХреЗ рдмрд┐рдирд╛, рдЗрд╕рдХреЗ рд╕рд╛рде рдирд┐рд░реНрдорд╛рдг рдХрд░рдиреЗ рдореЗрдВ рд╡рд┐рдлрд▓ рд░рд╣рддрд╛ рд╣реИ:
error[E0119]: conflicting implementations of trait `ab::B` for type `Foo`:
--> src/main.rs:24:1
|
11 | impl<T: A> B for T {
| ------------------ first implementation here
...
24 | impl B for Foo {}
| ^^^^^^^^^^^^^^ conflicting implementation for `Foo`
@ рдЧреНрд▓реИрдВрдбрд┐рдпрдо рдкреГрдереНрд╡реА рдкрд░ рдХреНрдпрд╛ рдЪрд▓ рд░рд╣рд╛ рд╣реИ? рдЕрдЪреНрдЫрд╛ рдЙрджрд╛рд╣рд░рдг, рдпрд╣рд╛рдБ рдЦреЗрд▓ рдХрд╛ рдореИрджрд╛рди рд▓рд┐рдВрдХ: https://play.rust-lang.org/?gist=fc7cf5145222c432e2bd8de1b0a425cd&version=nightly&mode-debug
@glandium рдЬреЛ рдХрд┐ https://github.com/rust-lang/rust/issues/48444 рд╣реИ
рдХреНрдпрд╛ рдпрд╣? рдореЗрд░реЗ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ рдХреЛрдИ рдЦрд╛рд▓реА рдирд┐рд╣рд┐рддрд╛рд░реНрде рдирд╣реАрдВ рд╣реИред
@glandium
impl B for Foo {}
@MoSal рд▓реЗрдХрд┐рди рдпрд╣ B
рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рд╕рд╛рде рдПрдХ рд╡рд┐рдзрд┐ рдЬреЛрдбрд╝рддрд╛ рд╣реИред
@gnzlbg рдпрд╣ рдкрд░рд┐рднрд╛рд╖рд╛ рд╕реЗ рдЦрд╛рд▓реА рд╣реИред рдмреНрд░реЗрд╕рд┐рдЬрд╝ рдХреЗ рдмреАрдЪ рдХреБрдЫ рднреА рдирд╣реАрдВред
#![feature(specialization)]
use std::borrow::Borrow;
#[derive(Debug)]
struct Bla {
bla: Vec<Option<i32>>
}
// Why is this a conflict ?
impl From<i32> for Bla {
fn from(i: i32) -> Self {
Bla { bla: vec![Some(i)] }
}
}
impl<B: Borrow<[i32]>> From<B> for Bla {
default fn from(b: B) -> Self {
Bla { bla: b.borrow().iter().map(|&i| Some(i)).collect() }
}
}
fn main() {
let b : Bla = [1, 2, 3].into();
println!("{:?}", b);
}
error[E0119]: conflicting implementations of trait `std::convert::From<i32>` for type `Bla`:
--> src/main.rs:17:1
|
11 | impl From<i32> for Bla {
| ---------------------- first implementation here
...
17 | impl<B: Borrow<[i32]>> From<B> for Bla {
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ conflicting implementation for `Bla`
|
= note: upstream crates may add new impl of trait `std::borrow::Borrow<[i32]>` for type `i32` in future versions
рдХреНрдпрд╛ рд╡рд┐рд╢реЗрд╖рдЬреНрдЮрддрд╛ рднрд╡рд┐рд╖реНрдп рдХреЗ рд╕рдВрднрд╛рд╡рд┐рдд рд╕рдВрдШрд░реНрд╖реЛрдВ рдХреЛ рд░реЛрдХ рдирд╣реАрдВ рдкрд╛рдПрдЧреА?
рдореБрдЭреЗ рдЕрдЪреНрдЫрд╛рдИ рджреЗрдВ, рдпрд╣ рдПрдХ рдзреАрдореА рдЧрддрд┐ рд╕реЗ рдЪрд▓рдиреЗ рд╡рд╛рд▓реА рд╡рд┐рд╢реЗрд╖рддрд╛ рд╣реИ! рджреЛ рд╡рд░реНрд╖реЛрдВ рдореЗрдВ рдХреЛрдИ рдкреНрд░рдЧрддрд┐ рдирд╣реАрдВ рд╣реБрдИ, рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ (рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдореВрд▓ рдкрдж рдХреЗ рдЕрдиреБрд╕рд╛рд░)ред рдХреНрдпрд╛ рд▓рдВрдЧ рдЯреАрдо рдиреЗ рдЗрд╕реЗ рдЫреЛрдбрд╝ рджрд┐рдпрд╛ рд╣реИ?
@alexreg рдирд╡реАрдирддрдо рд╡рд┐рдХрд╛рд╕ рдХреЗ рд▓рд┐рдП http://aturon.github.io/2018/04/05/sound-specialization/ рджреЗрдЦреЗрдВред
@alexreg рдпрд╣ рдкрддрд╛ рдЪрд▓рд╛ рд╣реИ рдХрд┐ рдзреНрд╡рдирд┐ рдХрд╛ рдЕрд░реНрде _ рднрд╛рд░_ рд╣реИред рдореЗрд░рд╛ рдорд╛рдирдирд╛ тАЛтАЛрд╣реИ рдХрд┐ рд╡рд░реНрддрдорд╛рди рдореЗрдВ рд╣реЛ рд░рд╣реЗ "рд╣рдореЗрд╢рд╛ рд▓рд╛рдЧреВ рд╣реЛрдиреЗ рд╡рд╛рд▓реЗ рдЕрдиреБрдорд╛рдиреЛрдВ" рдкрд░ рдХреБрдЫ рдХрд╛рдо рд╣реЛ рд░рд╣рд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдкреНрд░рдЧрддрд┐ рд╣реИред Https://github.com/rust-lang/rust/pull/49624 рджреЗрдЦреЗрдВ
рдереЛрдбрд╝рд╛ рд╕рдВрдШрд░реНрд╖ рдХреЗ рдмрд╛рдж, рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ specialization
рдФрд░ overlapping_marker_traits
рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╣реИрдХ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЪреМрд░рд╛рд╣реЗ рдХреЗ рдирд┐рд╢рд╛рди рдХреЛ рдкреНрд░рднрд╛рд╡реА рдврдВрдЧ рд╕реЗ рд▓рд╛рдЧреВ рдХрд░рдирд╛ рд╕рдВрднрд╡ рд╣реИред
https://play.rust-lang.org/?gist=cb7244f41c040db41fc447d491031263&version=nightly&mode=debug
рдореИрдВрдиреЗ рдЗрд╕ C ++ рдХреЛрдб рдХреЗ рдмрд░рд╛рдмрд░ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдкреБрдирд░рд╛рд╡рд░реНрддреА рд╡рд┐рд╢реЗрд╖ рдлрд╝рдВрдХреНрд╢рди рд▓рд┐рдЦрдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХреА:
C ++ рдХреЛрдб
#include <cassert>
#include <vector>
template<typename T>
size_t count(T elem)
{
return 1;
}
template<typename T>
size_t count(std::vector<T> vec)
{
size_t n = 0;
for (auto elem : vec)
{
n += count(elem);
}
return n;
}
int main()
{
auto v1 = std::vector{1, 2, 3};
assert(count(v1) == 3);
auto v2 = std::vector{ std::vector{1, 2, 3}, std::vector{4, 5, 6} };
assert(count(v2) == 6);
return 0;
}
рдореИрдВрдиреЗ рдпрд╣ рдХреЛрд╢рд┐рд╢ рдХреА:
рд░рд╕реНрдЯ рдХреЛрдб
#![feature(specialization)]
trait Count {
fn count(self) -> usize;
}
default impl<T> Count for T {
fn count(self) -> usize {
1
}
}
impl<T> Count for T
where
T: IntoIterator,
T::Item: Count,
{
fn count(self) -> usize {
let i = self.into_iter();
i.map(|x| x.count()).sum()
}
}
fn main() {
let v = vec![1, 2, 3];
assert_eq!(v.count(), 3);
let v = vec![
vec![1, 2, 3],
vec![4, 5, 6],
];
assert_eq!(v.count(), 6);
}
рд▓реЗрдХрд┐рди рдореБрдЭреЗ рдПрдХ рдорд┐рд▓ рд░рд╣рд╛ рд╣реИ:
overflow evaluating the requirement `{integer}: Count`
рдореБрдЭреЗ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ рдРрд╕рд╛ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП рдХреНрдпреЛрдВрдХрд┐ impl<T> Count for T where T::Item: Count
рдХреЛ рдЕрддрд┐рдкреНрд░рд╡рд╛рд╣ рдирд╣реАрдВ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред
рд╕рдВрдкрд╛рджрд┐рдд рдХрд░реЗрдВ: рдХреНрд╖рдорд╛ рдХрд░реЗрдВ, рдореИрдВрдиреЗ рдЕрднреА рджреЗрдЦрд╛ рдХрд┐ рдпрд╣ рдкрд╣рд▓реЗ рд╣реА рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛
@Boiethios рдЖрдкрдХрд╛ usecase рдХрд╛рдо рдХрд░ рд░рд╣рд╛ рд╣реИ рдпрджрд┐ рдЖрдк fn рдкрд░ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд╣реИрдВ рдФрд░
#![feature(specialization)]
trait Count {
fn count(self) -> usize;
}
impl<T> Count for T {
default fn count(self) -> usize {
1
}
}
impl<T> Count for T
where
T: IntoIterator,
T::Item: Count,
{
fn count(self) -> usize {
let i = self.into_iter();
i.map(|x| x.count()).sum()
}
}
fn main() {
let v = vec![1, 2, 3];
assert_eq!(v.count(), 3);
let v = vec![vec![1, 2, 3], vec![4, 5, 6]];
assert_eq!(v.count(), 6);
}
рдХреНрдпрд╛ рд╕рд╛рдЙрдВрдбрдиреЗрд╕ рдЫреЗрдж рдЕрднреА рднреА рддрдп рдирд╣реАрдВ рд╣реБрдЖ рд╣реИ?
@alexreg рдореБрдЭреЗ рдРрд╕рд╛ рдирд╣реАрдВ рд▓рдЧрддрд╛ред Http://smallcultfollowing.com/babysteps/blog/2018/02/09/maximally-minimal-specialization-always-applicable-impls/ рджреЗрдЦреЗрдВ
рдореЗрд░рд╛ рдЕрдиреБрдорд╛рди рд╣реИ рдХрд┐ рдЕрднреА рд╕рднреА рдХрд╛ рдзреНрдпрд╛рди рд╕рдВрд╕реНрдХрд░рдг рдкрд░ рдХреЗрдВрджреНрд░рд┐рдд рд╣реИ ...
рдареАрдХ рд╣реИ рдзрдиреНрдпрд╡рд╛рдж ... рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдореБрджреНрджрд╛ рд╣рдореЗрд╢рд╛ рдХреЗ рд▓рд┐рдП рдЦреАрдВрдЪ рд░рд╣рд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдкрд░реНрдпрд╛рдкреНрдд рд░реВрдк рд╕реЗ рдЙрдЪрд┐рдд рд╣реИред рдпрд╣ рдХрдард┐рди рд╣реИ, рдореБрдЭреЗ рдкрддрд╛ рд╣реИред рдФрд░ рджреБрд░реНрднрд╛рдЧреНрдп рд╕реЗ рдЕрднреА рдХрд╣реАрдВ рдФрд░ рдзреНрдпрд╛рди рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред
рдХреНрдпрд╛ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдореЛрдиреЛрдореЛрд░реНрдлрд┐рдХ рдорд╛рдорд▓реЛрдВ рдореЗрдВ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд╕рдВрдмрджреНрдз рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рд▓рд┐рдП рдЕрдиреБрдорд╛рдиреЛрдВ рдХреА рдЕрдиреБрдорддрд┐ рдирд╣реАрдВ рджреЗрдиреЗ рдХреЗ рдкреАрдЫреЗ рдХреЛрдИ рдФрд░ рдЕрдзрд┐рдХ рддрд░реНрдХ рдХрд░ рд╕рдХрддрд╛ рд╣реИ? рдореЗрд░реЗ рдкрд╛рд╕ рдПрдХ рдЙрдкрдпреЛрдЧ рдХрд╛ рдорд╛рдорд▓рд╛ рд╣реИ рдЬрд╣рд╛рдВ рдореИрдВ рдЙрд╕ рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдХреЛ рдкрд╕рдВрдж рдХрд░реВрдВрдЧрд╛ (рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ, рдпрд╣ рдХрднреА-рдХрднреА рдЙрди рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рд╕рд╛рде рдЖрд╣реНрд╡рд╛рди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╢рдмреНрджрд╛рд░реНрде рдХреЗ рд▓рд┐рдП рдЧрд▓рдд рд╣реЛрдЧрд╛ рдЬреЛ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдореЛрдиреЛрдореЛрд░реНрдлрд┐рдХ рдирд╣реАрдВ рдереЗ), рдФрд░ рдЕрдЧрд░ рдХреЛрдИ рдзреНрд╡рдирд┐ рд╕рдорд╕реНрдпрд╛ рдирд╣реАрдВ рд╣реИ, рддреЛ рдореБрдЭреЗ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рд╕рдордЭ рдирд╣реАрдВ рдЖрддрд╛ рдХрд┐ рдХреНрдпреЛрдВ рдпрд╣ рдЕрд╕реНрд╡реАрдХреГрдд рд╣реИред
@pythonesque https://github.com/rust-lang/rust/pull/42411 рдкрд░ рдХреБрдЫ рдЪрд░реНрдЪрд╛ рд╣реБрдИ рд╣реИ
рдЖрд╣, рдореБрдЭреЗ рд╕рдордЭ рдореЗрдВ рдЖрдпрд╛ рдХрд┐ рдХреНрдпрд╛ рдпрд╣ рдкрддрд╛ рдЪрд▓рддрд╛ рд╣реИ рдХрд┐ рдкреНрд░рдХреНрд╖реЗрдкрдг рд╕рд╛рдорд╛рдиреНрдп рд░реВрдк рд╕реЗ рд╡рд┐рд╢реЗрд╖рдЬреНрдЮрддрд╛ рдХреЗ рд╕рд╛рде рдмреБрд░реА рддрд░рд╣ рд╕реЗ рдмрд╛рддрдЪреАрдд рдХрд░рддрд╛ рд╣реИ
рджреБрд░реНрднрд╛рдЧреНрдп рд╕реЗ, рдореБрдЭреЗ рдпрдХреАрди рдирд╣реАрдВ рд╣реИ рдХрд┐ рдЕрдЧрд░ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдХреЛрдИ рдРрд╕рд╛ рдХрд░рдиреЗ рдХрд╛ рдХреЛрдИ рддрд░реАрдХрд╛ рд╣реИ рдЬреЛ рдореИрдВ рдЗрд╕ рддрд░рд╣ рдХреА рд╕реБрд╡рд┐рдзрд╛ рдХреЗ рдмрд┐рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ: рдореИрдВ рдПрдХ рд╕рдВрдмрджреНрдз рдкреНрд░рдХрд╛рд░ рд╣реИ рдЬреЛ "рдЯреНрд░реВ" рдЖрдЙрдЯрдкреБрдЯ рдХрд░рддрд╛ рд╣реИ рдЬрдм рджреЛ рдкрд╛рд╕-рдЗрди рдкреНрд░рдХрд╛рд░ рдПрдХ рд╡рд┐рд╢реЗрд╖ рдЧреБрдг рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╡рд╛рдХреНрдпрд╡рд┐рдиреНрдпрд╛рд╕ рд╕рдорд╛рди рд╣реЛрддреЗ рд╣реИрдВ; рдФрд░ "рдЭреВрдареЗ" рдЬрдм рд╡реЗ рдирд╣реАрдВ рд╣реЛрддреЗ рд╣реИрдВ ("рдЭреВрдареЗ" рдорд╛рдорд▓реЗ рдореЗрдВ рдПрдХ рдФрд░ рдЕрдзрд┐рдХ рдорд╣рдВрдЧреА рд╡рд┐рд╢реЗрд╖рддрд╛ рдЦреЛрдЬ рдХреЛ рдЯреНрд░рд┐рдЧрд░ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдЬреЛ рдпрд╣ рддрдп рдХрд░ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдХреНрдпрд╛ рд╡реЗ "рд╢рдмреНрджрд╛рд░реНрде" рд╕рдорд╛рди рд╣реИрдВ)ред рдХреЗрд╡рд▓ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рд╡рд┐рдХрд▓реНрдк рд▓рдЧрддрд╛ рд╣реИ (рдореЗрд░реЗ рд▓рд┐рдП) рд╕рд┐рд░реНрдл рдорд╣рдВрдЧреА рдЦреЛрдЬ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╣реЛрдирд╛; рдЬреЛ рд╕рд┐рджреНрдзрд╛рдВрдд рдореЗрдВ рдареАрдХ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рдмрд╣реБрдд рдЕрдзрд┐рдХ рдорд╣рдВрдЧрд╛ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред
(рдпрджрд┐ рдЗрд╕ рд╡рд┐рд╢реЗрд╖рддрд╛ рдХреЛ рдЪрд╛рд░реЛрдВ рдУрд░ рд╕реЗ рдмрдВрдж рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рддреЛ рдореИрдВ рдореБрдЦреНрдп рд╕реНрдерд┐рддрд┐ рдореЗрдВ рдирд┐рд░реНрдорд╛рдгрдХрд░реНрддрд╛рдУрдВ рдХреЗ рд╣рд░ рд╕рдВрднрд╛рд╡рд┐рдд рдЬреЛрдбрд╝реЗ рдХреА рдЧрдгрдирд╛ рдХрд░рдХреЗ рдФрд░ рдЙрдирдХрд╛ рдЖрдЙрдЯрдкреБрдЯ рдЯреНрд░реВ рдпрд╛ рдЧрд▓рдд рд╣реЛрдиреЗ рдкрд░ рдХрд╛рдо рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВ; рд▓реЗрдХрд┐рди рдЗрд╕рдХрд╛ рдЙрджреНрджреЗрд╢реНрдп рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА рдХреЗ рдмрд╛рд╣рд░ рд╡рд┐рд╕реНрддрд╛рд░ рдХреЗ рд▓рд┐рдП рдЦреБрд▓рд╛ рд╣реЛрдирд╛ рд╣реИ, рддрд╛рдХрд┐; рд╕рдВрднрд╡рдд: рдХрд╛рдо рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ, рдЦрд╛рд╕рдХрд░ рдЬрдм рд╕реЗ рджреЛ рдЕрд▓рдЧ-рдЕрд▓рдЧ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА рдореЗрдВ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдЬрд░реВрд░реА рдПрдХ рджреВрд╕рд░реЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдирд╣реАрдВ рдЬрд╛рдирддреЗ рд╣реИрдВ)ред
рд╡реИрд╕реЗ рднреА, рд╢рд╛рдпрдж рдпрд╣ рд╕рд┐рд░реНрдл рдПрдХ рд╕рдВрдХреЗрдд рд╣реИ рдХрд┐ рдореИрдВ рдЬреЛ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ рд╡рд╣ рд╡рд┐рд╢реЗрд╖рддрд╛ рдкреНрд░рдгрд╛рд▓реА рдХреЗ рд▓рд┐рдП рдПрдХ рдЦрд░рд╛рдм рдлрд┐рдЯ рд╣реИ рдФрд░ рдореБрдЭреЗ рдХреБрдЫ рдЕрдиреНрдп рддрдВрддреНрд░ рдкрд░ рд╕реНрд╡рд┐рдЪ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП, рдЬреИрд╕реЗ рдореИрдХреНрд░реЛрдЬрд╝: рдкреА
рдФрд░ рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд╕рдЪ рд╣реИ рдХрд┐ рдЬреЛ рдореИрдВ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ рд╡рд╣ "рдирдХрд╛рд░рд╛рддреНрдордХ рддрд░реНрдХ" рд╕реНрд╡рд╛рдж рдХрд╛ рд╣реИ (рд╣рд╛рд▓рд╛рдВрдХрд┐ рдмрдВрдж рд▓рдХреНрд╖рдг рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдкрд░реНрдпрд╛рдкреНрдд рдирд╣реАрдВ рд╣реЛрдВрдЧреЗ)ред
рдирдХрд╛рд░рд╛рддреНрдордХ рддрд░реНрдХ рдХреЗ рд▓рд┐рдП рдПрдХ рд╡реИрдХрд▓реНрдкрд┐рдХ рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ рдЬреЛ рдХрд┐рд╕реА рдкреНрд░рдХрд╛рд░ рдХреЗ рдФрдЬрд╛рд░ рд▓рдХреНрд╖рдг рдХреЗ рдПрдХ рдмрдВрдж рд╕реЗрдЯ рдХрд╛ рдХреЗрд╡рд▓ рдПрдХ рд╣реА рд╡рд┐рд╢реЗрд╖рддрд╛, рдРрд╕реА рд╣реИ рдХрд┐ рд╕реЗрдЯ рдХреЗ рдЕрдиреНрдп рдЕрдиреНрдп рд▓рдХреНрд╖рдг рдХреЗ рд╕рд╛рде рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдУрд╡рд░рд▓реИрдк рдирд╣реАрдВ (рдЬреИрд╕реЗ T
рдФрдЬрд╛рд░ рд╕реЗ рдПрдХ { Float | Int | Bool | Ptr }
)ред
рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рдЕрдЧрд░ рд╡рд╣рд╛рдБ рдПрдХ рддрд░реАрдХрд╛ рд╣реИ рдХрд┐ рдЬрдВрдЧ рдореЗрдВ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП (рдЬреЛ рд╡рд╣рд╛рдБ рдирд╣реАрдВ рд╣реИ, AFAIK?), рдореБрдЭреЗ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ рдпрд╣ рдЖрдкрдХреА рд╕рдорд╕реНрдпрд╛ рдХрд╛ рд╕рдорд╛рдзрд╛рди рд╣реЛрдЧрд╛ред рдореИрдВ рдЪрд╛рд╣реВрдВрдЧрд╛ рдХрд┐ рд╡рд┐рднрд┐рдиреНрди рдХреНрд░реЗрдЯреЛрдВ рдореЗрдВ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдирдП рд╕реНрдерд┐рд░рд╛рдВрдХ рдХреА рдПрдХ рдордирдорд╛рдиреА рд╕рдВрдЦреНрдпрд╛ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдВ, рдЬреЛ рдХрд┐ рдХреЗрд╡рд▓ рд╕реНрд╡рдпрдВ рдХреЗ рд▓рд┐рдП рдФрд░ рдЕрд╕рдорд╛рди рд╣рд░ рджреВрд╕рд░реЗ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдирд┐рд░рдВрддрд░ рдХреА рддреБрд▓рдирд╛ рдХрд░реЗрдВ, рдЬрд┐рдирдореЗрдВ рдХреНрд░реЗрдЯ рдкрд░рд┐рднрд╛рд╖рд╛ рдХреЗ рд╕рдордп рдЕрдЬреНрдЮрд╛рдд рд╣реИрдВред рдореИрдВ рдпрд╣ рдирд╣реАрдВ рджреЗрдЦрддрд╛ рдХрд┐ рдХрд┐рд╕реА рднреА рдкреНрд░рдХрд╛рд░ рдХреЗ рдмрдВрдж рд╕реЗрдЯ (рдпрд╛ рд▓рдХреНрд╖рдгреЛрдВ рдХреЗ рдкрд░рд┐рд╡рд╛рд░реЛрдВ рдХрд╛ рд╕реЗрдЯ) рднреА рдЙрд╕ рд▓рдХреНрд╖реНрдп рдХреЛ рдХреИрд╕реЗ рдкреВрд░рд╛ рдХрд░ рд╕рдХрддрд╛ рд╣реИ: рдпрд╣ рдПрдХ рдРрд╕реА рд╕рдорд╕реНрдпрд╛ рд╣реИ рдЬрд┐рд╕реЗ рд╕реАрдзреЗ рддреМрд░ рдкрд░ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЛ рджреЗрдЦреЗ рдмрд┐рдирд╛ рд╣рд▓ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдЕрдиреБрдорд╛рдиреЛрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХрд╛ рдХрд╛рд░рдг рдпрд╣ рд╣реЛрдЧрд╛ рдХрд┐ рдЖрдк рд╕рдм рдХреБрдЫ "рдмрд░рд╛рдмрд░ рдХреА рддреБрд▓рдирд╛ рдирд╣реАрдВ" рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдлрд┐рд░ рдЕрдкрдиреЗ рдирдП рдирд┐рд░рдВрддрд░ рдХреА рд╕рдорд╛рдирддрд╛ рдХреЛ рдЕрдкрдиреЗ рдЖрдк рдореЗрдВ рд▓рд╛рдЧреВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдЬрд┐рд╕ рднреА рдЯреЛрдХрд░реЗ рдореЗрдВ рдЖрдк рдирд┐рд░рдВрддрд░ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рддреЗ рд╣реИрдВ, рдЬреЛ рдЕрдирд╛рде рдХреЗ рдкреАрдЫреЗ рдирд╣реАрдВ рдЪрд▓реЗрдЧрд╛ред рдирд┐рдпрдо рдХреНрдпреЛрдВрдХрд┐ рд▓рдХреНрд╖рдг рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдореЗрдВ рд╕рднреА рдкреНрд░рдХрд╛рд░ рдПрдХ рд╣реА рдЯреЛрдХрд░реЗ рдореЗрдВ рдереЗред рдЕрдЧрд░ рдореИрдВ рд▓рдЧрднрдЧ рдРрд╕рд╛ рдХреЛрдИ рдирд┐рдпрдо рдЪрд╛рд╣рддрд╛ рдерд╛ рд▓реЗрдХрд┐рди рд╕рдорд╛рдирддрд╛, рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рдпрд╣ рднреА рдХрд╛рдо рдирд╣реАрдВ рдХрд░реЗрдЧрд╛, рд▓реЗрдХрд┐рди рд╕рдорд╛рдирддрд╛ рдореЗрд░реЗ рд▓рд┐рдП рдХрд╛рдлреА рдЕрдЪреНрдЫреА рд╣реИ :)
рд╡рд░реНрддрдорд╛рди рдореЗрдВ рд░рд╛рдд рдореЗрдВ, рдпрд╣ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ:
trait Foo {}
trait Bar {}
impl<T: Bar> Foo for T {}
impl Foo for () {}
рд▓реЗрдХрд┐рди рд╡рд┐рд╢реЗрд╖рдЬреНрдЮрддрд╛ рдХреЗ рд╕рд╛рде, рдФрд░ рд░рд╛рдд рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП, рдпрд╣ рдирд╣реАрдВ рд╣реИ:
#![feature(specialization)]
trait Foo<F> {}
trait Bar<F> {}
default impl<F, T: Bar<F>> Foo<F> for T {}
impl<F> Foo<F> for () {}
рдХреНрдпрд╛ рдпрд╣ рдПрдХ рддрд░реНрдХ рд╣реИ рдпрд╛ рдпрд╣ рдПрдХ рдмрдЧ рд╣реИ?
@ рд╢реНрд░реАрдорд╛рди рдЕрд╢реЛрдХ рд╕рд┐рд░реНрдл рд╕рд╛рдорд╛рдиреНрдп рдЕрдирд╛рде рдирд┐рдпрдо рдирд╣реАрдВ рд╣реИ? рдкрд╣рд▓реЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рдХреЛрдИ рдбрд╛рдЙрдирд╕реНрдЯреНрд░реАрдо рдЯреЛрдХрд░рд╛ impl Bar for ()
рдирд╣реАрдВ рд╣реЛ рд╕рдХрддрд╛ рдерд╛ impl Bar<CustomType> for ()
рдЬреЛ рдЖрдкрдХреЗ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдирд┐рд╣рд┐рддрд╛рд░реНрде рдХреЗ рд╕рд╛рде рд╕рдВрдШрд░реНрд╖ рдХрд░реЗрдЧрд╛ред
@Boscop рдЙрд╕ рдкрд░рд┐рджреГрд╢реНрдп рдореЗрдВ, рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ рдХрд┐рд╕реА рднреА рддрд░рд╣ рд╕реЗ рдЧреИрд░-рдбрд┐рдлрд╝реЙрд▓реНрдЯ рджреНрд╡рд╛рд░рд╛ рдиреАрдЪреЗ рдУрд╡рд░рд░рд╛рдЗрдб рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдпрджрд┐ рдореЗрд░реЗ рдкрд╛рд╕: impl Bar<bool> for () {}
рдЕрдиреНрдп рдирд┐рд╣рд┐рддрд╛рд░реНрдереЛрдВ рд╕реЗ рдкрд╣рд▓реЗ рдЬреЛрдбрд╝рд╛ рдЧрдпрд╛ рд╣реИ, рддреЛ рдореИрдВ рдЗрд╕реЗ рдХрд╛рдо рдХрд░рдиреЗ рдХреА рдЙрдореНрдореАрдж рдХрд░реВрдВрдЧрд╛ (рдЖрд░рдПрдлрд╕реА / рдЕрдкреЗрдХреНрд╖рд╛ рдХреЗ рдЕрдиреБрд╕рд╛рд░)ред рдХреНрдпрд╛ рдпрд╣ рд╕рд╣реА рдирд╣реАрдВ рд╣реИ?
рдЖрдкрдХреЗ рджреНрд╡рд╛рд░рд╛ рдмрддрд╛рдП рдЧрдП рдХрд╛рдЙрдВрдЯрд░-рдЙрджрд╛рд╣рд░рдг рдХреА рд░реЗрдЦрд╛рдУрдВ рдХреЗ рд╕рд╛рде рдЧрд╣рд░реА рдЦреБрджрд╛рдИ рдХрд░рддреЗ рд╣реБрдП, рдореБрдЭреЗ рдПрд╣рд╕рд╛рд╕ рд╣реЛрддрд╛ рд╣реИ (рдпрд╛ рд╡рд┐рд╢реНрд╡рд╛рд╕) рдХрд┐ рдЙрджрд╛рд╣рд░рдг "рд╣рдореЗрд╢рд╛-рд▓рд╛рдЧреВ" рдкрд░реАрдХреНрд╖рдг рдХреЛ рд╕рдВрддреБрд╖реНрдЯ рдХрд░рддрд╛ рд╣реИ, рдФрд░ рдЗрд╕ рдкрд░ рдХрд╛рдо рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред
рдпрд╣ рд╕рдорд╕реНрдпрд╛ рд╕рдВрднрд╡рддрдГ # 45814 рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддреА рд╣реИред
рдХреНрдпрд╛ рд╡рд┐рд╢реЗрд╖рдЬреНрдЮрддрд╛ рдореЗрдВ рдореМрдЬреВрдж рдирд╣реАрдВ рд╣реИрдВ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдкрд░ рд╡рд┐рд╢реЗрд╖рддрд╛ рд╕реАрдорд╛ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рдиреЗ рдХреА рдХреЛрдИ рдпреЛрдЬрдирд╛ рд╣реИ?
рдПрдХ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рдЬрд┐рд╕рдХреЗ рд▓рд┐рдП рдпрд╣ рдмрд╣реБрдд рдЙрдкрдпреЛрдЧреА рд╣реЛрдЧрд╛, рдЬреИрд╕реЗ рдХрд┐ рдЖрдк рдЖрд╕рд╛рдиреА рд╕реЗ рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рд╕рдВрд░рдЪрдирд╛ рдХреЗ рд╕рд╛рде рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рд╕рдВрд░рдЪрдирд╛ рдмрдирд╛рдХрд░ рд╡рд┐рднрд┐рдиреНрди рдкреНрд░рдХрд╛рд░реЛрдВ рд╕реЗ рдирд┐рдкрдЯрдиреЗ рдХреА рд░рдЪрдирд╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдЬрд┐рд╕реЗ рд╕рд╛рдЭрд╛ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред
#![feature(specialization)]
trait Handler<M> {
fn handle(&self, m:M);
}
struct Inner;
impl Handler<f64> for Inner {
fn handle(&self, m : f64) {
println!("inner got an f64={}", m);
}
}
struct Struct<T>(T);
impl<T:Handler<M>, M:std::fmt::Debug> Handler<M> for Struct<T> {
default fn handle(&self, m : M) {
println!("got something else: {:?}", m);
self.0.handle(m)
}
}
impl<T> Handler<String> for Struct<T> {
fn handle(&self, m : String) {
println!("got a string={}", m);
}
}
impl<T> Handler<u32> for Struct<T> {
fn handle(&self, m : u32) {
println!("got a u32={}", m);
}
}
fn main() {
let s = Struct(Inner);
s.handle("hello".to_string());
s.handle(5.0 as f64);
s.handle(5 as u32);
}
рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдКрдкрд░ рдХреЗ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ, рдХреБрдЫ рдЕрдЬреАрдм рдЬреЛ рдореИрдВрдиреЗ рдЕрдиреБрднрд╡ рдХрд┐рдпрд╛ рд╣реИ - рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд╣реИрдВрдбрд▓рд░ рдЗрдореНрдкреНрд▓рд╛рдВрдЯ (рдФрд░ рд╕реНрд╡рдпрдВ рднреА ред.0 mhandle (m)) рдкрд░ рдмрдВрдзреЗ рд╣реБрдП рдирд┐рд╢рд╛рди рдХреЛ рд╣рдЯрд╛рдиреЗ рдХреЗ рдмрд╛рдж рдХреЛрдб рдмрд┐рдирд╛ рдореБрджреНрджреЛрдВ рдХреЗ рд╕рдВрдХрд▓рди рдХрд░рддрд╛ рд╣реИред рд╣рд╛рд▓рд╛рдБрдХрд┐, рдЬрдм рдЖрдк u32 рдХреЗ рд▓рд┐рдП рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╣рдЯрд╛рддреЗ рд╣реИрдВ, рддреЛ рдпрд╣ рдЕрдиреНрдп рд╡рд┐рд╢реЗрд╖рддрд╛ рдХрдЯреМрддреА рдХреЛ рддреЛрдбрд╝рддрд╛ рд╣реИ:
#![feature(specialization)]
trait Handler<M> {
fn handle(&self, m:M);
}
struct Struct<T>(T);
impl<T, M:std::fmt::Debug> Handler<M> for Struct<T> {
default fn handle(&self, m : M) {
println!("got something else: {:?}", m);
}
}
impl<T> Handler<String> for Struct<T> {
fn handle(&self, m : String) {
println!("got a string={}", m);
}
}
// impl<T> Handler<u32> for Struct<T> {
// fn handle(&self, m : u32) {
// println!("got a u32={}", m);
// }
// }
fn main() {
let s = Struct(());
s.handle("hello".to_string());
s.handle(5.0 as f64);
}
рд╣рд╛рд▓рд╛рдВрдХрд┐ u32 рдХреЗ рд▓рд┐рдП рд╣реИрдВрдбрд▓рд░ рдХреЛ рдХреЙрд▓ рдХрд░рдиреЗ рд╡рд╛рд▓рд╛ рдХреЛрдИ рдХреЛрдб рдирд╣реАрдВ рд╣реИ, рдлрд┐рд░ рднреА рд╡рд╣рд╛рдВ рдирд╣реАрдВ рд╣реЛрдиреЗ рдХреЗ рдХрд╛рд░рдг рдпрд╣ рдХреЛрдб рдХрдВрдкрд╛рдЗрд▓ рди рд╣реЛрдиреЗ рдХрд╛ рдХрд╛рд░рдг рдмрдирддрд╛ рд╣реИред
рд╕рдВрдкрд╛рджрд┐рдд рдХрд░реЗрдВ: рдпрд╣ рджреВрд╕рд░реА рд╕рдорд╕реНрдпрд╛ рдХреЗ рд╕рдорд╛рди рдкреНрд░рддреАрдд рд╣реЛрддрд╛ рд╣реИ ("рд╣рд╛рд▓рд╛рдВрдХрд┐, рдЬрдм рдЖрдк u32 рдХреЗ рд▓рд┐рдП рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЛ рд╣рдЯрд╛рддреЗ рд╣реИрдВ, рддреЛ рдпрд╣ рдЕрдиреНрдп рд╡рд┐рд╢реЗрд╖рддрд╛ рдХрдЯреМрддреА рдХреЛ рддреЛрдбрд╝рддрд╛ рд╣реИ") рдХрд┐ рдЧреНрд▓реИрдбреА рдиреЗ рдПрдХ рдкреЛрд╕реНрдЯ рдХрд╛
рдЬрдВрдЧ рдХреЗ рд╕рд╛рде 1.35.0-рд░рд╛рдд (3de010678 2019-04-11), рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХреЛрдб рдПрдХ рддреНрд░реБрдЯрд┐ рджреЗрддрд╛ рд╣реИ:
#![feature(specialization)]
trait MyTrait<T> {
fn print(&self, parameter: T);
}
struct Message;
impl<T> MyTrait<T> for Message {
default fn print(&self, parameter: T) {}
}
impl MyTrait<u8> for Message {
fn print(&self, parameter: u8) {}
}
fn main() {
let message = Message;
message.print(1_u16);
}
рддреНрд░реБрдЯрд┐:
error[E0308]: mismatched types
--> src/main.rs:20:19
|
18 | message.print(1_u16);
| ^^^^^ expected u8, found u16
рд╣рд╛рд▓рд╛рдБрдХрд┐, рдЬрдм рдореИрдВ impl MyTrait<u8>
рдмреНрд▓реЙрдХ рдХреЛ рдЫреЛрдбрд╝рддрд╛ рд╣реВрдВ рддреЛ рдХреЛрдб рд╕рдВрдХрд▓рд┐рдд рдФрд░ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ:
#![feature(specialization)]
trait MyTrait<T> {
fn print(&self, parameter: T);
}
struct Message;
impl<T> MyTrait<T> for Message {
default fn print(&self, parameter: T) {}
}
/*
impl MyTrait<u8> for Message {
fn print(&self, parameter: u8) {}
}
*/
fn main() {
let message = Message;
message.print(1_u16);
}
рдХреНрдпрд╛ рдпрд╣ рдбрд┐рдЬрд╛рдЗрди рджреНрд╡рд╛рд░рд╛ рд╣реИ, рдХреНрдпрд╛ рдпрд╣ рдЗрд╕рд▓рд┐рдП рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдЕрдзреВрд░рд╛ рд╣реИ, рдпрд╛ рдпрд╣ рдПрдХ рдмрдЧ рд╣реИ?
рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдореИрдВ рдпрд╣ рдЬрд╛рдирдирд╛ рдЪрд╛рд╣реВрдВрдЧрд╛ рдХрд┐ рдХреНрдпрд╛ рдпрд╣ рд╡рд┐рд╢реЗрд╖рдЬреНрдЮрддрд╛ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдорд╛рдорд▓рд╛ (рдПрдХрд▓ рдХрдВрдХреНрд░реАрдЯ рдкреНрд░рдХрд╛рд░ рдХреЗ рд▓рд┐рдП рдЕрддрд┐рд╡реНрдпрд╛рдкреА рдкреНрд░рдХрд╛рд░ рдХреЗ рдорд╛рдкрджрдВрдбреЛрдВ рдХреЗ рд╕рд╛рде рд▓рдХреНрд╖рдг рд▓рд╛рдЧреВ рдХрд░рдирд╛) рдЕрддрд┐рд╡реНрдпрд╛рдкреА рдкреНрд░рдХрд╛рд░ рдХреЗ рд▓рд┐рдП рдПрдХ рд╣реА рд╡рд┐рд╢реЗрд╖рддрд╛ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХрд╛ рд╡рд┐рд░реЛрдз рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред RFC 1210 рдореЗрдВ "рдкреВрд░реНрд╡рд╡рд░реНрддреА рдирд┐рдпрдореЛрдВ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдирд╛" рдЕрдиреБрднрд╛рдЧ рдкрдврд╝рдирд╛, рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЗрд╕рдХрд╛ рд╕рдорд░реНрдерди рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛, рд▓реЗрдХрд┐рди RFC рдРрд╕реЗ рдЙрджрд╛рд╣рд░рдг рдирд╣реАрдВ рджреЗрддрд╛ рд╣реИ рдФрд░ рдореБрдЭреЗ рдирд╣реАрдВ рдкрддрд╛ рдХрд┐ рд╣рдо рдЕрднреА рднреА рдЗрд╕ RFC рдХрд╛ рд╕рдЦреНрддреА рд╕реЗ рдкрд╛рд▓рди рдХрд░ рд░рд╣реЗ рд╣реИрдВред
рдПрдХ рдЕрдЬреАрдм рд░рд┐рдкреЛрд░реНрдЯ рдХрд░реЗрдВ:
trait MyTrait {}
impl<E: std::error::Error> MyTrait for E {}
struct Foo {}
impl MyTrait for Foo {} // OK
// But this one is conflicting with error message:
//
// "... note: upstream crates may add new impl of trait `std::error::Error` for type
// std::boxed::Box<(dyn std::error::Error + 'static)>` in future versions"
//
// impl MyTrait for Box<dyn std::error::Error> {}
рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ Box<dyn std::error::Error>
рдЕрдЬреАрдмреЛрдЧрд░реАрдм ("рд╡рд┐рд╢реЗрд╖" рд╢рдмреНрдж рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рд╕реЗ рдмрдЪреЗрдВ) рдХреНрдпреЛрдВ рд╣реИ? рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рдЕрдЧрд░ рдпрд╣ рднрд╡рд┐рд╖реНрдп рдореЗрдВ std::error::Error
рдХрд╛ рдЕрдиреБрдорд╛рди рд▓рдЧрд╛рддрд╛ рд╣реИ, рддреЛ рднреА impl MyTrait for Box<dyn std::error::Error>
рдЕрднреА рднреА impl<E: std::error::Error> MyTrait for E
рдПрдХ рд╡реИрдз рд╡рд┐рд╢реЗрд╖рдЬреНрдЮрддрд╛ рд╣реИ, рдирд╣реАрдВ?
рдЕрднреА рднреА рдПрдХ рдорд╛рдиреНрдп рд╡рд┐рд╢реЗрд╖рдЬреНрдЮрддрд╛ рд╣реИ
рдЖрдкрдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ impl<E: std::error::Error> MyTrait for E
рд╡рд┐рд╢реЗрд╖ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛, рдХреНрдпреЛрдВрдХрд┐ рдЗрд╕рдореЗрдВ рдХреЛрдИ default
рд╡рд┐рдзрд┐рдпрд╛рдБ рдирд╣реАрдВ рд╣реИрдВред
@ bjorn3 рдРрд╕рд╛ рд▓рдЧ рд░рд╣рд╛ рд╣реИ рдХрд┐ рдпрд╣ рдХрд╛рдо рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП, рд▓реЗрдХрд┐рди рдЕрдЧрд░ рдЖрдк рдбрдореА рд╡рд┐рдзрд┐рдпреЛрдВ рдореЗрдВ рдЬреЛрдбрд╝рддреЗ рд╣реИрдВ рддреЛ рднреА рдРрд╕рд╛ рдирд╣реАрдВ рд╣реИ
рдЯреЛрдХрд░рд╛ рдореЗрдВ bar
pub trait Bar {}
impl<B: Bar> Bar for Box<B> {}
рдЯреЛрдХрд░рд╛ рдореЗрдВ foo
#![feature(specialization)]
use bar::*;
trait Trait {
fn func(&self) {}
}
impl<E: Bar> Trait for E {
default fn func(&self) {}
}
struct Foo;
impl Trait for Foo {} // OK
impl Trait for Box<dyn Bar> {} // Error error[E0119]: conflicting implementations of trait
рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рдпрджрд┐ рдЖрдк рдЯреЛрдХрд░рд╛ bar
рдмрджрд▓рддреЗ рд╣реИрдВ
pub trait Bar {}
impl<B: ?Sized + Bar> Bar for Box<B> {}
рдлрд┐рд░ foo
рд╕рдВрдХрд▓рди рдХрд░реЗрдВред
@ bjorn3 рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╣рдореЗрдВ рдЗрд╕реЗ ( рдЦреЗрд▓ рдХреЗ рдореИрджрд╛рди ) рд╡рд┐рд╢реЗрд╖реАрдХреГрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП default
рд╡рд┐рдзрд┐ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред
@ рдХреГрд╖реНрдгрдирд╛рд╕реА I рдЖрдкрдХреЗ рдЙрджрд╛рд╣рд░рдг ( рдЦреЗрд▓ рдХреЗ рдореИрджрд╛рди ) рдореЗрдВ "рдкрд░рд╕реНрдкрд░ рд╡рд┐рд░реЛрдзреА рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди" рддреНрд░реБрдЯрд┐ рдХреЛ рдкреБрди: рдЙрддреНрдкрдиреНрди рдирд╣реАрдВ рдХрд░ рд╕рдХрддрд╛ рд╣реИред
рдЕрдкрдбреЗрдЯ: рдУрд╣, рдореИрдВ рджреЗрдЦ рд░рд╣рд╛ рд╣реВрдВред рд▓рдХреНрд╖рдг Bar
рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрдкрд╕реНрдЯреНрд░реАрдо рдЯреЛрдХрд░рд╛ рд╕реЗ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред
@updogliu рдЖрдкрдХрд╛ рдЙрджрд╛рд╣рд░рдг рд╡рд┐рд╢реЗрд╖рдЬреНрдЮрддрд╛ рдирд╣реАрдВ рджрд┐рдЦрд╛рддрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ Foo
Error
рд▓рд╛рдЧреВ рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИред
рдХреНрдпрд╛ рдореИрдВ рдЖрдЬ рд░рд╛рдд рдмрд╣реБрдд рджреЗрд░ рд╕реЗ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ, рдпрд╛ рдЗрд╕рд╕реЗ рд╕реНрдЯреИрдХ рдУрд╡рд░рдлреНрд▓реЛ рдирд╣реАрдВ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП?
#![feature(specialization)]
use std::fmt::Debug;
trait Print {
fn print(self);
}
default impl<T> Print for [T; 1] where T: Debug {
fn print(self) {
println!("{:?}", self);
}
}
impl<T> Print for [T; 1] where T: Debug + Clone {
fn print(self) {
println!("{:?}", self.clone());
}
}
fn main() {
let x = [0u8];
x.print();
}
рдореЛрдЯреЗ-рджрд╛рдиреЗ рд╡рд╛рд▓реЗ default impl
рдмреНрд▓реЙрдХ рд╣рдореЗрд╢рд╛ рдореЗрд░реЗ рд▓рд┐рдП рдмрд╣реБрдд рд╣реА рдЕрдЬреАрдм рдХрд╛рдо рдХрд░рддреЗ рд░рд╣реЗ рд╣реИрдВ, рдореИрдВ рдЗрд╕рдХреЗ рдмрдЬрд╛рдп default fn
рдмрдврд╝рд┐рдпрд╛ рдЕрдирд╛рдЬ рдХреЗ рд╕рд┐рдВрдЯреИрдХреНрд╕ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рдирд╛ рдЪрд╛рд╣реВрдБрдЧрд╛ред
рд╕рдВрдкрд╛рджрд┐рдд рдХрд░реЗрдВ: RFC рдХреЛ рдХреНрд░реЙрд╕-рдЪреЗрдХ рдХрд░рдиреЗ рдкрд░, рдпрд╣ рдЕрдкреЗрдХреНрд╖рд┐рдд рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ default impl
рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ _not_ рдХрд╛ рдЕрд░реНрде рд╣реИ рдХрд┐ impl
рдмреНрд▓реЙрдХ рдореЗрдВ рд╕рднреА рдЖрдЗрдЯрдо default
ed рд╣реИрдВред рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдХрдо рд╕реЗ рдХрдо рдХрд╣рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрди рд╢рдмреНрджрд╛рд░реНрдереЛрдВ рдХреЛ рдЖрд╢реНрдЪрд░реНрдп рд╣реЛрддрд╛ рд╣реИред
@ HadrienG2 рдореИрдВрдиреЗ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЗрд╕ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдореЗрдВ рд╣рдореЗрд╢рд╛ default fn
рдХрд┐рдпрд╛ рд╣реИ рд▓реЗрдХрд┐рди рдЗрд╕ рдмрд╛рд░ рдореИрдВ default
рдХреАрд╡рд░реНрдб рднреВрд▓ рдЧрдпрд╛ рдФрд░ рд╕рдВрдХрд▓рдХ рдиреЗ рдЗрд╕реЗ impl
рдЬреЛрдбрд╝рдиреЗ рдХрд╛ рд╕реБрдЭрд╛рд╡ рджрд┐рдпрд╛ред рдкрд╣рд▓реЗ рд╕реНрдЯреИрдХ рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐ рдореБрджреНрджрд╛ рдирд╣реАрдВ рджреЗрдЦрд╛ рдерд╛ рдФрд░ рдЕрдЧрд░ рдпрд╣ рдЗрд╕ рд╕реНрддрд░ рдкрд░ рдЙрдореНрдореАрдж рдереА рдпрдХреАрди рдирд╣реАрдВ рдерд╛ред рд╕реБрдЭрд╛рд╡ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж, default fn
рдареАрдХ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред
рдореВрд▓ рдЖрд░рдПрдлрд╕реА рдХреЛ рджреЗрдЦрддреЗ рд╣реБрдП, рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рдкреНрд░рддреНрдпрд╛рд░реЛрдкрдг рдХреА рд╡рд┐рд╢реЗрд╖рдЬреНрдЮрддрд╛ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдПрдХ рдЦрдВрдб рд╣реИред рдХреНрдпрд╛ рдХрд┐рд╕реА рдиреЗ рджрд┐рдпрд╛ рдХрд┐ рдореИрдВ рдХреЛрд╢рд┐рд╢ рдХрд░реВрдВ?
RFC рдореЗрдВ рдкреНрд░рд╕реНрддрд╛рд╡рд┐рдд рджреГрд╖реНрдЯрд┐рдХреЛрдг рд╕реАрдзреЗ рдХрд╛рдо рдирд╣реАрдВ рдХрд░ рд╕рдХрддрд╛ рд╣реИ, рдХрдо рд╕реЗ рдХрдо, рдирд┐рд╣рд┐рдд рдХрд╛рд╕реНрдЯ рддрд░реАрдХреЛрдВ рдХреЗ рд▓рд┐рдП:
// This compiles correctly today:
#![feature(specialization)]
use std::marker::PhantomData;
struct Foo<T>(PhantomData<T>);
impl<T> Foo<T> {
default const fn foo() -> Self { Self(PhantomData) }
// ^^should't default here error?
}
// ----
// Adding this fails:
impl<T: Copy> Foo<T> {
const fn foo() -> Self { Self(PhantomData) }
}
рдореВрд▓ RFC рд╡рд┐рдзрд┐ рдХреЛ рдПрдХ рд╡рд┐рд╢реЗрд╖рддрд╛ рдореЗрдВ рдЙрдард╛рдиреЗ рдХрд╛ рдкреНрд░рд╕реНрддрд╛рд╡ рдХрд░рддрд╛ рд╣реИ, рдЬреЛ рдХрд┐ рдкреНрд░рдХрд╛рд░ рдХреЗ рд▓рд┐рдП рдХрд╛рд░реНрдпрд╛рдиреНрд╡рд┐рдд рдХрд░рддрд╛ рд╣реИ, рдФрд░ рдЗрдореНрдкреНрд▓рд┐рдЯ рдХрд░рддрд╛ рд╣реИред рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдХрд╛рд╕реНрдЯ рдПрдлрдПрди рддрд░реАрдХреЛрдВ рдХреЗ рд▓рд┐рдП, рдкреНрд░рдХрд╛рд░ рдХреЗ рд▓рд┐рдП рдирд┐рд╢рд╛рди рдХреЗ рдЙрди рд▓реЛрдЧреЛрдВ рдХреЛ рдХреЙрдиреНрд╕реНрдЯ рдЗрдореНрдкреНрд▓рд╛рдВрдЯ рд╣реЛрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреАред
рдЗрд╕ рд╕реНрдерд┐рддрд┐ рдореЗрдВ рдЖрдиреЗ рд╡рд╛рд▓реЗ рд╕рднреА рд▓реЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП рдФрд░ рдЗрд╕ рд╕реНрдерд┐рддрд┐ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдирдиреЗ рдХреЗ рд▓рд┐рдП рдЙрддреНрд╕реБрдХ рдереЗ - 2018 рдореЗрдВ рдХреБрдЫ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╡реИрдЪрд╛рд░рд┐рдХ рдкреНрд░рдЧрддрд┐ рд╣реБрдИ:
http://smallcultfollowing.com/babysteps/blog/2018/02/09/maximally-minimal-specialization-always-applicable-impls/
http://aturon.github.io/tech/2018/04/05/sound-specialization/
рдЕрднреА рд╣рд╛рд▓ рд╣реА рдореЗрдВ, рдкрд┐рдЫрд▓реЗ рдорд╣реАрдиреЗ @nikomatsakis рдиреЗ рд▓рд┐рдЦрд╛ рд╣реИ (рдПрдХ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд░реВрдк рдореЗрдВ, рдПрдХ рдФрд░ рд╕рдВрджрд░реНрдн рдореЗрдВ; рдмреЛрд▓реНрдб рдорд╛рдЗрди):
рдПрдХ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдореБрджреНрджрд╛ рдерд╛ [рд╡рд┐рд╢реЗрд╖рдЬреНрдЮрддрд╛ рдореЗрдВ] рдЬрд┐рд╕реЗ рдХрднреА рд╕рдВрддреЛрд╖рдЬрдирдХ рдврдВрдЧ рд╕реЗ рд╣рд▓ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛, рдЬреАрд╡рдирдХрд╛рд▓ рдФрд░ рд▓рдХреНрд╖рдгреЛрдВ рдХреЗ рдЪрд╛рд░реЛрдВ рдУрд░ рдПрдХ рддрдХрдиреАрдХреА рдзреНрд╡рдирд┐ рдЪрд┐рдВрддрд╛ [...] рдлрд┐рд░, [рдКрдкрд░ рдЬреЛ рджреЛ рдкреЛрд╕реНрдЯ рдЬреБрдбрд╝реЗ рд╣реБрдП рд╣реИрдВ]ред рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЗрди рд╡рд┐рдЪрд╛рд░реЛрдВ рдиреЗ рдореВрд▓ рд░реВрдк рд╕реЗ рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╣рд▓ рдХрд░ рджрд┐рдпрд╛ рд╣реИ , рд▓реЗрдХрд┐рди рд╣рдо рдЗрд╕ рдмреАрдЪ рд╡реНрдпрд╕реНрдд рд╣реИрдВ рдФрд░ рдЙрдирдХреЗ рдкрд╛рд╕ рдкрд╛рд▓рди рдХрд░рдиреЗ рдХрд╛ рд╕рдордп рдирд╣реАрдВ рд╣реИред
рдЙрдореНрдореАрдж рд╣реИ рдХрд┐ рд╣рд╛рд▓рд╛рдВрдХрд┐ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдЕрднреА рднреА рдХрд╛рдо рдХрд░рдирд╛ рд╣реИред
(рдЗрд╕реЗ рдкреЛрд╕реНрдЯ рдХрд░рдирд╛ рдХреНрдпреЛрдВрдХрд┐ рдореБрдЭреЗ рдпрд╣ рдзрд╛рдЧрд╛ рдХреБрдЫ рд╣рдлреНрддреЗ рдкрд╣рд▓реЗ рдорд┐рд▓рд╛ рдерд╛ рдФрд░ рдкрд┐рдЫрд▓реЗ рд╕рд╛рд▓ рдХреА рдкреНрд░рдЧрддрд┐ рдХрд╛ рдХреЛрдИ рдЕрдВрджрд╛рдЬрд╛ рдирд╣реАрдВ рдерд╛, рдлрд┐рд░ рд╣рд╛рд▓ рд╣реА рдореЗрдВ рджреБрд░реНрдШрдЯрдирд╛ рдХреЗ рдмрд╛рдж рдЙрди рдкреЛрд╕реНрдЯреНрд╕ рдореЗрдВ рдЖрдпрд╛ред рдЗрдирдХрд╛ рдЙрд▓реНрд▓реЗрдЦ рдХрд░рдиреЗ рдХреЗ рдКрдкрд░ рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдВ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдЧреАрдерд╣рдм рдХрд┐рд╕реА рднреА рд▓реЗрдХрд┐рди рдкрд╣рд▓реЗ рдХреЛ рджреЗрдЦрдиреЗ рдХреЗ рд▓рд┐рдП рддреЗрдЬреА рд╕реЗ рдХрдард┐рди рдмрдирд╛рддрд╛ рд╣реИред рд▓рдВрдмреЗ рдзрд╛рдЧреЗ рдкрд░ рдЕрдВрддрд┐рдо рдХреБрдЫ рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдВ: рд░реЛрдирд╛: рдпрд╣ рдорджрджрдЧрд╛рд░ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдпрджрд┐ рдЗрд╕ рдЕрджреНрдпрддрди рдиреЗ рдЗрд╕реЗ рдореБрджреНрджреЗ рдХреЗ рд╡рд┐рд╡рд░рдг рдореЗрдВ рд╢рд╛рдорд┐рд▓ рдХрд┐рдпрд╛ рд╣реЛред)
рд╕рднреА рдХреЛ рдирдорд╕реНрдХрд╛рд░! рдХреНрдпрд╛ рдХреЛрдИ рдореБрдЭреЗ рдмрддрд╛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдЙрдкрдпреЛрдЧ рдорд╛рдорд▓рд╛ рдХрд╛рдо рдХреНрдпреЛрдВ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ? рдХреАрдбрд╝реЗ рдпрд╛ рдЕрдкреЗрдХреНрд╖рд┐рдд рд╡реНрдпрд╡рд╣рд╛рд░?
рдЗрд╕ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд░реВрдк рдореЗрдВред impl A for i32
рдареАрдХ рд╣реИ, рд▓реЗрдХрд┐рди impl A for ()
рдХреЛ 1.39.0-рд░рд╛рдд рдореЗрдВ рд╕рдВрдХрд▓рд┐рдд рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред
#![feature(specialization)]
trait A {
fn a();
}
default impl <T: ToString> A for T {
fn a() {}
}
impl A for i32 {
fn a() {}
}
impl A for () {
fn a() {}
}
рд╕рдВрдХрд▓рд┐рдд рд╕рдВрджреЗрд╢:
error[E0119]: conflicting implementations of trait `A` for type `()`:
--> src/lib.rs:16:1
|
8 | default impl <T: ToString> A for T {
| ---------------------------------- first implementation here
...
16 | impl A for () {
| ^^^^^^^^^^^^^ conflicting implementation for `()`
|
= note: upstream crates may add new impl of trait `std::fmt::Display` for type `()` in future versions
@Hexilee рдиреЗ рдирд┐рд╣рд┐рддрд╛рд░реНрде рдХреЗ рддрд░реАрдХреЛрдВ рдкрд░ default
рд▓рдЧрд╛рдПрдВред
@ рдХреГрд╖реНрдгрд╕реНрдирд╛рдирд╕реА рдЙрджрд╛рд╣рд░рдг реи
@zserik рд╣рд╛рдБ, рдореБрдЭреЗ рдкрддрд╛ рд╣реИред рдореБрдЭреЗ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ рдЗрд╕реЗ рдЕрднреА рддрдХ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдпрд╛ рдЗрд╕реЗ рд╣рдЯрд╛ рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рдХрд┐рд╕реА рднреА рдорд╛рдорд▓реЗ рдореЗрдВ рдпрд╣ рдЕрдм рдХрд╛рдо рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред
рдпрд╣ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдЕрдм рдХрд╛рдо рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдХрд╛рдо рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред
рдореИрдВ рдпрд╣рд╛рдБ рдпрд╣ рдкреВрдЫ рд░рд╣рд╛ рд╣реВрдБ, рдХреНрдпреЛрдВрдХрд┐ рдореИрдВрдиреЗ рдЗрд╕ рд╡рд┐рд╖рдп рдкрд░ рдХрд╣реАрдВ рдФрд░ рдзреНрдпрд╛рди рдирд╣реАрдВ рджрд┐рдпрд╛ рд╣реИ - рдХреНрдпрд╛ рдХреЛрдИ default
рд╡рд┐рднрд┐рдиреНрди рдорд╛рдирдХ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреА рдХреЛрдИ рдпреЛрдЬрдирд╛ рд╣реИ, рдЗрд╕реА рддрд░рд╣ рд╕реЗ рд╣рдордиреЗ const
рдХреИрд╕реЗ рдХрд┐рдпрд╛ рд╣реИ From
рдФрд░ Into
рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди ( impl<T, U: From<T>> Into<U> for T
рдФрд░ impl<T> From<T> for T
) рдХреЗ рд▓рд┐рдП рд╡реНрдпрд╛рдкрдХ рд╕рд╛рдорд╛рдиреНрдп From
рд▓рд┐рдЦрдирд╛ рдореБрд╢реНрдХрд┐рд▓ рд╣реИ Into
core
рд╕реЗ рдбрд╛рдЙрдирд╕реНрдЯреНрд░реАрдо рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди, рдФрд░ рдпрд╣ рдЕрдЪреНрдЫрд╛ рд╣реЛрдЧрд╛ рдпрджрд┐ рдореИрдВ рдЕрдкрдиреЗ рд╕реНрд╡рдпрдВ рдХреЗ рдмрдХреНрд╕реЗ рдореЗрдВ рдЙрди рд░реВрдкрд╛рдВрддрд░рдгреЛрдВ рдХреЛ рдУрд╡рд░рд░рд╛рдЗрдб рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВред
рдЕрдЧрд░ рд╣рдо From
/ Into
рд▓рд┐рдП рд╡рд┐рд╢реЗрд╖рдЬреНрдЮрддрд╛ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддреЗ рд╣реИрдВ, рддреЛ рднреА рдпрд╣ рдЬрд╛рд▓реА рд╕рдорд╕реНрдпрд╛ рдХреЗ рдХрд╛рд░рдг рд╕рд╛рдорд╛рдиреНрдп рдЕрдиреБрдорд╛рдиреЛрдВ рдореЗрдВ рдорджрдж рдирд╣реАрдВ рдХрд░реЗрдЧрд╛ред
@ рдХреГрд╖реНрдгрдирд╛рд╕реА рдореБрдЭреЗ рд╡рд┐рд╢реНрд╡рд╛рд╕ рдирд╣реАрдВ рд╣реИ рдХрд┐ рдорд╛рдорд▓рд╛ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдпрд╣ рдХреЛрдб рдХрд╛рдо рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП рдЕрдЧрд░ From
рдФрд░ Into
рд╡рд┐рд╢реЗрд╖ рд╣реЛ, рд▓реЗрдХрд┐рди рдРрд╕рд╛ рдирд╣реАрдВ рд╣реИ рдХрд┐ рд╡реЗ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рд╣реИрдВ:
impl<M: Into<[S; 2]>, S> From<M> for GLVec2<S> {
fn from(to_array: M) -> GLVec2<S> {
unimplemented!()
}
}
impl<M, S> Into<M> for GLVec2<S>
where
[S; 2]: Into<M>,
{
fn into(self) -> M {
unimplemented!()
}
}
pub struct GLVec2<S> {
pub x: S,
pub y: S,
}
рдпрджрд┐ рдЖрдк From
рдФрд░ Into
рдХреЛ рдПрдХ рдХрд╕реНрдЯрдо рд╡рд┐рд╢реЗрд╖рддрд╛ рдореЗрдВ рд░реВрдкрд╛рдВрддрд░рд┐рдд рдХрд░рддреЗ рд╣реИрдВ, рдЬрд┐рд╕рдореЗрдВ рд╡реЗ рд╕рд╛рдорд╛рдиреНрдп рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдирд╣реАрдВ рд╣реИрдВ: https://play.rust-lang.org/?version=stable&mode=dugugeded= 2018 рдФрд░ рд╕рд╛рд░ = cc126b016ff62643946aebc6bab88c98
@ рдареАрдХ рд╣реИ, рдпрджрд┐ рдЖрдк рдбрд┐рдлрд╝реЙрд▓реНрдЯ
рдореИрдВ рджреЛрд╣рд░рд╛рдКрдВрдЧрд╛, рдорд╛рдирдХ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдореЗрдВ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ рдирд┐рд╣рд┐рдд рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП Into
From/Into
рдирд┐рд╣рд┐рддрд╛рд░реНрде Into
рд╕рдВрднрд╡ рдХреЗ рд▓рд┐рдП рд╕рд╛рдорд╛рдиреНрдп рдкреНрд░рддреНрдпрд╛рд░реЛрдкрдг рдирд╣реАрдВ рдХрд░реЗрдЧрд╛ред (рдФрд░ рдпрд╣ From
рд╕рд╛рдорд╛рдиреНрдп рдкреНрд░рднрд╛рд╡ рдХреЛ рдкреНрд░рднрд╛рд╡рд┐рдд рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ)
рдирдорд╕реНрддреЗ, рд╡рд░реНрддрдорд╛рди рд╡рд┐рд╢реЗрд╖рдЬреНрдЮрддрд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдореЗрдВ рдПрдХ рдЧрдВрднреАрд░ рдмрдЧ рд╣реИред рдореИрдВ рдЗрд╕реЗ рдПрдХ рдмрдЧ рдХреЗ рд░реВрдк рдореЗрдВ рд▓реЗрдмрд▓ рдХрд░рддрд╛ рд╣реВрдВ, рднрд▓реЗ рд╣реА рд╡рд╣ рдПрдХ рд╕реНрдкрд╖реНрдЯ рдбрд┐рдЬрд╛рдЗрди рдирд┐рд░реНрдгрдп рдерд╛, рдпрд╣ рд╣рдореЗрдВ рд╕рдмрд╕реЗ рд╢рдХреНрддрд┐рд╢рд╛рд▓реА рд╡рд┐рд╢реЗрд╖рдЬреНрдЮрддрд╛ рд╕реБрд╡рд┐рдзрд╛рдУрдВ рдореЗрдВ рд╕реЗ рдПрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рд╕реЗ рд░реЛрдХрддрд╛ рд╣реИ, рдЕрд░реНрдерд╛рддреН "рдЕрдкрд╛рд░рджрд░реНрд╢реА рдкреНрд░рдХрд╛рд░" (рдпрд╣ рдПрдХ рдФрдкрдЪрд╛рд░рд┐рдХ рдирд╛рдо рдирд╣реАрдВ рд╣реИ) рдХреЗ рдирд┐рд░реНрдорд╛рдг рдХреА рд╕рдВрднрд╛рд╡рдирд╛ред рдпрд╣ рдкреИрдЯрд░реНрди рдЕрдиреНрдп рднрд╛рд╖рд╛рдУрдВ рдореЗрдВ рд╕рдмрд╕реЗ рдкреНрд░рд╛рдЗрдорд░реА рдмрд┐рд▓реНрдбрд┐рдВрдЧ рдмреНрд▓реЙрдХреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рд╣реИ, рдЬреЛ рдХрд┐ рд╣реЙрд╕реНрдХрд▓ рдпрд╛ рд╕реНрдХрд╛рд▓рд╛ рдЬреИрд╕реА рдкреНрд░рдХрд╛рд░ рдХреА рдХрдХреНрд╖рд╛рдПрдВ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИред
рдпрд╣ рдкреИрдЯрд░реНрди рд╕рд░рд▓ рд╣реИ - рд╣рдо WithLabel
рдпрд╛ WithID
рдЬреИрд╕реА рд╕рдВрд░рдЪрдирд╛рдУрдВ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдЬреЛ рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рд╕рдВрд░рдЪрдирд╛рдУрдВ рдореЗрдВ рдХреБрдЫ рдлрд╝реАрд▓реНрдб рдФрд░ рд╡рд┐рдзрд┐рдпрд╛рдБ рдЬреЛрдбрд╝рддреЗ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рдпрджрд┐ рд╣рдо WithLabel<WithID<MyType>>
рдмрдирд╛рддреЗ рд╣реИрдВ рддреЛ рд╣рдо рд╕рдХреНрд╖рдо рд╣реЛрдВрдЧреЗ id
, label
рдФрд░ MyType
рд╕рднреА рдлрд╝реАрд▓реНрдб / рддрд░реАрдХреЗ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдПред рджреБрд░реНрднрд╛рдЧреНрдп рд╕реЗ, рд╡рд░реНрддрдорд╛рди рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рд╕рд╛рде, рдпрд╣ рд╕рдВрднрд╡ рдирд╣реАрдВ рд╣реИред
рдиреАрдЪреЗ рдЗрд╕ рдкреИрдЯрд░реНрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рд╡рд╛рд▓рд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг рдХреЛрдб рджрд┐рдЦрд╛рдпрд╛ рдЧрдпрд╛ рд╣реИред рдЯрд┐рдкреНрдкрдгреА-рдЖрдЙрдЯ рдХреЛрдб рд╕рдВрдХрд▓рд┐рдд рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ, рдЬрдмрдХрд┐ рдЗрд╕реЗ рдЗрд╕ рдкреИрдЯрд░реНрди рдХреЛ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЙрдкрдпреЛрдЧреА рдмрдирд╛рдирд╛ рдЪрд╛рд╣рд┐рдП:
#![feature(specialization)]
use std::ops::Deref;
use std::ops::DerefMut;
// =================
// === WithLabel ===
// =================
struct WithLabel<T>(String, T);
pub trait HasLabel {
fn label(&self) -> &String;
}
impl<T> HasLabel for WithLabel<T> {
fn label(&self) -> &String {
&self.0
}
}
// THIS SHOULD COMPILE, BUT GETS REJECTED
// impl<T> HasLabel for T
// where T: Deref, <Self as Deref>::Target : HasLabel {
// default fn label(&self) -> &String {
// self.deref().label()
// }
// }
impl<T> Deref for WithLabel<T> {
type Target = T;
fn deref(&self) -> &Self::Target {
&self.1
}
}
// ==============
// === WithID ===
// ==============
struct WithID<T>(i32, T);
pub trait HasID {
fn id(&self) -> &i32;
}
impl<T> HasID for WithID<T> {
fn id(&self) -> &i32 {
&self.0
}
}
// THIS SHOULD COMPILE, BUT GETS REJECTED
// impl<T> HasID for T
// where T: Deref, <Self as Deref>::Target : HasID {
// default fn id(&self) -> &i32 {
// self.deref().id()
// }
// }
impl<T> Deref for WithID<T> {
type Target = T;
fn deref(&self) -> &Self::Target {
&self.1
}
}
// =============
// === Usage ===
// =============
struct A(i32);
type X = WithLabel<WithID<A>>;
fn test<T: HasID + HasLabel> (t: T) {
println!("{:?}", t.label());
println!("{:?}", t.id());
}
fn main() {
let v1 = WithLabel("label1".to_string(), WithID(0, A(1)));
// test(v1); // THIS IS EXAMPLE USE CASE WHICH DOES NOT COMPILE
}
test(v1)
рд▓рд╛рдЗрди рдХрд╛рд░реНрдп рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдореЗрдВ рдореИрдиреНрдпреБрдЕрд▓ рд░реВрдк рд╕реЗ рдирд┐рд╣рд┐рдд рдЗрд╕ рддрд░рд╣ рдХреЗ рд▓рдХреНрд╖рдгреЛрдВ рдХреЛ рдЬреЛрдбрд╝рдирд╛ рд╣реЛрдЧрд╛:
impl<T: HasID> HasID for WithLabel<T> {
fn id(&self) -> &i32 {
self.deref().id()
}
}
рдмреЗрд╢рдХ, рдЗрд╕реЗ рдкреВрд░рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдореЗрдВ рдЗрд╕ рд╡рд┐рд╢реЗрд╖рддрд╛ рдХреЛ рдмрдирд╛рдиреЗ рдХреА рднреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреА:
impl<T: HasLabel> HasLabel for WithID<T> {
fn label(&self) -> &String {
self.deref().label()
}
}
рдФрд░ рдпрд╣ рдмрд╣реБрдд рд╣реА рдмреБрд░рд╛ рд╣реИ ред рдХреЗрд╡рд▓ 2 рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рд▓рд┐рдП рдпрд╣ рд╕рд░рд▓ рд╣реИред рд╣рд╛рд▓рд╛рдВрдХрд┐, рдХрд▓реНрдкрдирд╛ рдХрд░реЗрдВ рдХрд┐ рд╣рдореЗрдВ 10 рдЕрд▓рдЧ-рдЕрд▓рдЧ рдЕрдкрд╛рд░рджрд░реНрд╢реА-рдкреНрд░рдХрд╛рд░ рдХреА рдкрд░рд┐рднрд╛рд╖рд╛рдПрдВ рдорд┐рд▓реА рд╣реИрдВ, рдЬреЛ рдЕрд▓рдЧ-рдЕрд▓рдЧ рдХреНрд╖реЗрддреНрд░реЛрдВ рдХреЛ рдЬреЛрдбрд╝рддреА рд╣реИрдВ, рдЬреИрд╕реЗ WithID
, WithLabel
, WithCallback
, ... рдЖрдк рдЗрд╕реЗ рдирд╛рдо рджреЗрддреЗ рд╣реИрдВред рд╡рд┐рд╢реЗрд╖рдЬреНрдЮрддрд╛ рдХреЗ рд╡рд░реНрддрдорд╛рди рд╡реНрдпрд╡рд╣рд╛рд░ рдХреЗ рд╕рд╛рде, рд╣рдореЗрдВ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреА ... 1000 рд╕реЗ рдЕрдзрд┐рдХ рд╡рд┐рднрд┐рдиреНрди рд╡рд┐рд╢реЗрд╖рддрд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди! рдпрджрд┐ рдЯрд┐рдкреНрдкрдгреА рдХрд┐рдП рдЧрдП рдХреЛрдб рдХреЛ рд╕реНрд╡реАрдХрд╛рд░ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛, рддреЛ рд╣рдореЗрдВ рдХреЗрд╡рд▓ 10 рд╡рд┐рд╢реЗрд╖рддрд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреА рдФрд░ рдкреНрд░рддреНрдпреЗрдХ рдирдП рдкреНрд░рдХрд╛рд░ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреЗрд╡рд▓ рдПрдХ рдЕрддрд┐рд░рд┐рдХреНрдд рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреА ред
рдореБрдЭреЗ рдпрдХреАрди рдирд╣реАрдВ рд╣реИ рдХрд┐ рдЖрдкрдХрд╛ рдХреЛрдб рд╡рд┐рд╢реЗрд╖рдЬреНрдЮрддрд╛ рд╕реЗ рдХреИрд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рд╣реИред рдЖрдкрдХрд╛ рддрд░реНрдХ (рдЖрдкрдХрд╛ рдкреНрд░рд╛рд░рдВрднрд┐рдХ рдХреЛрдб рд╕рдВрдХрд▓рд┐рдд рдХрд░рддрд╛ рд╣реИ рд▓реЗрдХрд┐рди рдЯрд┐рдкреНрдкрдгреА рдХреА рдЧрдИ test(v1);
рд▓рд╛рдЗрди рдЖрдкрдХреЗ рджреНрд╡рд╛рд░рд╛ рджрд┐рдП рдЧрдП рдореИрдиреБрдЕрд▓ рдХреЗ рдмрд┐рдирд╛ рд╕рдВрдХрд▓рди рдирд╣реАрдВ рдХрд░рддреА рд╣реИ) рдЕрднреА рднреА рд▓рд╛рдЧреВ рд╣реЛрддреА рд╣реИ рдпрджрд┐ рдкрд╣рд▓реЗ #![feature(specialization)]
рд▓рд╛рдЗрди рдХреЛ рд╣рдЯрд╛ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
@qnighy рдХреЛрдб HasLabel for T
рдФрд░ HasID for T
- рдХреА рдЧрдбрд╝рдмрдбрд╝реА рдХреЗ рдмрд╛рдж рд╕рдВрдХрд▓рд┐рдд рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП - рд╡реЗ рд╡рд┐рд╢реЗрд╖рдЬреНрдЮрддрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣реЗ рд╣реИрдВред рд╡рд░реНрддрдорд╛рди рдореЗрдВ, рдЙрдиреНрд╣реЗрдВ рдЕрд╕реНрд╡реАрдХрд╛рд░ рдХрд░ рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ (рдореЗрд░реЗ рджреНрд╡рд╛рд░рд╛ рдкреНрд░рджрд╛рди рдХрд┐рдП рдЧрдП рдХреЛрдб рдореЗрдВ рдЙрдиреНрд╣реЗрдВ рдЕрдирд╕реБрдирд╛ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░реЗрдВ!)ред рдХреНрдпрд╛ рдпрд╣ рдЕрдм рдЖрдкрдХреЗ рд▓рд┐рдП рд╕рдордЭ рдореЗрдВ рдЖрддрд╛ рд╣реИ? ЁЯЩВ
рдЖрдЗрдП рддреАрди рдЙрджрд╛рд╣рд░рдгреЛрдВ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВ WithLabel<WithID<A>>
, WithID<WithLabel<A>>
рдФрд░ WithLabel<WithLabel<A>>
ред рдлрд┐рд░
WithLabel<WithID<A>>
рдФрд░ WithLabel<WithLabel<A>>
редWithID<WithLabel<A>>
рдФрд░ WithLabel<WithLabel<A>>
редрдЗрд╕рд▓рд┐рдП рдкреНрд░рддреНрдпрд╛рд░реЛрдкрдг рдХреА рдЬреЛрдбрд╝реА рдЖрд░рдПрдлрд╕реА рд╕реЗ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдЦрдВрдб
рд╡рд┐рд╢реЗрд╖рдЬреНрдЮрддрд╛ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕реБрд╕рдВрдЧрдд рд╣реИ, рд╣рдо рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░реЗрдВрдЧреЗ рдХрд┐ рдХрд┐рд╕реА рднреА рджреЛ рдХреЗ рд▓рд┐рдП
I
рдФрд░J
рдХрд┐ рдУрд╡рд░рд▓реИрдк рд╣реЛ, рд╣рдорд╛рд░реЗ рдкрд╛рд╕I < J
рдпрд╛J < I
ред рдпрд╣реА рд╣реИ, рдПрдХ рджреВрд╕рд░реЗ рд╕реЗ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЕрдзрд┐рдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред
рдФрд░ рдпрд╣ рдЖрдкрдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ рднреА рдПрдХ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рд╕рдорд╕реНрдпрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ HasLabel
WithLabel<WithLabel<A>>
рдХрд╛ рдирд┐рд╣рд┐рддрд╛рд░реНрде рджреЛ рддрд░реАрдХреЛрдВ рд╕реЗ рд╡реНрдпрд╛рдЦреНрдпрд╛ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред
рд╣рдо рдЗрд╕ рдорд╛рдорд▓реЗ рдХреЛ рдХреИрд╕реЗ рдХрд╡рд░ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдпрд╣ рдЖрд░рдПрдлрд╕реА рдореЗрдВ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА
рдЬрд╛рд▓реА рдирд┐рдпрдо рдкрддреЗ рдХреА рд╕реАрдорд╛рдПрдВ рд╡рд┐рд╢реЗрд╖рдЬреНрдЮрддрд╛ рдХреЗ рдореБрдЦреНрдп рд▓рдХреНрд╖реНрдпреЛрдВ рдХреЗ рдЕрдиреБрд╕рд╛рд░ рдХрд╛рдлреА рд╣рдж рддрдХ рдЧреМрдг рд╣реИрдВ (рдЬреИрд╕рд╛ рдХрд┐ рдкреНрд░реЗрд░рдгрд╛ рдореЗрдВ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ), рдФрд░ рдЗрд╕рд▓рд┐рдП, рдЪреВрдВрдХрд┐ рдЬрд╛рд▓реА рдирд┐рдпрдо рдХреЛ рдмрд╛рдж рдореЗрдВ рдЬреЛрдбрд╝рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, RFC рдЕрднреА рдХреЗ рд▓рд┐рдП рд╕рд░рд▓ рд╢реНрд░реГрдВрдЦрд▓рд╛ рдирд┐рдпрдо рд╕реЗ рдЪрд┐рдкрдХ рдЬрд╛рддрд╛ рд╣реИред
@qnighy , рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕реЛрдЪрдиреЗ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рджред
рдФрд░ рдпрд╣ рдЖрдкрдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ рдПрдХ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рд╕рдорд╕реНрдпрд╛ рднреА рд╣реИ рдХреНрдпреЛрдВрдХрд┐
WithLabel<WithLabel<A>>
рдХреЗ рд╣рд╕рд▓рд╛рдмреЗрд▓ рдХреА рд╡реНрдпрд╛рдЦреНрдпрд╛ рджреЛ рддрд░реАрдХреЛрдВ рд╕реЗ рдХреА рдЬрд╛ рд╕рдХрддреА рд╣реИред
рдпрд╣ рд╕рдЪ рд╣реИ рдХрд┐ рдЕрдЧрд░ рд╣рдо рдкрд░ рд╡рд┐рдЪрд╛рд░ рдирд╣реАрдВ рдХрд░рддреЗ impl<T> HasLabel for WithLabel<T>
рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдЕрдзрд┐рдХ рд╡рд┐рд╢реЗрд╖ рд░реВрдк impl<T> HasLabel for T
рдХреЗ рдЗрдирдкреБрдЯ рдХреЗ рд▓рд┐рдП WithLabel<WithLabel<A>>
ред рдЖрдкрдХреЗ рджреНрд╡рд╛рд░рд╛ рдЪрд┐рдкрдХрд╛рдП рдЧрдП рдЖрд░рдПрдлрд╕реА рдХрд╛ рд╣рд┐рд╕реНрд╕рд╛ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдХрд╡рд░ рдХрд░рддрд╛ рд╣реИ, рд╣рд╛рд▓рд╛рдВрдХрд┐, рдореЗрд░рд╛ рдорд╛рдирдирд╛ тАЛтАЛрд╣реИ рдХрд┐ рдпрд╣ рдПрдХ рдЧрдВрднреАрд░ рд╕реАрдорд╛ рд╣реИ рдФрд░ рдореИрдВ рдЗрд╕ рдПрдХреНрд╕рдЯреЗрдВрд╢рди рдХреЗ рдкрд╣рд▓реЗ рд░рд┐рд▓реАрдЬ рдореЗрдВ рдЗрд╕ рдЙрдкрдпреЛрдЧ рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ рдлрд┐рд░ рд╕реЗ рд╕рдорд░реНрдерди рдХреЗ рд▓рд┐рдП рд╡рд┐рдЪрд╛рд░ рдХрд░реВрдВрдЧрд╛ред
рдЗрд╕ рдмреАрдЪ, рдореИрдВ negative trait impls
рд╕рд╛рде рдЦреЗрд▓ рд░рд╣рд╛ рдерд╛ рдХреНрдпреЛрдВрдХрд┐ рд╡реЗ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЖрдкрдХреЗ рджреНрд╡рд╛рд░рд╛ рдХрд╡рд░ рдХрд┐рдП рдЧрдП рдмрд┐рдВрджреБрдУрдВ рдХреЛ рд╣рд▓ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдореИрдВрдиреЗ рдПрдХ рдХреЛрдб рдмрдирд╛рдпрд╛ рдерд╛ рдЬрд┐рд╕рдореЗрдВ рдЖрдкрдХреЗ рджреНрд╡рд╛рд░рд╛ рдмрддрд╛рдИ рдЧрдИ рд╕рдорд╕реНрдпрд╛рдПрдВ рдирд╣реАрдВ рд╣реИрдВ (рдЬрдм рддрдХ рдХрд┐ рдореИрдВ рдХреБрдЫ рдпрд╛рдж рдирд╣реАрдВ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ), рд╣рд╛рд▓рд╛рдВрдХрд┐, рдпрд╣ рдЕрднреА рднреА рд╕рдВрдХрд▓рди рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред рдЗрд╕ рдмрд╛рд░, рдореБрдЭреЗ рд╕рдордЭ рдирд╣реАрдВ рдЖрдпрд╛ рдХрд┐ рддреНрд░реБрдЯрд┐ рдореЗрдВ рдмрддрд╛рдИ рдЧрдИ рдмрд╛рдзрд╛рдПрдБ рдХрд╣рд╛рдБ рд╕реЗ рдЖрдИрдВ, рдХреНрдпреЛрдВрдХрд┐ рд╕рдВрдХрд▓реНрдк рдЕрд╕реНрдкрд╖реНрдЯ рдирд╣реАрдВ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред
рдЕрдЪреНрдЫреА рдмрд╛рдд рдпрд╣ рд╣реИ рдХрд┐ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд╕рдм рдХреБрдЫ рдЕрдм (рд╡рд┐рд╢реЗрд╖рдЬреНрдЮрддрд╛ рд╕рд╣рд┐рдд) рд╕рдВрдХрд▓рди рдХрд░рддрд╛ рд╣реИ рд▓реЗрдХрд┐рди test(v1)
рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ:
#![feature(specialization)]
#![feature(optin_builtin_traits)]
use std::ops::Deref;
use std::ops::DerefMut;
// =================
// === WithLabel ===
// =================
struct WithLabel<T>(String, T);
auto trait IsNotWithLabel {}
impl<T> !IsNotWithLabel for WithLabel<T> {}
pub trait HasLabel {
fn label(&self) -> &String;
}
impl<T> HasLabel for WithLabel<T> {
fn label(&self) -> &String {
&self.0
}
}
impl<T> HasLabel for T
where T: Deref + IsNotWithLabel, <Self as Deref>::Target : HasLabel {
default fn label(&self) -> &String {
self.deref().label()
}
}
impl<T> Deref for WithLabel<T> {
type Target = T;
fn deref(&self) -> &Self::Target {
&self.1
}
}
// ==============
// === WithID ===
// ==============
struct WithID<T>(i32, T);
pub trait HasID {
fn id(&self) -> &i32;
}
impl<T> HasID for WithID<T> {
fn id(&self) -> &i32 {
&self.0
}
}
auto trait IsNotWithID {}
impl<T> !IsNotWithID for WithID<T> {}
impl<T> HasID for T
where T: Deref + IsNotWithID, <Self as Deref>::Target : HasID {
default fn id(&self) -> &i32 {
self.deref().id()
}
}
impl<T> Deref for WithID<T> {
type Target = T;
fn deref(&self) -> &Self::Target {
&self.1
}
}
// =============
// === Usage ===
// =============
struct A(i32);
type X = WithLabel<WithID<A>>;
fn test<T: HasID + HasLabel> (t: T) {
println!("{:?}", t.label());
println!("{:?}", t.id());
}
fn main() {
let v1 = WithLabel("label1".to_string(), WithID(0, A(1)));
test(v1);
}
рдЗрд╕ рдмреАрдЪ, рдЖрдк рдЧреИрд░-рдорд╛рд░реНрдХрд░ рд▓рдХреНрд╖рдгреЛрдВ рдХреЛ рдУрд╡рд░рд▓реИрдк рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП RFC1268 overlapping_marker_traits
рдХрд╛ рд╢реЛрд╖рдг рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдЗрд╕ рд╣реИрдХ рдХреЗ рд▓рд┐рдП рддреАрди рдФрд░ рд▓рдХреНрд╖рдгреЛрдВ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ (рдорд╛рд░реНрдХрд░ рд▓рдХреНрд╖рдгреЛрдВ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЬрд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рд╡рд┐рд╢реЗрд╖рдЬреНрдЮрддрд╛ рдХреЗ рд╕рд╛рде рдлрд┐рд░ рд╕реЗ рдорд┐рдЯрд╛рдП рдЧрдП рдбреЗрдЯрд╛ рдХреЗ рд▓рд┐рдП рджреЛ)ред
@qnighy рдореИрдВрдиреЗ рдЗрд╕ рдмрдЧ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдПрдХ рдЕрд▓рдЧ рдореБрджреНрджрд╛ рдмрдирд╛рдпрд╛ рд╣реИ: https://github.com/rust-lang/rust/issues/66041
рдареАрдХ рд╣реИ, рдореИрдВрдиреЗ рдЕрднреА рдкрддрд╛ рд▓рдЧрд╛рдпрд╛ рд╣реИ рдХрд┐ auto traits
рдХрд╛ рд╕рдорд╛рдзрд╛рди рдпрд╣рд╛рдВ рдХрднреА рдирд╣реАрдВ рд╣реЛрдЧрд╛, рдЬреИрд╕рд╛ рдХрд┐ (https://doc.rust-lang.org/nightly/unstable-book/language-features/optin-builtin-traits рдХреЗ рдЕрдиреБрд╕рд╛рд░ред html) рд╡реЗ рдПрдХ рд╕рдВрд░рдЪрдирд╛ рдореЗрдВ рд╕рднреА рдХреНрд╖реЗрддреНрд░реЛрдВ рдХрд╛ рдкреНрд░рдЪрд╛рд░ рдХрд░рддреЗ рд╣реИрдВ:
рдорд╛рдирдХ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдореЗрдВ рд╕реЗрдВрдб рдпрд╛ рд╕рд┐рдВрдХ рдЬреИрд╕реЗ рдСрдЯреЛ рд▓рдХреНрд╖рдг, рдорд╛рд░реНрдХрд░ рд▓рдХреНрд╖рдг рд╣реИрдВ рдЬреЛ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рд╣рд░ рдкреНрд░рдХрд╛рд░ рдХреЗ рд▓рд┐рдП рд▓рд╛рдЧреВ рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВ, рдЬрдм рддрдХ рдХрд┐ рдпрд╣ рдкреНрд░рдХрд╛рд░, рдпрд╛ рдПрдХ рдкреНрд░рдХрд╛рд░ рдЬрд┐рд╕рдореЗрдВ рдпрд╣ рд╢рд╛рдорд┐рд▓ рдирд╣реАрдВ рд╣реИ, рдиреЗ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдПрдХ рдирдХрд╛рд░рд╛рддреНрдордХ рдирд┐рд╣рд┐рддрд╛рд░реНрде рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЪреБрдирд╛ рд╣реИред
рд╕рдВрдкрд╛рджрд┐рдд рдХрд░реЗрдВ
@qnighy рдХрд┐рд╕реА рддрд░рд╣ рдореИрдВрдиреЗ рдЕрдирджреЗрдЦреА рдХреА рдХрд┐ рдЖрдкрдиреЗ рдЦреЗрд▓ рдХреЗ рдореИрджрд╛рди рдХреЗ рд▓рд┐рдП рдПрдХ рд▓рд┐рдВрдХ рдкреНрд░рджрд╛рди рдХрд┐рдпрд╛ рд╣реИред Much рдЗрд╕рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рдмрд╣реБрдд рдзрдиреНрдпрд╡рд╛рджред рдпрд╣ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ рдФрд░ рдореИрдВ рдЗрд╕ рдмрд╛рдд рд╕реЗ рдЪрдХрд┐рдд рд╣реВрдВ рдХрд┐ рдпрд╣ рд╕рдорд╛рдзрд╛рди рдХрд┐рддрдирд╛ рдЖрд╕рд╛рди рд╣реИред рдХрдорд╛рд▓ рд╣реИ рдХрд┐ рд╣рдо рд╡рд░реНрддрдорд╛рди рдореЗрдВ рд╡реНрдпрдХреНрдд рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реИрдВ рдФрд░ рдореБрдЭреЗ рдЙрдореНрдореАрдж рд╣реИ рдХрд┐ рднрд╡рд┐рд╖реНрдп рдореЗрдВ рдпрд╣ рд╕рдВрднрд╛рд╡рдирд╛ рдЧрд╛рдпрдм рдирд╣реАрдВ рд╣реЛрдЧреА!
рдРрд╕реА рд╕реНрдерд┐рддрд┐ рдореЗрдВ, overlapping marker traits
рд╣реА рдПрдХрдорд╛рддреНрд░ рд╣реИрдХ рд╣реИ рдЬрд┐рд╕реЗ рд╣рдо рдЕрдм рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рднрд╡рд┐рд╖реНрдп рдореЗрдВ рдХрд┐рд╕реА рдкреНрд░рдХрд╛рд░ рдХреЗ рдЖрд╕рд╛рди рд╕рдорд╛рдзрд╛рди рдХреЛ рдЕрдиреБрдорддрд┐ рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдЪреНрдЫрд╛ рд╣реЛрдЧрд╛ рдХрд┐ рдЕрдкрд╛рд░рджрд░реНрд╢реА рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЛ рд╡реНрдпрдХреНрдд рдХрд░реЗрдВ (рдЬреИрд╕рд╛ рдХрд┐ рдореЗрд░реА рдкрд┐рдЫрд▓реА рдкреЛрд╕реНрдЯ рдореЗрдВ рд╡рд░реНрдгрд┐рдд рд╣реИ: https : //github.com/rust-lang/rust/issues/31844#issuecomment-549023367)ред
рдПрдХ рдмрд╣реБрдд рд╣реА рд╕рд░рд▓ рдЙрджрд╛рд╣рд░рдг ( рдЙрдкрд░реЛрдХреНрдд рдЙрджрд╛рд╣рд░рдг рдХрд╛ рд╕рд░рд▓реАрдХрд░рдг) рдЬреЛ рд╡рд┐рдлрд▓ рд░рд╣рддрд╛ рд╣реИ:
trait Trait<T> {}
impl<T> Trait<T> for T {}
impl<T> Trait<()> for T {}
рдореБрдЭреЗ рд╡рд┐рд╢реНрд╡рд╛рд╕ рдирд╣реАрдВ рд╣реИ рдХрд┐ рдпрд╣ рдЬрд╛рд▓реА рдирд┐рдпрдореЛрдВ рд╕реЗ рдкрд╣рдЪрд╛рдиреА рдЧрдИ рд╕рдорд╕реНрдпрд╛ рд╕реЗ
рдЗрд╕рдХреЗ рдмрд┐рдирд╛, рд╡рд░реНрддрдорд╛рди рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдореЗрд░реЗ рдЙрджреНрджреЗрд╢реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП рдмреЗрдХрд╛рд░ рд╣реИред рдпрджрд┐ рдЙрдкрд░реЛрдХреНрдд рдЕрдиреБрдорддрд┐ рджреА рдЧрдИ рдереА, рддреЛ рдореЗрд░рд╛ рдорд╛рдирдирд╛ тАЛтАЛрд╣реИ рдХрд┐ рд░реИрдкрд░ рдкреНрд░рдХрд╛рд░реЛрдВ рдкрд░ From
рд▓рд╛рдЧреВ рдХрд░рдирд╛ рд╕рдВрднрд╡ рд╣реЛрдЧрд╛ (рд╣рд╛рд▓рд╛рдВрдХрд┐ рдореИрдВ Into
рдмрд╛рд░реЗ рдореЗрдВ рдЕрдирд┐рд╢реНрдЪрд┐рдд рд╣реВрдВ)ред
рдХрд┐рд╕реА рднреА рд╢рд░реАрд░ рдХреЗ рд▓рд┐рдП рдЬреЛ рдЕрднреА рддрдХ рдирд╣реАрдВ рдЬрд╛рдирддрд╛ рд╣реИ: dtolnay рджреНрд╡рд╛рд░рд╛ рдЦреЛрдЬреА рдЧрдИ рдпрд╣ рднрдпрд╛рдирдХ рдЪрд╛рд▓ рд╣реИ рдЬреЛ рдЬрдВрдЧ рдкрд░ рд╡рд┐рд╢реЗрд╖ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ (рдмрд╣реБрдд рд╕реАрдорд┐рдд)
рдореБрдЭреЗ рдпрдХреАрди рдирд╣реАрдВ рд╣реИ рдХрд┐ рдпрд╣ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рд╕рдВрдмреЛрдзрд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЙрдирдХреЗ рддрд░реАрдХреЛрдВ рдХреЗ рд▓рд┐рдП рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рд╕рд╛рде рд▓рдХреНрд╖рдг рдмрд╕ рдлрд┐рд░ рд╕реЗ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдирд╛ рд╣реЛрдЧрд╛ рддрд╛рдХрд┐ рдЙрдиреНрд╣реЗрдВ default
рдХреЗ рд░реВрдк рдореЗрдВ рдЪрд┐рд╣реНрдирд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХреЗред рдЙрджрд╛рд╣рд░рдг;
trait Trait {
fn test(&self) { println!("default implementation"); }
}
impl<T> Trait for T {
// violates DRY principle
default fn test(&self) { println!("default implementation"); }
}
рдореИрдВ рдЗрд╕реЗ рдареАрдХ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд╕рд┐рдВрдЯреИрдХреНрд╕ рдХрд╛ рдкреНрд░рд╕реНрддрд╛рд╡ рдХрд░рддрд╛ рд╣реВрдВ (рдпрджрд┐ рдЗрд╕реЗ рдареАрдХ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ):
impl<T> Trait for T {
// delegates to the already existing default implementation
default fn test(&self);
}
# 68309 рдкрд░ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛
@jazzfool рдХреГрдкрдпрд╛ рдЗрд╕реЗ рдПрдХ рдореБрджреНрджреЗ рдХреЗ рд░реВрдк рдореЗрдВ
рдХреНрдпрд╛ рд╡рд┐рд╢реЗрд╖рдЬреНрдЮрддрд╛ рдХреЗ рдкрд░реАрдХреНрд╖рдг рдХреЗ рд▓рд┐рдП рдПрдХ рджреГрд╖реНрдЯрд┐рдХреЛрдг рд╣реИ? рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдПрдХ рдкрд░реАрдХреНрд╖рдг рд▓рд┐рдЦрддреЗ рд╕рдордп рдЬреЛ рдПрдХ рд╡рд┐рд╢реЗрд╖рдЬреНрдЮрддрд╛ рдХреА рд╢реБрджреНрдзрддрд╛ рдХреА рдЬрд╛рдВрдЪ рдХрд░рддрд╛ рд╣реИ, рдЖрдкрдХреЛ рдкрд╣рд▓реЗ рдпрд╣ рдЬрд╛рдирдирд╛ рд╣реЛрдЧрд╛ рдХрд┐ рдХреНрдпрд╛ рдЖрдк рдЬрд┐рд╕ рдкрд░реАрдХреНрд╖рдг рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░ рд░рд╣реЗ рд╣реИрдВ рд╡рд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рдмрдЬрд╛рдп рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред
@ the8472 рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рдЖрдк рд╕рдВрдХрд▓рдХ рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рдпрд╛ рдХреНрдпрд╛ рдЖрдкрдХрд╛ рдорддрд▓рдм рдЕрдкрдиреЗ рд╕реНрд╡рдпрдВ рдХреЗ рдХреЛрдб рдореЗрдВ рдкрд░реАрдХреНрд╖рдг рдХрд░рдирд╛ рд╣реИ? рдЖрдк рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдЗрдХрд╛рдИ рдкрд░реАрдХреНрд╖рдг рд▓рд┐рдЦ рд╕рдХрддреЗ рд╣реИрдВ рдЬреЛ рдЕрд▓рдЧ рддрд░рд╣ рд╕реЗ рд╡реНрдпрд╡рд╣рд╛рд░ рдХрд░рддреЗ рд╣реИрдВ (рдпрд╛рдиреА, рдПрдлрдПрди рдХреЛ рдХреЙрд▓ рдХрд░реЗрдВ, рдФрд░ рджреЗрдЦреЗрдВ рдХрд┐ рдХреНрдпрд╛ рдЖрдкрдХреЛ рд╡рд┐рд╢реЗрд╖ рд╕рдВрд╕реНрдХрд░рдг рдорд┐рд▓рддрд╛ рд╣реИ)ред рд╢рд╛рдпрдж рдЖрдк рдХрд╣ рд░рд╣реЗ рд╣реИрдВ рдХрд┐ рджреЛ рд╕рдВрд╕реНрдХрд░рдг рд╕рдорд╛рди рд╣реИрдВ, рдХреЗрд╡рд▓ рдПрдХ рдХреЛ рдЫреЛрдбрд╝рдХрд░ рдФрд░ рддреЗрдЬреА рд╕реЗ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП, рдФрд░ рдЗрд╕рд▓рд┐рдП рдЖрдк рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдирд╣реАрдВ рд╣реИрдВ рдХрд┐ рдЖрдкрдХреЛ рдХрд┐рд╕ рд╕рдВрд╕реНрдХрд░рдг рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдХрд░рдирд╛ рд╣реИ? рдЙрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рдореИрдВ рд╕рд╣рдордд рд╣реВрдВ, рдореБрдЭреЗ рдирд╣реАрдВ рдкрддрд╛ рдХрд┐ рдЖрдк рдЙрд╕ рд╕рдордп рдХреИрд╕реЗ рдкрд░реАрдХреНрд╖рдг рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
рдЖрдк рдорд╛рди рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдореИрдВ рдПрдХ рд╣реА рд╕реЗрдЯ рдХреЗ рд╕рд╛рде рдХреБрдЫ рдЕрдиреНрдп рд▓рдХреНрд╖рдг рдмрдирд╛ рд╕рдХрддрд╛ рд╣реВрдВ, рд▓реЗрдХрд┐рди рдЬрд╣рд╛рдВ fn рдЕрд▓рдЧ рддрд░реАрдХреЗ рд╕реЗ рд╡реНрдпрд╡рд╣рд╛рд░ рдХрд░рддреЗ рд╣реИрдВ, рдмрд╕ рдЦреБрдж рдХреЛ рдЖрд╢реНрд╡рд╕реНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдПред
рд╢рд╛рдпрдж рдЖрдк рдХрд╣ рд░рд╣реЗ рд╣реИрдВ рдХрд┐ рджреЛ рд╕рдВрд╕реНрдХрд░рдг рд╕рдорд╛рди рд╣реИрдВ, рдХреЗрд╡рд▓ рдПрдХ рдХреЛ рдЫреЛрдбрд╝рдХрд░ рдФрд░ рддреЗрдЬреА рд╕реЗ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП, рдФрд░ рдЗрд╕рд▓рд┐рдП рдЖрдк рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдирд╣реАрдВ рд╣реИрдВ рдХрд┐ рдЖрдкрдХреЛ рдХрд┐рд╕ рд╕рдВрд╕реНрдХрд░рдг рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдХрд░рдирд╛ рд╣реИ? рдЙрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рдореИрдВ рд╕рд╣рдордд рд╣реВрдВ, рдореБрдЭреЗ рдирд╣реАрдВ рдкрддрд╛ рдХрд┐ рдЖрдк рдЙрд╕ рд╕рдордп рдХреИрд╕реЗ рдкрд░реАрдХреНрд╖рдг рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
рдЖрдк рдореИрдХреНрд░реЛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдкрд░реАрдХреНрд╖рдг рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдореИрдВ рдЕрдкрдиреА рдЬрдВрдЧ рдХреЗ рд╕рд╛рде рдереЛрдбрд╝рд╛ рдХрдареЛрд░ рд╣реВрдБ, рд▓реЗрдХрд┐рди рдЗрди рдкрдВрдХреНрддрд┐рдпреЛрдВ рдХреЗ рд╕рд╛рде рдХреБрдЫ ...
[#cfg(test)]
static mut SPECIALIZATION_TRIGGERED : bool = false;
[#cfg(test)]
macro_rules! specialization_trigger {
() => { SPECIALIZATION_TRIGGERED = true; };
}
[#cfg(not(test))]
macro_rules! specialization_trigger {
() => {};
}
рдлрд┐рд░ рд╡рд┐рд╢реЗрд╖ рдирд┐рд╣рд┐рдд рдореЗрдВ specialization_trigger!()
рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ, рдФрд░ рдкрд░реАрдХреНрд╖рдгреЛрдВ рдореЗрдВ assert!(SPECIALIZATION_TRIGGERED);
[#cfg(test)] static mut SPECIALIZATION_TRIGGERED : bool = false; ...
рдЖрдк рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдЬрд╛рдПрдЧрд╛ thread_local! { static VAR: Cell<bool> = Cell::new(false); }
рдХреЗ рдмрдЬрд╛рдп static mut
рдХреНрдпреЛрдВрдХрд┐ рдЕрдиреНрдпрдерд╛ рдЪрд░ рдПрдХ рдкрд░реАрдХреНрд╖рдг рдорд╛рдорд▓реЗ рдзрд╛рдЧрд╛ рдореЗрдВ рд╕реЗрдЯ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдФрд░ рдЧрд▓рддреА рд╕реЗ рдХрд┐рд╕реА рджреВрд╕рд░реЗ рдзрд╛рдЧреЗ рд╕реЗ рдкрдврд╝реЗрдВред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдкреНрд░рддреНрдпреЗрдХ рдкрд░реАрдХреНрд╖рдг рдХреА рд╢реБрд░реБрдЖрдд рдореЗрдВ рдЪрд░ рдХреЛ рд░реАрд╕реЗрдЯ рдХрд░рдирд╛ рдпрд╛рдж рд░рдЦреЗрдВ, рдЕрдиреНрдпрдерд╛ рдЖрдкрдХреЛ рдкрд┐рдЫрд▓реЗ рдкрд░реАрдХреНрд╖рдг рд╕реЗ true
рдорд┐рд▓реЗрдЧрд╛ред
рдореЗрд░реЗ рдкрд╛рд╕ рдЖрд░рдПрдлрд╕реА рдкрд╛рда рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдПрдХ рдкреНрд░рд╢реНрди рд╣реИ, рдЙрдореНрдореАрдж рд╣реИ рдХрд┐ рдпрд╣ рдкреВрдЫрдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрдЪреНрдЫреА рдЬрдЧрд╣ рд╣реИред
рдкреБрди: рдЙрдкрдпреЛрдЧ рдЕрдиреБрднрд╛рдЧ рдореЗрдВ , рдпрд╣ рдЙрджрд╛рд╣рд░рдг рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ:
trait Add<Rhs=Self> {
type Output;
fn add(self, rhs: Rhs) -> Self::Output;
fn add_assign(&mut self, rhs: Rhs);
}
// the `default` qualifier here means (1) not all items are implied
// and (2) those that are can be further specialized
default impl<T: Clone, Rhs> Add<Rhs> for T {
fn add_assign(&mut self, rhs: Rhs) {
let tmp = self.clone() + rhs;
*self = tmp;
}
}
рдореБрдЭреЗ рдЖрд╢реНрдЪрд░реНрдп рд╣реИ рдХрд┐ рдпрд╣ рдХреИрд╕реЗ рдЯрд╛рдЗрдк-рдЪреЗрдХ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП, рдпрд╣ рджреЗрдЦрддреЗ рд╣реБрдП рдХрд┐ tmp
рдХрд╛ рдЯрд╛рдЗрдк Self::Output
рдФрд░ рдЗрд╕ рд╕рдВрдмрджреНрдз рдкреНрд░рдХрд╛рд░ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреБрдЫ рднреА рдЬреНрдЮрд╛рдд рдирд╣реАрдВ рд╣реИред RFC рдЯреЗрдХреНрд╕реНрдЯ рдпрд╣ рдирд╣реАрдВ рд╕рдордЭрд╛рддрд╛ рд╣реИ рдХрд┐ рдХрдо рд╕реЗ рдХрдо рдХрд╣реАрдВ рднреА рдРрд╕рд╛ рдирд╣реАрдВ рд╣реИ рдЬрд╣рд╛рдБ рдЙрджрд╛рд╣рд░рдг рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реЛред
рдХреНрдпрд╛ рдпрд╣рд╛рдБ рдХреБрдЫ рддрдВрддреНрд░ рд╣реИ рдЬреЛ рдЙрд╕ рдХрд╛рд░реНрдп рдХреЛ рдХрд░рдиреЗ рд╡рд╛рд▓рд╛ рдерд╛ / рд╣реИ?
рдХреНрдпрд╛ рд╡рд╣ рдбрд┐рдлрд╝реЙрд▓реНрдЯ where T: Add<Output = T>
рд╡рд┐рд╡рд╢ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ? рдпрд╛ рдХрд┐ рдПрдХ рдХрд░рдгреАрдп рд▓реВрдк рд╣реИ?
@ рд░рд╛рд▓реНрдлрдЬрдВрдЧ рдореИрдВ рдорд╛рдирддрд╛ рд╣реВрдВ рдХрд┐ рдЧрд▓рдд рд▓рдЧрддрд╛ рд╣реИред
рдореЗрд░реЗ рдкрд╛рд╕ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдПрдХ рд╕рд╡рд╛рд▓ рд╣реИ: рдпрд╣ рдореБрджреНрджрд╛ рдХрд┐рддрдирд╛ рд╕рд╛рд░реНрдердХ рд╣реИ рдФрд░ рд▓реЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП рдЗрд╕ рд╕реБрд╡рд┐рдзрд╛ рдХреЛ рдЖрдЬрд╝рдорд╛рдирд╛ рдХрд┐рддрдирд╛ рд╕рд╛рд░реНрдердХ рд╣реИ? рдЬреИрд╕рд╛ рдХрд┐ рдореИрдВ рд╕рдордЭрддрд╛ рд╣реВрдВ рдХрд┐ рд╡рд░реНрддрдорд╛рди рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдирд┐рд░рд╛рдзрд╛рд░ рдФрд░ рдЕрдкреВрд░реНрдг рд╣реИ рдФрд░ рд╕рдВрднрд╡рддрдГ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЪрд╛рдХ рдпрд╛ рдХреБрдЫ рдФрд░ рджреНрд╡рд╛рд░рд╛ рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рдЕрдЧрд░ рдпрд╣ рд╕рдЪ рд╣реИ, рддреЛ рдХреНрдпрд╛ рд╣рдореЗрдВ рдЗрд╕ рд╕реБрд╡рд┐рдзрд╛ рдФрд░ рдЕрдиреНрдп (рдЬреИрд╕реЗ рдЬреАрдПрдЯреА) рдХреЛ рддрдм рддрдХ рд▓рд╛рдЧреВ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП рдЬрдм рддрдХ рдХрд┐ рд╡реЗ рдареАрдХ рд╕реЗ рдлрд┐рд░ рд╕реЗ рддреИрдпрд╛рд░ рдирд╣реАрдВ рд╣реЛ рд╕рдХрддреЗ?
рдХреГрдкрдпрд╛ рд▓рд╛рдЧреВ рди рдХрд░реЗрдВред рдЯреВрдЯрд╛ рд╣реБрдЖ, рдирд┐рд░рд╛рдзрд╛рд░ рдФрд░ рдЕрдкреВрд░реНрдг рдЕрднреА рднреА рдкреНрд░рдпреЛрдЧ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред
рдЕрдЧрд░ рдпрд╣ рд╕рдЪ рд╣реИ, рддреЛ рдХреНрдпрд╛ рд╣рдореЗрдВ рдЗрд╕ рд╕реБрд╡рд┐рдзрд╛ рдФрд░ рдЕрдиреНрдп (рдЬреИрд╕реЗ рдЬреАрдПрдЯреА) рдХреЛ рддрдм рддрдХ рд▓рд╛рдЧреВ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП рдЬрдм рддрдХ рдХрд┐ рд╡реЗ рдареАрдХ рд╕реЗ рдлрд┐рд░ рд╕реЗ рддреИрдпрд╛рд░ рдирд╣реАрдВ рд╣реЛ рд╕рдХрддреЗ?
рдХреГрдкрдпрд╛ рди рдХрд░реЗрдВ, PyO3 (рдкрд╛рдпрдерди рдмрд╛рдЗрдВрдбрд┐рдВрдЧ рд▓рд╛рдЗрдмреНрд░реЗрд░реА) рд╡рд░реНрддрдорд╛рди рдореЗрдВ рд╡рд┐рд╢реЗрд╖рдЬреНрдЮрддрд╛ рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддрд╛ рд╣реИред Https://github.com/PyO3/pyo3/issues/210 рджреЗрдЦреЗрдВ
рдХреНрдпрд╛ std
рдХреА рдЙрдЪрд┐рдд рд░рд╛рд╢рд┐ рдЗрд╕ рдкрд░ рднреА рдирд┐рд░реНрднрд░ рдирд╣реАрдВ рдХрд░рддреА рд╣реИ? рд╣рд╛рд▓рд╛рдВрдХрд┐ рдореБрдЭреЗ рдпрд╛рдж рдЖрдпрд╛ рдХрд┐ рд╡реЗрдХреНрдЯрд░ рдФрд░ рд╕реНрдЯреНрд░рд┐рдВрдЧ рд╕рдВрдмрдВрдзрд┐рдд рд╕рд╛рдорд╛рди рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рд╕рд╛рд░реЗ рд╡рд┐рд╢реЗрд╖ рдЖрдВрддрд░рд┐рдХ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рджреЗрдЦрдиреЗ рдХреЛ рдорд┐рд▓реЗред рдРрд╕рд╛ рдирд╣реАрдВ рд╣реИ рдХрд┐ рдбреА-рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЛ рд░реЛрдХрдирд╛ рдЪрд╛рд╣рд┐рдП, рдмрд╕ рдпрд╣ рдХрд┐ рдкрд░реАрдХреНрд╖рдХ рдХреЗ рд╕рдВрдмрдВрдзрд┐рдд рдЕрдиреБрднрд╛рдЧреЛрдВ рдХреЛ рд╣рдЯрд╛рдиреЗ рдХреЗ рд░реВрдк рдореЗрдВ рд╕рд░рд▓ рдирд╣реАрдВ рд╣реЛрдЧрд╛ред
@ рд▓реНрдпреВрдХреНрд░рд┐рдПрд▓ рд╣рд╛рдБ, рдХрдИ рдЙрдкрдпреЛрдЧреА рдЕрдиреБрдХреВрд▓рди (рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ
рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, FusedIterator
рдФрд░ TrustedLen
рд╡рд┐рд╢реЗрд╖рдЬреНрдЮрддрд╛ рдХреЗ рдмрд┐рдирд╛ рдмреЗрдХрд╛рд░ рд╣реИрдВред
PyO3 (рдкрд╛рдпрдерди рдмрд╛рдЗрдВрдбрд┐рдВрдЧ рд▓рд╛рдЗрдмреНрд░реЗрд░реА) рд╡рд░реНрддрдорд╛рди рдореЗрдВ рд╡рд┐рд╢реЗрд╖рдЬреНрдЮрддрд╛ рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддрд╛ рд╣реИ
"рдбрд░рд╛рд╡рдирд╛" рднрд╛рдЧреЛрдВ рдХреЗ рдХрд╛рд░рдг рдпрд╣ рдбрд░рд╛рд╡рдирд╛ рд╣реИред рд╡рд┐рд╢реЗрд╖рдЬреНрдЮрддрд╛ рдХрд╛ рдЧрд▓рдд рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рдХрд╛рд░рдг рдорд╛рдирдХ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдореЗрдВ рдЧрдВрднреАрд░ рдзреНрд╡рдирд┐ рдХреАрдбрд╝реЗ рдереЗред рдЖрдк рдХреИрд╕реЗ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рд╣реИрдВ рдХрд┐ рдЖрдкрдХреЗ рдкрд╛рд╕ рдПрдХ рд╣реА рдХреАрдбрд╝реЗ рдирд╣реАрдВ рд╣реИрдВ? рдЗрд╕рдХреЗ рдмрдЬрд╛рдп min_specialization
рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░реЗрдВ, рдпрд╣ рдЙрдореНрдореАрдж рд╣реИ рдХрд┐ рдХрдо рд╕реЗ рдХрдо рдХрдо рдирд┐рд░рд╛рдзрд╛рд░ рд╣реИред
рд╢рд╛рдпрдж specialization
рдХреЛ const_generics
рд╕рдорд╛рди рдЪреЗрддрд╛рд╡рдиреА рдорд┐рд▓рдиреА рдЪрд╛рд╣рд┐рдП "рдпрд╣ рд╕реБрд╡рд┐рдзрд╛ рдЕрдзреВрд░реА рд╣реИ, рдирд┐рд░рд╛рдзрд╛рд░ рдФрд░ рдЯреВрдЯреА рд╣реБрдИ рд╣реИ, рдЙрддреНрдкрд╛рджрди рдореЗрдВ рдЙрдкрдпреЛрдЧ рди рдХрд░реЗрдВ "ред
рдХрдИ рдЙрдкрдпреЛрдЧреА рдЕрдиреБрдХреВрд▓рди (рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐рдпреЛрдВ рдХреЗ рдЖрд╕рдкрд╛рд╕) рд╡рд┐рд╢реЗрд╖рдЬреНрдЮрддрд╛ рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддреЗ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рдЗрд╕реЗ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдмрд╣реБрдд рдмрдбрд╝рд╛ рдкреВрд░реНрдг рдкреНрд░рддрд┐рдЧрдорди рд╣реЛрдЧрд╛ред
рдЗрди рджрд┐рдиреЛрдВ рд╡реЗ min_specialization
(рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП https://github.com/rust-lang/rust/pull/71321 рджреЗрдЦреЗрдВ) рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддреЗ рд╣реИрдВ, рдЬрд┐рд╕рдореЗрдВ рд╕рдмрд╕реЗ рдмрдбрд╝рд╛ рдзреНрд╡рдирд┐ рдЫреЗрдж рд╣реИред
@nikomatsakis
рдореИрдВ рдорд╛рдирддрд╛ рд╣реВрдВ рдХрд┐ рдЧрд▓рдд рд▓рдЧрддрд╛ рд╣реИред
рдХрд┐рд╕реА рднреА рд╡рд┐рдЪрд╛рд░ рдХрд╛ рдЗрд░рд╛рджрд╛ рдХреЛрдб рдХреНрдпрд╛ рд╣реИ? рдореИрдВрдиреЗ рдкрд╣рд▓реЗ рд╕реЛрдЪрд╛ рдерд╛ рдХрд┐ default impl
рдХрд╛ рдЙрджреНрджреЗрд╢реНрдп рднреА type Output = Self;
рд╕реЗрдЯ рдХрд░рдирд╛ рдерд╛, рд▓реЗрдХрд┐рди рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдкреНрд░рд╕реНрддрд╛рд╡рд┐рдд RFC рдореЗрдВ Output = T
рдмрд╛рдЙрдВрдб рдХрд░рдирд╛ рдерд╛?
@RalfJung рдХрд┐рд╕реА рднреА рдореМрдХрд╛ min_specialization
рджрд╕реНрддрд╛рд╡реЗрдЬ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ? рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЬреНрдЮрд╛рдд (рдФрд░ рд╕рдВрднрд╡рддрдГ рдЕрдЬреНрдЮрд╛рдд) рдзреНрд╡рдирд┐ рдХреАрдбрд╝реЗ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдПрдХ рдЯреЛрдХрд░рд╛ рдкрд░ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЕрдирд┐рд░реНрджрд┐рд╖реНрдЯ рд╕реБрд╡рд┐рдзрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЕрдзрд┐рдХ рдЬреЛрдЦрд┐рдо рднрд░рд╛ рд╣реИред рди рддреЛ рдЕрдЪреНрдЫрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдХрдо рд╕реЗ рдХрдо рдмрд╛рдж рд╡рд╛рд▓рд╛ рд╕рд┐рд░реНрдл рд╕рдВрдХрд▓рдХ рдЗрдВрдЯрд░реНрди рдирд╣реАрдВ рд╣реИред
рдореИрдВ рдЗрд╕ рдЯреНрд░реИрдХрд┐рдВрдЧ рд╕рдорд╕реНрдпрд╛ рд╕реЗ min_specialization
71321 рдкреАрдЖрд░ рдХреЗ рдмрд╛рд╣рд░ рдЕрд╕реНрдерд┐рд░ рдкреБрд╕реНрддрдХ рдХреЗ рдЕрдиреБрд╕рд╛рд░ рдпрд╣ рдЙрд╕ рд╕реБрд╡рд┐рдзрд╛ рдХреЗ рд▓рд┐рдП рдЯреНрд░реИрдХрд┐рдВрдЧ рдореБрджреНрджрд╛ рд╣реИред
рдореБрдЭреЗ рдЙрд╕ рдлреАрдЪрд░ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬреНрдпрд╛рджрд╛ рдЬрд╛рдирдХрд╛рд░реА рдирд╣реАрдВ рд╣реИ, рдореИрдВрдиреЗ рд╕рд┐рд░реНрдл рд▓рд┐рдмрд╕реНрдЯрд░реНрдб рд╕рд╛рдЙрдВрдбрдиреЗрд╕ рдлрд┐рдХреНрд╕ рджреЗрдЦреА рд╣реИред рдЗрд╕реЗ https://github.com/rust-lang/rust/pull/68970 рдореЗрдВ рдкреЗрд╢ рдХрд┐рдпрд╛ рдЧрдпрд╛, рдЬреЛ рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреБрдЫ рдФрд░ рдмрд╛рддреЗрдВ рдмрддрд╛рддрд╛ рд╣реИред
@matthewjasper рдХреЛ рдпрд╣ рд╕рдордЭ рдореЗрдВ рдЖрддрд╛ рд╣реИ рдХрд┐ рдЗрд╕реЗ рдереЛрдбрд╝рд╛ рдФрд░ рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рдХрд┐рдпрд╛ рдЬрд╛рдП рдФрд░ рд░рд╛рдд рдХреЗ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЛ feature(specialization)
рдкреНрд░рд╡рд╛рд╕ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд╣рд╛ рдЬрд╛рдП?
рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдХрдо рд╕реЗ рдХрдо рдПрдХ рдЪреЗрддрд╛рд╡рдиреА рд╣реЛрдиреА рдЪрд╛рд╣рд┐рдПред рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рд╕реБрд╡рд┐рдзрд╛ рдЕрдкрдиреА рд╡рд░реНрддрдорд╛рди рд╕реНрдерд┐рддрд┐ рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП blatantly рдЯреВрдЯреА рд╣реБрдИ рдФрд░ рдЦрддрд░рдирд╛рдХ рд╣реИред
рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ specialization
min_specialization
рдкрд░реНрдпрд╛рдп рдмрди рд╕рдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдореМрдЬреВрджрд╛ рдкрд░рд┐рдпреЛрдЬрдирд╛рдУрдВ рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рд╣реЛрдиреЗ рдкрд░, PyO3 рдпрд╛ рдЬреЛ рднреА рд╣реЛ, рдПрдХ рдФрд░ unsound_specialization
рд╕реБрд╡рд┐рдзрд╛ рдЬреЛрдбрд╝реЗрдВред рдпрд╣ рдХрд┐рд╕реА рдХреЛ рднреА рдмрдЪрд╛рдПрдЧрд╛ рдЬреЛ рдХреЗрд╡рд▓ min_specialization
рдХрд╛рдлреА рдкреНрд░рдпрд╛рд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдХрд┐рд╕реА рдФрд░ рдХреЛ рддреНрд░реБрдЯрд┐ рд╕рдВрджреЗрд╢ рдорд┐рд▓рддрд╛ рд╣реИ, рдФрд░ рдпрд╣рд╛рдВ рдирдпрд╛ рдирд╛рдо рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВред
@RalfJung
рдХрд┐рд╕реА рднреА рд╡рд┐рдЪрд╛рд░ рдХрд╛ рдЗрд░рд╛рджрд╛ рдХреЛрдб рдХреНрдпрд╛ рд╣реИ?
рдЦреИрд░, рдХреБрдЫ рдмрд┐рдВрджреБ рдкрд░, рд╣рдо рдПрдХ рдРрд╕реА рд╡рд┐рдзрд╛ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░ рд░рд╣реЗ рдереЗ, рдЬрд╣рд╛рдВ рдЪреВрдХ рдПрдХ рджреВрд╕рд░реЗ рдкрд░ рднрд░реЛрд╕рд╛ рдХрд░ рд╕рдХреЗред рддреЛ рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЗрд╕ рдмрд┐рдВрджреБ рдкрд░ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХрд╛рдо рдХрд┐рдпрд╛ рд╣реЛрдЧрд╛:
default impl<T: Clone, Rhs> Add<Rhs> for T {
type Output = T;
fn add_assign(&mut self, rhs: Rhs) {
let tmp = self.clone() + rhs;
*self = tmp;
}
}
рдЪреЗрддрд╛рд╡рдиреА рдпрд╣ рдереА рдХрд┐ рдпрджрд┐ рдЖрдк impl
рдХрд┐рд╕реА рднреА рд╕рджрд╕реНрдп рдХреЛ рдУрд╡рд░рд░рд╛рдЗрдб рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдЖрдкрдХреЛ рдЙрди рд╕рднреА рдХреЛ рдУрд╡рд░рд░рд╛рдЗрдб рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред рд╣рдордиреЗ рдмрд╛рдж рдореЗрдВ рдЗрд╕ рд╡рд┐рдЪрд╛рд░ рдХрд╛ рд╕рдорд░реНрдерди рдХрд┐рдпрд╛, рдФрд░ рдлрд┐рд░ рд╡рд┐рднрд┐рдиреНрди рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐рдпреЛрдВ рдХреЗ рдЪрд╛рд░реЛрдВ рдУрд░ рд▓рд╛рдд рдорд╛рд░реА, рдЬреИрд╕реЗ рдХрд┐ "рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд╕рдореВрд╣" (рдЬреЛ рдпрд╣рд╛рдВ рднреА рдХрд╛рдо рдХрд░реЗрдЧрд╛), рдФрд░ рдЕрдВрдд рдореЗрдВ рдХрд┐рд╕реА рднреА рд╕рдорд╛рдзрд╛рди рдХреЛ рдирд╣реАрдВ рдЕрдкрдирд╛рдпрд╛ рдХреНрдпреЛрдВрдХрд┐ рд╣рдореЗрдВ рд▓рдЧрд╛ рдХрд┐ рд╣рдо рдмрд╛рдж рдореЗрдВ рдПрдХ рдмрд╛рд░ рд╕реМрджрд╛ рдХрд░ рд▓реЗрддреЗ рд╣реИрдВ рдЕрдиреНрдп, рдПрд░, рджрдмрд╛рдиреЗ рдХреА рд╕рдорд╕реНрдпрд╛рдПрдВ (cc # 71420)ред
рдХреГрдкрдпрд╛ рди рдХрд░реЗрдВ, PyO3 (рдкрд╛рдпрдерди рдмрд╛рдЗрдВрдбрд┐рдВрдЧ рд▓рд╛рдЗрдмреНрд░реЗрд░реА) рд╡рд░реНрддрдорд╛рди рдореЗрдВ рд╡рд┐рд╢реЗрд╖рдЬреНрдЮрддрд╛ рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддрд╛ рд╣реИред PyO3 / pyo3 # 210 рджреЗрдЦреЗрдВ
рдпрд╣рд╛рдБ PyO3 рдЕрдиреБрдЪрд░ - рд╣рдо рд╡рд┐рд╢реЗрд╖рдЬреНрдЮрддрд╛ рд╕реЗ рджреВрд░ рдЬрд╛рдиреЗ рдХреЗ рдкрдХреНрд╖ рдореЗрдВ рд╣реИрдВ рддрд╛рдХрд┐ рд╣рдо рд╕реНрдерд┐рд░ рдЬрдВрдЧ рдкрд░ рдкрд╣реБрдБрдЪ рд╕рдХреЗрдВред рдХреНрдпрд╛ рдмрд╛рдХреА рд╡рд┐рд╢реЗрд╖рдЬреНрдЮрддрд╛ рдкреВрд░реА рд╣реЛрдиреЗ рд╕реЗ рдкрд╣рд▓реЗ min_specialization
рд╕реНрдерд┐рд░ рд╣реЛрдиреЗ рдХреА рд╕рдВрднрд╛рд╡рдирд╛ рд╣реЛрдЧреА?
рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ 2021 рд╕рдВрд╕реНрдХрд░рдг рдХреА рдкреНрд▓рд╛рдирд┐рдВрдЧ рд▓реИрдВрдЧ рдбрд┐рдЬрд╛рдЗрди рдореАрдЯрд┐рдВрдЧ (рдпрд╣ рдпреВрдЯреНрдпреВрдм рдкрд░ рд╣реИ, рдХреНрд╖рдорд╛ рдХрд░реЗрдВ, рдореИрдВ рдЕрдкрдиреЗ рдлреЛрди рдкрд░ рд╣реВрдВ, рдпрд╛ рдореИрдВ рдПрдХ рд▓рд┐рдВрдХ рдЦреЛрдЬрдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░реВрдВрдЧрд╛) рдореЗрдВ min_specialization рдХреЛ рд╕реНрдерд┐рд░ рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рдиреЗ рдХреА рдХреБрдЫ рдЪрд░реНрдЪрд╛ рдереАред рдореИрдВ рднреВрд▓ рдЧрдпрд╛ рдХрд┐ рдЙрдиреНрд╣реЛрдВрдиреЗ рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреНрдпрд╛ рдХрд╣рд╛ рд╣реИ
рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ 2021 рд╕рдВрд╕реНрдХрд░рдг рдХреА рдкреНрд▓рд╛рдирд┐рдВрдЧ рд▓реИрдВрдЧ рдбрд┐рдЬрд╛рдЗрди рдореАрдЯрд┐рдВрдЧ (рдпрд╣ рдпреВрдЯреНрдпреВрдм рдкрд░ рд╣реИ, рдХреНрд╖рдорд╛ рдХрд░реЗрдВ, рдореИрдВ рдЕрдкрдиреЗ рдлреЛрди рдкрд░ рд╣реВрдВ, рдпрд╛ рдореИрдВ рдПрдХ рд▓рд┐рдВрдХ рдЦреЛрдЬрдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░реВрдВрдЧрд╛) рдореЗрдВ min_specialization рдХреЛ рд╕реНрдерд┐рд░ рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рдиреЗ рдХреА рдХреБрдЫ рдЪрд░реНрдЪрд╛ рдереАред рдореИрдВ рднреВрд▓ рдЧрдпрд╛ рдХрд┐ рдЙрдиреНрд╣реЛрдВрдиреЗ рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреНрдпрд╛ рдХрд╣рд╛ рд╣реИ
рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рд╕рд╣реА YouTube рд▓рд┐рдВрдХ рд╣реИ: https://youtu.be/uDbs_1LXqus
(рдореЗрд░реЗ рдлреЛрди рдкрд░ рднреА)
рд╣рд╛рдБ, рдпрд╣ рдмрд╛рдд рд╣реИред рдпрд╣рд╛рдБ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдЪрд░реНрдЪрд╛ рдХрд╛ рдПрдХ рд▓рд┐рдВрдХ рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ: https://youtu.be/uDbs_1LXqus?t=2073
рдореИрдВ рдПрдХ рдкреНрд░рд╛рдпреЛрдЧрд┐рдХ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдореЗрдВ #[min_specialization]
рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ, рдЗрд╕рд▓рд┐рдП рдореИрдВрдиреЗ рд╕реЛрдЪрд╛ рд╣реИ рдХрд┐ рдореИрдВ рдЕрдкрдиреЗ рдЕрдиреБрднрд╡ рд╕рд╛рдЭрд╛ рдХрд░реВрдВрдЧрд╛ред рд▓рдХреНрд╖реНрдп рдпрд╣ рд╣реИ рдХрд┐ рдпрд╣ рд╕рдмрд╕реЗ рд╕рд░рд▓ рд░реВрдк рдореЗрдВ рд╡рд┐рд╢реЗрд╖рдЬреНрдЮрддрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ: рд╕рд╛рдорд╛рдиреНрдп рдорд╛рдорд▓реЗ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рддреЗрдЬреА рд╕реЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рд╕рд╛рде рдХреБрдЫ рд╕рдВрдХреАрд░реНрдг рдорд╛рдорд▓реЗ рд╣реИрдВред рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ, рдХреНрд░рд┐рдкреНрдЯреЛрдЧреНрд░рд╛рдлрд╝рд┐рдХ рдПрд▓реНрдЧреЛрд░рд┐рджрдо рдХреЛ рд╕рд╛рдорд╛рдиреНрдп рдорд╛рдорд▓реЗ рдореЗрдВ рдирд┐рд░рдВрддрд░ рд╕рдордп рдореЗрдВ рдЪрд▓рд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рд▓реЗрдХрд┐рди рддрдм рдпрджрд┐ рд╕рднреА рдЗрдирдкреБрдЯ Public
рд░реВрдк рдореЗрдВ рдЪрд┐рд╣реНрдирд┐рдд рд╣реЛрддреЗ рд╣реИрдВ, рддреЛ рдПрдХ рд╡рд┐рд╢реЗрд╖ рд╕рдВрд╕реНрдХрд░рдг рд╣реЛрддрд╛ рд╣реИ рдЬреЛ рддреЗрдЬреА рд╕реЗ рдкрд░рд┐рд╡рд░реНрддрдирд╢реАрд▓ рд╕рдордп рдореЗрдВ рдЪрд▓рддрд╛ рд╣реИ (рдХреНрдпреЛрдВрдХрд┐ рдпрджрд┐ рд╡реЗ рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рд╣реИрдВ рддреЛ рд╣рдо рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ рдирд┐рд╖реНрдкрд╛рджрди рд╕рдордп рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЙрдирдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдирдХрд╛рд░реА рд▓реАрдХ рдХрд░рдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рджреЗрдЦрднрд╛рд▓)ред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛ рдХреБрдЫ рдПрд▓реНрдЧреЛрд░рд┐рджрдо рддреЗрдЬреА рд╕реЗ рдирд┐рд░реНрднрд░ рдХрд░рддреЗ рд╣реИрдВ рдХрд┐ рдХреНрдпрд╛ рдЕрдгреНрдбрд╛рдХрд╛рд░ рд╡рдХреНрд░ рдмрд┐рдВрджреБ рд╕рд╛рдорд╛рдиреНрдпреАрдХреГрдд рд╣реИ рдпрд╛ рдирд╣реАрдВред рдЗрд╕реЗ рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╣рдо рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВ
#![feature(rustc_attrs, min_specialization)]
рддрдм рдпрджрд┐ рдЖрдкрдХреЛ рдПрдХ _specialization predicate_ рд▓рдХреНрд╖рдг рдмрдирд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдЬреИрд╕рд╛ рдХрд┐ рдЕрдзрд┐рдХрддрдо рдиреНрдпреВрдирддрдо рд╡рд┐рд╢реЗрд╖рдЬреНрдЮрддрд╛ рдореЗрдВ рд╕рдордЭрд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ рддреЛ рдЖрдк #[rustc_specialization_trait]
рд╕рд╛рде рд╡рд┐рд╢реЗрд╖рддрд╛ рдШреЛрд╖рдгрд╛ рдХреЛ рдЪрд┐рд╣реНрдирд┐рдд рдХрд░рддреЗ рд╣реИрдВред
рдЗрд╕ рдлрд╛рдЗрд▓ рдореЗрдВ рдореЗрд░рд╛ рд╕рд╛рд░рд╛ рд╕реНрдкреЗрд╢рд▓рд╛рдЗрдЬреЗрд╢рди рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ рдФрд░ рдпрд╣рд╛рдБ рдПрдХ рд╡рд┐рд╢реЗрд╖рдЬреНрдЮрддрд╛ рдХреЗ
рдлреАрдЪрд░ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ рдФрд░ рдореБрдЭреЗ рдареАрдХ рд╡рд╣реА рдЪрд╛рд╣рд┐рдП рдЬреЛ рдореБрдЭреЗ рдЪрд╛рд╣рд┐рдПред рдпрд╣ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рд░рд╕реНрдЯрдХ рдЖрдВрддрд░рд┐рдХ рдорд╛рд░реНрдХрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣рд╛ рд╣реИ рдФрд░ рдЗрд╕рд▓рд┐рдП рдЪреЗрддрд╛рд╡рдиреА рдХреЗ рдмрд┐рдирд╛ рдЯреВрдЯрдиреЗ рдХрд╛ рдЦрддрд░рд╛ рд╣реИред
рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдХрд╛ рдПрдХрдорд╛рддреНрд░ рдирдХрд╛рд░рд╛рддреНрдордХ рдкрдХреНрд╖ рдпрд╣ рд╣реИ рдХрд┐ рдореБрдЭреЗ default
рдорддрд▓рдм рдирд╣реАрдВ рд▓рдЧрддрд╛ рд╣реИред рдЕрдирд┐рд╡рд╛рд░реНрдп рд░реВрдк рд╕реЗ рдЕрднреА рдХреНрдпрд╛ default
рдЕрд░реНрде рд╣реИ: "рдпрд╣ рдирд┐рд╣рд┐рдд рд╡рд┐рд╢реЗрд╖ рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╡реНрдпрд╛рдЦреНрдпрд╛ рдХрд╛ рдЕрд░реНрде рд╣реИ рдХрд┐ рдпрд╣ рдПрдХ рдЙрдкрд╕рдореВрд╣ рдХреЛ рдХрд╡рд░ рдХрд░рддрд╛ рд╣реИ, рдЬреЛ рдЗрд╕реЗ рдкрд░рд╕реНрдкрд░ рд╡рд┐рд░реЛрдзреА рдирд┐рд╣рд┐рддрд╛рд░реНрде рдХреЗ рдмрдЬрд╛рдп рдЗрд╕рдХреЗ рд╡рд┐рд╢реЗрд╖рдЬреНрдЮрддрд╛ рдХреЗ рд░реВрдк рдореЗрдВ рджрд░реНрд╢рд╛рддрд╛ рд╣реИ"ред рд╕рдорд╕реНрдпрд╛ рдпрд╣ рд╣реИ рдХрд┐ рдпрд╣ рдмрд╣реБрдд рд╣реА рдЕрдЬреАрдм рджрд┐рдЦрдиреЗ рд╡рд╛рд▓рд╛ рдХреЛрдб рд╣реИ:
рдпрд╣рд╛рдБ рджреВрд╕рд░рд╛ рдирд┐рд╣рд┐рдд рдкрд╣рд▓реЗ рдХреА рд╡рд┐рд╢реЗрд╖рддрд╛ рд╣реИ рд▓реЗрдХрд┐рди рдпрд╣ default
ред default
рдХрд╛ рдЕрд░реНрде рдЦреЛ рдЬрд╛рдирд╛ рдкреНрд░рддреАрдд рд╣реЛрддрд╛ рд╣реИред рдпрджрд┐ рдЖрдк рдмрд╛рдХреА рд╕рднреА рдЖрдХреГрддрд┐рдпреЛрдВ рдХреЛ рджреЗрдЦрддреЗ рд╣реИрдВ рддреЛ рдпрд╣ рдкрддрд╛ рд▓рдЧрд╛рдирд╛ рдХрд╛рдлреА рдХрдард┐рди рд╣реИ рдХрд┐ рдХреМрди рд╕реЗ рд╡рд┐рд╢реЗрд╖рдЬреНрдЮ рд╡рд┐рд╢реЗрд╖рдЬреНрдЮрддрд╛ рдкреНрд░рд╛рдкреНрдд рдХрд░ рд░рд╣реЗ рд╣реИрдВред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдЬрдм рдореИрдВрдиреЗ рдПрдХ рдЧрд▓рдд рдЕрдиреБрдорд╛рди рд▓рдЧрд╛рдпрд╛, рдЬреЛ рдХрд┐ рдореМрдЬреВрджрд╛ рдХреЗ рд╕рд╛рде рдУрд╡рд░рд▓реИрдк рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛, рддреЛ рдпрд╣ рдкрддрд╛ рд▓рдЧрд╛рдирд╛ рдЕрдХреНрд╕рд░ рдореБрд╢реНрдХрд┐рд▓ рдерд╛ рдХрд┐ рдореИрдВ рдЧрд▓рдд рдХрд╣рд╛рдВ рдЧрдпрд╛ред
рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рд╕рдм рдХреБрдЫ рд╕рд░рд▓ рдерд╛ рдпрджрд┐ рдЖрдк рдХреБрдЫ рд╡рд┐рд╢реЗрд╖ рдХрд░рдиреЗ рдпреЛрдЧреНрдп рдереЗ рдФрд░ рдЬрдм рдЖрдк рдХреБрдЫ рдРрд╕рд╛ рдХрд░рддреЗ рд╣реИрдВ рддреЛ рдЖрдк рдареАрдХ-рдареАрдХ рдШреЛрд╖рдгрд╛ рдХрд░рддреЗ рд╣реИрдВ, рдЬреЛ рдЖрдкрдХреЛ рд╡рд┐рд╢реЗрд╖рдЬреНрдЮрддрд╛ рдкреНрд░рджрд╛рди рдХрд░рддреЗ рд╣реИрдВред RFC рдореЗрдВ рдЙрджрд╛рд╣рд░рдг рдкреНрд░рд╕реНрддреБрдд рдХрд░рдирд╛ рдХрд┐ рдореЗрд░реЗ рдорди рдореЗрдВ рдХреНрдпрд╛ рдерд╛:
impl<A, T> Extend<A, T> for Vec<A> where T: IntoIterator<Item=A>
{
// no need for default
fn extend(&mut self, iterable: T) {
...
}
}
// We declare explicitly which impl we are specializing repeating all type bounds etc
specialize impl<A, T> Extend<A, T> for Vec<A> where T: IntoIterator<Item=A>
// And then we declare explicitly how we are making this impl narrower with тАШwhenтАЩ.
// i.e. This impl is like the first except replace all occurances of тАШTтАЩ with тАШ&'a [A]тАЩ
when<'a> T = &'a [A]
{
fn extend(&mut self, iterable: &'a [A]) {
...
}
}
рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рджред
рдпрд╣рд╛рдБ рдореЗрд░реА рдЯрд┐рдкреНрдкрдгреА, рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдЖрдЗрдЯрдо рем, рдорд╛рдирдХ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдореЗрдВ рдПрдХ рдареЛрд╕ рдорд╛рдорд▓рд╛ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИ, рдЬрд╣рд╛рдБ рдПрдХ рд╡рд┐рд╢реЗрд╖рдЬреНрдЮрддрд╛ рд╣реЛрдирд╛ рд╡рд╛рдВрдЫрдиреАрдп рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдЬреЛ рдХреЗрд╡рд▓ рдЖрдВрд╢рд┐рдХ рд░реВрдк рд╕реЗ рдЕрдзрд┐рдХ рдЙрдкрдпреЛрдЧ рдпреЛрдЧреНрдп рд╣реЛ: IndexSet
рдПрдХ рдЕрд▓рдЧ Output
рдкреНрд░рдХрд╛рд░ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреА рдХреНрдпреЛрдВрдХрд┐ IndexSet
Index
рдмрд┐рдирд╛ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рд╣рдо рд╢рд╛рдпрдж рджреЛрдиреЛрдВ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЛ рдЕрд▓рдЧ-рдЕрд▓рдЧ Output
рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рд╕рд╛рде рд╕рд╣-рдЕрд╕реНрддрд┐рддреНрд╡ рдХреА рдЕрдиреБрдорддрд┐ рдирд╣реАрдВ рджреЗрдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВред рдХреЗ рдмрд╛рдж рд╕реЗ IndexSet
рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ рдПрдХ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╣реЛ рд╕рдХрддрд╛ рдерд╛ IndexMut
, рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╡рд┐рд╢реЗрд╖рдЬреНрдЮрддрд╛ рдЕрдиреБрдорддрд┐ рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдЪрд┐рдд рд╣реЛрдЧрд╛ index_set
рдХреА рд╡рд┐рд╢реЗрд╖рдЬреНрдЮрддрд╛ рдХреА рдЕрдиреБрдорддрд┐ рдХреЗ рдмрд┐рдирд╛ рд╡рд┐рдзрд┐ Output
ред
рдореЗрд░реЗ рдкрд╛рд╕ рд╡реАрдбрд┐рдпреЛ рдХреЗ рд╕рд╛рде рдПрдХ рдХрдард┐рди рд╕рдордп рд╣реИ, рдЗрд╕рд▓рд┐рдП рдореИрдВ рд▓рд┐рдВрдХ рдХрд┐рдП рдЧрдП рд╡реАрдбрд┐рдпреЛ рдХреЛ рдирд╣реАрдВ рджреЗрдЦ рд╕рдХрддрд╛ рд╣реВрдВ, рд╣рд╛рд▓рд╛рдВрдХрд┐, рдореЗрд░реЗ рдкрд╛рд╕ #[min_specialization]
рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдПрдХ рдкреНрд░рд╢реНрди рд╣реИред рдХреЗ рд░реВрдк рдореЗрдВ-рд╣реИ, рд╡рд╣рд╛рдБ рдПрдХ рд╣реИ rustc_unsafe_specialization_marker
рдХреА рддрд░рд╣ рд▓рдХреНрд╖рдг рдкрд░ рд╡рд┐рд╢реЗрд╖рддрд╛ FusedIterator
рдХрд┐ рдЕрдиреБрдХреВрд▓рди рд╕рдВрдХреЗрдд рдкреНрд░рджрд╛рди рдХрд░рддреЗ рд╣реИрдВ, рддрд╛рдХрд┐ рд╡реЗ рдкрд░ рд╡рд┐рд╢реЗрд╖ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред @matthewjasper рдиреЗ рд▓рд┐рдЦрд╛:
рдпрд╣ рдЕрд╕реНрд╡рд╛рднрд╛рд╡рд┐рдХ рд╣реИ рд▓реЗрдХрд┐рди рд╣рдо рдЗрд╕реЗ рдЕрд▓реНрдкрд╛рд╡рдзрд┐ рдореЗрдВ рдЕрдиреБрдорддрд┐ рджреЗрддреЗ рд╣реИрдВ рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рд╡рд┐рд╢реБрджреНрдз рд░реВрдк рд╕реЗ рд╕реБрд░рдХреНрд╖рд┐рдд рдХреЛрдб рдХреЗ рд╕рд╛рде рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░ рд╕рдХрддрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рд▓рдХреНрд╖рдг рд╡рд┐рдзрд┐рдпреЛрдВ рдкрд░ рд╡рд┐рд╢реЗрд╖рдЬреНрдЮрддрд╛ рд╣реЛ рд╕рдХрддреА рд╣реИред
рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдпреЛрдЬрдирд╛ @ рдиреНрдпреВрдЯрди рдХреЗ рдкреНрд░рд╕реНрддрд╛рд╡ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдФрд░ рдЗрди ( where specialize(T: FusedIterator)
) рдЬреИрд╕реЗ рд▓рдХреНрд╖рдгреЛрдВ рдХреЗ рд▓рд┐рдП рдПрдХ рд╡рд┐рд╢реЗрд╖рдЬреНрдЮрддрд╛ рдореЛрдбрд┐рдЯреА рдЬреЛрдбрд╝рдиреЗ рдХреА рд╣реИред рд▓реЗрдХрд┐рди рд╡рд░реНрддрдорд╛рди рдореЗрдВ, рдРрд╕рд╛ рдкреНрд░рддреАрдд рд╣реЛрддрд╛ рд╣реИ рдХрд┐ рдХреЛрдИ рднреА рдХреЛрдб рдЗрди рд▓рдХреНрд╖рдгреЛрдВ рдкрд░ рд╡рд┐рд╢реЗрд╖рдЬреНрдЮ рдХрд░ рд╕рдХрддрд╛ рд╣реИ ред рдпрджрд┐ рдЗрд╕реЗ рд╕реНрдерд┐рд░ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рд▓реЛрдЧ рд╕реНрдерд┐рд░ рд╡рд┐рд╢реЗрд╖рдЬреНрдЮрддрд╛рдУрдВ рдХреЛ рд▓рд┐рдЦ рд╕рдХрддреЗ рд╣реИрдВ, рдЬреЛ рдЗрд╕ рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддреЗ рд╣реИрдВ, рдЬрд┐рд╕рдХрд╛ рдЕрд░реНрде рд╣реИ рдХрд┐ рдпрд╣ рдирд┐рд░рд╛рдзрд╛рд░рддрд╛ рд╕реНрдерд┐рд░ рд╣реЛрдЧреАред
рдХреНрдпрд╛ рдЗрди рд▓рдХреНрд╖рдгреЛрдВ рдкрд░ рд╡рд┐рд╢реЗрд╖рдЬреНрдЮрддрд╛ рднреА рдорд╛рдирдХ рдкреБрд╕реНрддрдХрд╛рд▓рдп рддрдХ рд╕реАрдорд┐рдд рд╣реЛрдиреА рдЪрд╛рд╣рд┐рдП, рдлрд┐рд░? рдХреНрдпрд╛ рдорд╛рдирдХ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдЙрди рдкрд░ рд╡рд┐рд╢реЗрд╖рдЬреНрдЮ рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рд▓рд╛рдн рдкреНрд░рд╛рдкреНрдд рдХрд░рддреЗ рд╣реИрдВ?
рдпрджрд┐ рдЗрд╕реЗ рд╕реНрдерд┐рд░ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рд▓реЛрдЧ рд╕реНрдерд┐рд░ рд╡рд┐рд╢реЗрд╖рдЬреНрдЮрддрд╛рдУрдВ рдХреЛ рд▓рд┐рдЦ рд╕рдХрддреЗ рд╣реИрдВ, рдЬреЛ рдЗрд╕ рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддреЗ рд╣реИрдВ, рдЬрд┐рд╕рдХрд╛ рдЕрд░реНрде рд╣реИ рдХрд┐ рдпрд╣ рдирд┐рд░рд╛рдзрд╛рд░рддрд╛ рд╕реНрдерд┐рд░ рд╣реЛрдЧреАред
рдпрд╣ рдореЗрд░реА рд╕рдордЭ рд╣реИ рдХрд┐ min_specialization
рд░реВрдк рдореЗрдВ-рд╕реНрдерд┐рд░реАрдХрд░рдг рдХреЗ рд▓рд┐рдП рдЗрд░рд╛рджрд╛ рдирд╣реАрдВ рд╣реИред
рдореИрдВ рджреВрд╕рд░реЗ рдХреЗ рдХреБрдЫ рдкреНрд░рдХрд╛рд░ рдХреЗ рдорд╛рд░реНрдХрд░реЛрдВ рдХреЛ рд╡рд┐рд╢реЗрд╖рд╛рдВрдХ рд▓рдЧрд╛рдирд╛ рдЪрд╛рд╣реВрдВрдЧрд╛ред рд╕рд░рд╕рд░рд╛рд╣рдЯ рдореЗрдВ рдХреЛрдб рдХреЗ рдХреБрдЫ рдорд╛рдорд▓реЗ рдФрд░ рдорд╛рдирдХ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдРрд╕рд╛ рдирд╣реАрдВ рдХрд░ рд░рд╣реЗ рд╣реИрдВ рдЬреЛ рдРрд╕рд╛ рджрд┐рдЦрддрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдЬрд╛рдирдиреЗ рдХрд╛ рдХреЛрдИ рддрд░реАрдХрд╛ рдирд╣реАрдВ рд╣реИ рдХрд┐ рд╡рд┐рд╢реЗрд╖рдЬреНрдЮрддрд╛ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд╣реЛ рд░рд╣реА рд╣реИ:
Copy
рдПрдХ рдЕрдирд╛рд╡рд╢реНрдпрдХ рд╡рд┐рд╢реЗрд╖рдЬреНрдЮрддрд╛:
https://github.com/rust-lang/rust/pull/72707/files#diff -3afa644e1d09503658d661130df65f59L1955
"рд╡рд┐рд╢реЗрд╖рдЬреНрдЮрддрд╛" рдЬреЛ рдирд╣реАрдВ рд╣реИ:
https://github.com/rust-lang/rust/pull/71321/files#diff -da456bd3af6d94a9693e625ff7303113L1589
рдореИрдХреНрд░реЛ рджреНрд╡рд╛рд░рд╛ рддрдм рддрдХ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдЬрдм рддрдХ рдХрд┐ рдХреЛрдИ рдзреНрд╡рдЬ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдХреЛ рдкрд╛рд░ рдирд╣реАрдВ рдХрд░ рдЬрд╛рддрд╛ рд╣реИ:
https://github.com
@matthewjasper рдЕрдВрддрд┐рдо рд▓рд┐рдВрдХ рдХрд┐рд╕реА рднреА рд╡рд┐рд╢рд┐рд╖реНрдЯ рд╕реНрдирд┐рдкреЗрдЯ рд╕реЗ рд▓рд┐рдВрдХ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкреНрд░рдХрдЯ рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИред
рдореБрдЭреЗ рдпрдХреАрди рдирд╣реАрдВ рд╣реИ рдХрд┐ рдпрд╣ рдПрдХ рд╕реНрдкрд╖реНрдЯ рд▓рдХреНрд╖реНрдп рд╣реИ, рд▓реЗрдХрд┐рди AIUI рддрдереНрдп рдпрд╣ рд╣реИ рдХрд┐ рд╡рд┐рд╢реЗрд╖рдЬреНрдЮрддрд╛ рдХреЗ рдирд┐рд╢рд╛рди рдЪрд┐рд╣реНрдирд┐рдд рдирд╣реАрдВ рд╣реИрдВ, рдЖрдкрдХреЛ рдХрдВрдмрд▓ рдХреЗ рдирд┐рд╢рд╛рди рдкрд░ рдкрд░рд┐рд╡рд░реНрддрди рд╕реЗ рдмрдЪрдиреЗ рдХрд╛ рдПрдХ рддрд░реАрдХрд╛ рджреЗрддрд╛ рд╣реИред рдПрдХ рдирдпрд╛ default impl<T> Trait for T
рдбрд╛рдЙрдирд╕реНрдЯреНрд░реАрдо рдХреЗ рд╕рд╛рде рд╕рдВрдШрд░реНрд╖ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ - рд╡реЗ рд╕рд┐рд░реНрдл рд╡рд┐рд╢реЗрд╖рдЬреНрдЮрддрд╛ рдмрди рдЬрд╛рддреЗ рд╣реИрдВред
рдХреНрдпрд╛ рдЗрд╕реЗ рдХреЗрд╡рд▓ рдЪрд┐рдиреНрд╣рд┐рдд рдХрд░рдирд╛ рдПрдХ рдЪреЗрддрд╛рд╡рдиреА рд╣реЛ рд╕рдХрддреА рд╣реИ?
рд╕рд░рд╕рд░рд╛рд╣рдЯ рдореЗрдВ рдХреЛрдб рдХреЗ рдХреБрдЫ рдорд╛рдорд▓реЗ рдФрд░ рдорд╛рдирдХ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдРрд╕рд╛ рдирд╣реАрдВ рдХрд░ рд░рд╣реЗ рд╣реИрдВ рдЬреЛ рдРрд╕рд╛ рджрд┐рдЦрддрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдЬрд╛рдирдиреЗ рдХрд╛ рдХреЛрдИ рддрд░реАрдХрд╛ рдирд╣реАрдВ рд╣реИ рдХрд┐ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд╡рд┐рд╢реЗрд╖рдЬреНрдЮрддрд╛ рдХреНрдпрд╛ рд╣реЛ рд░рд╣реА рд╣реИ
рдЬрд╛рд╡рд╛ рдХреЗ рд╕рд╛рде рдореЗрд░рд╛ рдЕрдиреБрднрд╡ рд╕рдорд╛рди рд╣реИ (рд╣рд╛рд▓рд╛рдВрдХрд┐ рдмрд┐рд▓реНрдХреБрд▓ рдЕрдиреБрд░реВрдк рдирд╣реАрдВ)ред рдпрд╣ рдкрддрд╛ рд▓рдЧрд╛рдирд╛ рдореБрд╢реНрдХрд┐рд▓ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдХрд┐рд╕ рд╡рд░реНрдЧ рдХрд╛ рдЙрдкрд╡рд░реНрдЧ рдЪрд▓ рд░рд╣рд╛ рд╣реИ ...
рд╣рдо рдХреБрдЫ рд╡рд┐рд╢реЗрд╖ рдорд╛рд░реНрдХрд░реЛрдВ рдкрд░ рдХреБрдЫ рдорд╛рд░реНрдХрд░ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рд╣рд╛рд▓рд╛рдВрдХрд┐, рдпрд╣ рд╕реНрдкрд╖реНрдЯрддрд╛ рдХреЗ рд▓рд┐рдП рднреА рд╣реИ рдХрд┐ рдХреНрдпрд╛ рд╕рд╣реА рд╣реИ?
рд╣рдо рджреЛрдиреЛрдВ рд╕реНрдерд╛рдиреЛрдВ рдкрд░ рдорд╛рд░реНрдХрд░ рд▓рдЧрд╛ рд╕рдХрддреЗ рд╣реИрдВ, рдЬреЛ рдлрд┐рд░ рдЬрдВрдЧ рддреНрд░реБрдЯрд┐ рдпрд╛ рдЪреЗрддрд╛рд╡рдиреА рд╕рдВрджреЗрд╢реЛрдВ рдореЗрдВ рд╕реБрдзрд╛рд░ рдХрд░рддрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рд╡реЗ рдЕрдм рдЬрд╛рдирддреЗ рд╣реИрдВ рдХрд┐ рдХреНрдпрд╛ рд╡рд┐рд╢реЗрд╖рдЬреНрдЮрддрд╛ рд╡рд╛рдВрдЫрд┐рдд рд╣реИ рдФрд░ рдореМрдЬреВрдж рд╣реЛрдиреЗ рдкрд░ рджреВрд╕рд░реА рдЬрдЧрд╣ рдХреЛ рдЗрдВрдЧрд┐рдд рдХрд░ рд╕рдХрддрд╛ рд╣реИред
рдпрджрд┐ рдПрдХ рдЕрдкрд╕реНрдЯреНрд░реАрдо рдЯреЛрдХрд░рд╛ рдПрдХ рдЬреЛрдбрд╝ рдЬреЛрдбрд╝рддрд╛ рд╣реИ, рддреЛ рдмрд╕ рдЙрдиреНрдирдпрди рд╕реЗ рдЕрд▓рдЧ, рдПрдХ рдбрд╛рдЙрдирд╕реНрдЯреНрд░реАрдо рдЯреЛрдХрд░рд╛ рдЙрди рдЪрд╛рд▓реЛрдВ рдХреЛ рдирд┐рдпреЛрдЬрд┐рдд рдХрд░ рд╕рдХрддрд╛ рд╣реИ рдЬреЛ рдирдП рдФрд░ рдкреБрд░рд╛рдиреЗ рджреЛрдиреЛрдВ рд╕рдВрд╕реНрдХрд░рдгреЛрдВ рдХреЗ рдЦрд┐рд▓рд╛рдл рд╕рдВрдХрд▓рди рдХрд░рддреЗ рд╣реИрдВ, рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдирд╣реАрдВ рд╣реИ рдХрд┐ рдпрд╣ рдлрд╛рдпрджреЗрдордВрдж рд╣реИред
рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдмрджрд▓рд╛рд╡ рджрд┐рдЦрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдпрд╣ рдЕрдВрддрд░ рдмрд╣реБрдд рдмрдбрд╝рд╛ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред рдпрд╣ рдЗрд╕ рдУрд░ рдЗрд╢рд╛рд░рд╛ рдХрд░ рд░рд╣рд╛ рд╣реИ: https://github.com/rust-lang/rust/blob/fb818d4321dee29ec1938c002c1ff79b0e7eaadff/src/librust_span/def_id.rs#L124
рдкреБрди: рдХрдВрдмрд▓ рдирд┐рд╣рд┐рдд рд╣реИ, рд╡реЗ рд╡реИрд╕реЗ рднреА рдкрд░рд┐рд╡рд░реНрддрди рддреЛрдбрд╝ рд░рд╣реЗ рд╣реИрдВ:
min_specialization
рдХрд░рддрд╛ рд╣реИ)ред@cuviper рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЕрднреА рднреА рдирдП рдХрдВрдмрд▓ рдЗрдореНрдкреНрд▓рд╛рдВрдЯ рдЬреЛрдбрд╝рдиреЗ рдХреЗ рдЖрд╕рдкрд╛рд╕ рдХреЗ рдХрд┐рдирд╛рд░реЗ рдорд╛рдорд▓реЗ рдереЗ, рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рд╡рд┐рд╢реЗрд╖рдЬреНрдЮрддрд╛ рдХреЗ рд╕рд╛рде рднреАред рдореБрдЭреЗ рдпрд╛рдж рд╣реИ рдХрд┐ рдореИрдВ рдпрд╣ рдкрддрд╛ рд▓рдЧрд╛рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░ рд░рд╣рд╛ рдерд╛ рдХрд┐ рд╣рдореЗрдВ impl<T: Copy> Clone for T { }
рдЬреЛрдбрд╝рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП рдпрд╣ рдмреНрд▓реЙрдЧ рдкреЛрд╕реНрдЯ рдореИрдВрдиреЗ рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХрд┐рд╕реА рднреА рд╕реНрдерд┐рддрд┐ рдореЗрдВ
рднрд▓реЗ рд╣реА, рд╣рдо рдЗрд╕реЗ #[override]
рдПрдиреЛрдЯреЗрд╢рди рди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд▓рд┐рдВрдЯ рдЪреЗрддрд╛рд╡рдиреА рджреЗ рд╕рдХрддреЗ рд╣реИрдВред
рдЙрд╕ рдиреЗ рдХрд╣рд╛, рдЕрдЧрд░ рд╣рдо рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЛ рдпрд╣ рдШреЛрд╖рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рд╡реЗ рдХреМрди рд╕реЗ рд╡рд┐рд╢реЗрд╖рдЬреНрдЮ рд╣реИрдВ (рдХреЛрдИ рд╡рд┐рдЪрд╛рд░ рдирд╣реАрдВ рд╣реИ рдХрд┐ рд╣рдо рдРрд╕рд╛ рдХреИрд╕реЗ рдХрд░реЗрдВрдЧреЗ), рдпрд╣ рдЙрдирдХреА рдЪреАрдЬреЛрдВ рдХреЛ рд╕рд░рд▓ рдХрд░реЗрдЧрд╛ред рдЕрднреА рдХрдВрдкрд╛рдЗрд▓рд░ рдХреЛ рдЗрдореНрдкреНрд▓рд╛рдВрдЯ рдХреЗ рдмреАрдЪ рдХреЗ рд░рд┐рд╢реНрддреЛрдВ рдХреЛ рдХрдо рдХрд░рдирд╛ рд╣реИ рдФрд░ рдпрд╣ рд╣рдореЗрд╢рд╛ рдереЛрдбрд╝рд╛ рдореБрд╢реНрдХрд┐рд▓ рд╣реИред
рдЪрд╛рдХ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдореЗрдВ рд╣рдореЗрдВ рд▓рдВрдмрд┐рдд рд╡рд╕реНрддреБрдУрдВ рдореЗрдВ рд╕реЗ рдПрдХ рдкреНрд░рдпрд╛рд╕ рдХрд░рдирд╛ рд╣реИ рдФрд░ рд╡рд╛рдкрд╕ рдЬрд╛рдирд╛ рд╣реИ рдФрд░ рдпрд╣ рдмрддрд╛рдирд╛ рд╣реИ рдХрд┐ рд╡рд╣рд╛рдВ рд╡рд┐рд╢реЗрд╖рдЬреНрдЮрддрд╛ рдХреИрд╕реЗ рд╡реНрдпрдХреНрдд рдХреА рдЬрд╛рдиреА рдЪрд╛рд╣рд┐рдПред
рд╕рд░рд╕рд░рд╛рд╣рдЯ рдореЗрдВ рдХреЛрдб рдХреЗ рдХреБрдЫ рдорд╛рдорд▓реЗ рдФрд░ рдорд╛рдирдХ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдРрд╕рд╛ рдирд╣реАрдВ рдХрд░ рд░рд╣реЗ рд╣реИрдВ рдЬреЛ рдРрд╕рд╛ рджрд┐рдЦрддрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдЬрд╛рдирдиреЗ рдХрд╛ рдХреЛрдИ рддрд░реАрдХрд╛ рдирд╣реАрдВ рд╣реИ рдХрд┐ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд╡рд┐рд╢реЗрд╖рдЬреНрдЮрддрд╛ рдХреНрдпрд╛ рд╣реЛ рд░рд╣реА рд╣реИ
рдЬрд╛рд╡рд╛ рдХреЗ рд╕рд╛рде рдореЗрд░рд╛ рдЕрдиреБрднрд╡ рд╕рдорд╛рди рд╣реИ (рд╣рд╛рд▓рд╛рдВрдХрд┐ рдмрд┐рд▓реНрдХреБрд▓ рдЕрдиреБрд░реВрдк рдирд╣реАрдВ)ред рдпрд╣ рдкрддрд╛ рд▓рдЧрд╛рдирд╛ рдореБрд╢реНрдХрд┐рд▓ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдХрд┐рд╕ рд╡рд░реНрдЧ рдХрд╛ рдЙрдкрд╡рд░реНрдЧ рдЪрд▓ рд░рд╣рд╛ рд╣реИ ...
рдордИ рдореЗрдВ рд╡рд╛рдкрд╕, рдореИрдВрдиреЗ IRLO рдкрд░ рд╡рд┐рд╢реЗрд╖рдЬреНрдЮрддрд╛ рдХреЗ рд▓рд┐рдП рдПрдХ where match
рдЗрдореНрдкреНрд▓рд╛рдВрдЯ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ:
impl<R, T> AddAssign<R> for T {
fn add_assign(&mut self, rhs: R) where match T {
T: AddAssignSpec<R> => self.add_assign(rhs),
T: Add<R> + Copy => *self = *self + rhs,
T: Add<R> + Clone => { let tmp = self.clone() + rhs; *self = tmp; }
}
}
рдбрд╛рдЙрдирд╕реНрдЯреНрд░реАрдо рддрдм "рд╕реНрдкреЗрд╢рд▓рд╛рдЗрдЬреЗрд╢рди" рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЗрд╕ рддрд░рд╣ рдХреЗ impl
рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреА рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдХрдиреНрд╡реЗрдВрд╢рди рджреНрд╡рд╛рд░рд╛ рдЗрд╕ рддрд░рд╣ рдХреЗ рдирд┐рд╣рд┐рддрд╛рд░реНрде рдХреЗ рд▓рд┐рдП Trait
рдкрд╣рд▓реЗ рдЙрди рдкреНрд░рдХрд╛рд░реЛрдВ рд╕реЗ рдореЗрд▓ рдЦрд╛рдПрдВрдЧреЗ рдЬреЛ рдХрд┐рд╕реА рдЕрдиреНрдп рд╡рд┐рд╢реЗрд╖рддрд╛ TraitSpec
, рдФрд░ рдбрд╛рдЙрдирд╕реНрдЯреНрд░реАрдо рдкреНрд░рдХрд╛рд░ рдЬреЗрдиреЗрд░рд┐рдХ рд╡реНрдпрд╡рд╣рд╛рд░ рдХреЛ рдУрд╡рд░рд░рд╛рдЗрдб рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрд╕ рд╡рд┐рд╢реЗрд╖рддрд╛ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдЧрд╛:
// Crate upstream
pub trait Foo { fn foo(); }
pub trait FooSpec { fn foo(); }
impl<T> Foo for T {
fn foo() where T {
T : FooSpec => T::foo(),
_ => { println!("generic implementation") }
}
}
fn foo<T : Foo>(t: T) {
T::foo()
}
// crate downstream
struct A {}
struct B {}
impl upstream::FooSpec for A {
fn foo() { println!("Specialized"); }
}
fn main() {
upstream::foo(A); // prints "specialized"
upstream::foo(B); // prints "generic"
}
рдпрд╣ рдлреЙрд░реНрдореНрдпреБрд▓реЗрд╢рди рдЕрдкрд╕реНрдЯреНрд░реАрдо рдХреЗ рдХреНрд░рдо рдХреЛ рдЪреБрдирдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдкрд╕реНрдЯреНрд░реАрдо рдХреЛ рдЕрдзрд┐рдХ рдирд┐рдпрдВрддреНрд░рдг рджреЗрддрд╛ рд╣реИ, рдФрд░ рдЬреИрд╕рд╛ рдХрд┐ рдпрд╣ рд╡рд┐рд╢реЗрд╖рддрд╛ / рдлрд╝рдВрдХреНрд╢рди рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рдХрд╛ рд╣рд┐рд╕реНрд╕рд╛ рд╣реИ, рдпрд╣ рдкреНрд░рд▓реЗрдЦрди рдореЗрдВ рджрд┐рдЦрд╛рдИ рджреЗрдЧрд╛ред IMO рдпрд╣ рдЬрд╛рдирдиреЗ рдХреЗ рд▓рд┐рдП "рдЗрдореНрдкреНрд▓рд╛рдпрд┐рдВрдЧ рдЪреЗрдЬрд╝рд┐рдВрдЧ" рдХреЛ рд░реЛрдХрддрд╛ рд╣реИ рдХрд┐ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдХреМрди рд╕реА рд╢рд╛рдЦрд╛ рд▓рд╛рдЧреВ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рд░рд┐рдЬрд╝реЙрд▓реНрдпреВрд╢рди рдСрд░реНрдбрд░ рд╕реНрдкрд╖реНрдЯ рд╣реИред
рдпрд╣ рд╢рд╛рдпрдж рдЬреАрд╡рдирдХрд╛рд▓ рдХреЗ рдЖрд╕рдкрд╛рд╕ рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЛ рдмрдирд╛ рд╕рдХрддрд╛ рд╣реИ рдФрд░ рд╕рдорд╛рдирддрд╛ рдХреЛ рдЕрдзрд┐рдХ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдЯрд╛рдЗрдк рдХрд░ рд╕рдХрддрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рд╡рд┐рд╢реЗрд╖рдЬреНрдЮрддрд╛ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддреЗ рд╕рдордп рдХреЗрд╡рд▓ рдЕрдкрд╕реНрдЯреНрд░реАрдо рдЙрдиреНрд╣реЗрдВ рдорд┐рд▓ рд╕рдХрддрд╛ рд╣реИ (рдЪреВрдВрдХрд┐ рдбрд╛рдЙрдирд╕реНрдЯреНрд░реАрдо рдХреЗрд╡рд▓ "рд╡рд┐рд╢реЗрд╖рдЬреНрдЮрддрд╛ рд╡рд┐рд╢реЗрд╖рддрд╛" рдХреЛ рд▓рд╛рдЧреВ рдХрд░ рд░рд╣рд╛ рд╣реИред
рдЗрд╕ рдлреЙрд░реНрдореВрд▓реЗрд╢рди рдХреА рдХрдорд┐рдпрд╛рдВ рдпрд╣ рд╣реИрдВ рдХрд┐ рдпрд╣ RFC рдореЗрдВ рдПрдХ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдмрд╣реБрдд рдЕрд▓рдЧ рдорд╛рд░реНрдЧ рд╣реИ, рдФрд░ 2016 рд╕реЗ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛ рд░рд╣рд╛ рд╣реИ, рдФрд░ рдпрд╣ рдХрд┐ рдХрдо рд╕реЗ рдХрдо рдХреБрдЫ рд▓реЛрдЧреЛрдВ рдиреЗ рдЗрд╕ рдмрд╛рдд рдкрд░ рдЪрд┐рдВрддрд╛ рд╡реНрдпрдХреНрдд рдХреА рдХрд┐ рдпрд╣ рд╡рд░реНрддрдорд╛рди рдХреЗ рд░реВрдк рдореЗрдВ рдЕрднрд┐рд╡реНрдпрдВрдЬрдХ рдФрд░ / рдпрд╛ рд╕рд╣рдЬ рдирд╣реАрдВ рд╣реЛрдЧрд╛ред рд╡рд┐рд╢реЗрд╖рдЬреНрдЮрддрд╛ рд╕реБрд╡рд┐рдзрд╛ (рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ "рдкреНрд░рдХрд╛рд░ рдкрд░ рдореЗрд▓" рдмрд╣реБрдд рд╕рд╣рдЬ рд╣реИ, рд▓реЗрдХрд┐рди рдореИрдВ рдкрдХреНрд╖рдкрд╛рддреА рд╣реВрдВ рдХреНрдпреЛрдВрдХрд┐ рдореИрдВ рд╕реВрддреНрд░реАрдХрд░рдг рдХрд╛ рдкреНрд░рд╕реНрддрд╛рд╡ рдХрд░рддрд╛ рд╣реВрдВ)ред
рдореИрдЪ рд╕рд┐рдВрдЯреИрдХреНрд╕ рдореЗрдВ рдПрдХ рдФрд░ (рд╕рд┐рдВрдЯреИрдХреНрдЯрд┐рдХрд▓) рд▓рд╛рдн рд╣реЛ рд╕рдХрддрд╛ рд╣реИ: рдпрджрд┐ рдпрд╣ рднрд╡рд┐рд╖реНрдп рдореЗрдВ рдХреБрдЫ рдмрд┐рдВрджреБрдУрдВ рдкрд░ рдХреЙрдиреНрд╕реНрдЯрд┐рдЯреНрдпреВрдб-рдореИрдЪреЗрдб рдЧрд╛рд░реНрдбреНрд╕ рдХреЗ рд╕рд╛рде рдмрдврд╝рд╛рдпрд╛ рдЧрдпрд╛ рдерд╛, рддреЛ рдХрд┐рд╕реА рдХреЛ рдХреЙрдиреНрд╕реНрдЯреНрд░реЗрдХреНрдЯ рдПрдХреНрд╕рдкреНрд░реЗрд╢рдВрд╕ рдкрд░ рдмрд╛рдЙрдВрдб рд╕рд╢рд░реНрдд рд╡реНрдпрдХреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЬрд┐рдореНрдирд╛рд╕реНрдЯрд┐рдХ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реЛрдЧреАред рдЬреИрд╕реЗ рдХреЛрдИ size_of
, align_of
, needs_drop
рдпрд╛ рд╕рд░рдгреА рдЖрдХрд╛рд░ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рд╡рд┐рд╢реЗрд╖рдЬреНрдЮрддрд╛ рд▓рд╛рдЧреВ рдХрд░ рд╕рдХрддрд╛ рд╣реИред
@dureuill рдЬрд╛рдирдХрд╛рд░реА рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж! рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдПрдХ рджрд┐рд▓рдЪрд╕реНрдк рд╡рд┐рдЪрд╛рд░ рд╣реИред рдПрдХ рдЪрд┐рдВрддрд╛ рдХрд╛ рд╡рд┐рд╖рдп рдпрд╣ рд╣реИ рдХрд┐ рдпрд╣ рдЬрд░реВрд░реА рдирд╣реАрдВ рд╣реИ рдХрд┐ рд╡рд┐рд╢реЗрд╖рдЬреНрдЮрддрд╛ рдХреЗ рд▓рд┐рдП рдХреБрдЫ рдЕрдиреНрдп рдкреНрд░рддреНрдпрд╛рд╢рд┐рдд рдЙрдкрдпреЛрдЧ рдХреЗ рдорд╛рдорд▓реЛрдВ рдХреЛ рд╣рд▓ рдХрд┐рдпрд╛ рдЬрд╛рдП, рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ "рд╡реГрджреНрдзрд┐рд╢реАрд▓ рд░реВрдк рд╕реЗ рдкрд░рд┐рд╖реНрдХреГрдд рд╡реНрдпрд╡рд╣рд╛рд░" рдорд╛рдорд▓рд╛ рдЬреИрд╕рд╛ рдХрд┐ рдЗрд╕ рдмреНрд▓реЙрдЧ рдкреЛрд╕реНрдЯ рдореЗрдВ @aturon рджреНрд╡рд╛рд░рд╛ рд╡рд░реНрдгрд┐рдд рд╣реИред рдлрд┐рд░ рднреА, рдзреНрдпрд╛рди рдореЗрдВ рд░рдЦрдиреЗ рд▓рд╛рдпрдХред
@dureuill рдпрд╣ рд╡рд┐рдЪрд╛рд░ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рджрд┐рд▓рдЪрд╕реНрдк рд╣реИ рдФрд░ рдЗрд╕рдореЗрдВ рдмрд╣реБрдд рдЕрдзрд┐рдХ рд╕рдВрднрд╛рд╡рдирд╛рдПрдВ рд╣реЛ рд╕рдХрддреА рд╣реИрдВ, рд▓реЗрдХрд┐рди рд╡рд┐рдХрд▓реНрдк рд╣рдореЗрд╢рд╛ рд╕рдордХрдХреНрд╖ рд╡рд┐рдирд┐рдордп рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИред
рдореЗрд░реЗ рд╡рд┐рдЪрд╛рд░ рд╕реЗ рдЗрд╕рдХрд╛ рдХрд╛рд░рдг рдпрд╣ рдирд╣реАрдВ рд╣реИ рдХрд┐ рдХрд┐рд╕реА рдХреЛ рднреА рдЕрдзрд┐рдХ рд╕рд╛рдорд╛рдиреНрдп рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЛ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдмрджрд▓рдиреЗ рдХрд╛ рдЕрд╡рд╕рд░ рдирд╣реАрдВ рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рдПрдХ рдЕрдиреНрдп рд╕рдорд╕реНрдпрд╛ рдпрд╣ рднреА рд╣реЛ рд╕рдХрддреА рд╣реИ рдХрд┐ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ where
рд╕рд┐рдВрдЯреИрдХреНрд╕ RFC рдореЗрдВ рдореМрдЬреВрдж рд╕рднреА рд╕реБрд╡рд┐рдзрд╛рдУрдВ рдХреЗ рд▓рд┐рдП рд╕рдорд░реНрдерди рдирд╣реАрдВ рд╣реИ, рдЬрд┐рд╕ рдкрд░ рдЖрдкрдХрд╛ рд╕реБрдЭрд╛рд╡ рдирд┐рд░реНрднрд░ рдХрд░рддрд╛ рд╣реИред
рд╕реБрдЭрд╛рд╡ рдкреЗрдЪреАрджрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рд╡рд┐рд╢реЗрд╖рдЬреНрдЮрддрд╛ рдХреЗ рд▓рд┐рдП рдПрдХ рдкреНрд░рддрд┐рдпреЛрдЧреА рдХреЗ рдмрдЬрд╛рдп рдПрдХ рдЕрд▓рдЧ рд╡рд┐рд╢реЗрд╖рддрд╛ рдХреЗ рд░реВрдк рдореЗрдВ рдЦреБрдж рдХрд╛ рдЖрд░рдПрдлрд╕реА рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рджреЛрдиреЛрдВ рдЙрдкрдпреЛрдЧреА рд╣реЛрдВрдЧреЗ рдФрд░ рдореБрдЭреЗ рдХреЛрдИ рдХрд╛рд░рдг рдирд╣реАрдВ рджрд┐рдЦрддрд╛ рдХрд┐ рд╡реЗ рдПрдХ рд╕рд╛рде рдХреНрдпреЛрдВ рдирд╣реАрдВ рд░рд╣ рд╕рдХрддреЗред
@ the8472 @nikomatsakis , @ рдбрд╛рд░реНрдХ-рд▓реАрдЬрди: рд╕рдХрд╛рд░рд╛рддреНрдордХ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж! рдореИрдВ IRLO рдереНрд░реЗрдб рдореЗрдВ рдЖрдкрдХреА рдХреБрдЫ рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдХрд╛ рдЬрд╡рд╛рдм рджреЗрдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рддрд╛ рд╣реВрдВ, рдХреНрдпреЛрдВрдХрд┐ рдореИрдВ рдЯреНрд░реИрдХрд┐рдВрдЧ рдореБрджреНрджреЗ рдкрд░ рдмрд╣реБрдд рдЕрдзрд┐рдХ рд╢реЛрд░ рдирд╣реАрдВ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ (рдореИрдВ рдЖрдк рдореЗрдВ рд╕реЗ рдкреНрд░рддреНрдпреЗрдХ рдХреЗ рд▓рд┐рдП рдорд╛рдлреА рдЪрд╛рд╣рддрд╛ рд╣реВрдВ, рдЬрд┐рдиреНрд╣реЛрдВрдиреЗ рд╡рд┐рд╢реЗрд╖рдЬреНрдЮрддрд╛ рдкрд░ рд╕рдорд╛рдЪрд╛рд░ рдХреА рдЙрдореНрдореАрдж рдХреА рдереА рдФрд░ рдмрд╕ рдореЗрд░реА рд░рдВрдмрд▓рд┐рдВрдЧ рдорд┐рд▓реА: рдирд┐рд╕реНрддрдмреНрдзрддрд╛ :)ред
рдЕрдЧрд░ рдореИрдВ рдХреБрдЫ рдпреБрд╡рд╛ рд▓рд┐рдЦрдиреЗ рдХрд╛ рдкреНрд░рдмрдВрдзрди рдХрд░рддрд╛ рд╣реВрдВ, рддреЛ рдореИрдВ рдПрдХ рдЕрд▓рдЧ RFC рдЦреЛрд▓ рд╕рдХрддрд╛ рд╣реВрдВред рдЗрд╕ рдмреАрдЪ, рдореИрдВ рд▓рд┐рдВрдХ рдХрд┐рдП рдЧрдП IRLO рдереНрд░реЗрдб рдкрд░ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рдЦреБрд▓рд╛ рд╣реВрдВред рдореИрдВрдиреЗ aturon рдХреЗ рдмреНрд▓реЙрдЧ рдкреЛрд╕реНрдЯ рд╕реЗ рдПрдХ рд▓рдВрдмрд╛ рдЙрджрд╛рд╣рд░рдг рдЬреЛрдбрд╝рд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЙрд╕ рдкрд░ рдЯрд┐рдкреНрдкрдгреА рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕реНрд╡рддрдВрддреНрд░ рдорд╣рд╕реВрд╕ рдХрд░реЗрдВ!
рдореИрдВ рднреА рдХреБрдЫ рд╡рд┐рд╢реЗрд╖ рдкреНрд░рдХрд╛рд░ рдХреЗ рдорд╛рд░реНрдХрд░ рд╣реЛрдиреЗ рдХреЗ рдкрдХреНрд╖ рдореЗрдВ рд╣реВрдВред
2021 рд╕рдВрд╕реНрдХрд░рдг рджреГрд╖реНрдЯрд┐рдХреЛрдг, рдЬреЛ рд╣рдореЗрдВ рдЖрдЧреЗ рдХреЗ рдЦреЛрдЬрд╢рдмреНрджреЛрдВ рдХреЛ рдЖрд░рдХреНрд╖рд┐рдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ (рдЬреИрд╕реЗ specialize
)ред рдЗрд╕ рд╕реБрд╡рд┐рдзрд╛ рдХреА рдЬрдЯрд┐рд▓рддрд╛ рдФрд░ рдЗрддрд┐рд╣рд╛рд╕ рдХреЛ рджреЗрдЦрддреЗ рд╣реБрдП, рдореБрдЭреЗ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ рдпрд╣ 2021 рд╕рдВрд╕реНрдХрд░рдг рдХреА рд░рд┐рд▓реАрдЬрд╝ рд╕реЗ рдкрд╣рд▓реЗ рд╕реНрдерд┐рд░ рд╣реЛ рдЬрд╛рдПрдЧрд╛ (рдореБрдЭреЗ рдЧрд▓рдд рд╕рд╛рдмрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕реНрд╡рддрдВрддреНрд░ рд▓рдЧ рд░рд╣рд╛ рд╣реИ) рдЬрд┐рд╕рдХрд╛ рдЕрд░реНрде рд╣реИ - рдореЗрд░реА рд░рд╛рдп рдореЗрдВ - (рдПрдХ) рдирдП рдХреАрд╡рд░реНрдб рдХреЗ рд╕рд╛рде рдЦреЗрд▓рдирд╛ ) рдЙрдЪрд┐рдд рд╣реИред
рдЕрдиреНрдпрдерд╛, рдХреЗрд╡рд▓ рдореМрдЬреВрджрд╛ рдХреАрд╡рд░реНрдб рдЬреЛ рд▓рдЧрддрд╛ рд╣реИ ... рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ .. рдорд╛рд░реНрдХрд░ рдХреЗ рд░реВрдк рдореЗрдВ рдЙрдкрдпреБрдХреНрдд рд╣реИ, super
рд╣реЛ рд╕рдХрддрд╛ рд╣реИ?
Https://github.com/rust-lang/rust/issues/31844#issuecomment -639977601 рд╕реЗ @LLFourn рдХреЗ рдЙрджрд╛рд╣рд░рдг рдХрд╛ рдкреБрди: рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╕рд╛рд░рд╛рдВрд╢:
super
(рдкрд╣рд▓реЗ рд╕реЗ рдЖрд░рдХреНрд╖рд┐рдд рд╣реИ, рд▓реЗрдХрд┐рди рдЗрд╕реЗ default
рд╡рд┐рдХрд▓реНрдк рдХреЗ рд░реВрдк рдореЗрдВ рднреА рдЧрд▓рдд рд╕рдордЭрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ)super impl<A, T> Extend<A, T> for Vec<A> where T: IntoIterator<Item=A>
specialize
specialize impl<A, T> Extend<A, T> for Vec<A> where T: IntoIterator<Item=A>
spec
( specialize
impl
implement
) (https://github.com/rust-lang рдореЗрдВ @ssokolow рджреНрд╡рд╛рд░рд╛ рдЙрдард╛рдпрд╛ рдЧрдпрд╛ рд╡реИрдз рдЪрд┐рдВрддрд╛ рдХрд╛ рд╡рд┐рд╖рдп ) / рдЬрдВрдЧ / рдореБрджреНрджреЛрдВ / 31,844 # issuecomment-690,980,762)spec impl<A, T> Extend<A, T> for Vec<A> where T: IntoIterator<Item=A>
override
(рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЖрд░рдХреНрд╖рд┐рдд, рдзрдиреНрдпрд╡рд╛рдж @ the8472 https://github.com/rust-lang/rust/issues/31844#issuecomment-691042082)override impl<A, T> Extend<A, T> for Vec<A> where T: IntoIterator<Item=A>
рдпрд╛
spec
(specialize
рддрд░рд╣impl
implement
)
"рд╡рд┐рдирд┐рд░реНрджреЗрд╢" рдкрд╣рд▓реЗ рд╕реЗ рд╣реА "рд╡рд┐рдирд┐рд░реНрджреЗрд╢" (рдЬреИрд╕реЗред HTML 5 рдХрд▓реНрдкрдирд╛ ") рдХреЗ рд▓рд┐рдП рд╢реЙрд░реНрдЯрд╣реИрдВрдб рдХреЗ рд░реВрдк рдореЗрдВ рд▓реЛрдЧреЛрдВ рдХреЛ рдЕрдзрд┐рдХ рдкрд░рд┐рдЪрд┐рдд рд╣реИ, рдЗрд╕рд▓рд┐рдП рдореБрдЭреЗ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ рдпрд╣" рд╡рд┐рд╢реЗрд╖рдЬреНрдЮ "рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрдЪреНрдЫрд╛ рдЖрд╢реБрд▓рд┐рдкрд┐ рд╣реЛрдЧрд╛ред
override
рдПрдХ рдЖрд░рдХреНрд╖рд┐рдд рдХреАрд╡рд░реНрдб рд╣реИ, рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП рдЕрднрд┐рдкреНрд░реЗрдд рдерд╛, рдЗрд╕рд▓рд┐рдП рдпрд╣ рдПрдХ рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рдмреНрд▓реЙрдХ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдпреЛрдЧреНрдп рд╣реЛ рд╕рдХрддрд╛ рд╣реИред
рд╡рд┐рд╢реЗрд╖рдЬреНрдЮ рднреА рд╕реНрдерд╛рдиреАрдп рдирд┐рд░реНрднрд░ рд╣реИ - рдПрдХ рдСрд╕реНрдЯреНрд░реЗрд▓рд┐рдпрд╛рдИ рдХреЗ рд░реВрдк рдореЗрдВ рдпрд╣ рдореЗрд░реЗ рд▓рд┐рдП рд╡рд┐рд╢реЗрд╖рдЬреНрдЮ рд╣реИ, рдЗрд╕рд▓рд┐рдП 'рдХрд▓реНрдкрдирд╛' рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рд╕реЗ рд╕реНрдерд╛рдиреАрдп рдЕрд╕реНрдкрд╖реНрдЯрддрд╛ рджреВрд░ рд╣реЛ рдЬрд╛рддреА рд╣реИред
рд╡рд┐рд╢реЗрд╖рдЬреНрдЮ рднреА рд╕реНрдерд╛рдиреАрдп рдирд┐рд░реНрднрд░ рд╣реИ - рдПрдХ рдСрд╕реНрдЯреНрд░реЗрд▓рд┐рдпрд╛рдИ рдХреЗ рд░реВрдк рдореЗрдВ рдпрд╣ рдореЗрд░реЗ рд▓рд┐рдП рд╡рд┐рд╢реЗрд╖рдЬреНрдЮ рд╣реИ, рдЗрд╕рд▓рд┐рдП 'рдХрд▓реНрдкрдирд╛' рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рд╕реЗ рд╕реНрдерд╛рдиреАрдп рдЕрд╕реНрдкрд╖реНрдЯрддрд╛ рджреВрд░ рд╣реЛ рдЬрд╛рддреА рд╣реИред
рд╡рд╣ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, рд╕рд┐рд╡рд╛рдп рдЗрд╕рдХреЗ рдХрд┐ 'рд╕реНрдкреЗрд╕рд┐рдлрд┐рдХреЗрд╢рди' рд╕реНрдкреЗрд╕рд┐рдлрд┐рдХреЗрд╢рди рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рд╕рдВрдХреНрд╖рд┐рдкреНрдд рдирд╛рдо рд╣реИ, рдЗрд╕рд▓рд┐рдП рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╕реНрдкреЗрд╢рд▓рд╛рдЗрдЬреЗрд╢рди рдХреЗ рд▓рд┐рдП 'рд╕реНрдкреЗрдХ' рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рднреНрд░рдорд┐рдд рдХрд░рдиреЗ рд╡рд╛рд▓рд╛ рд╣реЛрдЧрд╛ред рднрд▓реЗ рд╣реА рдСрд╕реНрдЯреНрд░реЗрд▓рд┐рдпрд╛ рдореЗрдВ рд╢рдмреНрджреЛрдВ рдХреЛ рдЕрд▓рдЧ-рдЕрд▓рдЧ рддрд░реАрдХреЗ рд╕реЗ рд▓рд┐рдЦрд╛ рдЧрдпрд╛ рд╣реЛ, рдлрд┐рд░ рднреА рд╣рд░ рдХреЛрдИ рд╕рдордЭ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдЕрдЧрд░ рдпрд╣ рд╢рдмреНрдж 'z' рдпрд╛ 's' рдХреЗ рд╕рд╛рде рд╡рд░реНрддрдиреА рдореЗрдВ рдЖрддрд╛ рд╣реИред
рдПрдХ рдХрдирд╛рдбрд╛рдИ рдХреЗ рд░реВрдк рдореЗрдВ, рдореБрдЭреЗ рдпрд╣ рдХрд╣рдирд╛ рд╣реИ рдХрд┐ рд╡рд┐рд╢реЗрд╖рдЬреНрдЮ / рд╡рд┐рд╢реЗрд╖рдЬреНрдЮ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рдиреЗ рд╡рд╛рд▓рд╛ рдПрдХрдорд╛рддреНрд░ рд╢рдмреНрдж рдирд╣реАрдВ рд╣реИ рдЬреЛ рд▓реЛрдХреЗрд▓ рдХреЗ рд╕рд╛рде рдмрджрд▓рддрд╛ рд░рд╣рддрд╛ рд╣реИред
рдпрд╣рд╛рдВ, рд╣рдо "рд░рдВрдЧ" рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдпрд╣ рд╣рдореЗрд╢рд╛ рдореБрдЭреЗ рджреБрд░реНрд▓рдн рдЕрд╡рд╕рд░реЛрдВ рдкрд░ рдпрд╛рддреНрд░рд╛ рдХрд░рддрд╛ рд╣реИ рдЬрдм рдПрдХ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рднрд╛рд╖рд╛ рдпрд╛ рд▓рд╛рдЗрдмреНрд░реЗрд░реА "рд░рдВрдЧ" рдХреЗ рдмрдЬрд╛рдп рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИред рдмреЗрд╣рддрд░ рдпрд╛ рдмрджрддрд░ рдХреЗ рд▓рд┐рдП, рдЕрдореЗрд░рд┐рдХреА рдЕрдВрдЧреНрд░реЗрдЬреА рдПрдкреАрдЖрдИ рдбрд┐рдЬрд╛рдЗрди рдореЗрдВ рдПрдХ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдорд╛рдирдХ рдХрд╛ рдПрдХ рд╕рд╛ рд╣реИ рдФрд░, рд░рдВрдЧ / рд░рдВрдЧ рдЬреИрд╕реЗ рд╢рдмреНрджреЛрдВ рдХреЗ рд╕рд╛рде, рджреВрд╕рд░реЗ рдкрд░ рдПрдХ рд╡рд░реНрддрдиреА рдХрд╛ рдкрдХреНрд╖ рд▓реЗрдиреЗ рдХреЗ рд▓рд┐рдП рдЪрдпрди рдХрд░рдирд╛ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд╡рдВрдЪрд┐рдд рдХрд┐рдП рдмрд┐рдирд╛ рдЕрдкрд░рд┐рд╣рд╛рд░реНрдп рд╣реИред
рдпрд╣ рджреЗрдЦрддреЗ рд╣реБрдП рдХрд┐ рдореИрдВ "рд╕реНрдкреЗрд╕рд┐рдлрд┐рдХреЗрд╢рди" рдХрд╛ рдорддрд▓рдм "рд╕реНрдкреЗрд╕рд┐рдлрд┐рдХреЗрд╢рди" рд╕реЗ рдХрд┐рддрдиреА рджреГрдврд╝рддрд╛ рд╕реЗ рдЙрдореНрдореАрдж рдХрд░рддрд╛ рд╣реВрдВ, рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдПрдХ рдФрд░ рд╕реНрдерд┐рддрд┐ рд╣реИ, рдЬрд╣рд╛рдВ рд╣рдореЗрдВ рдЕрдореЗрд░рд┐рдХреА рдЕрдВрдЧреНрд░реЗрдЬреА рд╡рд░реНрддрдиреА рдкрд░ рд╕рдмрд╕реЗ рдХрдо рд╡рд┐рдХрд▓реНрдк рдЪреБрдирдиреЗ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред
рдпрд╣ рдбрд┐рдлреЗрдХреНрдЯреЛ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЗрд╕рдХрд╛ рдорддрд▓рдм рдпрд╣ рдирд╣реАрдВ рд╣реИ рдХрд┐ рдЙрдирдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдареАрдХ рд╣реИред рдореИрдВ рдЦреБрдж рдХреЛ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП "рд░рдВрдЧ рдХреЗ рд░реВрдк рдореЗрдВ рд░рдВрдЧ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реВрдВ" рдЬреИрд╕реЗ рдЖрдпрд╛рдд рдХрд░ рд░рд╣рд╛ рд╣реВрдВред рдореИрдВ рд╣рдореЗрд╢рд╛ рдХреЗ рд░реВрдк рдореЗрдВ рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдмрдирд╛рдо z рдкрд░ рдпрд╛рддреНрд░рд╛ рдХрд░рддреЗ рд╣реИрдВред рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ Rust рдХрд╛ рд╕рдорд╛рд╡реЗрд╢реА рдФрд░ рд╕реБрдЧрдорддрд╛ рдХреЗ рдкреНрд░рддрд┐ рд╕рдХрд╛рд░рд╛рддреНрдордХ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХреЛ рджреЗрдЦрддреЗ рд╣реБрдП, рдпрд╣ рдЙрди рднрд╛рд╖рд╛ рдХреА рд╢рд░реНрддреЛрдВ рдХреЛ рд╕рдордЭ рдореЗрдВ рдЖрддрд╛ рд╣реИ рдЬреЛ рд╕реНрдерд╛рдиреАрдп рдирд┐рд░реНрднрд░ рдирд╣реАрдВ рд╣реИрдВ, рдХреНрдпреЛрдВрдХрд┐ рдЫреЛрдЯреЗ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдЬреИрд╕реЗ рд░рдВрдЧ / рд░рдВрдЧ рдФрд░ s / z рдХрд╛ рдирд┐рд░реНрдорд╛рдг рдХрд░рддреЗ рд╣реИрдВред
рдореИрдВ рд╕рд┐рджреНрдзрд╛рдВрдд рд░реВрдк рдореЗрдВ рд╕рд╣рдордд рд╣реВрдВред рдореБрдЭреЗ рдЗрд╕ рдмрд╛рдд рдкрд░ рд╕рдВрджреЗрд╣ рд╣реИ рдХрд┐ рдЗрд╕ рдорд╛рдорд▓реЗ рдХреЗ рд▓рд┐рдП, рдПрдХ рд╕реНрдерд╛рдиреАрдп-рддрдЯрд╕реНрде рд╡рд┐рдХрд▓реНрдк рд╣реИ, рдЬреЛ рдЗрд╕реЗ рд╣рд▓ рдХрд░рдиреЗ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдЕрдзрд┐рдХ рд╕рдорд╕реНрдпрд╛рдУрдВ рдХрд╛ рдХрд╛рд░рдг рдирд╣реАрдВ рд╣реИред
рдПрдХ рдЧреИрд░-рдЕрдВрдЧреНрд░реЗрдЬреА рдореВрд▓ рд╡рдХреНрддрд╛ рдХреЗ рд░реВрдк рдореЗрдВ, рдореБрдЭреЗ рдпрд╣ рдХреБрдЫ рдордиреЛрд░рдВрдЬрдХ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рджреЗрд╢реА рдЕрдВрдЧреНрд░реЗрдЬреА рдмреЛрд▓рдиреЗ рд╡рд╛рд▓реЗ рдЕрддрд┐рд░рд┐рдХреНрдд u
рдмрд╛рд░реЗ рдореЗрдВ рд╢рд┐рдХрд╛рдпрдд рдХрд░реЗрдВрдЧреЗ, рдЬреЛ рдХрд┐ рд╕рдорд╛рд╡реЗрд╢рд┐рддрд╛ рдХреЗ рд▓рд┐рдП рдПрдХ рдмрд╛рдзрд╛ рд╣реИред рдЬрд╝рд░рд╛ рд╕реЛрдЪрд┐рдП рдХрд┐ рдРрд╕рд╛ рдХреНрдпрд╛ рд╣реЛрдЧрд╛ рдЕрдЧрд░ рд╕рдм рдХреБрдЫ рдереЛрдбрд╝рд╛ рдЕрдЬреАрдм рди рд╣реЛ, рд▓реЗрдХрд┐рди рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЕрд▓рдЧ рднрд╛рд╖рд╛ рдореЗрдВ рд▓рд┐рдЦрд╛ рдЧрдпрд╛ рд╣реЛред
рдЕрд▓рдЧ рддрд░реАрдХреЗ рд╕реЗ рд░рдЦреЗрдВ: рдЬрдВрдЧ рдореЗрдВ рдЗрд╕реНрддреЗрдорд╛рд▓ рд╣реЛрдиреЗ рд╡рд╛рд▓рд╛ рд╣рд░ рд╢рдмреНрдж рд╕реНрдерд╛рдиреАрдп рдирд┐рд░реНрднрд░ рд╣реИред
рдмреЗрд╣рддрд░ рдпрд╛ рдмрджрддрд░ рдХреЗ рд▓рд┐рдП, рд░рд╕реНрдЯ рдХреА рдЪреАрдЬреЛрдВ рдХреЛ рдЕрдореЗрд░рд┐рдХреА рдЕрдВрдЧреНрд░реЗрдЬреА рдореЗрдВ рд╡рд░реНрддрдиреА рджреА рдЬрд╛рддреА рд╣реИред рдХрдИ рд▓реЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП рдЗрд╕рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рдЙрдирдХреА рджреВрд╕рд░реА рдпрд╛ рддреАрд╕рд░реА рднрд╛рд╖рд╛ рдореЗрдВ рдХрд╛рдо рдХрд░рдирд╛; рджреВрд╕рд░реЛрдВ рдХреЗ рд▓рд┐рдП рдЗрд╕рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рд╡рд░реНрддрдиреА рдХреЛ рдереЛрдбрд╝рд╛ рд╕рдорд╛рдпреЛрдЬрд┐рдд рдХрд░рдирд╛ред рдпрд╣ рд╡рд╣реА рд╣реИ рдЬреЛ рд▓реЛрдЧреЛрдВ рдХреЗ рдПрдХ рдкреВрд░реЗ рд╕рдореВрд╣ рдХреЛ рдПрдХ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд▓реЗрддрд╛ рд╣реИред рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЕрдВрдЧреНрд░реЗрдЬреА рдХреЗ рдХрдИ рд╡реЗрд░рд┐рдПрдВрдЯ рдореЗрдВ рд╕рдорд╛рди рд╢рдмреНрджреЛрдВ рдХреЛ рдЪреБрдирдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд╛ рд▓рд╛рдн рдПрдХ рдЕрд╕рдВрджрд┐рдЧреНрдз рд╢рдмреНрдж рдЪреБрдирдиреЗ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдорд╛рдореВрд▓реА рд╣реИ - рдФрд░ spec
рдЕрд╕реНрдкрд╖реНрдЯ рд╣реИ рдЬреИрд╕рд╛ рдХрд┐ рдКрдкрд░ рдмрддрд╛рдпрд╛ рдЧрдпрд╛ рд╣реИред
рдХреАрд╡рд░реНрдб рдХреЗ рд░реВрдк рдореЗрдВ special
рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ?
рд╡реИрдХрд▓реНрдкрд┐рдХ, рджреЛ рдЦреЛрдЬрд╢рдмреНрдж рдмрдирд╛рдПрдБ: specialize
рдФрд░ specialise
рдФрд░ рдЙрдиреНрд╣реЗрдВ рд╕рдорддреБрд▓реНрдп рдмрдирд╛рдПрдВ ...
(рдпрд╛ рдЖрдк рдЧреИрд░-рдЕрдореЗрд░рд┐рдХрд┐рдпреЛрдВ рдХреЛ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рд╡рд░реНрддрдиреА рд▓рд┐рдЦрдирд╛ рд╕реАрдЦ рд╕рдХрддреЗ рд╣реИрдВ: рд╣рдореЗрдВ:-)
рдореИрдВ рдпрд╣ рдирд╣реАрдВ рдмреЛрд▓ рд╕рдХрддрд╛ рдХрд┐ рдЕрдзрд┐рдХрд╛рдВрд╢ рднрд╛рд╖рд╛рдПрдВ рдХреНрдпрд╛ рдХрд░рддреА рд╣реИрдВ, рд▓реЗрдХрд┐рди рд╕реАрдПрд╕рдПрд╕ рдЕрдореЗрд░рд┐рдХреА рдЕрдВрдЧреНрд░реЗрдЬреА рд╡рд░реНрддрдиреА рдХрд╛ рдЙрдкрдпреЛрдЧ рд╕рдм рдХреБрдЫ рдирдпрд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд░рддрд╛ рд╣реИред рд╡рд╛рд╕реНрддрд╡рд┐рдХ рд░реВрдк рд╕реЗ рдЕрдореЗрд░рд┐рдХреА рдЕрдВрдЧреНрд░реЗрдЬреА рдХрд╛ рдЙрдкрдпреЛрдЧ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рдореЗрдВ рднреА рдЕрдзрд┐рдХ рдмрд╛рд░ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
@ рдорд╛рд░реНрдХ-рдЗрдо рджреБрд░реНрднрд╛рдЧреНрдп рд╕реЗ, рдпрд╣ рдПрдХ рдлрд┐рд╕рд▓рди рдврд▓рд╛рди рд╣реИ рдЬреЛ рддрд░реНрдХ рдХреЗ рд▓рд┐рдП рдЕрдЧреНрд░рдгреА рд╣реИ рдХрд┐ рдкреНрд░рддреНрдпреЗрдХ рдкреНрд░рдореБрдЦ рднрд╛рд╖рд╛ рдореЗрдВ рдЬрдВрдЧрд▓реЛрдВ рдореЗрдВ рд╡реИрдХрд▓реНрдкрд┐рдХ рд╕реЗрдЯ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП рдЬреЛ рд╢рд┐рдХреНрд╖рд╛рд░реНрдерд┐рдпреЛрдВ рд╕реЗ рдЖ рд░рд╣реЗ рд╣реИрдВред
рдпрд╣ рднреА рдЕрдирд╛рд╡рд╢реНрдпрдХ рд░реВрдк рд╕реЗ рднрд╛рд╖рд╛ рдХреЛ рдЬрдЯрд┐рд▓ рдмрдирд╛рддрд╛ рд╣реИ рдХрд┐ рдХреАрд╡рд░реНрдб рдХреЗ рд▓рд┐рдП рдХрдИ рд╕рдорд╛рдирд╛рд░реНрдереА рд╢рдмреНрдж рд╣реИрдВ рдХреНрдпреЛрдВрдХрд┐ рд▓реЛрдЧ рдФрд░ рдкрд╛рд░реНрд╕рд░ рдХреЗрд╡рд▓ рдЗрд╕ рд╡рд┐рдЪрд╛рд░ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВ рдХрд┐ рд╡реНрд╣рд╛рдЯреНрд╕рдПрдк рдЙрд╕ рддрд░рд╣ рднрд┐рдиреНрди рд╣реЛ рд╕рдХрддрд╛ рд╣реИред
(рдпрд╣ рдЙрд▓реНрд▓реЗрдЦ рдирд╣реАрдВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐ рдпрд╣ рд╕рдВрднрд╛рд╡рд┐рдд рд░реВрдк рд╕реЗ рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдореЗрдВ рд╕рдорд╛рдирд╛рд░реНрдердХ рд╕рдорд╛рдирд╛рд░реНрдереА рд╢рдмреНрдж рдХреЗ рд▓рд┐рдП рдПрдХ рдзрдХреНрдХрд╛ рд╣реЛрдЧрд╛, рдЬреЛ рддрдм рд╢реБрджреНрдз рдирдХрд╛рд░рд╛рддреНрдордХ рд╣реЛрдиреЗ рд╕реЗ рдмрдЪрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЬрдВрдЧ рдХреЗ рдбрд┐рдЬрд╛рдЗрди рдФрд░ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХрд╛рд░реНрдп рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреАред)
рдЕрдВрдЧреНрд░реЗрдЬреА рдХреА рдХреМрди рд╕реА рдмреЛрд▓реА рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╣рд╕ рдХрд░рдиреЗ рдХреЗ рдмрдЬрд╛рдп, рд╣рдо рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдХрд┐ рдпрд╣ рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛ рдЕрдВрджрд░ рд╣реЛ, рд╢рд╛рдпрдж рд╣рдо рдЗрд╕реЗ рд╕рдордЭреМрддрд╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдЗрд╕реЗ рд╣рд┐рдмреНрд░реВ рдореЗрдВ рдбрд╛рд▓ рд╕рдХрддреЗ рд╣реИрдВ?
@ssokolow рдЬрдмрдХрд┐ рд╕рд╛рдорд╛рдиреНрдп рд░реВрдк рд╕реЗ рдлрд┐рд╕рд▓рди рдврд▓рд╛рди рддрд░реНрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдордЬрдмреВрдд рддрд░реНрдХ рдирд╣реАрдВ рд╣реИ, рдореИрдВ рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ рдЖрдкрдХреЗ рд╕рд╛рде рд╕рд╣рдордд рд╣реВрдВред рдПрдХ рддрд░реНрдХ рджреЗ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдХрдИ рднрд╛рд╖рд╛рдПрдВ рдареАрдХ рд╣реИрдВ рд▓реЗрдХрд┐рди рдХрдо рд╕реЗ рдХрдо рджреЛ рдХрд╛рд░рдг рд╣реИрдВ рдХрд┐ рдпрд╣ рдХреНрдпреЛрдВ рдирд╣реАрдВ рд╣реИ:
a
рд╕реНрд▓реЛрд╡рд╛рдХ рдореЗрдВ and
рдЕрдВрдЧреНрд░реЗрдЬреА рдореЗрдВ рд╣реИ)рдЕрдм рдкреАрдЫреЗ рдХреА рдУрд░ рдХрд╛рдо рдХрд░рддреЗ рд╣реБрдП, рдЕрдиреНрдп рднрд╛рд╖рд╛рдУрдВ рдХреА рдирд╣реАрдВ, рдЕрдВрдЧреНрд░реЗрдЬреА рдХреА рдЕрд▓рдЧ-рдЕрд▓рдЧ рдмреЛрд▓рд┐рдпреЛрдВ рдХреЛ рдХреНрдпреЛрдВ рдкрд╕рдВрдж рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП? рдореБрдЭреЗ рдПрдХ рдмрд┐рдВрджреБ рдирд╣реАрдВ рджрд┐рдЦ рд░рд╣рд╛ рд╣реИред рд╕рдВрдЧрддрд┐ (рд╕рдм рдХреБрдЫ рдЕрдореЗрд░рд┐рдХреА рдЕрдВрдЧреНрд░реЗрдЬреА рд╣реИ) рд╕рдмрд╕реЗ рд╕рд░рд▓, рд╕рдордЭрдиреЗ рдореЗрдВ рдЖрд╕рд╛рди рдФрд░ рдХрдо рд╕реЗ рдХрдо рддреНрд░реБрдЯрд┐-рдкреНрд░рд╡рдг рд▓рдЧрддрд╛ рд╣реИред
рдпрд╣ рд╕рдм рдХрд╣рд╛ рдЬрд╛ рд░рд╣рд╛ рд╣реИ, рдореБрдЭреЗ рдмрд╣реБрдд рдЦреБрд╢реА рд╣реЛрдЧреА "рдХреНрдпрд╛ рдЖрдкрдХрд╛ рдорддрд▓рдм XXX рдерд╛?" рддреНрд░реБрдЯрд┐ рд╕рдВрджреЗрд╢ рджреГрд╖реНрдЯрд┐рдХреЛрдгред рдЕрдиреНрдп рд╢рдмреНрдж рдЬрд┐рдирдХреЗ рдкрд╛рд╕ рдЕрдиреНрдп рд╕рдорд╕реНрдпрд╛рдПрдВ рдирд╣реАрдВ рд╣реИрдВ, рдареАрдХ рд╣реИрдВред
рдХрдо рд╕реЗ рдХрдо рдХрд┐рд╕реА рдХреЛ рдХреЛрдб рдореЗрдВ рдлреБрдЯрдмреЙрд▓ рдкрд░ рдЪрд░реНрдЪрд╛ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред ;)
рдпреВрдПрд╕ рд╕реНрдкреЗрд▓рд┐рдВрдЧ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рджреЗрд╢реЛрдВ рдореЗрдВ рд▓рдЧрднрдЧ 70% рджреЗрд╢реА рдЕрдВрдЧреНрд░реЗрдЬреА рдмреЛрд▓рдиреЗ рд╡рд╛рд▓реЗ рд▓реЛрдЧ рд░рд╣рддреЗ рд╣реИрдВред
рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛ ..
"-рдЗрдЬрд╝ рд╕реНрдкреЗрд▓рд┐рдВрдЧ рдХреЛ рдЕрдХреНрд╕рд░ рдмреНрд░рд┐рдЯреЗрди рдореЗрдВ рдПрдХ рдЕрдореЗрд░рд┐рдХреАрд╡рд╛рдж рдХреЗ рд░реВрдк рдореЗрдВ рдЧрд▓рдд рддрд░реАрдХреЗ рд╕реЗ рджреЗрдЦрд╛ рдЬрд╛рддрд╛ рд╣реИред 15 рд╡реАрдВ рд╢рддрд╛рдмреНрджреА рдХреЗ рдмрд╛рдж рд╕реЗ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд░рд╣рд╛ рд╣реИ, рдПрдХ рд╕рджреА рд╕реЗ рднреА рдЕрдзрд┐рдХ-рд╕реЗ-рдкреВрд░реНрд╡ рднрд╡рд┐рд╖реНрдпрд╡рд╛рдгреА рдХреА рдЧрдИ рд╣реИред рдпрд╣ рд╕реАрдзреЗ-рдЧреНрд░реАрдХ-рдорд╛рдЗрдХрд┐рдХреЛ-рдХреИрдЬрд╝реАрди рдФрд░ рд▓реИрдЯрд┐рди -рдЗрдЬрд╝рд╛рд░реЗ рд╕реЗ рдЖрддрд╛ рд╣реИ, рдЬрдмрдХрд┐ - ise рдлреНрд░рд╛рдВрд╕реАрд╕реА -iser рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЖрддрд╛ рд╣реИред рдСрдХреНрд╕рдлреЛрд░реНрдб рдЗрдВрдЧреНрд▓рд┐рд╢ рдбрд┐рдХреНрд╢рдирд░реА (OED) рдПрдХ рд╡рд┐рдХрд▓реНрдк рдХреЗ рд░реВрдк рдореЗрдВ -ise рдлреЙрд░реНрдо рдХреА рд╕рд┐рдлрд╛рд░рд┐рд╢ рдХрд░рддрд╛ рд╣реИ рдФрд░ рд╕реВрдЪреАрдмрджреНрдз рдХрд░рддрд╛ рд╣реИред "
"рдСрдХреНрд╕рдлреЛрд░реНрдб рдпреВрдирд┐рд╡рд░реНрд╕рд┐рдЯреА рдкреНрд░реЗрд╕ (OUP) рджреНрд╡рд╛рд░рд╛ рдкреНрд░рдХрд╛рд╢рди-рд╣реЗрдирд░реА рд╡реЙрдЯрд╕рди рдлрд╛рдЙрд▓рд░ рдХреЗ рдП рдбрд┐рдХреНрд╢рдирд░реА рдСрдлрд╝ рдореЙрдбрд░реНрди рдЗрдВрдЧреНрд▓рд┐рд╢ рдпреВрдЬрд╝, рд╣рд╛рд░реНрдЯреНрд╕ рд░реВрд▓реНрд╕, рдФрд░ рдж рдСрдХреНрд╕рдлрд╝реЛрд░реНрдб рдЧрд╛рдЗрдб рдЯреВ рдЗрдВрдЧреНрд▓рд┐рд╢ рдпреВрдЬрд╝ рдХреЗ рд░реВрдк рдореЗрдВ рдкреНрд░рдХрд╛рд╢рди-рднреА рд╕рд┐рдлрд╛рд░рд┐рд╢ рдХрд░рддреЗ рд╣реИрдВред рд╣рд╛рд▓рд╛рдВрдХрд┐, рд░реЙрдмрд░реНрдЯ рдПрд▓рди рдХреЗ рдкреЙрдХреЗрдЯ рдлрд╛рдЙрд▓рд░ рдХрд╛ рдореЙрдбрд░реНрди рдЗрдВрдЧреНрд▓рд┐рд╢ рдпреВрдЬрд╝ рдпрд╛ рддреЛ рд╕реНрдкреЗрд▓рд┐рдВрдЧ рдорд╛рдирддреЗ рд╣реИрдВред рдХрд╣реАрдВ рднреА рд╕реНрд╡реАрдХрд╛рд░реНрдп рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП рд▓реЗрдХрд┐рди рдпреВ.рдПрд╕.
рд╕рдВрджрд░реНрднред https://en.wikipedia.org/wiki/American_and_British_English_spelling_differences# -ise, _- ize _ (- isation, _- ization)
рдРрд╕рд╛ рдкреНрд░рддреАрдд рд╣реЛрддрд╛ рд╣реИ рдХрд┐ рд╕реНрдкреИрдирд┐рд╢ рдФрд░ рдЗрддрд╛рд▓рд╡реА рдореЗрдВ az рдпрд╛ рджреЛ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рдпрд╣ рдирд┐рд╢реНрдЪрд┐рдд рдирд╣реАрдВ рд╣реИ рдХрд┐ рдлреНрд░реЗрдВрдЪ рдХрд╣рд╛рдБ рд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрд░рддрд╛ рд╣реИ, рд╢рд╛рдпрдж рдЬрд░реНрдорди рд╕реЗ?
рдХреНрдпрд╛ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдХреАрд╡рд░реНрдб рдХреЗ рдЖрд╕рдкрд╛рд╕ рдЖрдЧреЗ рдмрдврд╝рддреЗ рд╣реБрдП рдФрд░ рдирд╛рдордХрд░рдг рдХреЛ рдПрдХ рдЖрдВрддрд░рд┐рдХ рдзрд╛рдЧреЗ рдореЗрдВ рд▓реЗ рдЬрд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ? рдореИрдВ рдлреАрдЪрд░ рдкрд░ рдкреНрд░рдЧрддрд┐ рдХреЗ рдЕрдкрдбреЗрдЯ рдХреЗ рд▓рд┐рдП рдЗрд╕ рдореБрджреНрджреЗ рдХрд╛ рдЕрдиреБрд╕рд░рдг рдХрд░ рд░рд╣рд╛ рд╣реВрдВ, рдФрд░ рдЗрд╕ рдЪрд░реНрдЪрд╛ рдХреЛ рдереЛрдбрд╝рд╛ рд╢реЛрд░ рдорд┐рд▓ рд░рд╣рд╛ рд╣реИред
рд╕рдмрд╕реЗ рдЙрдкрдпреЛрдЧреА рдЯрд┐рдкреНрдкрдгреА
рдореИрдВ рдПрдХ рдкреНрд░рд╛рдпреЛрдЧрд┐рдХ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдореЗрдВ
#[min_specialization]
рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ, рдЗрд╕рд▓рд┐рдП рдореИрдВрдиреЗ рд╕реЛрдЪрд╛ рд╣реИ рдХрд┐ рдореИрдВ рдЕрдкрдиреЗ рдЕрдиреБрднрд╡ рд╕рд╛рдЭрд╛ рдХрд░реВрдВрдЧрд╛ред рд▓рдХреНрд╖реНрдп рдпрд╣ рд╣реИ рдХрд┐ рдпрд╣ рд╕рдмрд╕реЗ рд╕рд░рд▓ рд░реВрдк рдореЗрдВ рд╡рд┐рд╢реЗрд╖рдЬреНрдЮрддрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ: рд╕рд╛рдорд╛рдиреНрдп рдорд╛рдорд▓реЗ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рддреЗрдЬреА рд╕реЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рд╕рд╛рде рдХреБрдЫ рд╕рдВрдХреАрд░реНрдг рдорд╛рдорд▓реЗ рд╣реИрдВред рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ, рдХреНрд░рд┐рдкреНрдЯреЛрдЧреНрд░рд╛рдлрд╝рд┐рдХ рдПрд▓реНрдЧреЛрд░рд┐рджрдо рдХреЛ рд╕рд╛рдорд╛рдиреНрдп рдорд╛рдорд▓реЗ рдореЗрдВ рдирд┐рд░рдВрддрд░ рд╕рдордп рдореЗрдВ рдЪрд▓рд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рд▓реЗрдХрд┐рди рддрдм рдпрджрд┐ рд╕рднреА рдЗрдирдкреБрдЯPublic
рд░реВрдк рдореЗрдВ рдЪрд┐рд╣реНрдирд┐рдд рд╣реЛрддреЗ рд╣реИрдВ, рддреЛ рдПрдХ рд╡рд┐рд╢реЗрд╖ рд╕рдВрд╕реНрдХрд░рдг рд╣реЛрддрд╛ рд╣реИ рдЬреЛ рддреЗрдЬреА рд╕реЗ рдкрд░рд┐рд╡рд░реНрддрдирд╢реАрд▓ рд╕рдордп рдореЗрдВ рдЪрд▓рддрд╛ рд╣реИ (рдХреНрдпреЛрдВрдХрд┐ рдпрджрд┐ рд╡реЗ рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рд╣реИрдВ рддреЛ рд╣рдо рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ рдирд┐рд╖реНрдкрд╛рджрди рд╕рдордп рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЙрдирдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдирдХрд╛рд░реА рд▓реАрдХ рдХрд░рдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рджреЗрдЦрднрд╛рд▓)ред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛ рдХреБрдЫ рдПрд▓реНрдЧреЛрд░рд┐рджрдо рддреЗрдЬреА рд╕реЗ рдирд┐рд░реНрднрд░ рдХрд░рддреЗ рд╣реИрдВ рдХрд┐ рдХреНрдпрд╛ рдЕрдгреНрдбрд╛рдХрд╛рд░ рд╡рдХреНрд░ рдмрд┐рдВрджреБ рд╕рд╛рдорд╛рдиреНрдпреАрдХреГрдд рд╣реИ рдпрд╛ рдирд╣реАрдВред рдЗрд╕реЗ рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╣рдо рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВрддрдм рдпрджрд┐ рдЖрдкрдХреЛ рдПрдХ _specialization predicate_ рд▓рдХреНрд╖рдг рдмрдирд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдЬреИрд╕рд╛ рдХрд┐ рдЕрдзрд┐рдХрддрдо рдиреНрдпреВрдирддрдо рд╡рд┐рд╢реЗрд╖рдЬреНрдЮрддрд╛ рдореЗрдВ рд╕рдордЭрд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ рддреЛ рдЖрдк
#[rustc_specialization_trait]
рд╕рд╛рде рд╡рд┐рд╢реЗрд╖рддрд╛ рдШреЛрд╖рдгрд╛ рдХреЛ рдЪрд┐рд╣реНрдирд┐рдд рдХрд░рддреЗ рд╣реИрдВредрдЗрд╕ рдлрд╛рдЗрд▓ рдореЗрдВ рдореЗрд░рд╛ рд╕рд╛рд░рд╛ рд╕реНрдкреЗрд╢рд▓рд╛рдЗрдЬреЗрд╢рди рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ рдФрд░ рдпрд╣рд╛рдБ рдПрдХ рд╡рд┐рд╢реЗрд╖рдЬреНрдЮрддрд╛ рдХреЗ
рдлреАрдЪрд░ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ рдФрд░ рдореБрдЭреЗ рдареАрдХ рд╡рд╣реА рдЪрд╛рд╣рд┐рдП рдЬреЛ рдореБрдЭреЗ рдЪрд╛рд╣рд┐рдПред рдпрд╣ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рд░рд╕реНрдЯрдХ рдЖрдВрддрд░рд┐рдХ рдорд╛рд░реНрдХрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣рд╛ рд╣реИ рдФрд░ рдЗрд╕рд▓рд┐рдП рдЪреЗрддрд╛рд╡рдиреА рдХреЗ рдмрд┐рдирд╛ рдЯреВрдЯрдиреЗ рдХрд╛ рдЦрддрд░рд╛ рд╣реИред
рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдХрд╛ рдПрдХрдорд╛рддреНрд░ рдирдХрд╛рд░рд╛рддреНрдордХ рдкрдХреНрд╖ рдпрд╣ рд╣реИ рдХрд┐ рдореБрдЭреЗ
default
рдорддрд▓рдм рдирд╣реАрдВ рд▓рдЧрддрд╛ рд╣реИред рдЕрдирд┐рд╡рд╛рд░реНрдп рд░реВрдк рд╕реЗ рдЕрднреА рдХреНрдпрд╛default
рдЕрд░реНрде рд╣реИ: "рдпрд╣ рдирд┐рд╣рд┐рдд рд╡рд┐рд╢реЗрд╖ рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╡реНрдпрд╛рдЦреНрдпрд╛ рдХрд╛ рдЕрд░реНрде рд╣реИ рдХрд┐ рдпрд╣ рдПрдХ рдЙрдкрд╕рдореВрд╣ рдХреЛ рдХрд╡рд░ рдХрд░рддрд╛ рд╣реИ, рдЬреЛ рдЗрд╕реЗ рдкрд░рд╕реНрдкрд░ рд╡рд┐рд░реЛрдзреА рдирд┐рд╣рд┐рддрд╛рд░реНрде рдХреЗ рдмрдЬрд╛рдп рдЗрд╕рдХреЗ рд╡рд┐рд╢реЗрд╖рдЬреНрдЮрддрд╛ рдХреЗ рд░реВрдк рдореЗрдВ рджрд░реНрд╢рд╛рддрд╛ рд╣реИ"ред рд╕рдорд╕реНрдпрд╛ рдпрд╣ рд╣реИ рдХрд┐ рдпрд╣ рдмрд╣реБрдд рд╣реА рдЕрдЬреАрдм рджрд┐рдЦрдиреЗ рд╡рд╛рд▓рд╛ рдХреЛрдб рд╣реИ:https://github.com/LLFourn/secp256kfun/blob/6766b60c02c99ca24f816801fe876fed79643c3a/secp25kkfun/src/op.rs#L196 -L206
рдпрд╣рд╛рдБ рджреВрд╕рд░рд╛ рдирд┐рд╣рд┐рдд рдкрд╣рд▓реЗ рдХреА рд╡рд┐рд╢реЗрд╖рддрд╛ рд╣реИ рд▓реЗрдХрд┐рди рдпрд╣
default
редdefault
рдХрд╛ рдЕрд░реНрде рдЦреЛ рдЬрд╛рдирд╛ рдкреНрд░рддреАрдд рд╣реЛрддрд╛ рд╣реИред рдпрджрд┐ рдЖрдк рдмрд╛рдХреА рд╕рднреА рдЖрдХреГрддрд┐рдпреЛрдВ рдХреЛ рджреЗрдЦрддреЗ рд╣реИрдВ рддреЛ рдпрд╣ рдкрддрд╛ рд▓рдЧрд╛рдирд╛ рдХрд╛рдлреА рдХрдард┐рди рд╣реИ рдХрд┐ рдХреМрди рд╕реЗ рд╡рд┐рд╢реЗрд╖рдЬреНрдЮ рд╡рд┐рд╢реЗрд╖рдЬреНрдЮрддрд╛ рдкреНрд░рд╛рдкреНрдд рдХрд░ рд░рд╣реЗ рд╣реИрдВред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдЬрдм рдореИрдВрдиреЗ рдПрдХ рдЧрд▓рдд рдЕрдиреБрдорд╛рди рд▓рдЧрд╛рдпрд╛, рдЬреЛ рдХрд┐ рдореМрдЬреВрджрд╛ рдХреЗ рд╕рд╛рде рдУрд╡рд░рд▓реИрдк рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛, рддреЛ рдпрд╣ рдкрддрд╛ рд▓рдЧрд╛рдирд╛ рдЕрдХреНрд╕рд░ рдореБрд╢реНрдХрд┐рд▓ рдерд╛ рдХрд┐ рдореИрдВ рдЧрд▓рдд рдХрд╣рд╛рдВ рдЧрдпрд╛редрдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рд╕рдм рдХреБрдЫ рд╕рд░рд▓ рдерд╛ рдпрджрд┐ рдЖрдк рдХреБрдЫ рд╡рд┐рд╢реЗрд╖ рдХрд░рдиреЗ рдпреЛрдЧреНрдп рдереЗ рдФрд░ рдЬрдм рдЖрдк рдХреБрдЫ рдРрд╕рд╛ рдХрд░рддреЗ рд╣реИрдВ рддреЛ рдЖрдк рдареАрдХ-рдареАрдХ рдШреЛрд╖рдгрд╛ рдХрд░рддреЗ рд╣реИрдВ, рдЬреЛ рдЖрдкрдХреЛ рд╡рд┐рд╢реЗрд╖рдЬреНрдЮрддрд╛ рдкреНрд░рджрд╛рди рдХрд░рддреЗ рд╣реИрдВред RFC рдореЗрдВ рдЙрджрд╛рд╣рд░рдг рдкреНрд░рд╕реНрддреБрдд рдХрд░рдирд╛ рдХрд┐ рдореЗрд░реЗ рдорди рдореЗрдВ рдХреНрдпрд╛ рдерд╛: