ΠΡΠΎ ΠΏΡΠΎΠ±Π»Π΅ΠΌΠ° ΠΎΡΡΠ»Π΅ΠΆΠΈΠ²Π°Π½ΠΈΡ ΡΠΏΠ΅ΡΠΈΠ°Π»ΠΈΠ·Π°ΡΠΈΠΈ (rust-lang / rfcs # 1210).
ΠΡΠ½ΠΎΠ²Π½ΡΠ΅ ΡΡΠ°ΠΏΡ ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΠΈ:
default impl
(https://github.com/rust-lang/rust/issues/37653)default
? https://github.com/rust-lang/rust/issues/48444ΠΠ΅ΡΠ΅ΡΠ΅Π½Π½ΡΠ΅ Π²ΠΎΠΏΡΠΎΡΡ ΠΈΠ· RFC:
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
ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ΅Ρ ΠΈΠ·Π±Π΅ΠΆΠ°ΡΡ Π±ΠΎΠ»ΡΡΠΈΠ½ΡΡΠ²Π° ΠΎΡΠΈΠ±ΠΎΠΊ .
ΠΠ΅ΠΊΠΎΡΠΎΡΡΠ΅ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡΠ΅Π»ΡΠ½ΡΠ΅ ΠΎΡΠΊΡΡΡΡΠ΅ Π²ΠΎΠΏΡΠΎΡΡ:
Π― Π½Π΅ ΡΠ²Π΅ΡΠ΅Π½, ΡΡΠΎ ΡΠΏΠ΅ΡΠΈΠ°Π»ΠΈΠ·Π°ΡΠΈΡ ΠΌΠ΅Π½ΡΠ΅Ρ ΠΏΡΠ°Π²ΠΈΠ»Π° ΡΠΈΡΠΎΡΡΡΠ²Π°:
Π₯ΡΠΆΠ΅ ΡΠΎΠ³ΠΎ, ΡΠΈΡΠΎΡΡΠΊΠΈΠ΅ ΠΏΡΠ°Π²ΠΈΠ»Π° "Π±ΡΠ΄ΡΡΠ΅ΠΉ ΡΠΎΠ²ΠΌΠ΅ΡΡΠΈΠΌΠΎΡΡΠΈ" Π΄Π΅ΡΠΆΠ°Ρ ΠΌΠ΅ΠΆΠΊΡΠ΅ΠΉΡΠ½ΡΡ ΡΠΏΠ΅ΡΠΈΠ°Π»ΠΈΠ·Π°ΡΠΈΡ ΠΏΠΎΠ΄ Π΄ΠΎΠ²ΠΎΠ»ΡΠ½ΠΎ ΠΆΠ΅ΡΡΠΊΠΈΠΌ ΠΊΠΎΠ½ΡΡΠΎΠ»Π΅ΠΌ. ΠΠ΅Π· Π½ΠΈΡ default-impls, ΠΎΡΡΠ°Π²Π»ΡΡ ΡΠ²ΠΎΠΈ ΠΌΠ΅ΡΠΎΠ΄Ρ ΠΎΡΠΊΡΡΡΡΠΌΠΈ, ΡΡΠ°Π½ΠΎΠ²ΠΈΡΡΡ Π½Π°ΠΌΠ½ΠΎΠ³ΠΎ Ρ ΡΠΆΠ΅.
ΠΠ½Π΅ Π½ΠΈΠΊΠΎΠ³Π΄Π° Π½Π΅ Π½ΡΠ°Π²ΠΈΠ»ΠΈΡΡ ΡΠ²Π½ΡΠ΅ ΠΎΡΡΠΈΡΠ°ΡΠ΅Π»ΡΠ½ΡΠ΅ Π°ΡΠ³ΡΠΌΠ΅Π½ΡΡ. Π― Π΄ΡΠΌΠ°Ρ, ΡΡΠΎ ΡΠΏΠ΅ΡΠΈΠ°Π»ΠΈΠ·Π°ΡΠΈΡ Π½Π° ΡΠΎΡΠ°Π»ΡΠ½ΡΡ ΠΎΡΡΠΈΡΠ°ΡΠ΅Π»ΡΠ½ΡΡ Π°ΡΠ³ΡΠΌΠ΅Π½ΡΠ°ΡΠΈΡ ΡΠ²Π»ΡΠ΅ΡΡΡ Ρ ΠΎΡΠΎΡΠΈΠΌ ΠΊΠΎΠΌΠΏΡΠΎΠΌΠΈΡΡΠΎΠΌ.
Π‘Π»Π΅Π΄ΡΠ΅Ρ Π»ΠΈ Π΄ΠΎΠΏΡΡΡΠΈΡΡ ΡΡΠΎ ΠΏΡΠΈ Π²Π½Π΅Π΄ΡΠ΅Π½ΠΈΠΈ ΡΠΏΠ΅ΡΠΈΠ°Π»ΠΈΠ·Π°ΡΠΈΠΈ? ΠΠ»ΠΈ Ρ ΡΡΠΎ-ΡΠΎ ΡΠΏΡΡΠΊΠ°Ρ?
http://is.gd/3Ul0pe
Π’ΠΎ ΠΆΠ΅ ΡΠ°ΠΌΠΎΠ΅ Ρ ΡΡΠΈΠΌ, ΠΌΠΎΠΆΠ½ΠΎ Π±ΡΠ»ΠΎ Π±Ρ ΠΎΠΆΠΈΠ΄Π°ΡΡ, ΡΡΠΎ ΠΎΠ½ ΡΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡΡΠ΅ΡΡΡ: http://is.gd/RyFIEl
ΠΠΎΡ ΠΎΠΆΠ΅, Π΅ΡΡΡ Π½Π΅ΠΊΠΎΡΠΎΡΡΠ΅ ΠΏΡΠΈΡΡΠ΄Ρ Π² ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ΠΈΠΈ ΠΏΠ΅ΡΠ΅ΠΊΡΡΡΠΈΡ, ΠΊΠΎΠ³Π΄Π° Π·Π°Π΄Π΅ΠΉΡΡΠ²ΠΎΠ²Π°Π½Ρ ΡΠ²ΡΠ·Π°Π½Π½ΡΠ΅ ΡΠΈΠΏΡ. ΠΡΠΎ ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡΡΠ΅Ρ: http://is.gd/JBPzIX , Π² ΡΠΎ Π²ΡΠ΅ΠΌΡ ΠΊΠ°ΠΊ ΡΡΠΎΡ ΡΠ°ΠΊΡΠΈΡΠ΅ΡΠΊΠΈ ΠΈΠ΄Π΅Π½ΡΠΈΡΠ½ΡΠΉ ΠΊΠΎΠ΄ Π½Π΅ ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡΡΠ΅ΡΡΡ: http://is.gd/0ksLPX
ΠΠΎΡ ΡΡΠ°Π³ΠΌΠ΅Π½Ρ ΠΊΠΎΠ΄Π°, ΠΊΠΎΡΠΎΡΡΠΉ Ρ ΠΎΠΆΠΈΠ΄Π°Π» ΡΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡΠΎΠ²Π°ΡΡ ΡΠΎ ΡΠΏΠ΅ΡΠΈΠ°Π»ΠΈΠ·Π°ΡΠΈΠ΅ΠΉ:
#![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
Π½Π΅ ΡΠ²Π»ΡΠ΅ΡΡΡ ΠΏΠ°ΡΠΎΠΉ (ΠΏΠΎΡΡΠΎΠΌΡ ΠΎΠ½ ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²ΡΠ΅Ρ ΠΏΠ΅ΡΠ²ΠΎΠΌΡ impl, Π½ΠΎ Π½Π΅ Π²ΡΠΎΡΠΎΠΌΡ).(T, U)
Π³Π΄Π΅:T: FromSqlRow<ST, DB>
,U: FromSqlRow<SU, DB>
, Π½ΠΎ _Π½Π΅_(T, U): FromSql<(ST, SU), DB>
(T, U)
ΡΠ°ΠΊΠΎΠ΅ ΡΡΠΎ:T: FromSqlRow<ST, DB>
U: FromSqlRow<SU, DB>
(T, U): FromSql<(ST, SU), DB>
ΠΡΠΎ ΡΠ° ΡΠΈΡΡΠ°ΡΠΈΡ, ΠΊΠΎΡΠΎΡΡΡ ΡΠ°Π·ΡΠ΅ΡΠΈΠ»Π° Π±Ρ ΡΠ΅ΡΠ΅ΡΠΊΠ° impls - Π²Π°ΠΌ Π½ΡΠΆΠ½ΠΎ Π±ΡΠ»ΠΎ Π±Ρ Π½Π°ΠΏΠΈΡΠ°ΡΡ ΡΡΠ΅ΡΠΈΠΉ impl Π΄Π»Ρ ΠΏΠ΅ΡΠ΅ΠΊΡΡΠ²Π°ΡΡΠ΅Π³ΠΎΡΡ ΡΠ»ΡΡΠ°Ρ ΠΈ ΡΠΊΠ°Π·Π°ΡΡ, ΡΡΠΎ ΠΎΠ½ Π΄ΠΎΠ»ΠΆΠ΅Π½ Π΄Π΅Π»Π°ΡΡ. Π ΠΊΠ°ΡΠ΅ΡΡΠ²Π΅ Π°Π»ΡΡΠ΅ΡΠ½Π°ΡΠΈΠ²Ρ, ΠΎΡΡΠΈΡΠ°ΡΠ΅Π»ΡΠ½ΡΠ΅ ΠΏΡΠΈΠ·Π½Π°ΠΊΠΈ ΠΌΠΎΠ³ΡΡ Π΄Π°ΡΡ Π²Π°ΠΌ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΡ ΠΈΡΠΊΠ»ΡΡΠΈΡΡ ΡΠΎΠ²ΠΏΠ°Π΄Π΅Π½ΠΈΠ΅ ΠΈΠ»ΠΈ ΠΈΠ½ΡΠΌ ΠΎΠ±ΡΠ°Π·ΠΎΠΌ Π½Π°ΡΡΡΠΎΠΈΡΡ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΡΠ΅ ΡΠΎΠ²ΠΏΠ°Π΄Π΅Π½ΠΈΡ.
Π£ Π²Π°Ρ Π΅ΡΡΡ:
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>
ΠΠΎ Π½ΠΈ ΠΎΠ΄ΠΈΠ½ impl Π½Π΅ ΡΠ²Π»ΡΠ΅ΡΡΡ Π±ΠΎΠ»Π΅Π΅ ΠΊΠΎΠ½ΠΊΡΠ΅ΡΠ½ΡΠΌ:
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
Π² Π±ΡΠ΄ΡΡΠ΅ΠΌ. ΠΡΠΎ ΠΌΠΎΠΆΠ΅Ρ ΠΏΠΎΠΊΠ°Π·Π°ΡΡΡΡ Π³Π»ΡΠΏΡΠΌ Π΄Π»Ρ Π΄Π°Π½Π½ΠΎΠ³ΠΎ ΠΏΡΠΈΠΌΠ΅ΡΠ°, Π½ΠΎ Π² ΡΠ΅Π»ΠΎΠΌ ΠΌΡ ΠΏΠΎΡΡΠΎΡΠ½Π½ΠΎ Π΄ΠΎΠ±Π°Π²Π»ΡΠ΅ΠΌ Π½ΠΎΠ²ΡΠ΅ ΠΈΠΌΠΏΠ»ΠΈΠΌΠ΅Π½ΡΡ, ΠΈ ΠΌΡ Ρ
ΠΎΡΠΈΠΌ Π·Π°ΡΠΈΡΠΈΡΡ ΠΈΡΡ
ΠΎΠ΄ΡΡΠΈΠΉ ΠΊΠΎΠ΄ ΠΎΡ Π²Π·Π»ΠΎΠΌΠ°, ΠΊΠΎΠ³Π΄Π° ΠΌΡ Π΄ΠΎΠ±Π°Π²Π»ΡΠ΅ΠΌ ΡΡΠΈ ΠΈΠΌΠΏΡ.
ΠΡΠΎ ΠΊΠΎΠ½ΡΠ΅ΡΠ²Π°ΡΠΈΠ²Π½ΡΠΉ Π²ΡΠ±ΠΎΡ, ΠΈ ΡΠΎ Π²ΡΠ΅ΠΌΠ΅Π½Π΅ΠΌ ΠΌΡ, Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ, Π·Π°Ρ ΠΎΡΠΈΠΌ ΡΠ°ΡΡΠ»Π°Π±ΠΈΡΡΡΡ. ΠΡ ΠΌΠΎΠΆΠ΅ΡΠ΅ ΠΏΠΎΠ»ΡΡΠΈΡΡ ΠΏΡΠ΅Π΄ΡΡΡΠΎΡΠΈΡ Π·Π΄Π΅ΡΡ:
Π‘ΠΏΠ°ΡΠΈΠ±ΠΎ Π·Π° ΠΏΡΠΎΡΡΠ½Π΅Π½ΠΈΠ΅ ΡΡΠΈΡ Π΄Π²ΡΡ ΡΠ»ΡΡΠ°Π΅Π². Π’Π΅ΠΏΠ΅ΡΡ ΡΡΠΎ ΠΈΠΌΠ΅Π΅Ρ ΡΠΌΡΡΠ»
ΠΠΎ Π²ΡΠΎΡΠ½ΠΈΠΊ, 22 ΠΌΠ°ΡΡΠ° 2016 Π³., 18:34 ΠΠ°ΡΠΎΠ½ Π’ΡΡΠΎΠ½ [email protected] Π½Π°ΠΏΠΈΡΠ°Π»:
@SergioBenitez https://github.com/SergioBenitez
ΠΠΎΠΌΠΏΠΈΠ»ΡΡΠΈΡ Π·Π°Π²Π΅ΡΡΠ°Π΅ΡΡΡ Π½Π΅ΡΠ΄Π°ΡΠ½ΠΎ, ΠΏΠΎΡΠΊΠΎΠ»ΡΠΊΡ ΠΊΠΎΠΌΠΏΠΈΠ»ΡΡΠΎΡ ΡΡΡΠ»Π°Π΅ΡΡΡ Π½Π° ΠΊΠΎΠ½ΡΠ»ΠΈΠΊΡΡ ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΠΈ. ΠΠ°ΠΏΠΈΡΡ
ΡΡΠΎ & str Π½Π΅ ΡΠ΅Π°Π»ΠΈΠ·ΡΠ΅Ρ FromStr, ΠΏΠΎΡΡΠΎΠΌΡ ΠΊΠΎΠ½ΡΠ»ΠΈΠΊΡΠ° Π±ΡΡΡ Π½Π΅ Π΄ΠΎΠ»ΠΆΠ½ΠΎ.ΠΡΠΎΠ±Π»Π΅ΠΌΠ° Π² ΡΠΎΠΌ, ΡΡΠΎ ΠΊΠΎΠΌΠΏΠΈΠ»ΡΡΠΎΡ ΠΊΠΎΠ½ΡΠ΅ΡΠ²Π°ΡΠΈΠ²Π½ΠΎ ΠΏΡΠ΅Π΄ΠΏΠΎΠ»Π°Π³Π°Π΅Ρ, ΡΡΠΎ & str
ΠΌΠΎΠΆΠ΅Ρ ΠΏΠΎΡΠ²ΠΈΡΡΡΡ ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΡ FromStr Π² Π±ΡΠ΄ΡΡΠ΅ΠΌ. ΠΡΠΎ ΠΌΠΎΠΆΠ΅Ρ ΠΏΠΎΠΊΠ°Π·Π°ΡΡΡΡ Π³Π»ΡΠΏΡΠΌ Π΄Π»Ρ
Π² ΡΡΠΎΠΌ ΠΏΡΠΈΠΌΠ΅ΡΠ΅, Π½ΠΎ Π² ΡΠ΅Π»ΠΎΠΌ ΠΌΡ Π²ΡΠ΅ Π²ΡΠ΅ΠΌΡ Π΄ΠΎΠ±Π°Π²Π»ΡΠ΅ΠΌ Π½ΠΎΠ²ΡΠ΅ ΠΈΠΌΠΏΡ, ΠΈ ΠΌΡ Ρ ΠΎΡΠΈΠΌ
Π·Π°ΡΠΈΡΠΈΡΡ ΠΊΠΎΠ΄ Π½ΠΈΠΆΠ΅ΡΡΠΎΡΡΠ΅Π³ΠΎ ΠΎΡ Π²Π·Π»ΠΎΠΌΠ°, ΠΊΠΎΠ³Π΄Π° ΠΌΡ Π΄ΠΎΠ±Π°Π²Π»ΡΠ΅ΠΌ ΡΡΠΈ ΠΈΠΌΠΏ.ΠΡΠΎ ΠΊΠΎΠ½ΡΠ΅ΡΠ²Π°ΡΠΈΠ²Π½ΡΠΉ Π²ΡΠ±ΠΎΡ, ΠΈ ΠΌΡ ΠΌΠΎΠ³Π»ΠΈ Π±Ρ ΡΠ°ΡΡΠ»Π°Π±ΠΈΡΡΡΡ.
ΡΠ΅ΡΠ΅Π· Π½Π΅ΠΊΠΎΡΠΎΡΠΎΠ΅ Π²ΡΠ΅ΠΌΡ. ΠΡ ΠΌΠΎΠΆΠ΅ΡΠ΅ ΠΏΠΎΠ»ΡΡΠΈΡΡ ΠΏΡΠ΅Π΄ΡΡΡΠΎΡΠΈΡ Π·Π΄Π΅ΡΡ:-
http://smallcultfollowing.com/babysteps/blog/2015/01/14/little-orphan-impls/
- ΡΠΆΠ°Π²ΡΠΈΠ½Π°-lang / rfcs # 1023 https://github.com/rust-lang/rfcs/pull/1023
- ΡΠΆΠ°Π²ΡΠΈΠ½Π° / rfcs # 1053 https://github.com/rust-lang/rfcs/issues/1053
- ΡΠΆΠ°Π²ΡΠΈΠ½Π°-lang / rfcs # 1148 https://github.com/rust-lang/rfcs/pull/1148
-
ΠΡ ΠΏΠΎΠ»ΡΡΠ°Π΅ΡΠ΅ ΡΡΠΎ, ΠΏΠΎΡΠΎΠΌΡ ΡΡΠΎ Π²Π°Ρ ΡΠΏΠΎΠΌΡΠ½ΡΠ»ΠΈ.
ΠΡΠ²Π΅ΡΡΡΠ΅ Π½Π° ΡΡΠΎ ΠΏΠΈΡΡΠΌΠΎ Π½Π°ΠΏΡΡΠΌΡΡ ΠΈΠ»ΠΈ ΠΏΡΠΎΡΠΌΠΎΡΡΠΈΡΠ΅ Π΅Π³ΠΎ Π½Π° GitHub
https://github.com/rust-lang/rust/issues/31844#issuecomment -200093757
@aturon
ΠΡΠΎΠ±Π»Π΅ΠΌΠ° Π² ΡΠΎΠΌ, ΡΡΠΎ ΠΊΠΎΠΌΠΏΠΈΠ»ΡΡΠΎΡ ΠΊΠΎΠ½ΡΠ΅ΡΠ²Π°ΡΠΈΠ²Π½ΠΎ ΠΏΡΠ΅Π΄ΠΏΠΎΠ»Π°Π³Π°Π΅Ρ, ΡΡΠΎ & str ΠΌΠΎΠΆΠ΅Ρ Π² Π±ΡΠ΄ΡΡΠ΅ΠΌ ΡΠ΅Π°Π»ΠΈΠ·ΠΎΠ²Π°ΡΡ FromStr. ΠΡΠΎ ΠΌΠΎΠΆΠ΅Ρ ΠΏΠΎΠΊΠ°Π·Π°ΡΡΡΡ Π³Π»ΡΠΏΡΠΌ Π΄Π»Ρ Π΄Π°Π½Π½ΠΎΠ³ΠΎ ΠΏΡΠΈΠΌΠ΅ΡΠ°, Π½ΠΎ Π² ΡΠ΅Π»ΠΎΠΌ ΠΌΡ ΠΏΠΎΡΡΠΎΡΠ½Π½ΠΎ Π΄ΠΎΠ±Π°Π²Π»ΡΠ΅ΠΌ Π½ΠΎΠ²ΡΠ΅ ΠΈΠΌΠΏΠ»ΠΈΠΌΠ΅Π½ΡΡ, ΠΈ ΠΌΡ Ρ ΠΎΡΠΈΠΌ Π·Π°ΡΠΈΡΠΈΡΡ ΠΈΡΡ ΠΎΠ΄ΡΡΠΈΠΉ ΠΊΠΎΠ΄ ΠΎΡ Π²Π·Π»ΠΎΠΌΠ°, ΠΊΠΎΠ³Π΄Π° ΠΌΡ Π΄ΠΎΠ±Π°Π²Π»ΡΠ΅ΠΌ ΡΡΠΈ ΠΈΠΌΠΏΡ.
Π Π°Π·Π²Π΅ ΡΡΠΎ Π½Π΅ ΡΠΎ, ΡΠ΅ΠΌ Π·Π°Π½ΠΈΠΌΠ°Π΅ΡΡΡ ΡΠΏΠ΅ΡΠΈΠ°Π»ΠΈΠ·Π°ΡΠΈΡ? Π§ΡΠΎ ΠΊΠ°ΡΠ°Π΅ΡΡΡ ΡΠΏΠ΅ΡΠΈΠ°Π»ΠΈΠ·Π°ΡΠΈΠΈ, Ρ Π±Ρ ΠΎΠΆΠΈΠ΄Π°Π», ΡΡΠΎ Π΄Π°ΠΆΠ΅ Π΅ΡΠ»ΠΈ Π² Π±ΡΠ΄ΡΡΠ΅ΠΌ Π±ΡΠ΄Π΅Ρ Π΄ΠΎΠ±Π°Π²Π»Π΅Π½Π° ββΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΡ FromStr
Π΄Π»Ρ &str
, ΠΏΡΡΠΌΠ°Ρ ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΡ ΡΡΠ΅ΠΉΡΠ° Simple
Π΄Π»Ρ &str
Π±ΡΠ΄Π΅Ρ ΠΈΠΌΠ΅ΡΡ ΠΏΡΠΈΠΎΡΠΈΡΠ΅Ρ.
@SergioBenitez Π²Π°ΠΌ Π½ΡΠΆΠ½ΠΎ ΠΏΠΎΠΌΠ΅ΡΡΠΈΡΡ default fn
Π² Π±ΠΎΠ»Π΅Π΅ ΠΎΠ±ΡΠΈΠΉ ΡΠ»Π΅ΠΌΠ΅Π½Ρ impl. Π’Π²ΠΎΠΉ
ΠΏΡΠΈΠΌΠ΅Ρ Π½Π΅ ΡΠ²Π»ΡΠ΅ΡΡΡ ΡΠΏΠ΅ΡΠΈΠ°Π»ΠΈΠ·ΠΈΡΠΎΠ²Π°Π½Π½ΡΠΌ.
22 ΠΌΠ°ΡΡΠ° 2016 Π³., 18:54 Π‘Π΅ΡΡ
ΠΈΠΎ ΠΠ΅Π½ΠΈΡΠ΅Ρ [email protected]
Π½Π°ΠΏΠΈΡΠ°Π»:
@aturon https://github.com/aturon
ΠΡΠΎΠ±Π»Π΅ΠΌΠ° Π² ΡΠΎΠΌ, ΡΡΠΎ ΠΊΠΎΠΌΠΏΠΈΠ»ΡΡΠΎΡ ΠΊΠΎΠ½ΡΠ΅ΡΠ²Π°ΡΠΈΠ²Π½ΠΎ ΠΏΡΠ΅Π΄ΠΏΠΎΠ»Π°Π³Π°Π΅Ρ, ΡΡΠΎ & str
ΠΌΠΎΠΆΠ΅Ρ ΠΏΠΎΡΠ²ΠΈΡΡΡΡ ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΡ FromStr Π² Π±ΡΠ΄ΡΡΠ΅ΠΌ. ΠΡΠΎ ΠΌΠΎΠΆΠ΅Ρ ΠΏΠΎΠΊΠ°Π·Π°ΡΡΡΡ Π³Π»ΡΠΏΡΠΌ Π΄Π»Ρ ΡΡΠΎΠ³ΠΎ
ΠΏΡΠΈΠΌΠ΅Ρ, Π½ΠΎ Π² ΡΠ΅Π»ΠΎΠΌ ΠΌΡ Π΄ΠΎΠ±Π°Π²Π»ΡΠ΅ΠΌ Π½ΠΎΠ²ΡΠ΅ ΠΈΠΌΠΏΡ Π²ΡΠ΅ Π²ΡΠ΅ΠΌΡ, ΠΈ ΠΌΡ Ρ ΠΎΡΠΈΠΌ
Π·Π°ΡΠΈΡΠΈΡΡ ΠΊΠΎΠ΄ Π½ΠΈΠΆΠ΅ΡΡΠΎΡΡΠ΅Π³ΠΎ ΠΎΡ Π²Π·Π»ΠΎΠΌΠ°, ΠΊΠΎΠ³Π΄Π° ΠΌΡ Π΄ΠΎΠ±Π°Π²Π»ΡΠ΅ΠΌ ΡΡΠΈ ΠΈΠΌΠΏ.Π Π°Π·Π²Π΅ ΡΡΠΎ Π½Π΅ ΡΠΎ, ΡΠ΅ΠΌ Π·Π°Π½ΠΈΠΌΠ°Π΅ΡΡΡ ΡΠΏΠ΅ΡΠΈΠ°Π»ΠΈΠ·Π°ΡΠΈΡ? Π‘ ΡΡΠ°ΡΡΠΈΠ΅ΠΌ
ΡΠΏΠ΅ΡΠΈΠ°Π»ΠΈΠ·Π°ΡΠΈΠΈ, Ρ Π±Ρ ΠΎΠΆΠΈΠ΄Π°Π», ΡΡΠΎ Π΄Π°ΠΆΠ΅ Π΅ΡΠ»ΠΈ ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΡ FromStr
for & str Π±ΡΠ»ΠΈ Π΄ΠΎΠ±Π°Π²Π»Π΅Π½Ρ Π² Π±ΡΠ΄ΡΡΠ΅ΠΌ, ΠΏΡΡΠΌΠ°Ρ ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΡ Π΄Π»Ρ
trait Π΄Π»Ρ & str Π±ΡΠ΄Π΅Ρ ΠΈΠΌΠ΅ΡΡ ΠΏΡΠΈΠΎΡΠΈΡΠ΅Ρ.-
ΠΡ ΠΏΠΎΠ»ΡΡΠ°Π΅ΡΠ΅ ΡΡΠΎ, ΠΏΠΎΡΠΎΠΌΡ ΡΡΠΎ Π²Π°Ρ ΡΠΏΠΎΠΌΡΠ½ΡΠ»ΠΈ.
ΠΡΠ²Π΅ΡΡΡΠ΅ Π½Π° ΡΡΠΎ ΠΏΠΈΡΡΠΌΠΎ Π½Π°ΠΏΡΡΠΌΡΡ ΠΈΠ»ΠΈ ΠΏΡΠΎΡΠΌΠΎΡΡΠΈΡΠ΅ Π΅Π³ΠΎ Π½Π° GitHub
https://github.com/rust-lang/rust/issues/31844#issuecomment -200097995
Π― Π΄ΡΠΌΠ°Ρ, ΡΡΠΎ "ΡΡΠ°Π½Π΄Π°ΡΡΠ½ΡΠ΅" ΡΠ΅ΡΡΡ, ΠΊΠΎΡΠΎΡΡΠ΅ Π°Π²ΡΠΎΠΌΠ°ΡΠΈΡΠ΅ΡΠΊΠΈ ΡΡΠΈΡΠ°ΡΡΡΡ default
Π·Π²ΡΡΠ°Ρ ΡΠ±ΠΈΠ²Π°ΡΡΠ΅ Ρ ΡΠΎΠ»ΠΊΡ. ΠΠ°ΠΌ ΠΌΠΎΠΆΠ΅Ρ ΠΏΠΎΠ½Π°Π΄ΠΎΠ±ΠΈΡΡΡΡ ΠΊΠ°ΠΊ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠΈΡΠ½ΠΎΡΡΡ Π΄Π»Ρ ΡΡΠ΅ΠΉΡΠ°, ΠΊΠ°ΠΊ Π² Haskell, ΠΈ Ρ. Π., Π’Π°ΠΊ ΠΈ ΠΎΡΠ»Π°Π±Π»Π΅Π½ΠΈΠ΅ impl
s. Π’Π°ΠΊΠΆΠ΅ Π²Ρ Π½Π΅ ΠΌΠΎΠΆΠ΅ΡΠ΅ Π»Π΅Π³ΠΊΠΎ grep
Π΄Π»Ρ Π½ΠΈΡ
, ΠΊΠ°ΠΊ Π²Ρ ΠΌΠΎΠΆΠ΅ΡΠ΅ Π·Π° default
. ΠΠ΅ΡΡΡΠ΄Π½ΠΎ ΠΎΠ΄Π½ΠΎΠ²ΡΠ΅ΠΌΠ΅Π½Π½ΠΎ Π²Π²Π΅ΡΡΠΈ ΠΊΠ»ΡΡΠ΅Π²ΠΎΠ΅ ΡΠ»ΠΎΠ²ΠΎ default
ΠΈ ΡΠΊΠ°Π·Π°ΡΡ ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΡ ΠΏΠΎ ΡΠΌΠΎΠ»ΡΠ°Π½ΠΈΡ, Π½ΠΎ ΠΈΡ
Π½Π΅Π»ΡΠ·Ρ ΡΠ°Π·Π΄Π΅Π»ΠΈΡΡ ΠΊΠ°ΠΊ Π΅ΡΡΡ. ΠΡΠΎΠΌΠ΅ ΡΠΎΠ³ΠΎ, Π΅ΡΠ»ΠΈ ΠΊΡΠΎ-ΡΠΎ Ρ
ΠΎΡΠ΅Ρ ΡΡΠΎΡΠ½ΠΈΡΡ ΡΠ·ΡΠΊ, ΡΠΎ ΡΡΠΈ "ΡΡΠ°Π½Π΄Π°ΡΡΠ½ΡΠ΅" ΠΏΡΠΈΠ·Π½Π°ΠΊΠΈ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠ΅ΡΠ΅ΠΈΠΌΠ΅Π½ΠΎΠ²Π°ΡΡ Π² "ΠΏΡΠ΅Π΄Π»Π°Π³Π°Π΅ΠΌΡΠ΅ ΠΏΡΠΈΠ·Π½Π°ΠΊΠΈ" Π² Π΄ΠΎΠΊΡΠΌΠ΅Π½ΡΠ°ΡΠΈΠΈ.
ΠΡΠΈΠΌΠ΅ΡΠ°Π½ΠΈΠ΅ ΠΎΡ # 32999 (ΠΊΠΎΠΌΠΌΠ΅Π½ΡΠ°ΡΠΈΠΉ) : Π΅ΡΠ»ΠΈ ΠΌΡ Π±ΡΠ΄Π΅ΠΌ ΡΠ»Π΅Π΄ΠΎΠ²Π°ΡΡ ΠΏΡΠ°Π²ΠΈΠ»Ρ ΡΠ΅ΡΠ΅ΡΠΊΠΈ (ΠΈΠ»ΠΈ ΡΠ°Π·ΡΠ΅ΡΠΈΡΡ ΠΎΡΡΠΈΡΠ°ΡΠ΅Π»ΡΠ½ΡΠ΅ ΠΎΠ³ΡΠ°Π½ΠΈΡΠ΅Π½ΠΈΡ), ΡΡΡΠΊ Β«ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ ΠΏΡΠΎΠΌΠ΅ΠΆΡΡΠΎΡΠ½ΡΠΉ ΠΏΡΠΈΠ·Π½Π°ΠΊΒ» Π΄Π»Ρ ΠΏΡΠ΅Π΄ΠΎΡΠ²ΡΠ°ΡΠ΅Π½ΠΈΡ Π΄Π°Π»ΡΠ½Π΅ΠΉΡΠ΅ΠΉ ΡΠΏΠ΅ΡΠΈΠ°Π»ΠΈΠ·Π°ΡΠΈΠΈ ΡΠ΅Π³ΠΎ-Π»ΠΈΠ±ΠΎ Π±ΠΎΠ»ΡΡΠ΅ Π½Π΅ Π±ΡΠ΄Π΅Ρ ΡΠ°Π±ΠΎΡΠ°ΡΡ.
@Stebalien
ΠΠΎΡΠ΅ΠΌΡ Π½Π΅ ΡΠ°Π±ΠΎΡΠ°Π΅Ρ? Π₯ΠΈΡΡΠΎΡΡΡ ΠΎΠ³ΡΠ°Π½ΠΈΡΠΈΠ²Π°Π΅Ρ ΡΠΏΠ΅ΡΠΈΠ°Π»ΠΈΠ·Π°ΡΠΈΡ ΡΠ°ΡΡΠ½ΠΎΠΉ ΡΠ΅ΡΡΠΎΠΉ. ΠΡ Π½Π΅ ΠΌΠΎΠΆΠ΅ΡΠ΅ ΡΠΏΠ΅ΡΠΈΠ°Π»ΠΈΠ·ΠΈΡΠΎΠ²Π°ΡΡ Π»ΠΈΡΠ½ΡΡ ΡΠ΅ΡΡΡ, Π΅ΡΠ»ΠΈ Π½Π΅ ΠΌΠΎΠΆΠ΅ΡΠ΅ ΠΏΠΎΠ»ΡΡΠΈΡΡ ΠΊ Π½Π΅ΠΉ Π΄ΠΎΡΡΡΠΏ.
@ arielb1 Π. Π₯ΠΎΡΠΎΡΠ°Ρ ΡΠΎΡΠΊΠ° Π·ΡΠ΅Π½ΠΈΡ. Π ΠΌΠΎΠ΅ΠΌ ΡΠ»ΡΡΠ°Π΅ ΡΡΠΎ Π½Π΅ Π»ΠΈΡΠ½Π°Ρ ΡΠ΅ΡΡΠ°.
Π― Π½Π΅ Π΄ΡΠΌΠ°Ρ, ΡΡΠΎ Π°ΡΠ³ΡΠΌΠ΅Π½ΡΠ°ΡΠΈΡ Β«Π²Π½Π΅ΡΠ½ΠΈΠ΅ ΡΠ»Π΅ΠΌΠ΅Π½ΡΡ Π½Π΅ ΠΌΠΎΠ³ΡΡ ΡΠΏΠ΅ΡΠΈΠ°Π»ΠΈΠ·ΠΈΡΠΎΠ²Π°ΡΡΡΡ, ΠΏΠΎΡΠΎΠΌΡ ΡΡΠΎ ΡΠ°ΡΡΡΠΆΠ΄Π΅Π½ΠΈΡ ΠΎ Π½Π΅ΡΡΡΠ΅ΡΡΠ²ΡΡΡΠ΅ΠΉ ΠΏΡΡΠΌΠΎΠΉ ΡΠΎΠ²ΠΌΠ΅ΡΡΠΈΠΌΠΎΡΡΠΈ + ΠΏΡΠ°Π²ΠΈΠ»ΠΎ ΡΠΎΠ³Π»Π°ΡΠΎΠ²Π°Π½Π½ΠΎΡΡΠΈΒ» ΠΎΡΠΎΠ±Π΅Π½Π½ΠΎ ΠΈΠ½ΡΠ΅ΡΠ΅ΡΠ½Ρ ΠΈΠ»ΠΈ ΠΏΠΎΠ»Π΅Π·Π½Ρ. ΠΡΠΎΠ±Π΅Π½Π½ΠΎ, ΠΊΠΎΠ³Π΄Π° ΠΌΡ Π½Π΅ ΠΏΡΠΈΠ΄Π΅ΡΠΆΠΈΠ²Π°Π΅ΠΌΡΡ Π½Π°ΡΠΈΡ ΠΊΠΎΠ½ΠΊΡΠ΅ΡΠ½ΡΡ ΠΏΡΠ°Π²ΠΈΠ» ΡΠΎΠ³Π»Π°ΡΠΎΠ²Π°Π½Π½ΠΎΡΡΠΈ.
ΠΡΡΡ Π»ΠΈ ΡΠΏΠΎΡΠΎΠ± ΠΏΠΎΠ»ΡΡΠΈΡΡ Π΄ΠΎΡΡΡΠΏ ΠΊ ΠΏΠ΅ΡΠ΅ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½Π½ΠΎΠΌΡ default impl
? ΠΡΠ»ΠΈ ΡΠ°ΠΊ, ΡΡΠΎ ΠΌΠΎΠΆΠ΅Ρ ΠΏΠΎΠΌΠΎΡΡ Π² ΠΏΠΎΡΡΡΠΎΠ΅Π½ΠΈΠΈ ΡΠ΅ΡΡΠΎΠ². Π‘ΠΌ. Π Π°Π·Π΄Π΅Π» Β« ΠΠΈΠ·Π°ΠΉΠ½ ΠΏΠΎ ΠΊΠΎΠ½ΡΡΠ°ΠΊΡΡΒ» ΠΈ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠ° .
Π Π°Π·ΡΠ΅ΡΠ΅Π½ΠΈΠ΅ ΠΏΡΠΎΠ΅ΡΠΈΡΠΎΠ²Π°Π½ΠΈΡ ΡΠ²ΡΠ·Π°Π½Π½ΡΡ ΠΏΠΎ ΡΠΌΠΎΠ»ΡΠ°Π½ΠΈΡ ΡΠΈΠΏΠΎΠ² Π²ΠΎ Π²ΡΠ΅ΠΌΡ ΠΏΡΠΎΠ²Π΅ΡΠΊΠΈ ΡΠΈΠΏΠΎΠ² ΠΏΠΎΠ·Π²ΠΎΠ»ΠΈΡ ΠΎΠ±Π΅ΡΠΏΠ΅ΡΠΈΡΡ Π½Π΅ΡΠ°Π²Π΅Π½ΡΡΠ²ΠΎ ΡΠΈΠΏΠΎΠ² Π²ΠΎ Π²ΡΠ΅ΠΌΡ ΠΊΠΎΠΌΠΏΠΈΠ»ΡΡΠΈΠΈ: https://gist.github.com/7c081574958d22f89d434a97b626b1e4
#![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, ΠΏΠΎΡΠΎΠΌΡ ΡΡΠΎ ΠΎΠ½ Π½Π΅ ΡΠ°Π·ΡΠ΅ΡΠ°Π΅ΡΡΡ Π΄Π»Ρ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Π΅ΠΉ Tor ΠΈΠ·-Π·Π° ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΡ CloudFlare. GitHub ΠΎΡΠ»ΠΈΡΠ½ΠΎ ΡΠ°Π±ΠΎΡΠ°Π΅Ρ Ρ ΠΏΠΎΠ»Π½ΡΠΌΠΈ URL-Π°Π΄ΡΠ΅ΡΠ°ΠΌΠΈ. Π play.rust-lang.org ΠΎΡΠ»ΠΈΡΠ½ΠΎ ΡΠ°Π±ΠΎΡΠ°Π΅Ρ ΡΠ΅ΡΠ΅Π· Tor.
Π‘Π°ΠΌ @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
ΠΠΎΠ΄Π΄Π΅ΡΠΆΠΈΠ²Π°Π΅Ρ Π»ΠΈ ΡΡΠΎ feture specialization
ΠΈ Π΅ΡΡΡ Π»ΠΈ Π² Π½Π°ΡΡΠΎΡΡΠ΅Π΅ Π²ΡΠ΅ΠΌΡ ΠΊΠ°ΠΊΠΈΠ΅-Π»ΠΈΠ±ΠΎ Π΄ΡΡΠ³ΠΈΠ΅ ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΠΈ?
@zitsen
ΠΡΠΈ ΠΈΠΌΠΏΠ»ΠΈΠΌΠ΅Π½ΡΡ Π½Π΅ Π΄ΠΎΠΏΡΡΠΊΠ°ΡΡΡΡ ΡΠ΅ΠΊΡΡΠΈΠΌ Π΄ΠΈΠ·Π°ΠΉΠ½ΠΎΠΌ ΡΠΏΠ΅ΡΠΈΠ°Π»ΠΈΠ·Π°ΡΠΈΠΈ, ΠΏΠΎΡΠΎΠΌΡ ΡΡΠΎ Π½ΠΈ T: Foo + Bar
Π½ΠΈ T: Foo + Baz
ΡΠ²Π»ΡΡΡΡΡ Π±ΠΎΠ»Π΅Π΅ ΡΠΏΠ΅ΡΠΈΠ°Π»ΠΈΠ·ΠΈΡΠΎΠ²Π°Π½Π½ΡΠΌΠΈ, ΡΠ΅ΠΌ Π΄ΡΡΠ³ΠΈΠ΅. Π’ΠΎ Π΅ΡΡΡ, Π΅ΡΠ»ΠΈ Ρ Π²Π°Ρ Π΅ΡΡΡ T: Foo + Bar + Baz
, Π½Π΅ΠΏΠΎΠ½ΡΡΠ½ΠΎ, ΠΊΠ°ΠΊΠΎΠΉ ΠΈΠΌΠΏΠ»Ρ Π΄ΠΎΠ»ΠΆΠ΅Π½ "Π²ΡΠΈΠ³ΡΠ°ΡΡ".
Π£ Π½Π°Ρ Π΅ΡΡΡ Π½Π΅ΠΊΠΎΡΠΎΡΡΠ΅ ΠΌΡΡΠ»ΠΈ ΠΎ Π±ΠΎΠ»Π΅Π΅ Π²ΡΡΠ°Π·ΠΈΡΠ΅Π»ΡΠ½ΠΎΠΉ ΡΠΈΡΡΠ΅ΠΌΠ΅, ΠΊΠΎΡΠΎΡΠ°Ρ ΠΏΠΎΠ·Π²ΠΎΠ»ΠΈΠ»Π° Π±Ρ Π²Π°ΠΌ _ΡΠ°ΠΊΠΆΠ΅_ Π΄Π°ΡΡ ΠΈΠΌΠΏΠ» Π΄Π»Ρ T: Foo + Bar + Baz
ΠΈ, ΡΠ°ΠΊΠΈΠΌ ΠΎΠ±ΡΠ°Π·ΠΎΠΌ, ΡΡΡΡΠ°Π½ΠΈΡΡ Π½Π΅ΠΎΠ΄Π½ΠΎΠ·Π½Π°ΡΠ½ΠΎΡΡΡ, Π½ΠΎ ΡΡΠΎ Π΅ΡΠ΅ Π½Π΅ Π±ΡΠ»ΠΎ ΠΏΠΎΠ»Π½ΠΎΡΡΡΡ ΠΏΡΠ΅Π΄Π»ΠΎΠΆΠ΅Π½ΠΎ.
ΠΡΠ»ΠΈ ΠΎΡΡΠΈΡΠ°ΡΠ΅Π»ΡΠ½Π°Ρ Ρ
Π°ΡΠ°ΠΊΡΠ΅ΡΠΈΡΡΠΈΠΊΠ° ΠΎΠ³ΡΠ°Π½ΠΈΡΠΈΠ²Π°Π΅Ρ ΠΊΠΎΠ³Π΄Π°-Π»ΠΈΠ±ΠΎ ΠΏΡΠΈΠ·Π΅ΠΌΠ»Π΅Π½ΠΈΠ΅ trait Baz: !Bar
, ΡΡΠΎ ΡΠ°ΠΊΠΆΠ΅ ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ ΡΠΎ ΡΠΏΠ΅ΡΠΈΠ°Π»ΠΈΠ·Π°ΡΠΈΠ΅ΠΉ, ΡΡΠΎΠ±Ρ Π΄ΠΎΠΊΠ°Π·Π°ΡΡ, ΡΡΠΎ Π½Π°Π±ΠΎΡΡ ΡΠΈΠΏΠΎΠ², ΡΠ΅Π°Π»ΠΈΠ·ΡΡΡΠΈΠ΅ Bar, ΠΈ ΡΠ΅, ΠΊΠΎΡΠΎΡΡΠ΅ ΡΠ΅Π°Π»ΠΈΠ·ΡΡΡ Baz, ΡΠ°Π·Π»ΠΈΡΠ½Ρ ΠΈ ΠΈΠ½Π΄ΠΈΠ²ΠΈΠ΄ΡΠ°Π»ΡΠ½ΠΎ ΡΠΏΠ΅ΡΠΈΠ°Π»ΠΈΠ·ΠΈΡΠΎΠ²Π°Π½Ρ.
ΠΠ°ΠΆΠ΅ΡΡΡ, ΡΡΠΎ ΠΎΡΠ²Π΅Ρ 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 {
|> ^
Π― ΡΡΠΈΡΠ°Ρ, ΡΡΠΎ Π²ΡΡΠ΅ΡΠΊΠ°Π·Π°Π½Π½ΡΠΉ _Π΄ΠΎΠ»ΠΆΠ΅Π½_ ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡΠΎΠ²Π°ΡΡΡΡ, ΠΈ Π΅ΡΡΡ Π΄Π²Π° ΠΈΠ½ΡΠ΅ΡΠ΅ΡΠ½ΡΡ Π²Π°ΡΠΈΠ°Π½ΡΠ°, ΠΊΠΎΡΠΎΡΡΠ΅ Π΄Π΅ΠΉΡΡΠ²ΠΈΡΠ΅Π»ΡΠ½ΠΎ ΡΠ°Π±ΠΎΡΠ°ΡΡ ΠΊΠ°ΠΊ Π·Π°Π΄ΡΠΌΠ°Π½ΠΎ:
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 {
// ...
}
(Π§ΡΠΎ _Π½Π΅_ ΡΠ°Π±ΠΎΡΠ°Π΅Ρ, Π΅ΡΠ»ΠΈ 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)
Π§ΡΠΎ ΠΊΠ°ΠΆΠ΅ΡΡΡ Π΄ΠΎΡΡΠ°ΡΠΎΡΠ½ΠΎ ΠΏΠΎΡ ΠΎΠΆΠΈΠΌ Π½Π° Π²Π°Ρ ΡΠ»ΡΡΠ°ΠΉ, ΡΡΠΎΠ±Ρ ΠΈΠΌΠ΅ΡΡ ΠΎΡΠ½ΠΎΡΠ΅Π½ΠΈΠ΅ ΠΊ Π΄Π΅Π»Ρ.
@aatch ΡΡΠΎΡ ΠΏΡΠΈΠΌΠ΅Ρ, ΠΏΠΎΡ ΠΎΠΆΠ΅, Π½Π΅ ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡΡΠ΅ΡΡΡ Ρ ΠΈΠ½ΡΡΠΈΡΠΈΠ²Π½ΠΎ ΠΏΠΎΠ½ΡΡΠ½ΡΠΌ ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ΠΌ ΠΏΡΠΈΠ·Π½Π°ΠΊΠ° ΠΏΡΠΈΠΌΠ΅ΡΠ°: https://play.rust-lang.org/?gist=97ff3c2f7f3e50bd3aef000dbfa2ca4e&version=nightly&backtrace=0
ΠΊΠΎΠ΄ ΡΠΏΠ΅ΡΠΈΠ°Π»ΠΈΠ·Π°ΡΠΈΠΈ ΡΠ²Π½ΠΎ Π·Π°ΠΏΡΠ΅ΡΠ°Π΅Ρ ΡΡΠΎ - ΡΠΌ. # 33481, ΡΡΠΎ Ρ ΠΈΠ·Π½Π°ΡΠ°Π»ΡΠ½ΠΎ Π΄ΡΠΌΠ°Π», ΡΡΠΎ ΡΡΠΎ ΠΎΡΠΈΠ±ΠΊΠ°, Π½ΠΎ ΠΎΠΊΠ°Π·Π°Π»ΠΎΡΡ ΠΏΡΠΎΠ±Π»Π΅ΠΌΠΎΠΉ Π΄ΠΈΠ°Π³Π½ΠΎΡΡΠΈΠΊΠΈ. ΠΠΎΠΈ PR ΠΏΠΎ ΡΠ»ΡΡΡΠ΅Π½ΠΈΡ Π΄ΠΈΠ°Π³Π½ΠΎΡΡΠΈΠΊΠΈ ΠΎΡΡΠ°Π»ΠΈΡΡ Π½Π΅Π·Π°ΠΌΠ΅ΡΠ΅Π½Π½ΡΠΌΠΈ, ΠΈ Ρ Π΄ΠΎΠ²ΠΎΠ»ΡΠ½ΠΎ Π΄ΠΎΠ»Π³ΠΎ Π½Π΅ Π΄ΠΎΠ²ΠΎΠ΄ΠΈΠ» ΠΈΡ Π΄ΠΎ ΠΏΠΎΡΠ»Π΅Π΄Π½Π΅ΠΉ Π²Π΅ΡΡΠΈΠΈ.
@rphmeier ΡΠ΅ΠΊΡΡ RFC ΠΏΡΠ΅Π΄ΠΏΠΎΠ»Π°Π³Π°Π΅Ρ, ΡΡΠΎ ΡΡΠΎ Π΄ΠΎΠ»ΠΆΠ½ΠΎ Π±ΡΡΡ ΡΠ°Π·ΡΠ΅ΡΠ΅Π½ΠΎ, Ρ ΠΎΡΡ ΡΡΠΎΡ ΠΏΡΠΈΠΌΠ΅Ρ ΡΠΊΠΎΠΏΠΈΡΠΎΠ²Π°Π½ ΠΈΠ· Π½Π΅Π³ΠΎ.
Π― ΠΏΠΎΠΈΠ³ΡΠ°Π»ΡΡ Ρ ΠΊΠΎΠ΄ΠΎΠΌ, ΠΊΠΎΡΠΎΡΡΠΉ ΠΌΠΎΠ³ Π±Ρ Π²ΡΠΈΠ³ΡΠ°ΡΡ ΠΎΡ ΡΠΏΠ΅ΡΠΈΠ°Π»ΠΈΠ·Π°ΡΠΈΠΈ. Π― ΡΠ²Π΅ΡΠ΄ΠΎ ΡΡΠΈΡΠ°Ρ, ΡΡΠΎ ΠΌΡ Π΄ΠΎΠ»ΠΆΠ½Ρ ΠΏΡΠΈΠ΄Π΅ΡΠΆΠΈΠ²Π°ΡΡΡΡ ΠΏΡΠ°Π²ΠΈΠ»Π° ΡΠ΅ΡΠ΅ΡΠΊΠΈ, Π° Π½Π΅ ΡΠ΅ΠΏΠΎΡΠΊΠΈ - ΡΡΠΎ ΠΊΠ°ΠΆΠ΅ΡΡΡ Π΅ΡΡΠ΅ΡΡΠ²Π΅Π½Π½ΡΠΌ ΠΈ Π΅Π΄ΠΈΠ½ΡΡΠ²Π΅Π½Π½ΡΠΌ ΡΠΏΠΎΡΠΎΠ±ΠΎΠΌ ΠΏΠΎΠ»ΡΡΠΈΡΡ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΡΡ ΠΌΠ½Π΅ Π³ΠΈΠ±ΠΊΠΎΡΡΡ (Π°ΡΡΠΈΠΊΡ).
ΠΡΠ»ΠΈ Π±Ρ ΠΌΡ Π²ΡΠ±ΡΠ°Π»ΠΈ default
Π΄Π»Ρ impl
Π° ΡΠ°ΠΊΠΆΠ΅ Π΄Π»Ρ ΠΎΡΠ΄Π΅Π»ΡΠ½ΡΡ
ΡΠ»Π΅ΠΌΠ΅Π½ΡΠΎΠ², ΠΌΠΎΠ³Π»ΠΈ Π±Ρ ΠΌΡ Π΄ΠΎΠ±ΠΈΡΡΡΡ, ΡΡΠΎΠ±Ρ Π΅ΡΠ»ΠΈ ΠΊΠ°ΠΊΠΎΠΉ-Π»ΠΈΠ±ΠΎ ΡΠ»Π΅ΠΌΠ΅Π½Ρ Π±ΡΠ» ΠΏΠ΅ΡΠ΅ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½, ΡΠΎ Π΄ΠΎΠ»ΠΆΠ½Ρ Π±ΡΠ»ΠΈ Π±ΡΡΡ Π²ΡΠ΅ ΠΎΠ½ΠΈ? ΠΡΠΎ ΠΏΠΎΠ·Π²ΠΎΠ»ΠΈΠ»ΠΎ Π±Ρ Π½Π°ΠΌ ΡΠ°ΡΡΡΠΆΠ΄Π°ΡΡ, ΠΎΡΠ½ΠΎΠ²ΡΠ²Π°ΡΡΡ Π½Π° ΡΠΎΡΠ½ΠΎΠΌ ΡΠΈΠΏΠ΅ Π°ΡΡΠΎΡΠΈΠ°ΡΠΈΠ²Π½ΠΎΠ³ΠΎ ΡΠΈΠΏΠ° ΠΏΠΎ ΡΠΌΠΎΠ»ΡΠ°Π½ΠΈΡ (Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ) Π² Π΄ΡΡΠ³ΠΈΡ
ΡΠ»Π΅ΠΌΠ΅Π½ΡΠ°Ρ
, ΡΡΠΎ ΠΊΠ°ΠΆΠ΅ΡΡΡ ΠΏΠΎΠ»Π΅Π·Π½ΡΠΌ ΠΏΠΎΠ²ΡΡΠ΅Π½ΠΈΠ΅ΠΌ Π²ΡΡΠ°Π·ΠΈΡΠ΅Π»ΡΠ½ΠΎΡΡΠΈ.
Π‘Π»Π΅Π΄ΡΠ΅Ρ Π»ΠΈ ΡΠ°Π·ΡΠ΅ΡΠΈΡΡ ΡΠ»Π΅Π΄ΡΡΡΠ΅Π΅? Π― Ρ
ΠΎΡΡ ΡΠΏΠ΅ΡΠΈΠ°Π»ΠΈΠ·ΠΈΡΠΎΠ²Π°ΡΡ ΡΠΈΠΏ ΡΠ°ΠΊ, ΡΡΠΎΠ±Ρ ArrayVec Π±ΡΠ» Copy
ΠΊΠΎΠ³Π΄Π° Π΅Π³ΠΎ ΡΠΈΠΏ ΡΠ»Π΅ΠΌΠ΅Π½ΡΠ° - Copy, ΠΈ ΡΡΠΎΠ±Ρ ΠΎΠ½ Π² ΠΏΡΠΎΡΠΈΠ²Π½ΠΎΠΌ ΡΠ»ΡΡΠ°Π΅ ΠΈΠΌΠ΅Π» Π΄Π΅ΡΡΡΡΠΊΡΠΎΡ. Π― ΠΏΡΡΠ°ΡΡΡ Π΄ΠΎΠ±ΠΈΡΡΡΡ ΡΡΠΎΠ³ΠΎ, ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡ Π²Π½ΡΡΡΠ΅Π½Π½Π΅Π΅ ΠΏΠΎΠ»Π΅, Π·Π°ΠΌΠ΅Π½Π΅Π½Π½ΠΎΠ΅ Π½Π° ΡΠΏΠ΅ΡΠΈΠ°Π»ΠΈΠ·Π°ΡΠΈΡ.
Π― Π½Π°Π΄Π΅ΡΠ»ΡΡ, ΡΡΠΎ ΡΡΠΎ Π±ΡΠ΄Π΅Ρ ΡΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡΠΎΠ²Π°Π½ΠΎ, Ρ.Π΅. ΡΡΠΎ ΠΎΠ½ Π²ΡΠ²ΠΎΠ΄ΠΈΡ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΡ ΠΊΠΎΠΏΠΈΡΠΎΠ²Π°Π½ΠΈΡ ΠΏΠΎΠ»Π΅ΠΉ ArrayVec<A>
ΠΈΠ· ΡΠΈΠΏΠΎΠ² ΠΏΠΎΠ»Π΅ΠΉ, ΠΊΠΎΡΠΎΡΡΠ΅ Π²ΡΠ±ΠΈΡΠ°ΡΡΡΡ ΡΠ²ΡΠ·ΡΡ A: Copy + Array
(ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡΡΠ΅ΠΌΡΠΉ ΡΡΠ°Π³ΠΌΠ΅Π½Ρ Π½Π° ΠΈΠ³ΡΠΎΠ²ΠΎΠΉ ΠΏΠ»ΠΎΡΠ°Π΄ΠΊΠ΅) .
impl<A: Copy + Array> Copy for ArrayVec<A>
//where <A as Repr>::Data: Copy
{ }
ΠΠ°ΠΊΠΎΠΌΠΌΠ΅Π½ΡΠΈΡΠΎΠ²Π°Π½Π½ΠΎΠ΅ ΠΏΡΠ΅Π΄Π»ΠΎΠΆΠ΅Π½ΠΈΠ΅ where Π½Π΅ ΡΡΠ΅Π±ΡΠ΅ΡΡΡ, ΠΏΠΎΡΠΊΠΎΠ»ΡΠΊΡ ΠΎΠ½ΠΎ ΠΏΡΠ΅Π΄ΠΎΡΡΠ°Π²Π»ΡΠ΅Ρ ΡΠ°ΡΡΠ½ΡΠΉ ΡΠΈΠΏ Repr
Π² ΠΎΠ±ΡΠ΅Π΄ΠΎΡΡΡΠΏΠ½ΠΎΠΌ ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡΠ΅. (ΠΠΎ Π²ΡΡΠΊΠΎΠΌ ΡΠ»ΡΡΠ°Π΅, ΡΡΠΎ ΡΠΎΠΆΠ΅ ΠΠΠ‘).
ΠΠ·ΠΌΠ΅Π½ΠΈΡΡ: Ρ Π·Π°Π±ΡΠ», ΡΡΠΎ ΡΠΆΠ΅ ΡΠΎΠΎΠ±ΡΠ°Π» ΠΎΠ± ΡΡΠΎΠΌ ΠΎ ΠΏΡΠΎΠ±Π»Π΅ΠΌΠ΅ β 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
Π½ΠΎ _Π½Π΅_ 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. (Π― Π½Π΅ ΡΠ²Π΅ΡΠ΅Π½, Π΅ΡΡΡ Π»ΠΈ ΡΠΏΠΎΡΠΎΠ± ΡΠ΄Π΅Π»Π°ΡΡ ΡΡΠΎ ΠΈΡΠΊΠ»ΡΡΠΈΡΠ΅Π»ΡΠ½ΠΎ Π² ΠΈΠΌΠΏΠ»ΠΈΠΊΠ°Π½ΡΠ΅.)
PS, ΠΈΠ·Π²ΠΈΠ½ΠΈΡΠ΅ Π·Π° Π΄ΠΎΠ»Π³ΡΡ Π·Π°Π΄Π΅ΡΠΆΠΊΡ Ρ ΠΎΡΠ²Π΅ΡΠΎΠΌ Π½Π° Π²Π°ΡΠΈ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΡ, Ρ Π²ΠΈΠΆΡ Π΄Π°ΡΡ ΠΎΡ _July_.
Π₯ΠΎΡΡ impl Trait Π΄Π΅ΠΉΡΡΠ²ΠΈΡΠ΅Π»ΡΠ½ΠΎ ΠΏΠΎΠΌΠΎΠ³Π°Π΅Ρ, Π½Π΅ ΡΡΡΠ΅ΡΡΠ²ΡΠ΅Ρ RFC, ΠΊΠΎΡΠΎΡΡΠΉ Π±ΡΠ» ΠΏΡΠΈΠ½ΡΡ ΠΈΠ»ΠΈ ΡΠ΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½, ΠΊΠΎΡΠΎΡΡΠΉ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ΅Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ Π΅Π³ΠΎ Ρ ΡΠ΅Π»Π°ΠΌΠΈ ΠΏΡΠΈΠ·Π½Π°ΠΊΠΎΠ² Π² Π»ΡΠ±ΠΎΠΉ ΡΠΎΡΠΌΠ΅, ΠΏΠΎΡΡΠΎΠΌΡ ΠΈΡΠΊΠ°ΡΡ Π΅Π³ΠΎ Π΄Π»Ρ ΡΡΠΎΠ³ΠΎ RFC ΠΊΠ°ΠΆΠ΅ΡΡΡ Π½Π΅ΠΌΠ½ΠΎΠ³ΠΎ ΡΡΡΠ°Π½Π½ΡΠΌ.
ΠΠ΅Π½Ρ ΠΈΠ½ΡΠ΅ΡΠ΅ΡΡΠ΅Ρ ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΡ ΡΡΠ½ΠΊΡΠΈΠΈ default impl
(Π³Π΄Π΅ Π²ΡΠ΅ ΡΠ»Π΅ΠΌΠ΅Π½ΡΡ - default
).
ΠΡ Π±Ρ ΠΏΡΠΈΠ½ΡΠ»ΠΈ ΡΡΠ°ΡΡΠΈΠ΅ Π² ΡΡΠΎΠΌ?
@giannicic ΠΠΏΡΠ΅Π΄Π΅Π»Π΅Π½Π½ΠΎ! Π― Π±ΡΠ» Π±Ρ ΡΠ°Π΄ ΡΠ°ΠΊΠΆΠ΅ ΠΏΠΎΠΌΠΎΡΡ Π½Π°ΡΡΠ°Π²Π½ΠΈΠΊΠΎΠΌ Π² ΡΠ°Π±ΠΎΡΠ΅.
ΠΡΡΡ Π»ΠΈ Π² Π½Π°ΡΡΠΎΡΡΠ΅Π΅ Π²ΡΠ΅ΠΌΡ Π·Π°ΠΊΠ»ΡΡΠ΅Π½ΠΈΠ΅ ΠΎ ΡΠΎΠΌ, Π΄ΠΎΠ»ΠΆΠ½Ρ Π»ΠΈ Π°ΡΡΠΎΡΠΈΠΈΡΠΎΠ²Π°Π½Π½ΡΠ΅ ΡΠΈΠΏΡ Π±ΡΡΡ ΡΠΏΠ΅ΡΠΈΠ°Π»ΠΈΠ·ΠΈΡΠΎΠ²Π°Π½Π½ΡΠΌΠΈ?
ΠΠΈΠΆΠ΅ ΠΏΡΠΈΠ²ΠΎΠ΄ΠΈΡΡΡ ΡΠΏΡΠΎΡΠ΅Π½ΠΈΠ΅ ΠΌΠΎΠ΅Π³ΠΎ Π²Π°ΡΠΈΠ°Π½ΡΠ° ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΡ, Π΄Π΅ΠΌΠΎΠ½ΡΡΡΠΈΡΡΡΡΠ΅Π΅ ΠΏΠΎΡΡΠ΅Π±Π½ΠΎΡΡΡ Π² ΡΠΏΠ΅ΡΠΈΠ°Π»ΠΈΠ·ΠΈΡΠΎΠ²Π°Π½Π½ΡΡ
ΡΠ²ΡΠ·Π°Π½Π½ΡΡ
ΡΠΈΠΏΠ°Ρ
.
Π£ ΠΌΠ΅Π½Ρ Π΅ΡΡΡ ΠΎΠ±ΡΠ°Ρ ΡΡΡΡΠΊΡΡΡΠ° Π΄Π°Π½Π½ΡΡ
, ΡΠΊΠ°ΠΆΠ΅ΠΌ 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::<_>());
}
}
Π‘ΠΏΠ°ΡΠΈΠ±ΠΎ @aturon !
Π ΠΎΡΠ½ΠΎΠ²Π½ΠΎΠΌ Ρ Π΄Π΅Π»Π°Ρ ΡΡΡ ΡΠ°Π±ΠΎΡΡ, Π΄ΠΎΠ±Π°Π²Π»ΡΡ Π½ΠΎΠ²ΡΠΉ Π°ΡΡΠΈΠ±ΡΡ Β«defaultnessΒ» Π² ΡΡΡΡΠΊΡΡΡΡ ast::ItemKind::Impl
(Π° Π·Π°ΡΠ΅ΠΌ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡ Π½ΠΎΠ²ΡΠΉ Π°ΡΡΠΈΠ±ΡΡ Π²ΠΌΠ΅ΡΡΠ΅ Ρ Π°ΡΡΠΈΠ±ΡΡΠΎΠΌ Β«defaultnessΒ» ΡΠ»Π΅ΠΌΠ΅Π½ΡΠ° 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
ΠΈ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡΠ΅ ΠΌΠ½Π΅ "Π·Π°ΠΏΡΠ΅ΡΠΈΡΡ" Π½Π΅ΠΊΠΎΡΠΎΡΡΠ΅ ΠΊΠΎΠΌΠ±ΠΈΠ½Π°ΡΠΈΠΈ, Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, ΡΡΠΎ A + C Π½ΠΈΠΊΠΎΠ³Π΄Π° Π½Π΅ Π΄ΠΎΠ»ΠΆΠ½ΠΎ ΠΏΡΠΎΠΈΡΡ ΠΎΠ΄ΠΈΡΡ:
ΠΠ΅Ρ, ΡΡΠΎ Π½Π΅ ΡΠΎ, ΡΡΠΎ ΡΠ°Π·ΡΠ΅ΡΠ°Π΅Ρ ΠΏΡΠ°Π²ΠΈΠ»ΠΎ ΡΠ΅ΡΠ΅ΡΠΊΠΈ. ΠΡΠΎ Π±ΡΠ»ΠΎ Π±Ρ Π±ΠΎΠ»ΡΡΠ΅ ΠΎΠ±Π»Π°ΡΡΡΡ Β«Π½Π΅Π³Π°ΡΠΈΠ²Π½ΡΡ ΡΠ°ΡΡΡΠΆΠ΄Π΅Π½ΠΈΠΉΒ» Π² ΡΠΎΠΉ ΠΈΠ»ΠΈ ΠΈΠ½ΠΎΠΉ ΡΠΎΡΠΌΠ΅.
ΠΠΎΠ½ΡΠ΅ΠΊΡΡ: Ρ Π·Π°Ρ ΠΎΡΠ΅Π» ΡΡΠΎΠ³ΠΎ ΠΏΡΠΈ ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΠΈ ΡΡΠ΅ΠΉΡΠ° ApproxEqual (Shape, Shape) Π΄Π»Ρ ΡΠ°Π·Π½ΡΡ ΡΠΈΠΏΠΎΠ² ΡΠΈΠ³ΡΡ (ΡΠΎΡΠ΅ΠΊ, ΠΊΡΠ±ΠΎΠ², ΠΌΠ½ΠΎΠ³ΠΎΡΠ³ΠΎΠ»ΡΠ½ΠΈΠΊΠΎΠ² ...), Π³Π΄Π΅ Π²ΡΠ΅ ΡΡΠΎ ΡΠ΅ΡΡΡ. ΠΠ½Π΅ ΠΏΡΠΈΡΠ»ΠΎΡΡ ΠΎΠ±ΠΎΠΉΡΠΈ ΡΡΠΎ, ΡΠ΅ΠΎΡΠ³Π°Π½ΠΈΠ·ΠΎΠ²Π°Π² ΡΡΠΎ Π² ΡΠ°Π·Π½ΡΠ΅ ΡΠ΅ΡΡΡ, Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, ApproxEqualPoint (Point, Point), ΡΡΠΎΠ±Ρ ΠΈΠ·Π±Π΅ΠΆΠ°ΡΡ ΠΊΠΎΠ½ΡΠ»ΠΈΠΊΡΡΡΡΠΈΡ ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΠΉ.
ΠΡΠ°ΠΊ, @withoutboats ΠΏΡΠΎΠ΄Π²ΠΈΠ³Π°Π΅Ρ ΠΈΠ΄Π΅Ρ Β«Π³ΡΡΠΏΠΏ ΠΈΡΠΊΠ»ΡΡΠ΅Π½ΠΈΡΒ», Π³Π΄Π΅ Π²Ρ ΠΌΠΎΠΆΠ΅ΡΠ΅ ΠΎΠ±ΡΡΠ²ΠΈΡΡ, ΡΡΠΎ ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½Π½ΡΠΉ Π½Π°Π±ΠΎΡ Ρ Π°ΡΠ°ΠΊΡΠ΅ΡΠΈΡΡΠΈΠΊ ΡΠ²Π»ΡΠ΅ΡΡΡ Π²Π·Π°ΠΈΠΌΠΎΠΈΡΠΊΠ»ΡΡΠ°ΡΡΠΈΠΌ (Ρ.
@nikomatsakis :
ΠΡΠ°ΠΊ, @withoutboats ΠΏΡΠΎΠ΄Π²ΠΈΠ³Π°Π΅Ρ ΠΈΠ΄Π΅Ρ Β«Π³ΡΡΠΏΠΏ ΠΈΡΠΊΠ»ΡΡΠ΅Π½ΠΈΡΒ», Π³Π΄Π΅ Π²Ρ ΠΌΠΎΠΆΠ΅ΡΠ΅ ΠΎΠ±ΡΡΠ²ΠΈΡΡ, ΡΡΠΎ ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½Π½ΡΠΉ Π½Π°Π±ΠΎΡ Ρ Π°ΡΠ°ΠΊΡΠ΅ΡΠΈΡΡΠΈΠΊ ΡΠ²Π»ΡΠ΅ΡΡΡ Π²Π·Π°ΠΈΠΌΠΎΠΈΡΠΊΠ»ΡΡΠ°ΡΡΠΈΠΌ (Ρ.
Π― Π΄ΡΠΌΠ°Π» ΠΎ Π³ΡΡΠΏΠΏΠ°Ρ
ΠΈΡΠΊΠ»ΡΡΠ΅Π½ΠΈΠΉ, ΠΊΠΎΠ³Π΄Π° ΠΏΠΈΡΠ°Π» ΡΡΠΎ (Π²Ρ ΡΠΏΠΎΠΌΡΠ½ΡΠ»ΠΈ ΠΎΠ± ΡΡΠΎΠΌ Π½Π° ΡΠΎΡΡΠΌΠ΅ Π½Π° Π΄Π½ΡΡ
), Π½ΠΎ Ρ Π½Π΅ Π΄ΡΠΌΠ°Ρ, ΡΡΠΎ ΠΎΠ½ΠΈ ΠΌΠΎΠ³ΡΡ ΡΠ°Π±ΠΎΡΠ°ΡΡ, ΠΏΠΎΡΠΊΠΎΠ»ΡΠΊΡ Π² ΡΡΠΎΠΌ ΠΊΠΎΠ½ΠΊΡΠ΅ΡΠ½ΠΎΠΌ ΠΏΡΠΈΠΌΠ΅ΡΠ΅ Π½Π΅ Π²ΡΠ΅ ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΠΈ ΡΡΠ΅ΠΉΡΠΎΠ² ΡΠ²Π»ΡΡΡΡΡ ΡΠΊΡΠΊΠ»ΡΠ·ΠΈΠ²Π½ΡΠΌΠΈ. Π‘Π°ΠΌΡΠΉ ΡΡΠΈΠ²ΠΈΠ°Π»ΡΠ½ΡΠΉ ΠΏΡΠΈΠΌΠ΅Ρ - ΡΡΠΎ ΡΠ΅ΡΡΡ Point
ΠΈ Float
: Float
_ ΠΌΠΎΠΆΠ΅Ρ Π±ΡΡΡ 1D ΡΠΎΡΠΊΠΎΠΉ, ΠΏΠΎΡΡΠΎΠΌΡ ApproxEqualPoint(Point, Point)
ΠΈ ApproxEqualFloat(Float, Float)
Π½Π΅ ΠΌΠΎΠ³ΡΡ Π±ΡΡΡ ΡΠΊΡΠΊΠ»ΡΠ·ΠΈΠ²Π½ΡΠΉ. ΠΡΡΡ ΠΈ Π΄ΡΡΠ³ΠΈΠ΅ ΠΏΡΠΈΠΌΠ΅ΡΡ, Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ Square
ΠΈ Polygon
ΠΈΠ»ΠΈ Box
| Cube
ΠΈ AABB
(ΠΎΠ³ΡΠ°Π½ΠΈΡΠΈΠ²Π°ΡΡΠ°Ρ ΡΠ°ΠΌΠΊΠ°, Π²ΡΡΠΎΠ²Π½Π΅Π½Π½Π°Ρ ΠΏΠΎ ΠΎΡΠΈ), Π³Π΄Π΅ Β«ΠΈΠ΅ΡΠ°ΡΡ
ΠΈΡ ΠΏΡΠΈΠ·Π½Π°ΠΊΠΎΠ²Β» Π΄Π΅ΠΉΡΡΠ²ΠΈΡΠ΅Π»ΡΠ½ΠΎ ΡΡΠ΅Π±ΡΠ΅Ρ Π±ΠΎΠ»Π΅Π΅ ΡΠ»ΠΎΠΆΠ½ΡΡ
ΠΎΠ³ΡΠ°Π½ΠΈΡΠ΅Π½ΠΈΠΉ.
ΠΠ΅Ρ, ΡΡΠΎ Π½Π΅ ΡΠΎ, ΡΡΠΎ ΡΠ°Π·ΡΠ΅ΡΠ°Π΅Ρ ΠΏΡΠ°Π²ΠΈΠ»ΠΎ ΡΠ΅ΡΠ΅ΡΠΊΠΈ. ΠΡΠΎ Π±ΡΠ»ΠΎ Π±Ρ Π±ΠΎΠ»ΡΡΠ΅ ΠΎΠ±Π»Π°ΡΡΡΡ Β«Π½Π΅Π³Π°ΡΠΈΠ²Π½ΡΡ ΡΠ°ΡΡΡΠΆΠ΄Π΅Π½ΠΈΠΉΒ» Π² ΡΠΎΠΉ ΠΈΠ»ΠΈ ΠΈΠ½ΠΎΠΉ ΡΠΎΡΠΌΠ΅.
Π― Π±Ρ, ΠΏΠΎ ΠΊΡΠ°ΠΉΠ½Π΅ΠΉ ΠΌΠ΅ΡΠ΅, ΡΠΌΠΎΠ³ ΡΠ΅Π°Π»ΠΈΠ·ΠΎΠ²Π°ΡΡ ΠΊΠΎΠ½ΠΊΡΠ΅ΡΠ½ΡΠΉ ΡΠ»ΡΡΠ°ΠΉ ΠΈ Π²ΡΡΠ°Π²ΠΈΡΡ Π² Π½Π΅Π³ΠΎ unimplemented!()
. ΠΡΠΎΠ³ΠΎ Π±ΡΠ»ΠΎ Π±Ρ Π΄ΠΎΡΡΠ°ΡΠΎΡΠ½ΠΎ, Π½ΠΎ, ΠΎΡΠ΅Π²ΠΈΠ΄Π½ΠΎ, ΠΌΠ½Π΅ Π±Ρ Π±ΠΎΠ»ΡΡΠ΅ Ρ
ΠΎΡΠ΅Π»ΠΎΡΡ, ΡΡΠΎΠ±Ρ ΠΊΠΎΠΌΠΏΠΈΠ»ΡΡΠΎΡ ΡΡΠ°ΡΠΈΡΠ΅ΡΠΊΠΈ Π»ΠΎΠ²ΠΈΠ» ΡΠ΅ ΡΠ»ΡΡΠ°ΠΈ, Π² ΠΊΠΎΡΠΎΡΡΡ
Ρ Π²ΡΠ·ΡΠ²Π°Ρ ΡΡΠ½ΠΊΡΠΈΡ Ρ unimplemented!()
Π² Π½Π΅ΠΉ (ΠΈ Π½Π° Π΄Π°Π½Π½ΡΠΉ ΠΌΠΎΠΌΠ΅Π½Ρ ΠΌΡ ΡΠ½ΠΎΠ²Π° Π½Π°Ρ
ΠΎΠ΄ΠΈΠΌΡΡ Π² Π·ΠΎΠ½Π΅ ΠΎΡΡΠΈΡΠ°ΡΠ΅Π»ΡΠ½ΡΡ
ΡΠ°ΡΡΡΠΆΠ΄Π΅Π½ΠΈΠΉ) .
Π‘ΠΏΠ΅ΡΠΈΠ°Π»ΠΈΠ·Π°ΡΠΈΡ ΡΠ΅ΡΠ΅ΡΠΊΠΈ cry :.
ΠΠ΄Π΅Ρ Β«Π³ΡΡΠΏΠΏ ΠΈΡΠΊΠ»ΡΡΠ΅Π½ΠΈΡΒ» Π½Π° ΡΠ°ΠΌΠΎΠΌ Π΄Π΅Π»Π΅ ΡΠ²Π»ΡΠ΅ΡΡΡ ΠΏΡΠΎΡΡΠΎ ΠΎΡΡΠΈΡΠ°ΡΠ΅Π»ΡΠ½ΡΠΌΠΈ Π³ΡΠ°Π½ΠΈΡΠ°ΠΌΠΈ ΡΡΠΏΠ΅ΡΡΠ΅ΠΌΠ΅ΠΉΡΠ°. ΠΠ΄Π½Π° Π²Π΅ΡΡ, ΠΊΠΎΡΠΎΡΡΡ ΠΌΡ Π½Π΅ ΠΈΡΡΠ»Π΅Π΄ΠΎΠ²Π°Π»ΠΈ ΡΠ»ΠΈΡΠΊΠΎΠΌ ΡΡΠ°ΡΠ΅Π»ΡΠ½ΠΎ, - ΡΡΠΎ ΠΏΠΎΠ½ΡΡΠΈΠ΅ ΡΠΏΠ΅ΡΠΈΠ°Π»ΠΈΠ·Π°ΡΠΈΠΈ ΠΎΠ±ΡΠ°ΡΠ½ΠΎΠΉ ΠΏΠΎΠ»ΡΡΠ½ΠΎΡΡΠΈ, ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡΡΠ΅Π΅ Π²Π°ΠΌ Π½Π°ΠΏΠΈΡΠ°ΡΡ ΡΠΏΠ΅ΡΠΈΠ°Π»ΠΈΠ·ΠΈΡΠΎΠ²Π°Π½Π½ΡΠΉ ΠΈΠΌΠΏΠ»Π°Π½Ρ Ρ ΠΎΠ±ΡΠ°ΡΠ½ΠΎΠΉ ΠΏΠΎΠ»ΡΡΠ½ΠΎΡΡΡΡ Π΄Π»Ρ Π΅Π³ΠΎ ΠΌΠ΅Π½Π΅Π΅ ΡΠΏΠ΅ΡΠΈΠ°Π»ΠΈΠ·ΠΈΡΠΎΠ²Π°Π½Π½ΠΎΠ³ΠΎ ΠΈΠΌΠΏΠ»Π°Π½ΡΠ°ΡΠ°. ΠΠ°ΠΏΡΠΈΠΌΠ΅Ρ, Π² ΡΡΠΎΠΌ ΡΠ»ΡΡΠ°Π΅ Π²Ρ ΠΏΡΠΎΡΡΠΎ Π½Π°ΠΏΠΈΡΠΈΡΠ΅:
impl<T> !Foo for T where T: A + C { }
Π― Π½Π΅ ΡΠΎΠ²ΡΠ΅ΠΌ ΡΠ²Π΅ΡΠ΅Π½, ΠΊΠ°ΠΊΠΎΠ²Ρ ΠΏΠΎΡΠ»Π΅Π΄ΡΡΠ²ΠΈΡ ΡΡΠΎΠ³ΠΎ ΡΠ°Π·ΡΠ΅ΡΠ΅Π½ΠΈΡ. Π― Π΄ΡΠΌΠ°Ρ, ΡΡΠΎ ΡΠ²ΡΠ·Π°Π½ΠΎ Ρ ΠΏΡΠΎΠ±Π»Π΅ΠΌΠ°ΠΌΠΈ, ΠΊΠΎΡΠΎΡΡΠ΅ ΠΠΈΠΊΠΎ ΡΠΆΠ΅ ΠΏΠΎΠ΄ΡΠ΅ΡΠΊΠΈΠ²Π°Π», ΠΎ ΡΠΎΠΌ, ΡΡΠΎ ΡΠΏΠ΅ΡΠΈΠ°Π»ΠΈΠ·Π°ΡΠΈΡ ΡΠ²Π»ΡΠ΅ΡΡΡ ΡΠ²ΠΎΠ΅Π³ΠΎ ΡΠΎΠ΄Π° ΠΎΠ±ΡΠ΅Π΄ΠΈΠ½Π΅Π½ΠΈΠ΅ΠΌ ΠΏΠΎΠ²ΡΠΎΡΠ½ΠΎΠ³ΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΡ ΠΊΠΎΠ΄Π° Ρ ΠΏΠΎΠ»ΠΈΠΌΠΎΡΡΠΈΠ·ΠΌΠΎΠΌ ΠΏΡΡΠΌΠΎ ΡΠ΅ΠΉΡΠ°Ρ.
ΠΡΠΈ Π²ΡΠ΅ΠΌ ΡΡΠΎΠΌ ΠΎΠ±ΡΡΠΆΠ΄Π΅Π½ΠΈΠΈ Π½Π΅Π³Π°ΡΠΈΠ²Π½ΡΡ ΡΠ°ΡΡΡΠΆΠ΄Π΅Π½ΠΈΠΉ ΠΈ Π½Π΅Π³Π°ΡΠΈΠ²Π½ΡΡ ΠΈΠΌΠΏΠ»ΠΈΠΊΠ°ΡΠΈΠΉ Ρ ΡΡΠ²ΡΡΠ²ΡΡ ΡΠ΅Π±Ρ ΠΎΠ±ΡΠ·Π°Π½Π½ΡΠΌ ΡΠ½ΠΎΠ²Π° Π²ΡΠΏΠΎΠΌΠ½ΠΈΡΡ ΡΡΠ°ΡΡΡ ΠΈΠ΄Π΅Ρ Haskell ΠΎ Β«ΡΠ΅ΠΏΠΎΡΠΊΠ°Ρ ΡΠΊΠ·Π΅ΠΌΠΏΠ»ΡΡΠΎΠ²Β» ( Π±ΡΠΌΠ°Π³Π° , Π±ΡΠΌΠ°Π³Π° , ΡΠΈΡΡΠ΅ΠΌΠ° ΠΎΡΡΠ»Π΅ΠΆΠΈΠ²Π°Π½ΠΈΡ ΠΏΡΠΎΠ±Π»Π΅ΠΌ GHC , ΠΏΡΠ΅Π΄Π²Π°ΡΠΈΡΠ΅Π»ΡΠ½ΡΠΉ RFC Rust ) ΠΊΠ°ΠΊ ΠΏΠΎΡΠ΅Π½ΡΠΈΠ°Π»ΡΠ½ΡΠΉ ΠΈΡΡΠΎΡΠ½ΠΈΠΊ Π²Π΄ΠΎΡ Π½ΠΎΠ²Π΅Π½ΠΈΡ Π΅ΡΠ΅.
ΠΠΎ ΡΡΡΠΈ, ΠΈΠ΄Π΅Ρ ΡΠΎΡΡΠΎΠΈΡ Π² ΡΠΎΠΌ, ΡΡΠΎ Π²Π΅Π·Π΄Π΅, Π³Π΄Π΅ Π²Ρ ΠΌΠΎΠΆΠ΅ΡΠ΅ Π½Π°ΠΏΠΈΡΠ°ΡΡ trait
impl, Π²Ρ ΡΠ°ΠΊΠΆΠ΅ ΠΌΠΎΠΆΠ΅ΡΠ΅ Π½Π°ΠΏΠΈΡΠ°ΡΡ Π»ΡΠ±ΠΎΠ΅ ΠΊΠΎΠ»ΠΈΡΠ΅ΡΡΠ²ΠΎ Β«else if clausesΒ», ΡΠΊΠ°Π·Π°Π² Π΄ΡΡΠ³ΠΎΠ΅ impl
ΠΊΠΎΡΠΎΡΠΎΠ΅ Π΄ΠΎΠ»ΠΆΠ½ΠΎ ΠΏΡΠΈΠΌΠ΅Π½ΡΡΡΡΡ Π² ΡΠ»ΡΡΠ°Π΅, Π΅ΡΠ»ΠΈ ΠΏΡΠ΅Π΄ΡΠ΄ΡΡΠΈΠ΅ Π½Π΅ ΡΠ΄Π΅Π»Π°Π», Ρ Π½Π΅ΠΎΠ±ΡΠ·Π°ΡΠ΅Π»ΡΠ½ΡΠΌ Π·Π°ΠΊΠ»ΡΡΠΈΡΠ΅Π»ΡΠ½ΡΠΌ ΠΏΡΠ΅Π΄Π»ΠΎΠΆΠ΅Π½ΠΈΠ΅ΠΌ else, ΡΠΊΠ°Π·ΡΠ²Π°ΡΡΠΈΠΌ ΠΎΡΡΠΈΡΠ°ΡΠ΅Π»ΡΠ½ΠΎΠ΅ 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
Π― ΠΌΠΎΠ³ Π±Ρ ΠΏΠΎΡΡΠ΅ΠΏΠ΅Π½Π½ΠΎ Π΄ΠΎΠ±Π°Π²Π»ΡΡΡ impls ΠΏΠΎ ΠΌΠ΅ΡΠ΅ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎΡΡΠΈ, Π° ΡΠ°ΠΊΠΆΠ΅ ΠΏΠΎΠ»ΡΡΠ°ΡΡ Ρ ΠΎΡΠΎΡΠΈΠ΅ ΠΎΡΠΈΠ±ΠΊΠΈ ΠΊΠΎΠΌΠΏΠΈΠ»ΡΡΠΎΡΠ°, ΠΊΠΎΠ³Π΄Π° ΠΏΡΡΠ°ΡΡΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ ΡΡΠ΅ΠΉΡ Ρ ΡΠΈΠΏΠΎΠΌ, Π΄Π»Ρ ΠΊΠΎΡΠΎΡΠΎΠ³ΠΎ Π½Π΅Ρ impl.
Π― Π½Π΅ ΡΠΎΠ²ΡΠ΅ΠΌ ΡΠ²Π΅ΡΠ΅Π½, ΠΊΠ°ΠΊΠΎΠ²Ρ ΠΏΠΎΡΠ»Π΅Π΄ΡΡΠ²ΠΈΡ ΡΡΠΎΠ³ΠΎ ΡΠ°Π·ΡΠ΅ΡΠ΅Π½ΠΈΡ.
ΠΠΈΠΊΠΎ ΡΠΏΠΎΠΌΡΠ½ΡΠ», ΡΡΠΎ Π΅ΡΡΡ ΠΏΡΠΎΠ±Π»Π΅ΠΌΡ Ρ ΠΎΡΡΠΈΡΠ°ΡΠ΅Π»ΡΠ½ΠΎΠΉ Π°ΡΠ³ΡΠΌΠ΅Π½ΡΠ°ΡΠΈΠ΅ΠΉ. FWIW Π΅Π΄ΠΈΠ½ΡΡΠ²Π΅Π½Π½ΠΎΠ΅, Π΄Π»Ρ ΡΠ΅Π³ΠΎ Π² ΠΏΡΠΈΠ²Π΅Π΄Π΅Π½Π½ΠΎΠΌ Π²ΡΡΠ΅ ΠΏΡΠΈΠΌΠ΅ΡΠ΅ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΡΡ ΠΎΡΡΠΈΡΠ°ΡΠ΅Π»ΡΠ½Π°Ρ Π°ΡΠ³ΡΠΌΠ΅Π½ΡΠ°ΡΠΈΡ, - ΡΡΠΎ ΡΠΊΠ°Π·Π°ΡΡ, ΡΡΠΎ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Ρ Π·Π½Π°Π΅Ρ, ΡΡΠΎ Π΄Π»Ρ ΠΊΠΎΠ½ΠΊΡΠ΅ΡΠ½ΠΎΠ³ΠΎ ΡΠ»ΡΡΠ°Ρ ΡΡΠ΅Π±ΡΠ΅ΡΡΡ impl, Π½ΠΎ ΡΠ²Π½ΠΎ ΡΠ΅ΡΠΈΠ» Π½Π΅ ΠΏΡΠ΅Π΄ΠΎΡΡΠ°Π²Π»ΡΡΡ Π΄Π»Ρ Π½Π΅Π³ΠΎ ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΡ.
Π― ΡΠΎΠ»ΡΠΊΠΎ ΡΡΠΎ Π½Π°ΠΆΠ°Π» # 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 ΠΈ @rphmeier, ΠΊΠΎΡΠΎΡΡΠ΅ ΠΎΡΠ²Π΅ΡΠΈΠ»ΠΈ.
#![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 Π½Π° ΠΏΡΠ΅Π΄ΠΌΠ΅Ρ Π½Π΅ΠΎΠΆΠΈΠ΄Π°Π½Π½ΠΎΠ³ΠΎ ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΡ, Ρ ΠΊΠΎΡΠΎΡΡΠΌ ΡΡΠΎΠ»ΠΊΠ½ΡΠ»ΡΡ, ΡΠ°Π±ΠΎΡΠ°Ρ Π½Π°Π΄ ΡΠΎΠ·Π΄Π°Π½ΠΈΠ΅ΠΌ ΡΠΏΠ΅ΡΠΈΠ°Π»ΠΈΠ·Π°ΡΠΈΠΈ Π² Serde. ΠΠΎΠ΄ΠΎΠ±Π½ΠΎ https://github.com/rust-lang/rust/issues/38167 , ΡΡΠΎ ΡΠ»ΡΡΠ°ΠΉ, ΠΊΠΎΠ³Π΄Π° ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ° ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡΡΠ΅ΡΡΡ Π±Π΅Π· ΡΠΏΠ΅ΡΠΈΠ°Π»ΠΈΠ·ΠΈΡΠΎΠ²Π°Π½Π½ΠΎΠ³ΠΎ impl, Π° ΠΏΡΠΈ Π΅Π³ΠΎ Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΠΈ Π²ΠΎΠ·Π½ΠΈΠΊΠ°Π΅Ρ ΠΎΡΠΈΠ±ΠΊΠ° ΡΠΈΠΏΠ°. cc @bluss , ΠΊΠΎΡΠΎΡΠΎΠ³ΠΎ ΡΠ°Π½Π΅Π΅ Π±Π΅ΡΠΏΠΎΠΊΠΎΠΈΠ»Π° ΡΡΠ° ΡΠΈΡΡΠ°ΡΠΈΡ.
Π§ΡΠΎ, Π΅ΡΠ»ΠΈ Π±Ρ ΠΌΡ ΡΠ°Π·ΡΠ΅ΡΠΈΠ»ΠΈ ΡΠΏΠ΅ΡΠΈΠ°Π»ΠΈΠ·Π°ΡΠΈΡ Π±Π΅Π· ΠΊΠ»ΡΡΠ΅Π²ΠΎΠ³ΠΎ ΡΠ»ΠΎΠ²Π° default
Π² ΠΎΠ΄Π½ΠΎΠΌ ΡΡΠΈΠΊΠ΅, Π°Π½Π°Π»ΠΎΠ³ΠΈΡΠ½ΠΎ ΡΠΎΠΌΡ, ΠΊΠ°ΠΊ ΠΌΡ ΡΠ°Π·ΡΠ΅ΡΠ°Π΅ΠΌ ΠΎΡΡΠΈΡΠ°ΡΠ΅Π»ΡΠ½ΡΠ΅ Π°ΡΠ³ΡΠΌΠ΅Π½ΡΡ Π² ΠΎΠ΄Π½ΠΎΠΌ ΡΡΠΈΠΊΠ΅?
ΠΠΎΠ΅ Π³Π»Π°Π²Π½ΠΎΠ΅ ΠΎΠΏΡΠ°Π²Π΄Π°Π½ΠΈΠ΅ ΡΠ°ΠΊΠΎΠ²ΠΎ: Β«ΡΠ°Π±Π»ΠΎΠ½ ΠΈΡΠ΅ΡΠ°ΡΠΎΡΠΎΠ² ΠΈ Π²Π΅ΠΊΡΠΎΡΠΎΠ²Β». ΠΠ½ΠΎΠ³Π΄Π° ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»ΠΈ Ρ ΠΎΡΡΡ ΡΠ΅Π°Π»ΠΈΠ·ΠΎΠ²Π°ΡΡ ΡΡΠΎ-ΡΠΎ Π΄Π»Ρ Π²ΡΠ΅Ρ ΠΈΡΠ΅ΡΠ°ΡΠΎΡΠΎΠ² ΠΈ Π²Π΅ΠΊΡΠΎΡΠΎΠ²:
impl<I> Foo for I where I: Iterator<Item = u32> { ... }
impl Foo for Vec<u32> { ... }
(ΠΡΠΎ ΠΎΡΠ½ΠΎΡΠΈΡΡΡ ΠΊ Π΄ΡΡΠ³ΠΈΠΌ ΡΠΈΡΡΠ°ΡΠΈΡΠΌ, ΠΊΡΠΎΠΌΠ΅ ΠΈΡΠ΅ΡΠ°ΡΠΎΡΠΎΠ² ΠΈ Π²Π΅ΠΊΡΠΎΡΠΎΠ², ΠΊΠΎΠ½Π΅ΡΠ½ΠΎ, ΡΡΠΎ ΡΠΎΠ»ΡΠΊΠΎ ΠΎΠ΄ΠΈΠ½ ΠΏΡΠΈΠΌΠ΅Ρ.)
Π‘Π΅Π³ΠΎΠ΄Π½Ρ ΡΡΠΎ Π½Π΅ ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡΡΠ΅ΡΡΡ, Π΅ΡΡΡ ΡΡΡΠΈΡ ΠΈ ΡΠΊΡΠ΅ΠΆΠ΅Ρ Π·ΡΠ±ΠΎΠ². Π‘ΠΏΠ΅ΡΠΈΠ°Π»ΠΈΠ·Π°ΡΠΈΡ ΡΠ΅ΡΠ°Π΅Ρ ΡΡΡ ΠΏΡΠΎΠ±Π»Π΅ΠΌΡ:
default impl<I> Foo for I where I: Iterator<Item = u32> { ... }
impl Foo for Vec<u32> { ... }
ΠΠΎ, ΡΠ΅ΡΠ°Ρ ΡΡΡ ΠΏΡΠΎΠ±Π»Π΅ΠΌΡ, Π²Ρ Π΄ΠΎΠ±Π°Π²ΠΈΠ»ΠΈ Π² ΡΠ²ΠΎΠΉ ΡΡΠΈΠΊ ΠΏΡΠ±Π»ΠΈΡΠ½ΡΠΉ ΠΊΠΎΠ½ΡΡΠ°ΠΊΡ: ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠ΅ΡΠ΅ΠΎΠΏΡΠ΅Π΄Π΅Π»ΠΈΡΡ ΠΈΡΠ΅ΡΠ°ΡΠΎΡ impl Foo
. ΠΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ, ΠΌΡ Π½Π΅ Ρ
ΠΎΡΠΈΠΌ Π·Π°ΡΡΠ°Π²Π»ΡΡΡ Π²Π°Ρ ΡΡΠΎ Π΄Π΅Π»Π°ΡΡ - ΡΠ»Π΅Π΄ΠΎΠ²Π°ΡΠ΅Π»ΡΠ½ΠΎ, Π»ΠΎΠΊΠ°Π»ΡΠ½Π°Ρ ΡΠΏΠ΅ΡΠΈΠ°Π»ΠΈΠ·Π°ΡΠΈΡ Π±Π΅Π· default
.
Π― ΠΏΠΎΠ»Π°Π³Π°Ρ, Π²ΠΎΠΏΡΠΎΡ Π² ΡΠΎΠΌ, Π² ΡΠ΅ΠΌ ΠΈΠΌΠ΅Π½Π½ΠΎ Π·Π°ΠΊΠ»ΡΡΠ°Π΅ΡΡΡ ΡΠΎΠ»Ρ default
. Π’ΡΠ΅Π±ΠΎΠ²Π°Π½ΠΈΠ΅ default
Π±ΡΠ»ΠΎ, Ρ Π΄ΡΠΌΠ°Ρ, ΠΈΠ·Π½Π°ΡΠ°Π»ΡΠ½ΠΎ ΠΆΠ΅ΡΡΠΎΠΌ Π² ΡΡΠΎΡΠΎΠ½Ρ ΡΡΠ½ΠΎΡΡΠΈ ΠΈ ΡΠ°ΠΌΠΎΠ΄ΠΎΠΊΡΠΌΠ΅Π½ΡΠΈΡΠΎΠ²Π°Π½ΠΈΡ ΠΊΠΎΠ΄Π°. Π’Π°ΠΊ ΠΆΠ΅, ΠΊΠ°ΠΊ ΠΊΠΎΠ΄ Rust ΠΏΠΎ ΡΠΌΠΎΠ»ΡΠ°Π½ΠΈΡ Π½Π΅ΠΈΠ·ΠΌΠ΅Π½ΡΠ΅ΠΌΡΠΉ, Π·Π°ΠΊΡΡΡΡΠΉ ΠΏΠΎ ΡΠΌΠΎΠ»ΡΠ°Π½ΠΈΡ, Π±Π΅Π·ΠΎΠΏΠ°ΡΠ½ΡΠΉ ΠΏΠΎ ΡΠΌΠΎΠ»ΡΠ°Π½ΠΈΡ, ΠΎΠ½ ΡΠ°ΠΊΠΆΠ΅ Π΄ΠΎΠ»ΠΆΠ΅Π½ Π±ΡΡΡ ΠΎΠΊΠΎΠ½ΡΠ°ΡΠ΅Π»ΡΠ½ΡΠΌ ΠΏΠΎ ΡΠΌΠΎΠ»ΡΠ°Π½ΠΈΡ. ΠΠ΄Π½Π°ΠΊΠΎ, ΠΏΠΎΡΠΊΠΎΠ»ΡΠΊΡ Β«Π½Π΅ΡΠΈΠ½Π°Π»ΡΠ½ΠΎΡΡΡΒ» - ΡΡΠΎ Π³Π»ΠΎΠ±Π°Π»ΡΠ½ΠΎΠ΅ ΡΠ²ΠΎΠΉΡΡΠ²ΠΎ, Ρ Π½Π΅ ΠΌΠΎΠ³Ρ ΡΠΏΠ΅ΡΠΈΠ°Π»ΠΈΠ·ΠΈΡΠΎΠ²Π°ΡΡ ΡΠ»Π΅ΠΌΠ΅Π½Ρ, Π΅ΡΠ»ΠΈ Π½Π΅ ΠΏΠΎΠ·Π²ΠΎΠ»Ρ Π²Π°ΠΌ ΡΠΏΠ΅ΡΠΈΠ°Π»ΠΈΠ·ΠΈΡΠΎΠ²Π°ΡΡ ΡΠ»Π΅ΠΌΠ΅Π½Ρ.
Π’ΡΠ΅Π±ΠΎΠ²Π°Π½ΠΈΠ΅
default
Π±ΡΠ»ΠΎ, Ρ Π΄ΡΠΌΠ°Ρ, ΠΈΠ·Π½Π°ΡΠ°Π»ΡΠ½ΠΎ ΠΆΠ΅ΡΡΠΎΠΌ Π² ΡΡΠΎΡΠΎΠ½Ρ ΡΡΠ½ΠΎΡΡΠΈ ΠΈ ΡΠ°ΠΌΠΎΠ΄ΠΎΠΊΡΠΌΠ΅Π½ΡΠΈΡΠΎΠ²Π°Π½ΠΈΡ ΠΊΠΎΠ΄Π°. ΠΠ΄Π½Π°ΠΊΠΎ [..] Ρ Π½Π΅ ΠΌΠΎΠ³Ρ ΡΠΏΠ΅ΡΠΈΠ°Π»ΠΈΠ·ΠΈΡΠΎΠ²Π°ΡΡ ΠΏΡΠ΅Π΄ΠΌΠ΅Ρ, Π΅ΡΠ»ΠΈ Ρ Π½Π΅ ΠΏΠΎΠ·Π²ΠΎΠ»Ρ Π²Π°ΠΌ ΡΠΏΠ΅ΡΠΈΠ°Π»ΠΈΠ·ΠΈΡΠΎΠ²Π°ΡΡ ΠΏΡΠ΅Π΄ΠΌΠ΅Ρ.
ΠΠ΅ΡΠΆΠ΅Π»ΠΈ ΡΡΠΎ ΡΠ°ΠΊ ΠΏΠ»ΠΎΡ ΠΎ? ΠΡΠ»ΠΈ Π²Ρ Ρ ΠΎΡΠΈΡΠ΅ ΡΠΏΠ΅ΡΠΈΠ°Π»ΠΈΠ·ΠΈΡΠΎΠ²Π°ΡΡΡΡ Π½Π° ΠΈΠΌΠΏΠ»Π°Π½ΡΠΎΠ»ΠΎΠ³Π΅, ΡΠΎ, Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ, Π΄ΡΡΠ³ΠΈΠ΅ Π»ΡΠ΄ΠΈ ΡΠΎΠΆΠ΅ Π·Π°Ρ ΠΎΡΡΡ.
Π― Π²ΠΎΠ»Π½ΡΡΡΡ, ΠΏΠΎΡΠΎΠΌΡ ΡΡΠΎ ΠΎΠ΄Π½Π° ΠΌΡΡΠ»Ρ ΠΎΠ± ΡΡΠΎΠΌ RFC ΡΠΆΠ΅ Π΄Π°Π΅Ρ ΠΌΠ½Π΅ Π²ΠΎΡΠΏΠΎΠΌΠΈΠ½Π°Π½ΠΈΡ ΠΎ ΠΏΠΎΡΡΡΡΠ°Π²ΠΌΠ°ΡΠΈΡΠ΅ΡΠΊΠΎΠΌ ΡΡΡΠ΅ΡΡΠ΅ ΠΎ ΡΠ°Π±ΠΎΡΠ΅ Ρ ΠΊΠΎΠ΄ΠΎΠ²ΡΠΌΠΈ Π±Π°Π·Π°ΠΌΠΈ C ++, ΠΊΠΎΡΠΎΡΡΠ΅ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡΡ Π½Π΅ΠΏΡΠΈΠ»ΠΈΡΠ½ΠΎΠ΅ ΠΊΠΎΠ»ΠΈΡΠ΅ΡΡΠ²ΠΎ ΠΏΠ΅ΡΠ΅Π³ΡΡΠ·ΠΊΠΈ ΠΈ Π½Π°ΡΠ»Π΅Π΄ΠΎΠ²Π°Π½ΠΈΡ ΠΈ Π½Π΅ ΠΈΠΌΠ΅ΡΡ ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π»Π΅Π½ΠΈΡ ΠΎ ΡΠΎΠΌ, ΡΡΠΎ wtf ΠΏΡΠΎΠΈΡΡ ΠΎΠ΄ΠΈΡ Π² Π»ΡΠ±ΠΎΠΉ ΡΡΡΠΎΠΊΠ΅ ΠΊΠΎΠ΄Π°, Π² ΠΊΠΎΡΠΎΡΠΎΠΉ Π΅ΡΡΡ Π²ΡΠ·ΠΎΠ² ΠΌΠ΅ΡΠΎΠ΄Π°. Π― Π΄Π΅ΠΉΡΡΠ²ΠΈΡΠ΅Π»ΡΠ½ΠΎ ΡΠ΅Π½Ρ ΡΠΎ, Π½Π° ΡΡΠΎ ΠΏΠΎΡΠ΅Π» @aturon , ΡΡΠΎΠ±Ρ ΡΠ΄Π΅Π»Π°ΡΡ ΡΠΏΠ΅ΡΠΈΠ°Π»ΠΈΠ·Π°ΡΠΈΡ ΡΠ²Π½ΠΎΠΉ ΠΈ ΡΠ°ΠΌΠΎΠ΄ΠΎΠΊΡΠΌΠ΅Π½ΡΠΈΡΠΎΠ²Π°Π½Π½ΠΎΠΉ.
ΠΠ΅ΡΠΆΠ΅Π»ΠΈ ΡΡΠΎ ΡΠ°ΠΊ ΠΏΠ»ΠΎΡ ΠΎ? ΠΡΠ»ΠΈ Π²Ρ Ρ ΠΎΡΠΈΡΠ΅ ΡΠΏΠ΅ΡΠΈΠ°Π»ΠΈΠ·ΠΈΡΠΎΠ²Π°ΡΡΡΡ Π½Π° ΠΈΠΌΠΏΠ»Π°Π½ΡΠΎΠ»ΠΎΠ³Π΅, ΡΠΎ, Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ, Π΄ΡΡΠ³ΠΈΠ΅ Π»ΡΠ΄ΠΈ ΡΠΎΠΆΠ΅ Π·Π°Ρ ΠΎΡΡΡ.
ΠΡΠ»ΠΈ Π΄ΡΡΠ³ΠΈΠ΅ Π»ΡΠ΄ΠΈ ΡΠΎΠ»ΡΠΊΠΎ Β«ΠΌΠΎΠΆΠ΅Ρ Π±ΡΡΡΒ» ΡΠΎΠΆΠ΅ Ρ ΠΎΡΡΡ ΡΠΏΠ΅ΡΠΈΠ°Π»ΠΈΠ·ΠΈΡΠΎΠ²Π°ΡΡΡΡ Π½Π° ΡΡΠΎΠΌ, ΠΈ Π΅ΡΠ»ΠΈ Π΅ΡΡΡ Ρ ΠΎΡΠΎΡΠΈΠ΅ ΡΠ»ΡΡΠ°ΠΈ, ΠΊΠΎΠ³Π΄Π° ΠΌΡ Π±Ρ ΡΡΠΎΠ³ΠΎ Π½Π΅ Ρ ΠΎΡΠ΅Π»ΠΈ, ΠΌΡ Π½Π΅ Π΄ΠΎΠ»ΠΆΠ½Ρ Π΄Π΅Π»Π°ΡΡ Π½Π΅Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΡΠΌ ΡΡΠΎ ΡΠΊΠ°Π·Π°ΡΡ. (Π½Π΅ΠΌΠ½ΠΎΠ³ΠΎ ΠΏΠΎΡ ΠΎΠΆΠ΅ Π½Π° ΠΈΠ½ΠΊΠ°ΠΏΡΡΠ»ΡΡΠΈΡ: Π²Ρ Ρ ΠΎΡΠΈΡΠ΅ ΠΏΠΎΠ»ΡΡΠΈΡΡ Π΄ΠΎΡΡΡΠΏ ΠΊ Π½Π΅ΠΊΠΎΡΠΎΡΡΠΌ Π΄Π°Π½Π½ΡΠΌ, Π° ΠΌΠΎΠΆΠ΅Ρ Π±ΡΡΡ, ΠΈ Π΄ΡΡΠ³ΠΈΠ΅ Π»ΡΠ΄ΠΈ ΡΠΎΠΆΠ΅ Π·Π°Ρ ΠΎΡΡΡ - ΠΏΠΎΡΡΠΎΠΌΡ Π²Ρ ΡΠ²Π½ΠΎ ΠΏΠΎΠΌΠ΅ΡΠ°Π΅ΡΠ΅ _this data_ ΠΎΠ±ΡΠ΅Π΄ΠΎΡΡΡΠΏΠ½ΡΠΌΠΈ, Π²ΠΌΠ΅ΡΡΠΎ ΡΠΎΠ³ΠΎ, ΡΡΠΎΠ±Ρ ΠΏΠΎ ΡΠΌΠΎΠ»ΡΠ°Π½ΠΈΡ Π²ΡΠ΅ Π΄Π°Π½Π½ΡΠ΅ Π±ΡΠ»ΠΈ ΠΎΠ±ΡΠ΅Π΄ΠΎΡΡΡΠΏΠ½ΡΠΌΠΈ.)
Π― Π²ΠΎΠ»Π½ΡΡΡΡ, ΠΏΠΎΡΠΎΠΌΡ ΡΡΠΎ ΠΎΠ΄Π½Π° ΠΌΡΡΠ»Ρ ΠΎΠ± ΡΡΠΎΠΌ RFC ΡΠΆΠ΅ Π²ΡΠ·ΡΠ²Π°Π΅Ρ Ρ ΠΌΠ΅Π½Ρ Π²ΠΎΡΠΏΠΎΠΌΠΈΠ½Π°Π½ΠΈΡ ΠΎ ΠΏΠΎΡΡΡΡΠ°Π²ΠΌΠ°ΡΠΈΡΠ΅ΡΠΊΠΎΠΌ ΡΡΡΠ΅ΡΡΠ΅ ...
ΠΠΎ ΠΊΠ°ΠΊ Π·Π°ΠΏΡΠ΅ΡΠΈΡΡ ΡΡΡ ΡΠΏΠ΅ΡΠΈΡΠΈΠΊΠ°ΡΠΈΡ ΠΏΡΠ΅Π΄ΠΎΡΠ²ΡΠ°ΡΠΈΡΡ ΡΠ°ΠΊΠΈΠ΅ Π²Π΅ΡΠΈ?
Π΅ΡΠ»ΠΈ Π΅ΡΡΡ Ρ ΠΎΡΠΎΡΠΈΠ΅ ΡΠ»ΡΡΠ°ΠΈ, ΠΊΠΎΠ³Π΄Π° ΠΌΡ Π±Ρ Π½Π΅ Ρ ΠΎΡΠ΅Π»ΠΈ, ΡΡΠΎΠ±Ρ ΠΎΠ½ΠΈ ΡΡΠΎ Π΄Π΅Π»Π°Π»ΠΈ, ΠΌΡ Π½Π΅ Π΄ΠΎΠ»ΠΆΠ½Ρ Π΄Π΅Π»Π°ΡΡ Π½Π΅Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΡΠΌ ΡΠΊΠ°Π·Π°Π½ΠΈΠ΅ ΡΡΠΎΠ³ΠΎ.
ΠΠ΅ΠΎΠ±ΡΠ·Π°ΡΠ΅Π»ΡΠ½ΠΎ Π΄Π°Π²Π°ΡΡ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»ΡΠΌ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΠΈ, ΠΊΠΎΠ³Π΄Π° ΠΎΠ½ΠΈ ΠΌΠΎΠ³ΡΡ Π±ΡΡΡ ΠΏΠΎΠ»Π΅Π·Π½Ρ. ΠΠ΅Ρ, Π΅ΡΠ»ΠΈ ΡΡΠΎ ΡΠ°ΠΊΠΆΠ΅ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ΅Ρ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»ΡΠΌ ΠΏΠΈΡΠ°ΡΡ Π·Π°ΠΏΡΡΠ°Π½Π½ΡΠΉ ΠΊΠΎΠ΄.
ΠΠΎ ΠΊΠ°ΠΊ Π·Π°ΠΏΡΠ΅ΡΠΈΡΡ ΡΡΡ ΡΠΏΠ΅ΡΠΈΡΠΈΠΊΠ°ΡΠΈΡ ΠΏΡΠ΅Π΄ΠΎΡΠ²ΡΠ°ΡΠΈΡΡ ΡΠ°ΠΊΠΈΠ΅ Π²Π΅ΡΠΈ?
ΠΠΎΠΏΡΡΡΠΈΠΌ, Π²Ρ Π²ΠΈΠ΄ΠΈΡΠ΅ foo.bar()
ΠΈ Ρ
ΠΎΡΠΈΡΠ΅ ΠΏΠΎΡΠΌΠΎΡΡΠ΅ΡΡ, ΡΡΠΎ Π΄Π΅Π»Π°Π΅Ρ bar()
. ΠΡΡΠΌΠΎ ΡΠ΅ΠΉΡΠ°Ρ, Π΅ΡΠ»ΠΈ Π²Ρ ΠΎΠ±Π½Π°ΡΡΠΆΠΈΡΠ΅, ΡΡΠΎ ΠΌΠ΅ΡΠΎΠ΄ ΡΠ΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½ Π½Π° ΠΏΠΎΠ΄Ρ
ΠΎΠ΄ΡΡΠ΅ΠΌ ΡΠΈΠΏΠ΅ ΠΈ ΠΎΠ½ Π½Π΅ ΠΏΠΎΠΌΠ΅ΡΠ΅Π½ ΠΊΠ°ΠΊ default
Π²Ρ Π·Π½Π°Π΅ΡΠ΅, ΡΡΠΎ ΡΡΠΎ ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ ΠΌΠ΅ΡΠΎΠ΄Π°, ΠΊΠΎΡΠΎΡΠΎΠ΅ Π²Ρ ΠΈΡΠ΅ΡΠ΅. Π‘ ΠΏΡΠ΅Π΄Π»ΠΎΠΆΠ΅Π½ΠΈΠ΅ΠΌ @withoutboats ΡΡΠΎ Π±ΠΎΠ»ΡΡΠ΅ Π½Π΅ Π±ΡΠ΄Π΅Ρ ΠΏΡΠ°Π²Π΄ΠΎΠΉ - Π²ΠΌΠ΅ΡΡΠΎ ΡΡΠΎΠ³ΠΎ Π²Ρ Π½ΠΈΠΊΠΎΠ³Π΄Π° Π½Π΅ ΡΠ·Π½Π°Π΅ΡΠ΅ Π½Π°Π²Π΅ΡΠ½ΡΠΊΠ°, Π΄Π΅ΠΉΡΡΠ²ΠΈΡΠ΅Π»ΡΠ½ΠΎ Π»ΠΈ Π²Ρ ΡΠΌΠΎΡΡΠΈΡΠ΅ Π½Π° ΠΊΠΎΠ΄, ΠΊΠΎΡΠΎΡΡΠΉ Π²ΡΠΏΠΎΠ»Π½ΡΠ΅ΡΡΡ.
Π²ΠΌΠ΅ΡΡΠΎ ΡΡΠΎΠ³ΠΎ Π²Ρ Π½ΠΈΠΊΠΎΠ³Π΄Π° Π½Π΅ ΡΠ·Π½Π°Π΅ΡΠ΅ Π½Π°Π²Π΅ΡΠ½ΡΠΊΠ°, Π΄Π΅ΠΉΡΡΠ²ΠΈΡΠ΅Π»ΡΠ½ΠΎ Π»ΠΈ Π²Ρ ΡΠΌΠΎΡΡΠΈΡΠ΅ Π½Π° ΠΊΠΎΠ΄, ΠΊΠΎΡΠΎΡΡΠΉ Π²ΡΠΏΠΎΠ»Π½ΡΠ΅ΡΡΡ.
ΠΡΠΎ ΡΠ²Π½ΠΎΠ΅ ΠΏΡΠ΅ΡΠ²Π΅Π»ΠΈΡΠ΅Π½ΠΈΠ΅ ΡΡΡΠ΅ΠΊΡΠ° ΡΠ°Π·ΡΠ΅ΡΠ΅Π½ΠΈΡ ΡΠΏΠ΅ΡΠΈΠ°Π»ΠΈΠ·Π°ΡΠΈΠΈ ΠΈΠΌΠΏΠ»ΠΈΡΠΈΡΠΎΠ², ΠΎΡΠ»ΠΈΡΠ½ΡΡ ΠΎΡ Π·Π½Π°ΡΠ΅Π½ΠΈΠΉ ΠΏΠΎ ΡΠΌΠΎΠ»ΡΠ°Π½ΠΈΡ, Π΄Π»Ρ Π»ΠΎΠΊΠ°Π»ΡΠ½ΡΡ ΡΠΈΠΏΠΎΠ². ΠΡΠ»ΠΈ Π²Ρ ΡΠΌΠΎΡΡΠΈΡΠ΅ Π½Π° ΠΊΠΎΠ½ΠΊΡΠ΅ΡΠ½ΡΠΉ ΠΈΠΌΠΏΠ»Π°Π½Ρ, Π²Ρ Π·Π½Π°Π΅ΡΠ΅, ΡΡΠΎ ΡΠΌΠΎΡΡΠΈΡΠ΅ Π½Π° ΠΏΡΠ°Π²ΠΈΠ»ΡΠ½ΡΠΉ ΠΈΠΌΠΏΠ». Π Ρ Π²Π°Ρ Π΅ΡΡΡ Π΄ΠΎΡΡΡΠΏ ΠΊΠΎ Π²ΡΠ΅ΠΌΡ ΠΈΡΡΠΎΡΠ½ΠΈΠΊΡ ΡΡΠΎΠ³ΠΎ ΡΡΠΈΠΊΠ°; ΠΡ ΠΌΠΎΠΆΠ΅ΡΠ΅ ΠΎΠΏΡΠ΅Π΄Π΅Π»ΠΈΡΡ, ΡΠ²Π»ΡΠ΅ΡΡΡ Π»ΠΈ ΡΡΠΎΡ ΠΈΠΌΠΏΠ»Π°Π½Ρ ΡΠΏΠ΅ΡΠΈΠ°Π»ΠΈΠ·ΠΈΡΠΎΠ²Π°Π½Π½ΡΠΌ ΠΈΠ»ΠΈ Π½Π΅Ρ, ΡΠ°Π½ΡΡΠ΅, ΡΠ΅ΠΌ "Π½ΠΈΠΊΠΎΠ³Π΄Π°".
ΠΠ΅ΠΆΠ΄Ρ ΡΠ΅ΠΌ, Π΄Π°ΠΆΠ΅ Ρ default
ΠΏΡΠΎΠ±Π»Π΅ΠΌΠ° ΠΎΡΡΠ°Π΅ΡΡΡ, Π΄Π°ΠΆΠ΅ Π΅ΡΠ»ΠΈ ΠΈΠΌΠΏΠ» Π½Π΅ Π±ΡΠ» Π·Π°Π²Π΅ΡΡΠ΅Π½. ΠΡΠ»ΠΈ ΠΏΡΠ°Π²ΠΈΠ»ΡΠ½ΡΠΉ impl Π½Π° ΡΠ°ΠΌΠΎΠΌ Π΄Π΅Π»Π΅ ΡΠ²Π»ΡΠ΅ΡΡΡ default
impl, Π²Ρ Π½Π°Ρ
ΠΎΠ΄ΠΈΡΠ΅ΡΡ Π² ΡΠΎΠΉ ΠΆΠ΅ ΡΠΈΡΡΠ°ΡΠΈΠΈ, ΠΊΠΎΠ³Π΄Π° Π½Π΅ ΡΠ²Π΅ΡΠ΅Π½Ρ, ΡΡΠΎ ΡΡΠΎ ΠΏΡΠ°Π²ΠΈΠ»ΡΠ½ΡΠΉ impl. Π, ΠΊΠΎΠ½Π΅ΡΠ½ΠΎ, Π΅ΡΠ»ΠΈ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΡΡ ΡΠΏΠ΅ΡΠΈΠ°Π»ΠΈΠ·Π°ΡΠΈΡ, ΡΡΠΎ Π±ΡΠ΄Π΅Ρ Π΄ΠΎΠ²ΠΎΠ»ΡΠ½ΠΎ ΡΠ°ΡΡΠΎ (Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, ΡΡΠΎ ΡΠ°ΠΊ ΡΠ΅Π³ΠΎΠ΄Π½Ρ ΠΏΠΎΡΡΠΈ Π΄Π»Ρ ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ ΠΈΠΌΠΏΠ»ΠΈΠΊΠ°ΡΠΈΠΈ ToString
).
ΠΠ° ΡΠ°ΠΌΠΎΠΌ Π΄Π΅Π»Π΅ Ρ ΡΡΠΈΡΠ°Ρ, ΡΡΠΎ ΡΡΠΎ Π΄ΠΎΠ²ΠΎΠ»ΡΠ½ΠΎ ΡΠ΅ΡΡΠ΅Π·Π½Π°Ρ ΠΏΡΠΎΠ±Π»Π΅ΠΌΠ°, Π½ΠΎ Π½Π΅ ΡΠ²Π΅ΡΠ΅Π½, ΡΡΠΎ default
ΡΠ΅ΡΠ°Π΅Ρ Π΅Π΅. ΠΠ°ΠΌ Π½ΡΠΆΠ½Ρ Π±ΠΎΠ»Π΅Π΅ ΡΠΎΠ²Π΅ΡΡΠ΅Π½Π½ΡΠ΅ ΠΈΠ½ΡΡΡΡΠΌΠ΅Π½ΡΡ Π½Π°Π²ΠΈΠ³Π°ΡΠΈΠΈ ΠΏΠΎ ΠΊΠΎΠ΄Ρ. Π Π½Π°ΡΡΠΎΡΡΠ΅Π΅ Π²ΡΠ΅ΠΌΡ rustdoc ΠΏΡΠΈΠΌΠ΅Π½ΡΠ΅Ρ ΠΏΠΎΠ΄Ρ
ΠΎΠ΄ Β«ΠΌΠ°ΠΊΡΠΈΠΌΠ°Π»ΡΠ½ΡΡ
ΡΡΠΈΠ»ΠΈΠΉΒ», ΠΊΠΎΠ³Π΄Π° Π΄Π΅Π»ΠΎ Π΄ΠΎΡ
ΠΎΠ΄ΠΈΡ Π΄ΠΎ ΠΈΠΌΠΏΠ»ΠΈΠΌΠ΅Π½ΡΠΎΠ² ΡΡΠ΅ΠΉΡΠΎΠ² - ΠΎΠ½ Π½Π΅ ΡΡΡΠ»Π°Π΅ΡΡΡ Π½Π° ΠΈΡ
ΠΈΡΡΠΎΡΠ½ΠΈΠΊ ΠΈ Π΄Π°ΠΆΠ΅ Π½Π΅ ΠΏΠ΅ΡΠ΅ΡΠΈΡΠ»ΡΠ΅Ρ ΠΈΠΌΠΏΠ»ΠΈΠΌΠ΅Π½ΡΡ, ΠΏΡΠ΅Π΄ΠΎΡΡΠ°Π²Π»ΡΠ΅ΠΌΡΠ΅ blanket impls.
Π― Π½Π΅ Π³ΠΎΠ²ΠΎΡΡ, ΡΡΠΎ ΡΡΠΎ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ Π½ΠΈΠΊΠΎΠΈΠΌ ΠΎΠ±ΡΠ°Π·ΠΎΠΌ ΡΠ²Π»ΡΠ΅ΡΡΡ Ρ Π»ΠΎΠΏΡΡΠΊΠΎΠΉ, Π½ΠΎ Ρ Π΄ΡΠΌΠ°Ρ, ΡΡΠΎ Π΅Π³ΠΎ ΡΡΠΎΠΈΡ ΡΠ°ΡΡΠΌΠΎΡΡΠ΅ΡΡ Π±ΠΎΠ»Π΅Π΅ ΠΏΠΎΠ΄ΡΠΎΠ±Π½ΠΎ.
ΠΠ΅ΠΎΠ±ΡΠ·Π°ΡΠ΅Π»ΡΠ½ΠΎ Π΄Π°Π²Π°ΡΡ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»ΡΠΌ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΠΈ, ΠΊΠΎΠ³Π΄Π° ΠΎΠ½ΠΈ ΠΌΠΎΠ³ΡΡ Π±ΡΡΡ ΠΏΠΎΠ»Π΅Π·Π½Ρ. ΠΠ΅Ρ, Π΅ΡΠ»ΠΈ ΡΡΠΎ ΡΠ°ΠΊΠΆΠ΅ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ΅Ρ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»ΡΠΌ ΠΏΠΈΡΠ°ΡΡ Π·Π°ΠΏΡΡΠ°Π½Π½ΡΠΉ ΠΊΠΎΠ΄.
Π‘ΠΎΠ²Π΅ΡΡΠ΅Π½Π½ΠΎ Π²Π΅ΡΠ½ΠΎ. Π― Π΄ΡΠΌΠ°Ρ, ΡΡΠΎ Ρ Π³ΠΎΠ²ΠΎΡΡ Π·Π΄Π΅ΡΡ ΠΎ Π΄ΡΡΠ³ΠΎΠΌ Β«ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Π΅Β», ΠΊΠΎΡΠΎΡΡΠΉ ΡΠ²Π»ΡΠ΅ΡΡΡ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Π΅ΠΌ ΡΡΠΈΠΊΠΎΠ², ΠΊΠΎΡΠΎΡΡΠ΅ Π²Ρ ΠΏΠΈΡΠ΅ΡΠ΅. ΠΡ ΠΆΠ΅ Π½Π΅ Ρ ΠΎΡΠΈΡΠ΅, ΡΡΠΎΠ±Ρ ΠΎΠ½ΠΈ ΡΠ²ΠΎΠ±ΠΎΠ΄Π½ΠΎ ΡΠΏΠ΅ΡΠΈΠ°Π»ΠΈΠ·ΠΈΡΠΎΠ²Π°Π»ΠΈ ΡΠ΅ΡΡΡ Π² Π²Π°ΡΠ΅ΠΌ ΡΡΠΈΠΊΠ΅ (Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ, Ρ Π°ΠΊΠ΅ΡΡΠΊΠΈΠΌ ΠΎΠ±ΡΠ°Π·ΠΎΠΌ Π²Π»ΠΈΡΡ Π½Π° ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ Π²Π°ΡΠ΅Π³ΠΎ ΡΡΠΈΠΊΠ°). Π‘ Π΄ΡΡΠ³ΠΎΠΉ ΡΡΠΎΡΠΎΠ½Ρ, ΠΌΡ Π΄Π°Π΄ΠΈΠΌ Π±ΠΎΠ»ΡΡΠ΅ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΠ΅ΠΉ Β«ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»ΡΒ», ΠΎ ΠΊΠΎΡΠΎΡΠΎΠΌ Π²Ρ Π³ΠΎΠ²ΠΎΡΠΈΡΠ΅, Π° ΠΈΠΌΠ΅Π½Π½ΠΎ Π°Π²ΡΠΎΡΡ ΡΡΠΈΠΊΠ°, Π½ΠΎ Π΄Π°ΠΆΠ΅ Π±Π΅Π· ΠΏΡΠ΅Π΄Π»ΠΎΠΆΠ΅Π½ΠΈΡ @withoutboats Π²Π°ΠΌ ΠΏΡΠΈΠ΄Π΅ΡΡΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ Β«ΠΏΠΎ ΡΠΌΠΎΠ»ΡΠ°Π½ΠΈΡΒ» ΠΈ ΡΡΠΎΠ»ΠΊΠ½ΡΡΡΡΡ Ρ ΡΠΎΠΉ ΠΆΠ΅ ΠΏΡΠΎΠ±Π»Π΅ΠΌΠΎΠΉ. .
Π― Π΄ΡΠΌΠ°Ρ, ΡΡΠΎ default
ΠΏΠΎΠΌΠΎΠ³Π°Π΅Ρ Π² ΡΠΎΠΌ ΡΠΌΡΡΠ»Π΅, ΡΡΠΎ Π΅ΡΠ»ΠΈ Π²Ρ Ρ
ΠΎΡΠΈΡΠ΅ ΡΠΏΡΠΎΡΡΠΈΡΡ ΡΡΠ΅Π½ΠΈΠ΅ ΠΊΠΎΠ΄Π°, Π²Ρ ΠΌΠΎΠΆΠ΅ΡΠ΅ ΠΏΠΎΠΏΡΠΎΡΠΈΡΡ, ΡΡΠΎΠ±Ρ Π½ΠΈΠΊΡΠΎ Π½Π΅ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π» default
ΠΈΠ»ΠΈ ΡΡΡΠ°Π½ΠΎΠ²ΠΈΠ» ΡΡΡΠΎΠ³ΠΈΠ΅ ΠΏΡΠ°Π²ΠΈΠ»Π° Π΄ΠΎΠΊΡΠΌΠ΅Π½ΡΠ°ΡΠΈΠΈ Π΄Π»Ρ Π΅Π³ΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΡ. Π ΡΡΠΎΡ ΠΌΠΎΠΌΠ΅Π½Ρ Π²Π°ΠΌ Π½ΡΠΆΠ½ΠΎ ΡΠΎΠ»ΡΠΊΠΎ Π±Π΅ΡΠΏΠΎΠΊΠΎΠΈΡΡΡΡ ΠΎ default
s ΠΈΠ· std
, ΠΊΠΎΡΠΎΡΡΠ΅, ΠΏΠΎ-Π²ΠΈΠ΄ΠΈΠΌΠΎΠΌΡ, Π»ΡΠ΄ΠΈ Π»ΡΡΡΠ΅ ΠΏΠΎΠΉΠΌΡΡ.
Π― Π²ΡΠΏΠΎΠΌΠΈΠ½Π°Ρ ΠΈΠ΄Π΅Ρ ΠΎ ΡΠΎΠΌ, ΡΡΠΎ ΠΏΡΠ°Π²ΠΈΠ»Π° Π΄ΠΎΠΊΡΠΌΠ΅Π½ΡΠ°ΡΠΈΠΈ ΠΌΠΎΠ³ΡΡ Π±ΡΡΡ Π½Π°Π»ΠΎΠΆΠ΅Π½Ρ Π½Π° ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ ΡΠΏΠ΅ΡΠΈΠ°Π»ΠΈΠ·Π°ΡΠΈΠΈ, ΡΠΏΠΎΡΠΎΠ±ΡΡΠ²ΠΎΠ²Π°Π²ΡΠ΅Π΅ ΡΡΠ²Π΅ΡΠΆΠ΄Π΅Π½ΠΈΡ RFC ΡΠΏΠ΅ΡΠΈΠ°Π»ΠΈΠ·Π°ΡΠΈΠΈ.
@withoutboats. ΠΡΠ°Π²ΠΈΠ»ΡΠ½ΠΎ Π»ΠΈ Ρ ΠΏΡΠΎΡΠΈΡΠ°Π» Π²Π°ΡΡ ΠΌΠΎΡΠΈΠ²Π°ΡΠΈΡ ΠΊ ΠΎΡΠ»Π°Π±Π»Π΅Π½ΠΈΡ default
ΠΏΠΎΡΠΊΠΎΠ»ΡΠΊΡ Π²Π°ΠΌ Π½ΡΠΆΠ½Π° ΠΎΠ³ΡΠ°Π½ΠΈΡΠ΅Π½Π½Π°Ρ ΡΠΎΡΠΌΠ° default
ΡΡΠΎ ΠΎΠ·Π½Π°ΡΠ°Π΅Ρ "ΠΏΠ΅ΡΠ΅ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅, Π½ΠΎ ΡΠΎΠ»ΡΠΊΠΎ Π² ΡΡΠΎΠΌ ΡΡΠΈΠΊΠ΅" (Ρ.Π΅. pub(crate)
Π½ΠΎ Π΄Π»Ρ default
)? ΠΠ΄Π½Π°ΠΊΠΎ Π΄Π»Ρ ΠΏΡΠΎΡΡΠΎΡΡ Π²Ρ ΠΏΡΠ΅Π΄Π»Π°Π³Π°Π΅ΡΠ΅ ΠΈΠ·ΠΌΠ΅Π½ΠΈΡΡ ΡΠ΅ΠΌΠ°Π½ΡΠΈΠΊΡ ΠΈΡΠΊΠ»ΡΡΠ΅Π½ΠΈΡ default
Π²ΠΌΠ΅ΡΡΠΎ Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΡ Π³ΡΠ°Π΄Π°ΡΠΈΠΉ default
-ness?
ΠΠ΅ΡΠ½ΡΠΉ. ΠΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ ΡΠ΅Π³ΠΎ-ΡΠΎ Π²ΡΠΎΠ΄Π΅ default(crate)
ΠΊΠ°ΠΆΠ΅ΡΡΡ ΠΈΠ·Π»ΠΈΡΠ½ΠΈΠΌ.
ΠΠΏΡΠΈΠΎΡΠΈ, Ρ Π±Ρ ΠΏΡΠ΅Π΄ΠΏΠΎΠ»ΠΎΠΆΠΈΠ», ΡΡΠΎ ΡΡΠΎ ΠΌΠΎΠΆΠ½ΠΎ ΡΠΌΠΎΠ΄Π΅Π»ΠΈΡΠΎΠ²Π°ΡΡ ΡΠ΅ΡΠ΅Π· ΡΠΎ, ΡΡΠΎ ΡΠΊΡΠΏΠΎΡΡΠΈΡΡΠ΅Ρ ΡΡΠΈΠΊ, Π½Π΅ ΡΠ°ΠΊ Π»ΠΈ? Π‘ΡΡΠ΅ΡΡΠ²ΡΡΡ Π»ΠΈ ΡΠΈΡΡΠ°ΡΠΈΠΈ, ΠΊΠΎΠ³Π΄Π° Π²Ρ Π½Π΅ ΠΌΠΎΠ³Π»ΠΈ Π±Ρ ΠΏΡΠΎΡΡΠΎ Π²Π²Π΅ΡΡΠΈ Π»ΠΈΡΠ½ΡΡ Π²ΡΠΏΠΎΠΌΠΎΠ³Π°ΡΠ΅Π»ΡΠ½ΡΡ ΡΠ΅ΡΡΡ Ρ ΠΏΠΎΠΌΠΎΡΡΡ ΠΌΠ΅ΡΠΎΠ΄ΠΎΠ² default
ΠΈ Π²ΡΠ·Π²Π°ΡΡ Π΅Π΅ ΠΈΠ· ΡΠ²ΠΎΠ΅Π³ΠΎ ΡΠΎΠ±ΡΡΠ²Π΅Π½Π½ΠΎΠ³ΠΎ ΡΠΈΠ½Π°Π»ΡΠ½ΠΎΠ³ΠΎ impl
s? ΠΡ Ρ
ΠΎΡΠΈΡΠ΅, ΡΡΠΎΠ±Ρ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π» Π²Π°ΡΠΈ default
s, Π½ΠΎ Π½Π΅ ΠΏΡΠ΅Π΄ΠΎΡΡΠ°Π²Π»ΡΠ» ΡΠ²ΠΎΠΈ ΡΠΎΠ±ΡΡΠ²Π΅Π½Π½ΡΠ΅?
ΠΠ΅ΡΠ½ΡΠΉ. ΠΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ ΡΠ΅Π³ΠΎ-ΡΠΎ Π²ΡΠΎΠ΄Π΅ default (crate) ΠΊΠ°ΠΆΠ΅ΡΡΡ ΠΈΠ·Π»ΠΈΡΠ½ΠΈΠΌ.
Π― Π½Π΅ ΡΠΎΠ³Π»Π°ΡΠ΅Π½. Π― Π΄Π΅ΠΉΡΡΠ²ΠΈΡΠ΅Π»ΡΠ½ΠΎ Ρ ΠΎΡΡ ΠΎΠ³ΡΠ°Π½ΠΈΡΠ΅Π½Π½ΡΡ ΡΠΎΡΠΌΡ ΠΏΠΎ ΡΠΌΠΎΠ»ΡΠ°Π½ΠΈΡ. Π― Ρ ΠΎΡΠ΅Π» ΡΡΠΎ ΡΠ΄Π΅Π»Π°ΡΡ. ΠΠΎΡ ΠΌΠΎΡΠΈΠ²Π°ΡΠΈΡ ΡΠΎΡΡΠΎΠΈΡ Π² ΡΠΎΠΌ, ΡΡΠΎ ΠΈΠ½ΠΎΠ³Π΄Π° ΠΈΠΌΠΏΠ»ΠΈΡΠΈΡΠ½ΡΠ΅ ΠΏΠ΅ΡΠ΅ΡΠ΅ΡΠ΅Π½ΠΈΡ ΠΈ Ρ. Π. ΠΠ°ΡΡΠ°Π²ΡΡ Π²Π°Ρ Π΄ΠΎΠ±Π°Π²ΠΈΡΡ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ ΠΏΠΎ ΡΠΌΠΎΠ»ΡΠ°Π½ΠΈΡ, Π½ΠΎ ΡΡΠΎ Π½Π΅ Π·Π½Π°ΡΠΈΡ, ΡΡΠΎ Π²Ρ Ρ ΠΎΡΠΈΡΠ΅ ΡΠ°Π·ΡΠ΅ΡΠΈΡΡ ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ»ΡΠ½ΡΠΌ ΡΡΠΈΠΊΠ°ΠΌ ΠΈΠ·ΠΌΠ΅Π½ΡΡΡ ΡΠ²ΠΎΠ΅ ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅. ΠΠ·Π²ΠΈΠ½ΠΈΡΠ΅, Π΄ΠΎ Π²ΡΡΡΠ΅ΡΠΈ, Ρ ΠΌΠΎΠ³Ρ ΠΏΠΎΠΏΡΡΠ°ΡΡΡΡ ΡΡΠΎΡΠ½ΠΈΡΡ ΠΏΡΠΈΠΌΠ΅Ρ ΡΡΡΡ ΠΏΠΎΠ·ΠΆΠ΅.
@nikomatsakis Π£ ΠΌΠ΅Π½Ρ ΡΠ° ΠΆΠ΅ ΠΌΠΎΡΠΈΠ²Π°ΡΠΈΡ, Ρ ΠΏΡΠ΅Π΄Π»Π°Π³Π°Ρ ΠΏΡΠΎΡΡΠΎ ΡΠ΄Π°Π»ΠΈΡΡ ΡΡΠ°Π½Π΄Π°ΡΡΠ½ΠΎΠ΅ ΡΡΠ΅Π±ΠΎΠ²Π°Π½ΠΈΠ΅ ΡΠΏΠ΅ΡΠΈΠ°Π»ΠΈΠ·ΠΈΡΠΎΠ²Π°ΡΡΡΡ Π½Π° ΠΎΠ΄Π½ΠΎΠΌ ΡΡΠΈΠΊΠ΅, Π° Π½Π΅ Π΄ΠΎΠ±Π°Π²Π»ΡΡΡ Π±ΠΎΠ»ΡΡΠ΅ ΡΡΡΠ°Π³ΠΎΠ². :-)
ΠΡΠ»ΠΈ ΡΠ»ΡΡΠ°ΠΉΠ½ΠΎ ΡΡΠΎ Π½Π΅ΡΠΊΡΠΏΠΎΡΡΠΈΡΠΎΠ²Π°Π½Π½ΠΎΠ΅ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ ΠΏΠΎ ΡΠΌΠΎΠ»ΡΠ°Π½ΠΈΡ ΠΌΠΎΠΆΠ΅Ρ Π±ΡΡΡ Π±ΠΎΠ»Π΅Π΅ ΡΠ°ΡΠΏΡΠΎΡΡΡΠ°Π½Π΅Π½Π½ΡΠΌ, ΡΠΎΠ³Π΄Π° ΡΡΠ½ΠΊΡΠΈΡ #[default_export]
Π±ΡΠ΄Π΅Ρ Π»Π΅Π³ΡΠ΅ Π·Π°ΠΏΠΎΠΌΠ½ΠΈΡΡ ΠΏΠΎ Π°Π½Π°Π»ΠΎΠ³ΠΈΠΈ Ρ #[macro_export]
. ΠΡΠΎΠΌΠ΅ΠΆΡΡΠΎΡΠ½ΡΠΌ Π²Π°ΡΠΈΠ°Π½ΡΠΎΠΌ ΠΌΠΎΠΆΠ΅Ρ Π±ΡΡΡ ΡΠ°Π·ΡΠ΅ΡΠ΅Π½ΠΈΠ΅ ΡΡΠΎΠΉ ΡΡΠ½ΠΊΡΠΈΠΈ ΡΠΊΡΠΏΠΎΡΡΠ° Π΄Π»Ρ ΡΡΡΠΎΠΊ pub use
ΠΈΠ»ΠΈ pub mod
.
ΠΡΠ»ΠΎ Π±Ρ Π»ΡΡΡΠ΅ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ ΠΊΠ»ΡΡΠ΅Π²ΠΎΠ΅ ΡΠ»ΠΎΠ²ΠΎ pub
, ΠΏΠΎΡΠΊΠΎΠ»ΡΠΊΡ ΠΌΠ°ΠΊΡΠΎΡΡ 2.0 Π±ΡΠ΄ΡΡ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΈΠ²Π°ΡΡ ΠΌΠ°ΠΊΡΠΎΡΡ ΠΊΠ°ΠΊ ΠΎΠ±ΡΡΠ½ΡΠ΅ ΡΠ»Π΅ΠΌΠ΅Π½ΡΡ ΠΈ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ pub
Π²ΠΌΠ΅ΡΡΠΎ #[macro_use]
. ΠΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ pub
Π΄Π»Ρ ΠΎΠ±ΠΎΠ·Π½Π°ΡΠ΅Π½ΠΈΡ Π²ΠΈΠ΄ΠΈΠΌΠΎΡΡΠΈ ΠΏΠΎ Π²ΡΠ΅ΠΌ Π½Π°ΠΏΡΠ°Π²Π»Π΅Π½ΠΈΡΠΌ Π±ΡΠ»ΠΎ Π±Ρ Π±ΠΎΠ»ΡΡΠΈΠΌ Π²ΡΠΈΠ³ΡΡΡΠ΅ΠΌ Π΄Π»Ρ Π΅Π³ΠΎ ΡΠΎΠ³Π»Π°ΡΠΎΠ²Π°Π½Π½ΠΎΡΡΠΈ.
@withoutboats Π² Π»ΡΠ±ΠΎΠΌ ΡΠ»ΡΡΠ°Π΅, Ρ Π΄ΡΠΌΠ°Ρ, ΠΈΠ½ΠΎΠ³Π΄Π° Π²Π°ΠΌ Π·Π°Ρ ΠΎΡΠ΅ΡΡΡ ΡΠΏΠ΅ΡΠΈΠ°Π»ΠΈΠ·ΠΈΡΠΎΠ²Π°ΡΡΡΡ Π½Π° ΠΌΠ΅ΡΡΠ½ΠΎΠΌ ΡΡΠΎΠ²Π½Π΅, Π½ΠΎ Π½Π΅ ΠΎΠ±ΡΠ·Π°ΡΠ΅Π»ΡΠ½ΠΎ ΠΎΡΠΊΡΡΠ²Π°ΡΡ Π΄Π²Π΅ΡΠΈ Π΄Π»Ρ Π²ΡΠ΅Ρ
ΠΡΠ»ΠΎ Π±Ρ Π»ΡΡΡΠ΅ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ ΠΊΠ»ΡΡΠ΅Π²ΠΎΠ΅ ΡΠ»ΠΎΠ²ΠΎ pub
ΠΠ°Π»ΠΈΡΠΈΠ΅ 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
Π·Π½Π°ΡΠΈΡΠ΅Π»ΡΠ½ΠΎ Π±ΠΎΠ»Π΅Π΅ ΡΠ°ΡΠΏΡΠΎΡΡΡΠ°Π½Π΅Π½Π½ΡΠΌ? ΠΠ΅ ΡΠ»Π΅Π΄ΡΠ΅Ρ Π»ΠΈ ΡΠΊΡΠΏΠΎΡΡΠΈΡΠΎΠ²Π°ΡΡ default
ness ΠΏΠΎ ΡΠΌΠΎΠ»ΡΠ°Π½ΠΈΡ?
ΠΠ°, ΡΠ»ΡΡΠ°ΠΉ: Π²Ρ ΠΌΠΎΠΆΠ΅ΡΠ΅ ΠΌΠ°ΠΊΡΠΈΠΌΠΈΠ·ΠΈΡΠΎΠ²Π°ΡΡ ΡΡ
ΠΎΠ΄ΡΡΠ²ΠΎ Ρ ΡΠΊΡΠΏΠΎΡΡΠΎΠΌ Π² Π΄ΡΡΠ³ΠΎΠΌ ΠΌΠ΅ΡΡΠ΅, ΡΡΠΎ Π΄ΠΈΠΊΡΡΠ΅Ρ ΡΡΠΎ-ΡΠΎ Π²ΡΠΎΠ΄Π΅ pub mod mymodule default;
ΠΈ pub use mymodule::MyTrait default;
, ΠΈΠ»ΠΈ, Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ, Ρ overridable
. ΠΡΠΈ Π½Π΅ΠΎΠ±Ρ
ΠΎΠ΄ΠΈΠΌΠΎΡΡΠΈ Π²Ρ ΠΌΠΎΠΆΠ΅ΡΠ΅ ΡΠΊΡΠΏΠΎΡΡΠΈΡΠΎΠ²Π°ΡΡ default
ΡΠΎΠ»ΡΠΊΠΎ Π΄Π»Ρ Π½Π΅ΠΊΠΎΡΠΎΡΡΡ
ΠΌΠ΅ΡΠΎΠ΄ΠΎΠ² Ρ pub use MyModule::MyTrait::{methoda,methodb} default;
ΠΠΈ Π² ΠΊΠΎΠ΅ΠΌ ΡΠ»ΡΡΠ°Π΅: Π²Π°ΠΌ Π½ΡΠΆΠ½ΠΎ Π²ΡΡΠ°ΠΆΠ°ΡΡ ΠΊΠΎΠ½ΡΠΈΠ΄Π΅Π½ΡΠΈΠ°Π»ΡΠ½ΠΎΡΡΡ, Π° Π½Π΅ ΠΏΡΠ±Π»ΠΈΡΠ½ΠΎΡΡΡ, ΠΊΠΎΡΠΎΡΠ°Ρ Π² Π»ΡΠ±ΠΎΠΌ ΡΠ»ΡΡΠ°Π΅ Π·Π½Π°ΡΠΈΡΠ΅Π»ΡΠ½ΠΎ ΠΎΡΠ»ΠΈΡΠ°Π΅ΡΡΡ ΠΎΡ Π²ΡΠ΅Π³ΠΎ ΠΎΡΡΠ°Π»ΡΠ½ΠΎΠ³ΠΎ Π² Rust, ΠΏΠΎΡΡΠΎΠΌΡ ΡΠ΅ΠΏΠ΅ΡΡ 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 };
}
Π‘Π΅Π³ΠΎΠ΄Π½Ρ ΠΌΡ ΡΠ΄Π΅Π»Π°Π»ΠΈ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΎ, Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ, ΡΡΠ΅Π²ΠΎΠΆΠ½ΡΡ ΠΎΡΠΊΡΡΡΠΈΠΉ, Π²Ρ ΠΌΠΎΠΆΠ΅ΡΠ΅ ΠΏΡΠΎΡΠΈΡΠ°ΡΡ Π»ΠΎΠ³ΠΈ IRC Π·Π΄Π΅ΡΡ: https://botbot.me/mozilla/rust-lang/
Π― Π½Π΅ ΡΠ²Π΅ΡΠ΅Π½ Π½Π° 100% Π²ΠΎ Π²ΡΠ΅Ρ Π²ΡΠ²ΠΎΠ΄Π°Ρ , ΠΊ ΠΊΠΎΡΠΎΡΡΠΌ ΠΌΡ ΠΏΡΠΈΡΠ»ΠΈ, ΡΠ΅ΠΌ Π±ΠΎΠ»Π΅Π΅ ΡΡΠΎ ΠΊΠΎΠΌΠΌΠ΅Π½ΡΠ°ΡΠΈΠΈ ΠΠΈΠΊΠΎ ΠΏΠΎΡΠ»Π΅ ΡΠ°ΠΊΡΠ° ΠΊΠ°ΠΆΡΡΡΡ ΠΎΠ±Π½Π°Π΄Π΅ΠΆΠΈΠ²Π°ΡΡΠΈΠΌΠΈ. ΠΠ° ΠΊΠ°ΠΊΠΎΠ΅-ΡΠΎ Π²ΡΠ΅ΠΌΡ ΠΌΠ½Π΅ ΡΡΠΎ ΠΏΠΎΠΊΠ°Π·Π°Π»ΠΎΡΡ Π½Π΅ΠΌΠ½ΠΎΠ³ΠΎ Π°ΠΏΠΎΠΊΠ°Π»ΠΈΠΏΡΠΈΡΠ΅ΡΠΊΠΈΠΌ.
ΠΠ΄Π½Π° Π²Π΅ΡΡ, Π² ΠΊΠΎΡΠΎΡΠΎΠΉ Ρ ΡΠΎΠ²Π΅ΡΡΠ΅Π½Π½ΠΎ ΡΠ²Π΅ΡΠ΅Π½, Π·Π°ΠΊΠ»ΡΡΠ°Π΅ΡΡΡ Π² ΡΠΎΠΌ, ΡΡΠΎ ΡΡΠ΅Π±ΠΎΠ²Π°Π½ΠΈΠ΅ default
Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ Π±ΡΡΡ ΡΠ΄Π΅Π»Π°Π½ΠΎ ΡΠΎΠ²ΠΌΠ΅ΡΡΠΈΠΌΡΠΌ Ρ Π³Π°ΡΠ°Π½ΡΠΈΠ΅ΠΉ ΡΠΎΠ³ΠΎ, ΡΡΠΎ Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΠ΅ Π½ΠΎΠ²ΡΡ
default
impls Π²ΡΠ΅Π³Π΄Π° ΠΎΠ±ΡΠ°ΡΠ½ΠΎ ΡΠΎΠ²ΠΌΠ΅ΡΡΠΈΠΌΠΎ. ΠΠΎΡ Π΄Π΅ΠΌΠΎΠ½ΡΡΡΠ°ΡΠΈΡ:
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) { }
}
Local ΡΠ΅Π°Π»ΠΈΠ·ΡΠ΅Ρ A
ΠΈ C
Π½ΠΎ Π½Π΅ B
. ΠΡΠ»ΠΈ Π±Ρ local ΡΠ΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π» 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 { }
ΠΡΠΎΡ impl Π±ΡΠ» Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ ΠΈ ΡΠ²Π»ΡΠ΅ΡΡΡ ΠΏΠΎΠ»Π½ΠΎΡΡΡΡ ΡΠΏΠ΅ΡΠΈΠ°Π»ΠΈΠ·ΠΈΡΠΎΠ²Π°Π½Π½ΡΠΌ, ΠΏΠΎΡΡΠΎΠΌΡ ΠΌΡ ΡΠΊΠ°Π·Π°Π»ΠΈ, ΡΡΠΎ ΡΡΠΎ Π½Π΅ΡΡΡΠΈΠΌΠΎΠ΅ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠ΅. ΠΠ΄Π½Π°ΠΊΠΎ ΡΡΠΎ ΡΠΎΠ·Π΄Π°Π΅Ρ ΡΡΠ°Π½Π·ΠΈΡΠΈΠ²Π½ΡΡ ΠΈΠΌΠΏΠ»ΠΈΠΊΠ°ΡΠΈΡ - Ρ Π½Π°Ρ ΡΠΆΠ΅ Π΅ΡΡΡ Β«Π²ΡΠ΅ B impl C (Π½Π΅ ΡΠΏΠ΅ΡΠΈΠ°Π»ΠΈΠ·ΠΈΡΠΎΠ²Π°Π½Π½ΡΠΉ)Β», Π΄ΠΎΠ±Π°Π²ΠΈΠ² Β«all A impl B (ΡΠΏΠ΅ΡΠΈΠ°Π»ΠΈΠ·ΠΈΡΠΎΠ²Π°Π½Π½ΡΠΉ)Β», ΠΌΡ Π½Π΅ΡΠ²Π½ΠΎ Π΄ΠΎΠ±Π°Π²ΠΈΠ»ΠΈ ΠΎΠΏΠ΅ΡΠ°ΡΠΎΡ Β«all A impl C (Π½Π΅ ΡΠΏΠ΅ΡΠΈΠ°Π»ΠΈΠ·ΠΈΡΠΎΠ²Π°Π½Π½ΡΠΉ) ". Π’Π΅ΠΏΠ΅ΡΡ Π΄Π΅ΡΡΠΊΠΈΠΉ ΡΡΠΈΠΊ Π½Π΅Π»ΡΠ·Ρ ΠΎΠ±Π½ΠΎΠ²ΠΈΡΡ.
ΠΠΎΠΆΠ΅Ρ ΡΠ»ΡΡΠΈΡΡΡΡ ΡΠ°ΠΊ, ΡΡΠΎ ΠΈΠ΄Π΅Ρ Π³Π°ΡΠ°Π½ΡΠΈΡΠΎΠ²Π°ΡΡ, ΡΡΠΎ Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΠ΅ ΡΠΏΠ΅ΡΠΈΠ°Π»ΠΈΠ·ΠΈΡΠΎΠ²Π°Π½Π½ΡΡ ΠΈΠΌΠΏΠ»Π°Π½ΡΠ°ΡΠΎΠ² Π½Π΅ ΡΠ²Π»ΡΠ΅ΡΡΡ ΠΊΡΠΈΡΠΈΡΠ΅ΡΠΊΠΈΠΌ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ΠΌ, ΠΏΠΎΠ»Π½ΠΎΡΡΡΡ Π²ΡΠΏΠ°Π΄Π°Π΅Ρ ΠΈΠ· ΠΎΠΊΠ½Π°, ΠΏΠΎΡΠΎΠΌΡ ΡΡΠΎ ΠΠ°ΡΠΎΠ½ ΠΏΠΎΠΊΠ°Π·Π°Π» (ΠΊΠ°ΠΊ Π²Ρ ΠΌΠΎΠΆΠ΅ΡΠ΅ Π²ΠΈΠ΄Π΅ΡΡ Π² ΠΆΡΡΠ½Π°Π»Π°Ρ , ΡΠΊΠ°Π·Π°Π½Π½ΡΡ Π²ΡΡΠ΅), ΡΡΠΎ Π²Ρ ΠΌΠΎΠΆΠ΅ΡΠ΅ ΠΏΠΈΡΠ°ΡΡ ΠΈΠΌΠΏΠ»ΠΈΠΌΠ΅Π½ΡΡ, ΠΊΠΎΡΠΎΡΡΠ΅ Π΄Π°ΡΡ ΡΠΊΠ²ΠΈΠ²Π°Π»Π΅Π½ΡΠ½ΡΠ΅ Π³Π°ΡΠ°Π½ΡΠΈΠΈ ΠΎΡΠ½ΠΎΡΠΈΡΠ΅Π»ΡΠ½ΠΎ Π΄Π΅ΡΠΎΠ»ΡΠ° . ΠΠ΄Π½Π°ΠΊΠΎ Π±ΠΎΠ»Π΅Π΅ ΠΏΠΎΠ·Π΄Π½ΠΈΠ΅ ΠΊΠΎΠΌΠΌΠ΅Π½ΡΠ°ΡΠΈΠΈ ΠΠΈΠΊΠΎ ΠΏΡΠ΅Π΄ΠΏΠΎΠ»Π°Π³Π°ΡΡ, ΡΡΠΎ ΡΠ°ΠΊΠΈΠ΅ ΠΈΠΌΠΏΠ»ΠΈΠΌΠ΅Π½ΡΡ ΠΌΠΎΠ³ΡΡ Π±ΡΡΡ Π·Π°ΠΏΡΠ΅ΡΠ΅Π½Ρ (ΠΈΠ»ΠΈ, ΠΏΠΎ ΠΊΡΠ°ΠΉΠ½Π΅ΠΉ ΠΌΠ΅ΡΠ΅, Π·Π°ΠΏΡΠ΅ΡΠ΅Π½Ρ) ΠΏΡΠ°Π²ΠΈΠ»Π°ΠΌΠΈ Π΄Π»Ρ ΡΠΈΡΠΎΡ.
Π’Π°ΠΊΠΈΠΌ ΠΎΠ±ΡΠ°Π·ΠΎΠΌ , Π΅Π΅ Π½Π΅ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½Π½ΡΠΉ ΠΌΠ½Π΅ , Π΅ΡΠ»ΠΈ Β«impls ΡΠ²Π»ΡΠ΅ΡΡΡ Π½Π΅ΡΠ°Π·ΡΡΠ²Π½ΠΎΠΉΒ» Π³Π°ΡΠ°Π½ΡΠΈΡ ΡΠΏΠ°ΡΡΠΈ , , Π½ΠΎ ΠΎΠ½ ΡΠ²Π΅ΡΠ΅Π½ , ΡΡΠΎ ΠΎΠ½Π° Π½Π΅ ΡΠΎΠ²ΠΌΠ΅ΡΡΠΈΠΌΠ° Ρ ΡΠ²Π½ΡΠΌ ΠΊΠΎΠ½ΡΡΠΎΠ»Π΅ΠΌ Π½Π°Π΄ ΠΎΡΡΡΠΈΠΉ Π·Π°Π²Π΅ΡΡΠ΅Π½Π½ΠΎΡΡΡΡ.
ΠΡΡΡ Π»ΠΈ ΠΊΠ°ΠΊΠΎΠΉ-Π½ΠΈΠ±ΡΠ΄Ρ ΠΏΠ»Π°Π½ ΠΏΠΎ ΡΡΠΎΠΌΡ ΠΏΠΎΠ²ΠΎΠ΄Ρ?
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 impl ΠΎΠ±ΡΠ°ΡΠ½ΠΎ ΡΠΎΠ²ΠΌΠ΅ΡΡΠΈΠΌ Π΄Π»Ρ Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΡ, Π΅ΡΠ»ΠΈ : _
Π’ΠΎ Π΅ΡΡΡ, Ρ Π΄ΡΠΌΠ°Ρ, ΡΡΠΎ Π²ΠΎ Π²ΡΠ΅Ρ ΠΏΡΠΎΠ±Π»Π΅ΠΌΠ½ΡΡ ΠΏΡΠΈΠΌΠ΅ΡΠ°Ρ Π΄ΠΎΠ±Π°Π²Π»Π΅Π½Π½ΡΠΉ impl - ΡΡΠΎ Π±Π»Π°Π½ΠΊΠ΅ΡΠ½ΡΠΉ impl. ΠΡ Ρ ΠΎΡΠ΅Π»ΠΈ ΡΠΊΠ°Π·Π°ΡΡ, ΡΡΠΎ ΠΏΠΎΠ»Π½ΠΎΡΡΡΡ ΡΡΠ°Π½Π΄Π°ΡΡΠ½ΡΠ΅ ΠΈΠΌΠΏΠ»Π΅ΠΌΠ΅Π½ΡΡ Π΄Π»Ρ Π±Π»Π°Π½ΠΊΠ΅ΡΠΎΠ² ΡΠΎΠΆΠ΅ Π΄ΠΎΠΏΡΡΡΠΈΠΌΡ, Π½ΠΎ Ρ Π΄ΡΠΌΠ°Ρ, ΠΌΡ ΠΏΡΠΎΡΡΠΎ Π΄ΠΎΠ»ΠΆΠ½Ρ ΡΠΊΠ°Π·Π°ΡΡ, ΡΡΠΎ Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΠ΅ ΡΡΡΠ΅ΡΡΠ²ΡΡΡΠΈΡ ΠΈΠΌΠΏΠ»Π΅ΠΌΠ΅Π½ΡΠΎΠ² Π΄Π»Ρ Π±Π»Π°Π½ΠΊΠ΅ΡΠΎΠ² ΠΌΠΎΠΆΠ΅Ρ ΡΡΠ°ΡΡ ΡΠ΅ΡΡΠ΅Π·Π½ΡΠΌ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ΠΌ.
ΠΠΎΠΏΡΠΎΡ Π² ΡΠΎΠΌ, ΠΊΠ°ΠΊΡΡ Π³Π°ΡΠ°Π½ΡΠΈΡ ΠΌΡ Ρ ΠΎΡΠΈΠΌ Π΄Π°ΡΡ ΠΏΠ΅ΡΠ΅Π΄ Π»ΠΈΡΠΎΠΌ ΡΡΠΎΠ³ΠΎ - Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, Ρ Π΄ΡΠΌΠ°Ρ, ΡΡΠΎ Π±ΡΠ»ΠΎ Π±Ρ ΠΎΡΠ΅Π½Ρ Ρ ΠΎΡΠΎΡΠΎ, Π΅ΡΠ»ΠΈ Π±Ρ Ρ ΠΎΡΡ Π±Ρ ΠΎΠ΄Π΅ΡΠ»ΠΎ impl ΠΌΠΎΠ³Π»ΠΎ Π±ΡΡΡ ΡΠΎΠ»ΡΠΊΠΎ ΠΊΡΠΈΡΠΈΡΠ΅ΡΠΊΠΈΠΌ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ΠΌ Π½Π° ΠΎΡΠ½ΠΎΠ²Π΅ ΠΊΠΎΠ΄Π° Π² Π²Π°ΡΠ΅ΠΌ ΡΡΠΈΠΊΠ΅, ΡΡΠΎΠ±Ρ Π²Ρ ΠΌΠΎΠ³Π»ΠΈ ΠΏΡΠΎΡΠΌΠΎΡΡΠ΅ΡΡ Π²Π°Ρ ΡΡΠΈΠΊ ΠΈ ΡΠΎΡΠ½ΠΎ Π·Π½Π°Π΅ΡΠ΅, Π½ΡΠΆΠ½ΠΎ Π»ΠΈ Π²Π°ΠΌ ΡΠ²Π΅Π»ΠΈΡΠΈΠ²Π°ΡΡ ΠΎΡΠ½ΠΎΠ²Π½ΡΡ Π²Π΅ΡΡΠΈΡ.
@withoutboats
Π§ΡΠΎ ΠΊΠ°ΡΠ°Π΅ΡΡΡ ΠΏΡΠΎΠ±Π»Π΅ΠΌΡ ΠΎΠ±ΡΠ°ΡΠ½ΠΎΠΉ ΡΠΎΠ²ΠΌΠ΅ΡΡΠΈΠΌΠΎΡΡΠΈ, Ρ Π΄ΡΠΌΠ°Ρ, ΡΡΠΎ Π±Π»Π°Π³ΠΎΠ΄Π°ΡΡ ΡΠΈΡΠΎΡΡΠΊΠΈΠΌ ΠΏΡΠ°Π²ΠΈΠ»Π°ΠΌ ΠΌΡ ΠΌΠΎΠΆΠ΅ΠΌ ΠΎΠ±ΠΎΠΉΡΠΈΡΡ Π±Π΅Π· ΡΠ»Π΅Π΄ΡΡΡΠΈΡ ΠΏΡΠ°Π²ΠΈΠ»:
_An impl ΠΎΠ±ΡΠ°ΡΠ½ΠΎ ΡΠΎΠ²ΠΌΠ΅ΡΡΠΈΠΌ Π΄Π»Ρ Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΡ, Π΅ΡΠ»ΠΈ : _
- _ΠΡΠΎΡΠ²Π»Π΅Π½Π½Π°Ρ ΡΠ΅ΡΡΠ° ΡΠ²Π»ΡΠ΅ΡΡΡ Π°Π²ΡΠΎΠΌΠ°ΡΠΈΡΠ΅ΡΠΊΠΎΠΉ ΡΠ΅ΡΡΠΎΠΉ.
- _ΠΡΠΈΠ΅ΠΌΠ½ΠΈΠΊ - ΡΡΠΎ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡ ΡΠΈΠΏΠ°, ΠΈ ΠΊΠ°ΠΆΠ΄Π°Ρ ΡΠ΅ΡΡΠ° Π² impl ΡΡΡΠ΅ΡΡΠ²ΠΎΠ²Π°Π»Π° ΡΠ°Π½Π΅Π΅.
Π’ΠΎ Π΅ΡΡΡ, Ρ Π΄ΡΠΌΠ°Ρ, ΡΡΠΎ Π²ΠΎ Π²ΡΠ΅Ρ ΠΏΡΠΎΠ±Π»Π΅ΠΌΠ½ΡΡ ΠΏΡΠΈΠΌΠ΅ΡΠ°Ρ Π΄ΠΎΠ±Π°Π²Π»Π΅Π½Π½ΡΠΉ impl - ΡΡΠΎ Π±Π»Π°Π½ΠΊΠ΅ΡΠ½ΡΠΉ impl. ΠΡ Ρ ΠΎΡΠ΅Π»ΠΈ ΡΠΊΠ°Π·Π°ΡΡ, ΡΡΠΎ ΠΏΠΎΠ»Π½ΠΎΡΡΡΡ ΡΡΠ°Π½Π΄Π°ΡΡΠ½ΡΠ΅ ΠΈΠΌΠΏΠ»Π΅ΠΌΠ΅Π½ΡΡ Π΄Π»Ρ Π±Π»Π°Π½ΠΊΠ΅ΡΠΎΠ² ΡΠΎΠΆΠ΅ Π΄ΠΎΠΏΡΡΡΠΈΠΌΡ, Π½ΠΎ Ρ Π΄ΡΠΌΠ°Ρ, ΠΌΡ ΠΏΡΠΎΡΡΠΎ Π΄ΠΎΠ»ΠΆΠ½Ρ ΡΠΊΠ°Π·Π°ΡΡ, ΡΡΠΎ Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΠ΅ ΡΡΡΠ΅ΡΡΠ²ΡΡΡΠΈΡ ΠΈΠΌΠΏΠ»Π΅ΠΌΠ΅Π½ΡΠΎΠ² Π΄Π»Ρ Π±Π»Π°Π½ΠΊΠ΅ΡΠΎΠ² ΠΌΠΎΠΆΠ΅Ρ ΡΡΠ°ΡΡ ΡΠ΅ΡΡΠ΅Π·Π½ΡΠΌ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ΠΌ.
Π‘ΠΏΡΡΡΡ Π½Π΅Π΄Π΅Π»Ρ ΠΈ ΠΌΠ½ΠΎΠ³ΠΎ ΠΎΠ±ΡΡΠΆΠ΄Π΅Π½ΠΈΠΉ ΡΡΠΎ, ΠΊ ΡΠΎΠΆΠ°Π»Π΅Π½ΠΈΡ, ΠΎΠΊΠ°Π·Π°Π»ΠΎΡΡ Π½Π΅ ΡΠ°ΠΊ .
Π£ Π½Π°Ρ Π΅ΡΡΡ ΡΠ»Π΅Π΄ΡΡΡΠΈΠ΅ ΡΠ΅Π·ΡΠ»ΡΡΠ°ΡΡ: 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 Π, Ρ ΠΏΠΎΠ½ΡΠ» Π²Π°Ρ ΡΠΏΠΈΡΠΎΠΊ ΠΈΠ· Π΄Π²ΡΡ ΠΌΠ°ΡΠΊΠ΅ΡΠΎΠ² ΠΊΠ°ΠΊ ΠΈΠ»ΠΈ, Π° Π½Π΅ ΠΊΠ°ΠΊ ΠΈ , ΡΡΠΎ, ΠΊΠ°ΠΆΠ΅ΡΡΡ, Π²Ρ ΠΈΠΌΠ΅Π»ΠΈ Π² Π²ΠΈΠ΄Ρ?
@aturon ΠΠ°, Ρ ΠΈΠΌΠ΅Π» Π² Π²ΠΈΠ΄Ρ Β«ΠΈΠ»ΠΈΒ» - ΡΡΠΎ Π΄Π²Π° ΡΠ»ΡΡΠ°Ρ, ΠΊΠΎΠ³Π΄Π° ΡΡΠΎ ΠΊΡΠΈΡΠΈΡΠ΅ΡΠΊΠΎΠ΅ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠ΅. ΠΡΠ±Π°Ρ Π°Π²ΡΠΎΠΌΠ°ΡΠΈΡΠ΅ΡΠΊΠ°Ρ Ρ Π°ΡΠ°ΠΊΡΠ΅ΡΠΈΡΡΠΈΠΊΠ° ΠΈΠΌΠΏΠ»Π°Π½ΡΠ°ΡΠ°, Π½Π΅Π·Π°Π²ΠΈΡΠΈΠΌΠΎ ΠΎΡ ΡΠΎΠ³ΠΎ, Π½Π°ΡΠΊΠΎΠ»ΡΠΊΠΎ ΠΎΠ½Π° ΠΊΠΎΠ½ΠΊΡΠ΅ΡΠ½Π°, ΡΠ²Π»ΡΠ΅ΡΡΡ ΠΊΡΠΈΡΠΈΡΠ΅ΡΠΊΠΈΠΌ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ΠΌ, ΠΏΠΎΡΠΊΠΎΠ»ΡΠΊΡ ΠΌΡ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ΅ΠΌ ΡΠ°ΡΠΏΡΠΎΡΡΡΠ°Π½ΡΡΡ Π½Π΅Π³Π°ΡΠΈΠ²Π½ΡΠ΅ ΡΠ°ΡΡΡΠΆΠ΄Π΅Π½ΠΈΡ ΠΎ Π½ΠΈΡ : https://is.gd/k4Xtlp
Π’ΠΎ Π΅ΡΡΡ, Π΅ΡΠ»ΠΈ ΠΎΠ½ Π½Π΅ ΡΠΎΠ΄Π΅ΡΠΆΠΈΡ Π½ΠΎΠ²ΡΡ ΠΈΠΌΠ΅Π½. AFAIK, ΠΈΠΌΠΏΠ»Π°Π½Ρ, ΡΠΎΠ΄Π΅ΡΠΆΠ°ΡΠΈΠΉ Π½ΠΎΠ²ΠΎΠ΅ ΠΈΠΌΡ, Π½ΠΈΠΊΠΎΠ³Π΄Π° Π½Π΅ Π»ΠΎΠΌΠ°Π΅ΡΡΡ.
@withoutboats ΠΠ½Π΅ ΠΈΠ½ΡΠ΅ΡΠ΅ΡΠ½ΠΎ, ΠΌΠΎΠΆΠ΅ΠΌ Π»ΠΈ ΠΌΡ / Π΄ΠΎΠ»ΠΆΠ½Ρ Π»ΠΈ ΠΌΡ ΠΎΠ³ΡΠ°Π½ΠΈΡΠΈΠ²Π°ΡΡ Π»ΡΠ΄Π΅ΠΉ, ΠΏΠΎΠ»Π°Π³Π°ΡΡΠΈΡ
ΡΡ Π½Π° Π½Π΅Π³Π°ΡΠΈΠ²Π½ΡΡ Π»ΠΎΠ³ΠΈΠΊΡ Π² ΠΎΡΠ½ΠΎΡΠ΅Π½ΠΈΠΈ Π°Π²ΡΠΎ-ΡΠ΅ΡΡ Ρ
Π°ΡΠ°ΠΊΡΠ΅ΡΠ°. Π’ΠΎ Π΅ΡΡΡ, Π΅ΡΠ»ΠΈ ΠΌΡ ΡΠΊΠ°Π·Π°Π»ΠΈ, ΡΡΠΎ Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΠ΅ Π½ΠΎΠ²ΡΡ
ΠΈΠΌΠΏΠ»ΠΈΠΌΠ΅Π½ΡΠΎΠ² Π°Π²ΡΠΎΠΌΠ°ΡΠΈΡΠ΅ΡΠΊΠΈΡ
ΡΠ΅ΡΡ ΡΠ²Π»ΡΠ΅ΡΡΡ Π½Π°ΡΡΡΠ΅Π½ΠΈΠ΅ΠΌ Π·Π°ΠΊΠΎΠ½Π°, ΠΌΡ ΠΌΠΎΠ³Π»ΠΈ Π±Ρ ΠΏΡΠ΅Π΄ΡΠΏΡΠ΅Π΄ΠΈΡΡ ΠΎ ΠΈΠΌΠΏΠ»ΠΈΠ΅Π½ΡΠ°Ρ
, ΠΊΠΎΡΠΎΡΡΠ΅ ΠΌΠΎΠ³ΡΡ Π±ΡΡΡ Π½Π°ΡΡΡΠ΅Π½Ρ Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΠ΅ΠΌ Π²ΡΡΠ΅ΡΡΠΎΡΡΠ΅Π³ΠΎ ΡΡΠΈΠΊΠ° Send
. ΠΡΡΡΠ΅ Π²ΡΠ΅Π³ΠΎ ΡΡΠΎ ΡΡΠ°Π±ΠΎΡΠ°Π»ΠΎ Π±Ρ, Π΅ΡΠ»ΠΈ Π±Ρ Ρ Π½Π°Ρ Π±ΡΠ»ΠΎ:
default
Π² ΡΡΡΠ°ΡΠ΅Π³ΠΈΡΠ΅ΡΠΊΠΈΡ
ΠΌΠ΅ΡΡΠ°Ρ
(Π±ΠΎΠ»ΡΡΡΡ ΡΠ°ΡΡΡ Π²ΡΠ΅ΠΌΠ΅Π½ΠΈ);Rc
ΠΌΠΎΠ³Π»ΠΈ Π·Π°ΡΠ²ΠΈΡΡ ΠΎ ΡΠ²ΠΎΠ΅ΠΌ Π½Π°ΠΌΠ΅ΡΠ΅Π½ΠΈΠΈ Π½ΠΈΠΊΠΎΠ³Π΄Π° Π½Π΅ Π±ΡΡΡ Send
- Π½ΠΎ ΡΠΎΠ³Π΄Π° Ρ Π½Π°Ρ Π΅ΡΡΡ ΡΠ°ΠΊΠΈΠ΅ Π΄Π»Ρ Π°Π²ΡΠΎΠΌΠ°ΡΠΈΡΠ΅ΡΠΊΠΈΡ
ΡΠ΅ΡΡ, ΡΡΠΎΠ±Ρ ΠΌΡ ΠΌΠΎΠ³Π»ΠΈ ΠΈΡ
ΡΡΠΈΡΡΠ²Π°ΡΡ.ΠΠ΅ Π·Π½Π°Ρ, Π΄ΡΠΌΠ°Ρ, ΡΡΠΎ Π·Π°Π²ΠΈΡΠΈΡ ΠΎΡ ΡΠΈΠ»ΡΠ½ΠΎΠΉ ΠΌΠΎΡΠΈΠ²Π°ΡΠΈΠΈ. ΠΡΠΎΠ±Π΅Π½Π½ΠΎ ΠΌΠ°Π»ΠΎΠ²Π΅ΡΠΎΡΡΠ½ΠΎ, ΡΡΠΎ Π²Ρ ΠΏΠΎΠΉΠΌΠ΅ΡΠ΅, ΡΡΠΎ Ρ ΡΠΈΠΏΠ° ΠΌΠΎΠΆΠ΅Ρ Π±ΡΡΡ unsafe impl Send/Sync
ΠΏΠΎΡΠ»Π΅ ΡΠΎΠ³ΠΎ, ΠΊΠ°ΠΊ Π²Ρ Π΅Π³ΠΎ ΡΠΆΠ΅ Π²ΡΠΏΡΡΡΠΈΠ»ΠΈ; Π― Π΄ΡΠΌΠ°Ρ, ΡΡΠΎ Π² Π±ΠΎΠ»ΡΡΠΈΠ½ΡΡΠ²Π΅ ΡΠ»ΡΡΠ°Π΅Π² ΡΡΠΎ Π±ΡΠ΄Π΅Ρ Π±Π΅Π·ΠΎΠΏΠ°ΡΠ½ΠΎ, Π΅ΡΠ»ΠΈ Π²Ρ Π½Π°ΠΏΠΈΡΠ΅ΡΠ΅ ΡΠΈΠΏ Ρ ΠΏΡΠ΅Π΄Π²ΠΈΠ΄Π΅Π½ΠΈΠ΅ΠΌ, ΡΡΠΎ ΠΎΠ½ Π±ΡΠ΄Π΅Ρ Π±Π΅Π·ΠΎΠΏΠ°ΡΠ½ΡΠΌ (ΠΏΠΎΡΠΎΠΌΡ ΡΡΠΎ Π² ΡΡΠΎΠΌ ΡΡΡΡ ΡΠΈΠΏΠ°).
Π― Π²ΡΠ΅ Π²ΡΠ΅ΠΌΡ Π΄ΠΎΠ±Π°Π²Π»ΡΡ unsafe impl Send/Sync
ΠΏΠΎΡΡΡΠ°ΠΊΡΡΠΌ. ΠΠ½ΠΎΠ³Π΄Π° ΠΏΠΎΡΠΎΠΌΡ, ΡΡΠΎ Ρ Π΄Π΅Π»Π°Ρ Π΅Π³ΠΎ ΠΏΠΎΡΠΎΠΊΠΎΠ±Π΅Π·ΠΎΠΏΠ°ΡΠ½ΡΠΌ, ΠΈΠ½ΠΎΠ³Π΄Π° ΠΏΠΎΡΠΎΠΌΡ, ΡΡΠΎ Ρ ΠΏΠΎΠ½ΠΈΠΌΠ°Ρ, ΡΡΠΎ API C, Ρ ΠΊΠΎΡΠΎΡΡΠΌ Ρ Π²Π·Π°ΠΈΠΌΠΎΠ΄Π΅ΠΉΡΡΠ²ΡΡ, ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ Π² ΠΏΠΎΡΠΎΠΊΠ°Ρ
, Π° ΠΈΠ½ΠΎΠ³Π΄Π° ΠΏΡΠΎΡΡΠΎ ΠΏΠΎΡΠΎΠΌΡ, ΡΡΠΎ Π΄ΠΎΠ»ΠΆΠ½ΠΎ Π»ΠΈ ΡΡΠΎ-ΡΠΎ Π±ΡΡΡ Send
/ Sync
isn ΠΡΠΎ Π½Π΅ ΡΠΎ, ΠΎ ΡΠ΅ΠΌ Ρ Π΄ΡΠΌΠ°Ρ, ΠΊΠΎΠ³Π΄Π° ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π»ΡΡ ΡΡΠΈΡΡ.
Π― ΡΠ°ΠΊΠΆΠ΅ Π΄ΠΎΠ±Π°Π²Π»ΡΡ ΠΈΡ ΠΏΠΎΡΡΡΠ°ΠΊΡΡΠΌ ΠΏΡΠΈ ΡΠ²ΡΠ·ΡΠ²Π°Π½ΠΈΠΈ C API - ΡΠ°ΡΡΠΎ ΠΏΠΎΡΠΎΠΌΡ, ΡΡΠΎ ΠΊΡΠΎ-ΡΠΎ ΡΠ²Π½ΠΎ Π·Π°ΠΏΡΠ°ΡΠΈΠ²Π°Π΅Ρ ΡΡΠΈ Π³ΡΠ°Π½ΠΈΡΡ, ΠΏΠΎΡΡΠΎΠΌΡ Ρ Π·Π°ΡΠ΅ΠΌ ΠΏΡΠΎΡΠΌΠ°ΡΡΠΈΠ²Π°Ρ ΠΈ ΠΏΡΠΎΠ²Π΅ΡΡΡ, ΡΡΠΎ Π³Π°ΡΠ°Π½ΡΠΈΡΡΠ΅Ρ Π±Π°Π·ΠΎΠ²Π°Ρ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠ°.
ΠΠ΄Π½Π° Π²Π΅ΡΡ, ΠΊΠΎΡΠΎΡΠ°Ρ ΠΌΠ½Π΅ Π½Π΅ Π½ΡΠ°Π²ΠΈΡΡΡ Π² ΡΠΎΠΌ, ΠΊΠ°ΠΊ ΡΠ°Π±ΠΎΡΠ°Π΅Ρ ΡΠΏΠ΅ΡΠΈΠ°Π»ΠΈΠ·Π°ΡΠΈΡ ΡΠ²ΡΠ·Π°Π½Π½ΡΡ ΡΠ΅ΡΡ ΠΏΡΡΠΌΠΎ ΡΠ΅ΠΉΡΠ°Ρ, - ΡΡΠΎΡ ΡΠ°Π±Π»ΠΎΠ½ Π½Π΅ ΡΠ°Π±ΠΎΡΠ°Π΅Ρ:
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
in traits Π²ΡΡΠ²ΠΎΠ±ΠΎΠ΄ΠΈΠ»ΠΎ Π±Ρ Π±ΠΎΠ»ΡΡΠΎΠ΅ ΠΆΠ΅Π»Π°Π½ΠΈΠ΅ Π΄Π»Ρ ΡΠ°ΠΊΠΎΠ³ΠΎ ΡΠΎΠ΄Π° ΡΠ°Π±Π»ΠΎΠ½ΠΎΠ², Π½ΠΎ ΠΌΠ½Π΅ ΠΈΠ½ΡΠ΅ΡΠ΅ΡΠ½ΠΎ, Π½Π΅Ρ Π»ΠΈ Π»ΡΡΡΠ΅Π³ΠΎ ΡΠ΅ΡΠ΅Π½ΠΈΡ, Π³Π΄Π΅ ΠΎΠ±ΡΠΈΠΉ impl Π΄Π΅ΠΉΡΡΠ²ΠΈΡΠ΅Π»Π΅Π½, Π½ΠΎ ΡΡΠ° ΡΠΏΠ΅ΡΠΈΠ°Π»ΠΈΠ·Π°ΡΠΈΡ Π½Π΅ ΡΠ°Π±ΠΎΡΠ°Π΅Ρ, ΠΏΠΎΡΠΎΠΌΡ ΡΡΠΎ ΠΎΠ½Π° Π²Π²ΠΎΠ΄ΠΈΡ ΠΎΡΠΈΠ±ΠΊΡ ΡΠΈΠΏΠ° ?
@withoutboats ΠΠ°, ΡΡΠΎ ΠΎΠ΄ΠΈΠ½ ΠΈΠ· ΠΎΡΠ½ΠΎΠ²Π½ΡΡ Π½Π΅ΡΠ΅ΡΠ΅Π½Π½ΡΡ Π²ΠΎΠΏΡΠΎΡΠΎΠ² ΠΏΠΎ Π΄ΠΈΠ·Π°ΠΉΠ½Ρ (ΠΊΠΎΡΠΎΡΡΠΉ Ρ Π·Π°Π±ΡΠ»
@aturon Π―Π²Π»ΡΠ΅ΡΡΡ Π»ΠΈ ΡΠ΅ΠΊΡΡΠ΅Π΅ ΡΠ΅ΡΠ΅Π½ΠΈΠ΅ Π½Π°ΠΈΠ±ΠΎΠ»Π΅Π΅ ΠΊΠΎΠ½ΡΠ΅ΡΠ²Π°ΡΠΈΠ²Π½ΡΠΌ (ΠΏΡΡΠΌΠ°Ρ ΡΠΎΠ²ΠΌΠ΅ΡΡΠΈΠΌΠΎΡΡΡ ΡΠΎ Π²ΡΠ΅ΠΌ, ΡΡΠΎ ΠΌΡ Ρ ΠΎΡΠΈΠΌ ΡΠ΄Π΅Π»Π°ΡΡ) ΠΈΠ»ΠΈ ΡΡΠΎ ΡΠ΅ΡΠ΅Π½ΠΈΠ΅, ΠΊΠΎΡΠΎΡΠΎΠ΅ ΠΌΡ Π΄ΠΎΠ»ΠΆΠ½Ρ ΠΏΡΠΈΠ½ΡΡΡ ΠΏΠ΅ΡΠ΅Π΄ ΡΡΠ°Π±ΠΈΠ»ΠΈΠ·Π°ΡΠΈΠ΅ΠΉ?
Π― Π»ΠΈΡΠ½ΠΎ ΡΡΠΈΡΠ°Ρ, ΡΡΠΎ Π΅Π΄ΠΈΠ½ΡΡΠ²Π΅Π½Π½ΠΎΠ΅ ΡΠ΅Π°Π»ΡΠ½ΠΎΠ΅ ΡΠ΅ΡΠ΅Π½ΠΈΠ΅ ΡΡΠΎΠΉ ΠΏΡΠΎΠ±Π»Π΅ΠΌΡ, ΠΊΠΎΡΠΎΡΡΡ ΠΏΠΎΠ΄Π½ΠΈΠΌΠ°Π΅Ρ 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 ΡΠΏΠΎΡΠΎΠ± Π½Π°ΠΏΠΈΡΠ°Π½ΠΈΡ ΡΡΠΎΠ³ΠΎ ΠΊΠΎΠ΄Π° ΡΠ±ΠΈΠ²Π°Π΅Ρ Ρ ΡΠΎΠ»ΠΊΡ. Π― Π΄ΡΠΌΠ°Ρ, ΡΡΠΎ Π²ΠΌΠ΅ΡΡΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΡ impl BufRead Π² ΠΊΠ°ΡΠ΅ΡΡΠ²Π΅ Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π΅ΠΌΠΎΠ³ΠΎ ΡΠΈΠΏΠ° Buffer Π²Ρ ΠΈΠΌΠ΅Π»ΠΈ Π² Π²ΠΈΠ΄Ρ Self :: BufReader, Π²Π΅ΡΠ½ΠΎ?
ΠΠ°, Ρ ΠΈΠ·ΠΌΠ΅Π½ΠΈΠ» ΡΠ΅ΡΠ΅Π½ΠΈΠ΅ Π½Π° ΠΈΠΌΠΏΠ»ΠΈΡΠΈΡ Π½Π° ΠΎΡΠ½ΠΎΠ²Π΅ ΡΡΠ΅ΠΉΡΠ°, Π° Π·Π°ΡΠ΅ΠΌ ΠΏΠ΅ΡΠ΅ΠΊΠ»ΡΡΠΈΠ»ΡΡ ΠΎΠ±ΡΠ°ΡΠ½ΠΎ, Π½ΠΎ ΠΏΡΠΎΠΏΡΡΡΠΈΠ» Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π΅ΠΌΡΠΉ ΡΠΈΠΏ Π² ΡΡΠ΅ΠΉΡΠ΅.
ΠΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ, ΡΡΠΎ-ΡΠΎ Π²ΡΠΎΠ΄Π΅ ΡΠΈΡΡΠ΅ΠΌΡ ΡΠΈΠΏΠΎΠ² ΡΡΠΎΠ³ΠΎ ΡΠ·ΡΠΊΠ° ΡΠ°ΠΊΠΆΠ΅ ΠΌΠΎΠΆΠ΅Ρ Π±ΡΡΡ ΠΈΠ½ΡΠ΅ΡΠ΅ΡΠ½ΡΠΌ, ΠΏΠΎΡΠΊΠΎΠ»ΡΠΊΡ ΠΎΠ½ ΠΏΠΎΡ
ΠΎΠΆ Π½Π° Rusts, Π½ΠΎ Ρ Π½Π΅ΠΊΠΎΡΠΎΡΡΠΌΠΈ ΠΎΡΠΎΠ±Π΅Π½Π½ΠΎΡΡΡΠΌΠΈ, ΠΊΠΎΡΠΎΡΡΠ΅ ΠΌΠΎΠ³ΡΡ ΡΠ΅ΡΠΈΡΡ ΡΠ΅ΠΊΡΡΠΈΠ΅ ΠΏΡΠΎΠ±Π»Π΅ΠΌΡ.
( A <: B
Π² Rust Π±ΡΠ΄Π΅Ρ ΠΈΡΡΠΈΠ½Π½ΡΠΌ, Π΅ΡΠ»ΠΈ 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
Π½Π΅ ΡΠ΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½ Π΄Π»Ρ ΠΊΠΎΡΡΠ΅ΠΆΠ΅ΠΉ, Π° 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 ()
Π² ΡΠ»Π΅Π΄ΡΡΡΠ΅ΠΌ Π²ΡΠΏΡΡΠΊΠ΅, ΠΈ ΠΌΡ Π½Π΅ Ρ
ΠΎΡΠΈΠΌ, ΡΡΠΎΠ±Ρ ΡΡΠΎ Π±ΡΠ»ΠΎ ΠΊΡΠΈΡΠΈΡΠ΅ΡΠΊΠΈΠΌ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ΠΌ. ΠΡ Ρ
ΠΎΡΠΈΠΌ, ΡΡΠΎΠ±Ρ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠΈ ΠΈΠΌΠ΅Π»ΠΈ ΡΠ²ΠΎΠ±ΠΎΠ΄Ρ Π²Π½ΠΎΡΠΈΡΡ ΡΠ°ΠΊΠΈΠ΅ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΡ. ΠΠΎΡΡΠΎΠΌΡ, Ρ
ΠΎΡΡ () Π½Π΅ ΠΏΠΎΠ΄ΡΠ°Π·ΡΠΌΠ΅Π²Π°Π΅Ρ Display, ΠΌΡ Π½Π΅ ΠΌΠΎΠΆΠ΅ΠΌ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ ΡΡΡ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡ ΠΏΡΠΈ ΠΏΡΠΎΠ²Π΅ΡΠΊΠ΅ ΠΏΠ΅ΡΠ΅ΠΊΡΡΡΠΈΡ.
ΠΠΎ ΡΠ°ΠΊΠΆΠ΅, ΠΏΠΎΡΠΊΠΎΠ»ΡΠΊΡ () Π½Π΅ ΠΏΠΎΠ΄ΡΠ°Π·ΡΠΌΠ΅Π²Π°Π΅Ρ Display, ΠΎΠ½ Π½Π΅ Π±ΠΎΠ»Π΅Π΅ ΠΊΠΎΠ½ΠΊΡΠ΅ΡΠ΅Π½, ΡΠ΅ΠΌ T: Display
. ΠΠΎΡ ΠΏΠΎΡΠ΅ΠΌΡ ΡΠΏΠ΅ΡΠΈΠ°Π»ΠΈΠ·Π°ΡΠΈΡ Π½Π΅ ΡΠ°Π±ΠΎΡΠ°Π΅Ρ, ΡΠΎΠ³Π΄Π° ΠΊΠ°ΠΊ Π² ΡΠ»ΡΡΠ°Π΅ ΠΏΠΎ ΡΠΌΠΎΠ»ΡΠ°Π½ΠΈΡ (): Default
, ΡΠ»Π΅Π΄ΠΎΠ²Π°ΡΠ΅Π»ΡΠ½ΠΎ, impl ΡΠ²Π»ΡΠ΅ΡΡΡ Π±ΠΎΠ»Π΅Π΅ ΠΊΠΎΠ½ΠΊΡΠ΅ΡΠ½ΡΠΌ, ΡΠ΅ΠΌ T: Default
.
ΠΠΎΠ΄ΠΎΠ±Π½ΡΠ΅ ΠΈΠΌΠΏΠ»Ρ Π½Π°Ρ ΠΎΠ΄ΡΡΡΡ Π² ΠΊΠ°ΠΊΠΎΠΌ-ΡΠΎ Β«ΠΏΠΎΠ΄Π²Π΅ΡΠ΅Π½Π½ΠΎΠΌ ΡΠΎΡΡΠΎΡΠ½ΠΈΠΈΒ», ΠΈ ΠΌΡ Π½Π΅ ΠΌΠΎΠΆΠ΅ΠΌ ΠΏΡΠ΅Π΄ΠΏΠΎΠ»ΠΎΠΆΠΈΡΡ, ΡΡΠΎ ΠΎΠ½ΠΈ ΡΠΎΠ²ΠΏΠ°Π΄Π°ΡΡ ΠΈΠ»ΠΈ Π½Π΅Ρ. ΠΡ ΠΏΡΡΠ°Π΅ΠΌΡΡ Π½Π°ΠΉΡΠΈ ΠΏΡΠΈΠ½ΡΠΈΠΏΠΈΠ°Π»ΡΠ½ΡΠΉ ΡΠΏΠΎΡΠΎΠ± Π·Π°ΡΡΠ°Π²ΠΈΡΡ ΡΡΡ ΡΠ°Π±ΠΎΡΡ ΡΠ°Π±ΠΎΡΠ°ΡΡ, Π½ΠΎ ΡΡΠΎ Π½Π΅ ΠΏΠ΅ΡΠ²Π°Ρ ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΡ ΡΠΏΠ΅ΡΠΈΠ°Π»ΠΈΠ·Π°ΡΠΈΠΈ, ΡΡΠΎ ΡΠ°ΡΡΠΈΡΠ΅Π½ΠΈΠ΅ Ρ ΠΎΠ±ΡΠ°ΡΠ½ΠΎΠΉ ΡΠΎΠ²ΠΌΠ΅ΡΡΠΈΠΌΠΎΡΡΡΡ Π΄Π»Ρ ΡΡΠΎΠΉ ΡΡΠ½ΠΊΡΠΈΠΈ, ΠΊΠΎΡΠΎΡΠΎΠ΅ ΠΏΠΎΡΠ²ΠΈΡΡΡ ΠΏΠΎΠ·ΠΆΠ΅.
Π― ΠΏΠΎΠ΄Π°Π» β 40582, ΡΡΠΎΠ±Ρ ΠΎΡΡΠ»Π΅Π΄ΠΈΡΡ ΠΏΡΠΎΠ±Π»Π΅ΠΌΡ Π½Π°Π΄Π΅ΠΆΠ½ΠΎΡΡΠΈ, ΡΠ²ΡΠ·Π°Π½Π½ΡΡ ΡΠΎ ΡΡΠΎΠΊΠΎΠΌ ΡΠ»ΡΠΆΠ±Ρ.
Π£ ΠΌΠ΅Π½Ρ Π²ΠΎΠ·Π½ΠΈΠΊΠ»Π° ΠΏΡΠΎΠ±Π»Π΅ΠΌΠ° ΠΏΡΠΈ ΠΏΠΎΠΏΡΡΠΊΠ΅ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ ΡΠΏΠ΅ΡΠΈΠ°Π»ΠΈΠ·Π°ΡΠΈΡ, Ρ Π½Π΅ Π΄ΡΠΌΠ°Ρ, ΡΡΠΎ ΠΎΠ½Π° ΡΠ°ΠΊΠ°Ρ ΠΆΠ΅, ΠΊΠ°ΠΊ Ρ @antoyo , Ρ ΠΏΠΎΠ΄Π°Π» Π΅Π΅ ΠΊΠ°ΠΊ ΠΎΡΠ΄Π΅Π»ΡΠ½ΡΡ ΠΏΡΠΎΠ±Π»Π΅ΠΌΡ # 41140, ΠΏΡΠΈ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎΡΡΠΈ Ρ ΠΌΠΎΠ³Ρ ΠΏΡΠΈΠ²Π΅ΡΡΠΈ Π·Π΄Π΅ΡΡ ΠΏΡΠΈΠΌΠ΅Ρ ΠΊΠΎΠ΄Π°
@ afonso360 ΠΠ΅Ρ, ΠΌΠΎΠΆΠ½ΠΎ ΠΎΡΠ΄Π΅Π»ΡΠ½ΡΠΉ Π²ΠΎΠΏΡΠΎΡ.
Π ΠΎΠ±ΡΠ΅ΠΌ, Π½Π° Π΄Π°Π½Π½ΡΠΉ ΠΌΠΎΠΌΠ΅Π½Ρ Π΄Π°Π»ΡΠ½Π΅ΠΉΡΠ°Ρ ΡΠ°Π±ΠΎΡΠ° ΠΏΠΎ ΡΠΏΠ΅ΡΠΈΠ°Π»ΠΈΠ·Π°ΡΠΈΠΈ Π·Π°Π±Π»ΠΎΠΊΠΈΡΠΎΠ²Π°Π½Π° Π΄Π»Ρ ΡΠ°Π±ΠΎΡΡ Π½Π°Π΄ Chalk , ΡΡΠΎ Π΄ΠΎΠ»ΠΆΠ½ΠΎ ΠΏΠΎΠ·Π²ΠΎΠ»ΠΈΡΡ Π½Π°ΠΌ ΡΠ΅ΡΠΈΡΡ ΠΏΡΠΎΠ±Π»Π΅ΠΌΡ Π½Π°Π΄Π΅ΠΆΠ½ΠΎΡΡΠΈ, Π° ΡΠ°ΠΊΠΆΠ΅, Π²Π΅ΡΠΎΡΡΠ½ΠΎ, ΡΡΡΡΠ°Π½ΠΈΡΡ ΠΏΡΠΎΠ±Π»Π΅ΠΌΡ Ρ ICE, ΠΊΠΎΡΠΎΡΡΠ΅ ΡΠ΅Π³ΠΎΠ΄Π½Ρ ΠΏΠΎΡΠ°ΠΆΠ΅Π½Ρ.
ΠΠΎΠΆΠ΅Ρ ΠΊΡΠΎ-Π½ΠΈΠ±ΡΠ΄Ρ ΡΡΠΎΡΠ½ΠΈΡΡ, Π±Π°Π³ ΡΡΠΎ ΠΈΠ»ΠΈ ΡΡΠΎ-ΡΠΎ Π½Π°ΠΌΠ΅ΡΠ΅Π½Π½ΠΎ Π·Π°ΠΏΡΠ΅ΡΠ΅Π½Π½ΠΎΠ΅? https://is.gd/pBvefi
@sgrif Π― ΡΡΠΈΡΠ°Ρ, ΡΡΠΎ ΠΏΡΠΎΠ±Π»Π΅ΠΌΠ° Π·Π΄Π΅ΡΡ Π² ΡΠΎΠΌ, ΡΡΠΎ ΠΏΡΠΎΠ΅ΡΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅ ΡΠΈΠΏΠΎΠ², ΡΠ²ΡΠ·Π°Π½Π½ΡΡ ΠΏΠΎ ΡΠΌΠΎΠ»ΡΠ°Π½ΠΈΡ, Π·Π°ΠΏΡΠ΅ΡΠ΅Π½ΠΎ. Π₯ΠΎΡΡ Π΄ΠΈΠ°Π³Π½ΠΎΡΡΠΈΠΊΠ° ΠΌΠΎΠ³Π»Π° Π±Ρ Π±ΡΡΡ Π»ΡΡΡΠ΅: https://github.com/rust-lang/rust/issues/33481
ΠΠ΅ ΠΌΠΎΠ³Π»ΠΈ Π±Ρ Π²Ρ ΠΏΠΎΡΡΠ½ΠΈΡΡ, ΠΏΠΎΡΠ΅ΠΌΡ ΡΡΠΎ Π΄ΠΎΠ»ΠΆΠ½ΠΎ Π±ΡΡΡ Π·Π°ΠΏΡΠ΅ΡΠ΅Π½ΠΎ? ΠΡ Π·Π½Π°Π΅ΠΌ, ΡΡΠΎ Π½Π΅Π»ΡΠ·Ρ Π΄ΠΎΠ±Π°Π²ΠΈΡΡ ΠΊΠ°ΠΊΠΎΠΉ-Π»ΠΈΠ±ΠΎ ΠΊΠΎΠ½ΠΊΡΠ΅ΡΠ½ΡΠΉ ΠΈΠΌΠΏΠ», ΠΏΠΎΡΠΊΠΎΠ»ΡΠΊΡ ΡΡΠΎ Π½Π°ΡΡΡΠΈΡ ΠΏΡΠ°Π²ΠΈΠ»Π° Π΄Π»Ρ ΡΠΈΡΠΎΡ.
ΠΡΠΎΡ ΠΊΠΎΠΌΠΌΠ΅Π½ΡΠ°ΡΠΈΠΉ ΡΠΊΠ°Π·ΡΠ²Π°Π΅Ρ Π½Π° ΡΠΎ, ΡΡΠΎ Π² Π½Π΅ΠΊΠΎΡΠΎΡΡΡ ΡΠ»ΡΡΠ°ΡΡ ΡΡΠΎ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎ Π΄Π»Ρ ΠΎΠ±Π΅ΡΠΏΠ΅ΡΠ΅Π½ΠΈΡ Π½Π°Π΄Π΅ΠΆΠ½ΠΎΡΡΠΈ (Ρ ΠΎΡΡ Ρ Π½Π΅ Π·Π½Π°Ρ ΠΏΠΎΡΠ΅ΠΌΡ), Π° Π² Π΄ΡΡΠ³ΠΈΡ - Π΄Π»Ρ ΡΠΎΠ³ΠΎ, ΡΡΠΎΠ±Ρ Π·Π°ΡΡΠ°Π²ΠΈΡΡ ΠΏΠΎΡΡΠ΅Π±ΠΈΡΠ΅Π»Π΅ΠΉ ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡΠ° ΡΠ°ΡΡΠΌΠ°ΡΡΠΈΠ²Π°ΡΡ Π΅Π³ΠΎ ΠΊΠ°ΠΊ Π°Π±ΡΡΡΠ°ΠΊΡΠ½ΡΠΉ ΡΠΈΠΏ: https://github.com/rust- lang / rust / blob / e5e664f / src / librustc / traits / 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 / rust-lang / rust / issues / 31844 # issuecomment -284268302. ΠΡΠΈ ΡΡΠΎΠΌ, ΠΎΡΠ½ΠΎΠ²ΡΠ²Π°ΡΡΡ Π½Π° ΠΊΠΎΠΌΠΌΠ΅Π½ΡΠ°ΡΠΈΠΈ @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>
, Ρ Π²ΡΠ΅ ΡΠ°Π²Π½ΠΎ ΠΎΠΆΠΈΠ΄Π°Ρ, ΡΡΠΎ Rust Π²ΡΠ±Π΅ΡΠ΅Ρ ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΡ, ΠΎΡΠ»ΠΈΡΠ½ΡΡ ΠΎΡ 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))
}
}
Π’Π°ΠΊΠΈΠΌ ΠΎΠ±ΡΠ°Π·ΠΎΠΌ, ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΡΡ impl ΠΏΠΎ ΡΠΌΠΎΠ»ΡΠ°Π½ΠΈΡ, Π΅ΡΠ»ΠΈ 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 -249355377 ΠΈ Π½Π΅Π·Π°Π²ΠΈΡΠΈΠΌΠΎ ΠΎΡ ΠΌΠ΅Π½Ρ. Π― Ρ ΠΎΡΠ΅Π» Π±Ρ Π½Π°ΠΏΠΈΡΠ°ΡΡ 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`
@glandium, ΡΡΠΎ ΡΠ°ΠΌ ΡΠ²ΠΎΡΠΈΡΡΡ? Π₯ΠΎΡΠΎΡΠΈΠΉ ΠΏΡΠΈΠΌΠ΅Ρ, Π²ΠΎΡ ΡΡΡΠ»ΠΊΠ° Π½Π° ΠΈΠ³ΡΠΎΠ²ΡΡ ΠΏΠ»ΠΎΡΠ°Π΄ΠΊΡ: https://play.rust-lang.org/?gist=fc7cf5145222c432e2bd8de1b0a425cd&version=nightly&mode=debug
@glandium, ΡΠΎ Π΅ΡΡΡ https://github.com/rust-lang/rust/issues/48444
ΡΡΠΎ? Π² ΠΌΠΎΠ΅ΠΌ ΠΏΡΠΈΠΌΠ΅ΡΠ΅ Π½Π΅Ρ ΠΏΡΡΡΠΎΠ³ΠΎ impl.
@glandium
impl B for Foo {}
@MoSal, Π½ΠΎ ΡΡΠΎ impl "Π½Π΅ ΠΏΡΡΡΠΎ", ΠΏΠΎΡΠΊΠΎΠ»ΡΠΊΡ 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
Π Π°Π·Π²Π΅ ΡΠΏΠ΅ΡΠΈΠ°Π»ΠΈΠ·Π°ΡΠΈΡ Π½Π΅ ΠΏΡΠ΅Π΄ΠΎΡΠ²ΡΠ°ΡΠΈΡ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΡΠ΅ ΠΊΠΎΠ½ΡΠ»ΠΈΠΊΡΡ Π² Π±ΡΠ΄ΡΡΠ΅ΠΌ?
ΠΠΎΠΆΠ΅ ΠΌΠΎΠΉ, ΡΡΠΎ ΠΌΠ΅Π΄Π»Π΅Π½Π½Π°Ρ ΡΡΠ½ΠΊΡΠΈΡ! ΠΠΎΡ ΠΎΠΆΠ΅, Π½ΠΈΠΊΠ°ΠΊΠΎΠ³ΠΎ ΠΏΡΠΎΠ³ΡΠ΅ΡΡΠ° Π·Π° Π±ΠΎΠ»Π΅Π΅ ΡΠ΅ΠΌ Π΄Π²Π° Π³ΠΎΠ΄Π° (ΠΊΠΎΠ½Π΅ΡΠ½ΠΎ, ΡΠΎΠ³Π»Π°ΡΠ½ΠΎ ΠΈΡΡ ΠΎΠ΄Π½ΠΎΠΌΡ ΠΏΠΎΡΡΡ). ΠΠΎΠΌΠ°Π½Π΄Π° lang ΠΎΡΠΊΠ°Π·Π°Π»Π°ΡΡ ΠΎΡ ΡΡΠΎΠ³ΠΎ?
@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 ΠΠ°Ρ
#![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
ΠΡ , Ρ ΠΏΠΎΠ½ΠΈΠΌΠ°Ρ, Π΅ΡΠ»ΠΈ ΠΎΠΊΠ°ΠΆΠ΅ΡΡΡ, ΡΡΠΎ ΠΏΡΠΎΠ΅ΠΊΡΠΈΡ ΠΏΠ»ΠΎΡ ΠΎ Π²Π·Π°ΠΈΠΌΠΎΠ΄Π΅ΠΉΡΡΠ²ΡΠ΅Ρ ΡΠΎ ΡΠΏΠ΅ΡΠΈΠ°Π»ΠΈΠ·Π°ΡΠΈΠ΅ΠΉ Π² ΡΠ΅Π»ΠΎΠΌ. . Π Π΄Π΅ΠΉΡΡΠ²ΠΈΡΠ΅Π»ΡΠ½ΠΎ, ΡΠΎ, ΡΡΠΎ Ρ Ρ ΠΎΡΡ, ΠΈΠΌΠ΅Π΅Ρ ΠΏΡΠΈΠ²ΠΊΡΡ Β«Π½Π΅Π³Π°ΡΠΈΠ²Π½ΡΡ ΡΠ°ΡΡΡΠΆΠ΄Π΅Π½ΠΈΠΉΒ» (Ρ ΠΎΡΡ Π·Π°ΠΊΡΡΡΡΡ ΡΠ΅ΡΡ Π±ΡΠ»ΠΎ Π±Ρ Π½Π΅Π΄ΠΎΡΡΠ°ΡΠΎΡΠ½ΠΎ).
Π ΡΠΎΠΆΠ°Π»Π΅Π½ΠΈΡ, Ρ Π½Π΅ ΡΠ²Π΅ΡΠ΅Π½, Π΄Π΅ΠΉΡΡΠ²ΠΈΡΠ΅Π»ΡΠ½ΠΎ Π»ΠΈ Π΅ΡΡΡ ΡΠΏΠΎΡΠΎΠ± Π΄Π΅Π»Π°ΡΡ ΡΠΎ, ΡΡΠΎ Ρ Ρ ΠΎΡΡ Π±Π΅Π· ΡΠ°ΠΊΠΎΠΉ ΡΡΠ½ΠΊΡΠΈΠΈ: Ρ Ρ ΠΎΡΠ΅Π» Π±Ρ ΠΈΠΌΠ΅ΡΡ ΡΠ²ΡΠ·Π°Π½Π½ΡΠΉ ΡΠΈΠΏ, ΠΊΠΎΡΠΎΡΡΠΉ Π²ΡΠ²ΠΎΠ΄ΠΈΡ Β«TrueΒ», ΠΊΠΎΠ³Π΄Π° Π΄Π²Π° ΠΏΠ΅ΡΠ΅Π΄Π°Π½Π½ΡΡ ΡΠΈΠΏΠ°, ΡΠ΅Π°Π»ΠΈΠ·ΡΡΡΠΈΡ ΠΊΠΎΠ½ΠΊΡΠ΅ΡΠ½ΡΡ ΡΠ΅ΡΡΡ, ΡΠΈΠ½ΡΠ°ΠΊΡΠΈΡΠ΅ΡΠΊΠΈ ΡΠ°Π²Π½Ρ, ΠΈ Β«ΠΠΎΠΆΡΒ», ΠΊΠΎΠ³Π΄Π° ΠΎΠ½ΠΈ Π½Π΅ ΡΠΎΠ²ΠΏΠ°Π΄Π°ΡΡ (ΡΠ»ΡΡΠ°ΠΉ Β«ΠΠΎΠΆΡΒ» Π·Π°ΠΏΡΡΠΊΠ°Π΅Ρ Π±ΠΎΠ»Π΅Π΅ Π·Π°ΡΡΠ°ΡΠ½ΡΠΉ ΠΏΠΎΠΈΡΠΊ ΠΏΡΠΈΠ·Π½Π°ΠΊΠΎΠ², ΠΊΠΎΡΠΎΡΡΠΉ ΠΌΠΎΠΆΠ΅Ρ ΠΎΠΏΡΠ΅Π΄Π΅Π»ΠΈΡΡ, ΡΠ°Π²Π½Ρ Π»ΠΈ ΠΎΠ½ΠΈ Β«ΡΠ΅ΠΌΠ°Π½ΡΠΈΡΠ΅ΡΠΊΠΈΒ»). ΠΠ΄ΠΈΠ½ΡΡΠ²Π΅Π½Π½Π°Ρ ΡΠ΅Π°Π»ΡΠ½Π°Ρ Π°Π»ΡΡΠ΅ΡΠ½Π°ΡΠΈΠ²Π° ΠΊΠ°ΠΆΠ΅ΡΡΡ (ΠΌΠ½Π΅) - ΠΏΡΠΎΡΡΠΎ Π²ΡΠ΅Π³Π΄Π° Π²ΡΠΏΠΎΠ»Π½ΡΡΡ Π΄ΠΎΡΠΎΠ³ΠΎΡΡΠΎΡΡΠΈΠΉ ΠΏΠΎΠΈΡΠΊ; Π’Π΅ΠΎΡΠ΅ΡΠΈΡΠ΅ΡΠΊΠΈ ΡΡΠΎ Π½ΠΎΡΠΌΠ°Π»ΡΠ½ΠΎ, Π½ΠΎ ΠΌΠΎΠΆΠ΅Ρ Π±ΡΡΡ Π½Π°ΠΌΠ½ΠΎΠ³ΠΎ Π΄ΠΎΡΠΎΠΆΠ΅.
(Π― ΠΌΠΎΠ³ Π±Ρ ΠΎΠ±ΠΎΠΉΡΠΈ ΡΡΠΎ, Π΅ΡΠ»ΠΈ Π±Ρ ΡΠ΅ΡΡΠ° Π±ΡΠ»Π° ΠΏΡΠ΅Π΄Π½Π°Π·Π½Π°ΡΠ΅Π½Π° Π΄Π»Ρ Π·Π°ΠΊΡΡΡΠΈΡ, ΠΏΡΠΎΡΡΠΎ ΠΏΠ΅ΡΠ΅ΡΠΈΡΠ»ΠΈΠ² Π²ΡΠ΅ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΡΠ΅ ΠΏΠ°ΡΡ ΠΊΠΎΠ½ΡΡΡΡΠΊΡΠΎΡΠΎΠ² Π² ΠΏΠΎΠ·ΠΈΡΠΈΠΈ Π³ΠΎΠ»ΠΎΠ²Ρ ΠΈ Π·Π°ΡΡΠ°Π²ΠΈΠ² ΠΈΡ Π²ΡΠ²ΠΎΠ΄ΠΈΡΡ True ΠΈΠ»ΠΈ False; Π½ΠΎ ΠΎΠ½ ΠΏΡΠ΅Π΄Π½Π°Π·Π½Π°ΡΠ΅Π½ Π΄Π»Ρ ΡΠ°ΡΡΠΈΡΠ΅Π½ΠΈΡ Π·Π° ΠΏΡΠ΅Π΄Π΅Π»Π°ΠΌΠΈ ΡΠ΅ΠΏΠΎΠ·ΠΈΡΠΎΡΠΈΡ, ΡΡΠΎΠ±Ρ Π½Π΅ ΡΡΠ°Π±ΠΎΡΠ°Π΅Ρ, ΡΠ΅ΠΌ Π±ΠΎΠ»Π΅Π΅, ΡΡΠΎ ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΠΈ Π² Π΄Π²ΡΡ ΡΠ°Π·Π½ΡΡ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»ΡΡΠΊΠΈΡ ΡΠ΅ΠΏΠΎΠ·ΠΈΡΠΎΡΠΈΡΡ Π½Π΅ ΠΎΠ±ΡΠ·Π°ΡΠ΅Π»ΡΠ½ΠΎ Π±ΡΠ΄ΡΡ Π·Π½Π°ΡΡ Π΄ΡΡΠ³ ΠΎ Π΄ΡΡΠ³Π΅).
Π Π»ΡΠ±ΠΎΠΌ ΡΠ»ΡΡΠ°Π΅, ΠΌΠΎΠΆΠ΅Ρ Π±ΡΡΡ, ΡΡΠΎ ΠΏΡΠΎΡΡΠΎ ΠΏΡΠΈΠ·Π½Π°ΠΊ ΡΠΎΠ³ΠΎ, ΡΡΠΎ ΡΠΎ, ΡΡΠΎ Ρ Ρ ΠΎΡΡ ΡΠ΄Π΅Π»Π°ΡΡ, ΠΏΠ»ΠΎΡ ΠΎ ΠΏΠΎΠ΄Ρ ΠΎΠ΄ΠΈΡ Π΄Π»Ρ ΡΠΈΡΡΠ΅ΠΌΡ ΠΏΡΠΈΠ·Π½Π°ΠΊΠΎΠ², ΠΈ ΠΌΠ½Π΅ ΡΠ»Π΅Π΄ΡΠ΅Ρ ΠΏΠ΅ΡΠ΅ΠΊΠ»ΡΡΠΈΡΡΡΡ Π½Π° ΠΊΠ°ΠΊΠΎΠΉ-ΡΠΎ Π΄ΡΡΠ³ΠΎΠΉ ΠΌΠ΅Ρ Π°Π½ΠΈΠ·ΠΌ, Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, ΠΌΠ°ΠΊΡΠΎΡΡ: P
Π Π΄Π΅ΠΉΡΡΠ²ΠΈΡΠ΅Π»ΡΠ½ΠΎ, ΡΠΎ, ΡΡΠΎ Ρ Ρ ΠΎΡΡ, ΠΈΠΌΠ΅Π΅Ρ ΠΏΡΠΈΠ²ΠΊΡΡ Β«Π½Π΅Π³Π°ΡΠΈΠ²Π½ΡΡ ΡΠ°ΡΡΡΠΆΠ΄Π΅Π½ΠΈΠΉΒ» (Ρ ΠΎΡΡ Π·Π°ΠΊΡΡΡΡΡ ΡΠ΅ΡΡ Π±ΡΠ»ΠΎ Π±Ρ Π½Π΅Π΄ΠΎΡΡΠ°ΡΠΎΡΠ½ΠΎ).
ΠΠ»ΡΡΠ΅ΡΠ½Π°ΡΠΈΠ²ΠΎΠΉ ΠΎΡΡΠΈΡΠ°ΡΠ΅Π»ΡΠ½ΠΎΠΌΡ ΡΠ°ΡΡΡΠΆΠ΄Π΅Π½ΠΈΡ ΡΠ²Π»ΡΠ΅ΡΡΡ ΡΡΠ΅Π±ΠΎΠ²Π°Π½ΠΈΠ΅, ΡΡΠΎΠ±Ρ ΡΠΈΠΏ ΡΠ΅Π°Π»ΠΈΠ·ΠΎΠ²ΡΠ²Π°Π» ΡΠΎΠ»ΡΠΊΠΎ ΠΎΠ΄Π½Ρ Ρ
Π°ΡΠ°ΠΊΡΠ΅ΡΠΈΡΡΠΈΠΊΡ Π·Π°ΠΊΡΡΡΠΎΠ³ΠΎ Π½Π°Π±ΠΎΡΠ° Ρ
Π°ΡΠ°ΠΊΡΠ΅ΡΠΈΡΡΠΈΠΊ, ΡΠ°ΠΊ ΡΡΠΎ ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΠΈ Ρ Π΄ΡΡΠ³ΠΈΠΌΠΈ Π΄ΡΡΠ³ΠΈΠΌΠΈ Ρ
Π°ΡΠ°ΠΊΡΠ΅ΡΠΈΡΡΠΈΠΊΠ°ΠΌΠΈ Π² Π½Π°Π±ΠΎΡΠ΅ Π½Π΅ ΠΌΠΎΠ³ΡΡ ΠΏΠ΅ΡΠ΅ΠΊΡΡΠ²Π°ΡΡΡΡ (Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, T
ΡΠ΅Π°Π»ΠΈΠ·ΡΠ΅Ρ ΠΎΠ΄Π½Ρ ΠΈΠ· { Float | Int | Bool | Ptr }
).
ΠΠ°ΠΆΠ΅ Π΅ΡΠ»ΠΈ Π±Ρ Π±ΡΠ» ΡΠΏΠΎΡΠΎΠ± ΠΎΠ±Π΅ΡΠΏΠ΅ΡΠΈΡΡ ΡΡΠΎ Π² Rust (ΠΊΠΎΡΠΎΡΠΎΠ³ΠΎ Π½Π΅Ρ, AFAIK?), Π― Π½Π΅ Π΄ΡΠΌΠ°Ρ, ΡΡΠΎ ΡΡΠΎ ΡΠ΅ΡΠΈΠ»ΠΎ Π±Ρ ΠΌΠΎΡ ΠΏΡΠΎΠ±Π»Π΅ΠΌΡ. Π― Ρ ΠΎΡΠ΅Π» Π±Ρ, ΡΡΠΎΠ±Ρ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»ΠΈ Π² ΡΠ°Π·Π½ΡΡ ΡΡΠΈΠΊΠ°Ρ ΠΌΠΎΠ³Π»ΠΈ ΡΠ΅Π°Π»ΠΈΠ·ΠΎΠ²ΡΠ²Π°ΡΡ ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ»ΡΠ½ΠΎΠ΅ ΠΊΠΎΠ»ΠΈΡΠ΅ΡΡΠ²ΠΎ Π½ΠΎΠ²ΡΡ ΠΊΠΎΠ½ΡΡΠ°Π½Ρ, ΠΊΠΎΡΠΎΡΡΠ΅ Π΄ΠΎΠ»ΠΆΠ½Ρ ΡΡΠ°Π²Π½ΠΈΠ²Π°ΡΡΡΡ ΡΠ°Π²Π½ΡΠΌΠΈ ΡΠΎΠ»ΡΠΊΠΎ ΡΠ°ΠΌΠΈΠΌ ΡΠ΅Π±Π΅ ΠΈ Π½Π΅ ΡΠ°Π²Π½ΡΠΌΠΈ Π»ΡΠ±ΠΎΠΉ Π΄ΡΡΠ³ΠΎΠΉ ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½Π½ΠΎΠΉ ΠΊΠΎΠ½ΡΡΠ°Π½ΡΠ΅, Π²ΠΊΠ»ΡΡΠ°Ρ ΡΠ΅, ΠΊΠΎΡΠΎΡΡΠ΅ Π½Π΅ΠΈΠ·Π²Π΅ΡΡΠ½Ρ Π²ΠΎ Π²ΡΠ΅ΠΌΡ ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ΠΈΡ ΡΡΠΈΠΊΠ°. Π― Π½Π΅ ΠΏΠΎΠ½ΠΈΠΌΠ°Ρ, ΠΊΠ°ΠΊ ΠΊΠ°ΠΊΠΎΠΉ-Π»ΠΈΠ±ΠΎ Π·Π°ΠΊΡΡΡΡΠΉ Π½Π°Π±ΠΎΡ ΡΠ΅ΡΡ (ΠΈΠ»ΠΈ Π΄Π°ΠΆΠ΅ Π½Π°Π±ΠΎΡ ΡΠ΅ΠΌΠ΅ΠΉΡΡΠ² ΡΠ΅ΡΡ) ΠΌΠΎΠΆΠ΅Ρ Π΄ΠΎΡΡΠΈΡΡ ΡΡΠΎΠΉ ΡΠ΅Π»ΠΈ ΡΠ°ΠΌ ΠΏΠΎ ΡΠ΅Π±Π΅: ΡΡΠΎ ΠΏΡΠΎΠ±Π»Π΅ΠΌΠ°, ΠΊΠΎΡΠΎΡΡΡ ΠΏΡΠΈΠ½ΡΠΈΠΏΠΈΠ°Π»ΡΠ½ΠΎ Π½Π΅Π»ΡΠ·Ρ ΡΠ΅ΡΠΈΡΡ, Π½Π΅ Π³Π»ΡΠ΄Ρ Π½Π΅ΠΏΠΎΡΡΠ΅Π΄ΡΡΠ²Π΅Π½Π½ΠΎ Π½Π° ΡΠΈΠΏΡ. ΠΡΠΈΡΠΈΠ½Π°, ΠΏΠΎ ΠΊΠΎΡΠΎΡΠΎΠΉ ΡΡΠΎ Π±ΡΠ΄Π΅Ρ ΡΠ°Π±ΠΎΡΠ°ΡΡ Ρ ΠΏΡΠΎΠ΅ΠΊΡΠΈΡΠΌΠΈ ΠΏΠΎ ΡΠΌΠΎΠ»ΡΠ°Π½ΠΈΡ, Π·Π°ΠΊΠ»ΡΡΠ°Π΅ΡΡΡ Π² ΡΠΎΠΌ, ΡΡΠΎ Π²Ρ ΠΌΠΎΠΆΠ΅ΡΠ΅ ΠΏΠΎ ΡΠΌΠΎΠ»ΡΠ°Π½ΠΈΡ Π²ΡΠ΅, ΡΡΠΎΠ±Ρ Β«Π½Π΅ ΡΡΠ°Π²Π½ΠΈΠ²Π°ΡΡ ΡΠ°Π²Π½ΡΠ΅Β», Π° Π·Π°ΡΠ΅ΠΌ ΡΠ΅Π°Π»ΠΈΠ·ΠΎΠ²Π°ΡΡ ΡΠ°Π²Π΅Π½ΡΡΠ²ΠΎ Π²Π°ΡΠ΅ΠΉ Π½ΠΎΠ²ΠΎΠΉ ΠΊΠΎΠ½ΡΡΠ°Π½ΡΡ ΡΠ°ΠΌΠΎΠΉ ΡΠ΅Π±Π΅ Π² Π»ΡΠ±ΠΎΠΌ ΡΡΠΈΠΊΠ΅, Π² ΠΊΠΎΡΠΎΡΠΎΠΌ Π²Ρ ΠΎΠΏΡΠ΅Π΄Π΅Π»ΠΈΠ»ΠΈ ΠΊΠΎΠ½ΡΡΠ°Π½ΡΡ, ΡΡΠΎ Π½Π΅ Π±ΡΠ΄Π΅Ρ ΠΌΠ΅ΡΠ°ΡΡ ΡΠΈΡΠΎΡΠ΅ rules, ΠΏΠΎΡΠΎΠΌΡ ΡΡΠΎ Π²ΡΠ΅ ΡΠΈΠΏΡ Π² ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΠΈ ΡΡΠ΅ΠΉΡΠ° Π±ΡΠ»ΠΈ Π² ΠΎΠ΄Π½ΠΎΠΌ ΡΡΠΈΠΊΠ΅. ΠΡΠ»ΠΈ Π±Ρ Ρ Ρ ΠΎΡΠ΅Π» ΠΏΠΎΡΡΠΈ Π»ΡΠ±ΠΎΠ΅ ΡΠ°ΠΊΠΎΠ΅ ΠΏΡΠ°Π²ΠΈΠ»ΠΎ, ΠΊΡΠΎΠΌΠ΅ ΡΠ°Π²Π΅Π½ΡΡΠ²Π°, Π΄Π°ΠΆΠ΅ ΡΡΠΎ Π½Π΅ ΡΡΠ°Π±ΠΎΡΠ°Π»ΠΎ Π±Ρ, Π½ΠΎ ΡΠ°Π²Π΅Π½ΡΡΠ²Π° Π΄Π»Ρ ΠΌΠ΅Π½Ρ Π΄ΠΎΡΡΠ°ΡΠΎΡΠ½ΠΎ :)
Π Π½Π°ΡΡΠΎΡΡΠ΅Π΅ Π²ΡΠ΅ΠΌΡ ΠΊΠ°ΠΆΠ΄ΡΡ Π½ΠΎΡΡ ΡΡΠΎ ΡΠ°Π±ΠΎΡΠ°Π΅Ρ:
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 () {}
ΠΡΡΡ Π»ΠΈ Π² ΡΡΠΎΠΌ ΠΏΡΠΈΡΠΈΠ½Π° ΠΈΠ»ΠΈ ΡΡΠΎ ΠΎΡΠΈΠ±ΠΊΠ°?
@rmanoka Π Π°Π·Π²Π΅ ΡΡΠΎ Π½Π΅ ΠΎΠ±ΡΡΠ½ΡΠ΅ ΠΏΡΠ°Π²ΠΈΠ»Π° Π΄Π»Ρ ΡΠΈΡΠΎΡ? Π ΠΏΠ΅ΡΠ²ΠΎΠΌ ΡΠ»ΡΡΠ°Π΅ Π½ΠΈ ΠΎΠ΄ΠΈΠ½ Π½ΠΈΠΆΠ½ΠΈΠΉ ΡΡΠΈΠΊ Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ impl Bar for ()
ΠΏΠΎΡΡΠΎΠΌΡ ΠΊΠΎΠΌΠΏΠΈΠ»ΡΡΠΎΡ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ΅Ρ ΡΡΠΎ, Π½ΠΎ Π²ΠΎ Π²ΡΠΎΡΠΎΠΌ ΠΏΡΠΈΠΌΠ΅ΡΠ΅ Π½ΠΈΠΆΠ½ΠΈΠΉ ΡΡΠΈΠΊ ΠΌΠΎΠΆΠ΅Ρ impl Bar<CustomType> for ()
ΡΡΠΎ Π±ΡΠ΄Π΅Ρ ΠΊΠΎΠ½ΡΠ»ΠΈΠΊΡΠΎΠ²Π°ΡΡ Ρ Π²Π°ΡΠΈΠΌ imp ΠΏΠΎ ΡΠΌΠΎΠ»ΡΠ°Π½ΠΈΡ.
@Boscop Π ΡΡΠΎΠΌ ΡΡΠ΅Π½Π°ΡΠΈΠΈ imp ΠΏΠΎ ΡΠΌΠΎΠ»ΡΠ°Π½ΠΈΡ Π² Π»ΡΠ±ΠΎΠΌ ΡΠ»ΡΡΠ°Π΅ Π΄ΠΎΠ»ΠΆΠ΅Π½ Π±ΡΡΡ Π·Π°ΠΌΠ΅Π½Π΅Π½ Π½Π΅ ΠΏΠΎ ΡΠΌΠΎΠ»ΡΠ°Π½ΠΈΡ Π½ΠΈΠΆΠ΅. ΠΠ°ΠΏΡΠΈΠΌΠ΅Ρ, Π΅ΡΠ»ΠΈ Π±Ρ Ρ ΠΌΠ΅Π½Ρ Π±ΡΠ»ΠΎ: impl Bar<bool> for () {}
Π΄ΠΎΠ±Π°Π²Π»Π΅Π½Π½ΠΎΠ΅ ΠΏΠ΅ΡΠ΅Π΄ Π΄ΡΡΠ³ΠΈΠΌΠΈ ΠΈΠΌΠΏΠ»Π΅ΠΌΠ΅Π½ΡΠ°ΡΠΈΡΠΌΠΈ, Ρ Π±Ρ ΠΎΠΆΠΈΠ΄Π°Π», ΡΡΠΎ ΡΡΠΎ ΡΡΠ°Π±ΠΎΡΠ°Π΅Ρ (ΡΠΎΠ³Π»Π°ΡΠ½ΠΎ RFC / ΠΎΠΆΠΈΠ΄Π°Π½ΠΈΡ). ΠΠ΅ ΠΏΡΠ°Π²Π΄Π° Π»ΠΈ?
Π£Π³Π»ΡΠ±Π»ΡΡΡΡ Π² ΡΠ°ΡΡΡΠΆΠ΄Π΅Π½ΠΈΡ ΠΎ ΠΊΠΎΠ½ΡΡΠΏΡΠΈΠΌΠ΅ΡΠ΅, ΠΊΠΎΡΠΎΡΡΠΉ Π²Ρ ΡΠΏΠΎΠΌΡΠ½ΡΠ»ΠΈ, Ρ ΠΏΠΎΠ½ΠΈΠΌΠ°Ρ (ΠΈΠ»ΠΈ Π²Π΅ΡΡ), ΡΡΠΎ ΡΡΠΎΡ ΠΏΡΠΈΠΌΠ΅Ρ ΡΠ΄ΠΎΠ²Π»Π΅ΡΠ²ΠΎΡΡΠ΅Ρ ΠΊΡΠΈΡΠ΅ΡΠΈΡ Β«Π²ΡΠ΅Π³Π΄Π° ΠΏΡΠΈΠΌΠ΅Π½ΠΈΠΌΠΎΡΡΡΒ» ΠΈ, Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ, Π½Π°Π΄ Π½ΠΈΠΌ ΡΠ°Π±ΠΎΡΠ°ΡΡ.
ΠΡΠ° ΠΏΡΠΎΠ±Π»Π΅ΠΌΠ°, Π²Π΅ΡΠΎΡΡΠ½ΠΎ, Π·Π°Π²ΠΈΡΠΈΡ ΠΎΡ # 45814.
ΠΡΡΡ Π»ΠΈ ΠΊΠ°ΠΊΠΈΠ΅-Π»ΠΈΠ±ΠΎ ΠΏΠ»Π°Π½Ρ ΠΏΠΎ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΊΠ΅ Π³ΡΠ°Π½ΠΈΡ ΡΠ΅ΡΡ ΠΏΠΎ ΡΠΌΠΎΠ»ΡΠ°Π½ΠΈΡ, ΠΊΠΎΡΠΎΡΡΡ Π½Π΅Ρ Π² ΡΠΏΠ΅ΡΠΈΠ°Π»ΠΈΠ·Π°ΡΠΈΠΈ?
Π ΠΊΠ°ΡΠ΅ΡΡΠ²Π΅ ΠΏΡΠΈΠΌΠ΅ΡΠ°, Π΄Π»Ρ ΠΊΠΎΡΠΎΡΠΎΠ³ΠΎ ΡΡΠΎ Π±ΡΠ»ΠΎ Π±Ρ ΠΎΡΠ΅Π½Ρ ΠΏΠΎΠ»Π΅Π·Π½ΠΎ, Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, ΡΡΠΎΠ±Ρ Π²Ρ ΠΌΠΎΠ³Π»ΠΈ Π»Π΅Π³ΠΊΠΎ ΡΠΊΠΎΠΌΠΏΠΎΠ½ΠΎΠ²Π°ΡΡ ΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΡ ΡΠ°Π·Π»ΠΈΡΠ½ΡΡ ΡΠΈΠΏΠΎΠ², ΡΠΎΠ·Π΄Π°Π² ΠΎΠ±ΡΠΈΠΉ Struct Ρ ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ»ΡΠ½ΡΠΌ Π²Π½ΡΡΡΠ΅Π½Π½ΠΈΠΌ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ΠΌ Π΄Π»Ρ ΡΡΠ½ΠΊΡΠΈΠΉ, ΠΊΠΎΡΠΎΡΡΠ΅ Π½Π΅ Π΄ΠΎΠ»ΠΆΠ½Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡΡΡ ΡΠΎΠ²ΠΌΠ΅ΡΡΠ½ΠΎ.
#![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);
}
ΠΡΠΎΠΌΠ΅ ΡΠΎΠ³ΠΎ, Π² ΠΏΡΠΈΠ²Π΅Π΄Π΅Π½Π½ΠΎΠΌ Π²ΡΡΠ΅ ΠΏΡΠΈΠΌΠ΅ΡΠ΅ Ρ ΠΈΡΠΏΡΡΠ°Π» Π½Π΅ΡΡΠΎ ΡΡΡΠ°Π½Π½ΠΎΠ΅ - ΠΏΠΎΡΠ»Π΅ ΡΠ΄Π°Π»Π΅Π½ΠΈΡ ΠΏΡΠΈΠ·Π½Π°ΠΊΠ°, ΠΏΡΠΈΠ²ΡΠ·Π°Π½Π½ΠΎΠ³ΠΎ ΠΊ ΠΎΠ±ΡΠ°Π±ΠΎΡΡΠΈΠΊΡ ΠΏΠΎ ΡΠΌΠΎΠ»ΡΠ°Π½ΠΈΡ impl (Π° ΡΠ°ΠΊΠΆΠ΅ self.0.handle (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, ΡΡΠΎ, ΠΊΠ°ΠΆΠ΅ΡΡΡ, Π½Π°ΡΡΡΠ°Π΅Ρ Π²ΡΠ²ΠΎΠ΄ Π΄ΡΡΠ³ΠΎΠ³ΠΎ ΠΏΡΠΈΠ·Π½Π°ΠΊΠ°Β»), ΠΠ»ΡΠ΄Π΄ΠΈ ΡΠΏΠΎΠΌΡΠ½ΡΠ»Π° ΠΎΠ΄ΠΈΠ½ ΠΏΠΎΡΡ Π½Π°Π·Π°Π΄.
ΠΡΠΈ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠΈ rustc 1.35.0-nightly (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
ΠΠ±ΡΠ°ΡΠΈΡΠ΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅: Π΅ΡΠ»ΠΈ Π²Ρ ΠΈΠ·ΠΌΠ΅Π½ΠΈΡΠ΅ crate bar
Π½Π°
pub trait Bar {}
impl<B: ?Sized + Bar> Bar for Box<B> {}
ΠΠ°ΡΠ΅ΠΌ ΡΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡΡΠ΅Ρ foo
.
@ bjorn3 ΠΠΎΡ
ΠΎΠΆΠ΅, ΡΡΠΎ Π½Π°ΠΌ Π½Π΅ Π½ΡΠΆΠ΅Π½ ΠΌΠ΅ΡΠΎΠ΄ default
ΡΡΠΎΠ±Ρ Π΅Π³ΠΎ ΡΠΏΠ΅ΡΠΈΠ°Π»ΠΈΠ·ΠΈΡΠΎΠ²Π°ΡΡ ( ΠΈΠ³ΡΠΎΠ²Π°Ρ ΠΏΠ»ΠΎΡΠ°Π΄ΠΊΠ° ).
@KrishnaSannasi Π― Π½Π΅ ΠΌΠΎΠ³Ρ Π²ΠΎΡΠΏΡΠΎΠΈΠ·Π²Π΅ΡΡΠΈ ΠΎΡΠΈΠ±ΠΊΡ "ΠΊΠΎΠ½ΡΠ»ΠΈΠΊΡΡΡΡΠΈΠ΅ ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΠΈ" Π² Π²Π°ΡΠ΅ΠΌ ΠΏΡΠΈΠΌΠ΅ΡΠ΅ ( Π΄Π΅ΡΡΠΊΠ°Ρ ΠΏΠ»ΠΎΡΠ°Π΄ΠΊΠ° ).
ΠΠ±Π½ΠΎΠ²Π»Π΅Π½ΠΈΠ΅: Π, ΠΏΠΎΠ½ΡΡΠ½ΠΎ. Π§ΡΠΎΠ±Ρ ΠΏΡΠΈΠΌΠ΅Ρ ΡΠ°Π±ΠΎΡΠ°Π», ΡΡΠ΅ΠΉΡ 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
ΡΠ°ΠΌΠΎΠΌ Π΄Π΅Π»Π΅ _Π½Π΅_ ΠΎΠ·Π½Π°ΡΠ°Π΅Ρ, ΡΡΠΎ Π²ΡΠ΅ ΡΠ»Π΅ΠΌΠ΅Π½ΡΡ Π² Π±Π»ΠΎΠΊΠ΅ impl
ΡΠ²Π»ΡΡΡΡΡ default
ed. Π― ΡΡΠΈΡΠ°Ρ ΡΡΡ ΡΠ΅ΠΌΠ°Π½ΡΠΈΠΊΡ ΡΠ΄ΠΈΠ²ΠΈΡΠ΅Π»ΡΠ½ΠΎΠΉ, Π΅ΡΠ»ΠΈ Π½Π΅ ΡΠΊΠ°Π·Π°ΡΡ Π±ΠΎΠ»ΡΡΠ΅.
@ HadrienG2 ΠΠ° ΡΠ°ΠΌΠΎΠΌ Π΄Π΅Π»Π΅ Ρ Π²ΡΠ΅Π³Π΄Π° ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π» default fn
Π² ΡΡΠΎΠΌ ΠΏΡΠΎΠ΅ΠΊΡΠ΅, Π½ΠΎ Π½Π° ΡΡΠΎΡ ΡΠ°Π· Ρ Π·Π°Π±ΡΠ» ΠΊΠ»ΡΡΠ΅Π²ΠΎΠ΅ ΡΠ»ΠΎΠ²ΠΎ default
ΠΈ ΠΊΠΎΠΌΠΏΠΈΠ»ΡΡΠΎΡ ΠΏΡΠ΅Π΄Π»ΠΎΠΆΠΈΠ» Π΄ΠΎΠ±Π°Π²ΠΈΡΡ Π΅Π³ΠΎ Π² impl
. Π Π°Π½ΡΡΠ΅ Π½Π΅ Π²ΠΈΠ΄Π΅Π» ΠΏΡΠΎΠ±Π»Π΅ΠΌΡ Ρ ΡΠ΅ΠΊΡΡΡΠΈΠ΅ΠΉ ΡΡΠ΅ΠΊΠ° ΠΈ Π½Π΅ Π±ΡΠ» ΡΠ²Π΅ΡΠ΅Π½, ΠΎΠΆΠΈΠ΄Π°Π»ΠΎΡΡ Π»ΠΈ ΡΡΠΎ Π½Π° Π΄Π°Π½Π½ΠΎΠΌ ΡΡΠ°ΠΏΠ΅. Π‘ΠΏΠ°ΡΠΈΠ±ΠΎ Π·Π° ΠΏΡΠ΅Π΄Π»ΠΎΠΆΠ΅Π½ΠΈΠ΅, default fn
ΠΎΡΠ»ΠΈΡΠ½ΠΎ ΡΠ°Π±ΠΎΡΠ°Π΅Ρ.
Π ΠΈΡΡ ΠΎΠ΄Π½ΠΎΠΌ RFC Π΅ΡΡΡ ΡΠ°Π·Π΄Π΅Π», ΠΏΠΎΡΠ²ΡΡΠ΅Π½Π½ΡΠΉ ΡΠΏΠ΅ΡΠΈΠ°Π»ΠΈΠ·Π°ΡΠΈΠΈ Π²ΡΡΡΠΎΠ΅Π½Π½ΡΡ ΠΈΠΌΠΏΠΎΠ². ΠΡΠΎ-ΡΠΎ Π΄Π°Π» ΠΌΠ½Π΅ ΠΏΠΎΠΏΡΠΎΠ±ΠΎΠ²Π°ΡΡ?
ΠΠΎΠ΄Ρ ΠΎΠ΄, ΠΏΡΠ΅Π΄Π»ΠΎΠΆΠ΅Π½Π½ΡΠΉ Π² RFC, ΠΌΠΎΠΆΠ΅Ρ Π±ΠΎΠ»ΡΡΠ΅ Π½Π΅ ΡΠ°Π±ΠΎΡΠ°ΡΡ Π½Π°ΠΏΡΡΠΌΡΡ, ΠΏΠΎ ΠΊΡΠ°ΠΉΠ½Π΅ΠΉ ΠΌΠ΅ΡΠ΅, Π΄Π»Ρ Π²Π½ΡΡΡΠ΅Π½Π½ΠΈΡ ΠΌΠ΅ΡΠΎΠ΄ΠΎΠ² const:
// 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 ΠΏΡΠ΅Π΄Π»Π°Π³Π°Π΅Ρ ΠΏΡΠ΅ΠΎΠ±ΡΠ°Π·ΠΎΠ²Π°ΡΡ ΠΌΠ΅ΡΠΎΠ΄ Π² ΡΠΈΠΏΠ°ΠΆ, ΡΠ΅Π°Π»ΠΈΠ·ΠΎΠ²Π°ΡΡ Π΅Π³ΠΎ Π΄Π»Ρ ΡΠΈΠΏΠ° ΠΈ ΡΠΏΠ΅ΡΠΈΠ°Π»ΠΈΠ·ΠΎΠ²Π°ΡΡ impl. Π― ΠΏΠΎΠ»Π°Π³Π°Ρ, ΡΡΠΎ Π΄Π»Ρ ΠΌΠ΅ΡΠΎΠ΄ΠΎΠ² const fn ΡΡΠΈ impls ΠΏΡΠΈΠ·Π½Π°ΠΊΠ° Π΄Π»Ρ ΡΠΈΠΏΠ° Π΄ΠΎΠ»ΠΆΠ½Ρ Π±ΡΡΡ const impls.
ΠΠ»Ρ ΡΠ΅Ρ
, ΠΊΡΠΎ ΡΡΠ°Π»ΠΊΠΈΠ²Π°Π΅ΡΡΡ Ρ ΡΡΠΈΠΌ ΠΈ ΠΈΠ½ΡΠ΅ΡΠ΅ΡΡΠ΅ΡΡΡ ΡΡΠ°ΡΡΡΠΎΠΌ, Π² 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 Π½Π°ΠΏΠΈΡΠ°Π» (Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, Π² Π΄ΡΡΠ³ΠΎΠΌ ΠΊΠΎΠ½ΡΠ΅ΠΊΡΡΠ΅; ΠΏΠΎΠ»ΡΠΆΠΈΡΠ½ΡΠΉ ΡΡΠΈΡΡ), ΡΡΠΎ:
Π±ΡΠ»Π° ΠΎΠ΄Π½Π° ΠΊΠ»ΡΡΠ΅Π²Π°Ρ ΠΏΡΠΎΠ±Π»Π΅ΠΌΠ° [Π² ΡΠΏΠ΅ΡΠΈΠ°Π»ΠΈΠ·Π°ΡΠΈΠΈ], ΠΊΠΎΡΠΎΡΠ°Ρ ΡΠ°ΠΊ ΠΈ Π½Π΅ Π±ΡΠ»Π° ΡΠ΅ΡΠ΅Π½Π° ΡΠ΄ΠΎΠ²Π»Π΅ΡΠ²ΠΎΡΠΈΡΠ΅Π»ΡΠ½ΠΎ, ΠΏΡΠΎΠ±Π»Π΅ΠΌΠ° ΡΠ΅Ρ Π½ΠΈΡΠ΅ΡΠΊΠΎΠΉ Π½Π°Π΄Π΅ΠΆΠ½ΠΎΡΡΠΈ Π² ΠΎΡΠ½ΠΎΡΠ΅Π½ΠΈΠΈ ΠΏΡΠΎΠ΄ΠΎΠ»ΠΆΠΈΡΠ΅Π»ΡΠ½ΠΎΡΡΠΈ ΠΆΠΈΠ·Π½ΠΈ ΠΈ Ρ Π°ΡΠ°ΠΊΡΠ΅ΡΠΈΡΡΠΈΠΊ [...] ΠΠ°ΡΠ΅ΠΌ [ΡΡΠΈ Π΄Π²Π° ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΡ, ΡΡΡΠ»ΠΊΠΈ Π½Π° ΠΊΠΎΡΠΎΡΡΠ΅ ΠΏΡΠΈΠ²Π΅Π΄Π΅Π½Ρ Π²ΡΡΠ΅]. ΠΠΎΡ ΠΎΠΆΠ΅, ΡΡΠΎ ΡΡΠΈ ΠΈΠ΄Π΅ΠΈ Π² ΠΎΡΠ½ΠΎΠ²Π½ΠΎΠΌ ΡΠ΅ΡΠΈΠ»ΠΈ ΠΏΡΠΎΠ±Π»Π΅ΠΌΡ , Π½ΠΎ ΠΏΠΎΠΊΠ° ΡΡΠΎ ΠΌΡ Π±ΡΠ»ΠΈ Π·Π°Π½ΡΡΡ, ΠΈ Ρ Π½Π°Ρ Π½Π΅ Π±ΡΠ»ΠΎ Π²ΡΠ΅ΠΌΠ΅Π½ΠΈ Π½Π° Π΄Π°Π»ΡΠ½Π΅ΠΉΡΠΈΠ΅ Π΄Π΅ΠΉΡΡΠ²ΠΈΡ.
ΠΠ²ΡΡΠΈΡ ΠΎΠ±Π½Π°Π΄Π΅ΠΆΠΈΠ²Π°ΡΡΠ΅, Ρ ΠΎΡΡ ΡΠ²Π½ΠΎ Π΅ΡΡΡ Π½Π°Π΄ ΡΠ΅ΠΌ ΠΏΠΎΡΠ°Π±ΠΎΡΠ°ΡΡ.
(ΠΡΠ±Π»ΠΈΠΊΡΡ ΡΡΠΎ, ΠΏΠΎΡΠΎΠΌΡ ΡΡΠΎ Ρ Π½Π°ΡΠ΅Π» ΡΡΡ Π²Π΅ΡΠΊΡ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΎ Π½Π΅Π΄Π΅Π»Ρ Π½Π°Π·Π°Π΄ ΠΈ ΠΏΠΎΠ½ΡΡΠΈΡ Π½Π΅ ΠΈΠΌΠ΅Π» ΠΎ ΠΏΡΠΎΠ³ΡΠ΅ΡΡΠ΅ Π·Π° ΠΏΡΠΎΡΠ»ΡΠΉ Π³ΠΎΠ΄, ΡΠΎ ΡΠΎΠ²ΡΠ΅ΠΌ Π½Π΅Π΄Π°Π²Π½ΠΎ ΡΠ»ΡΡΠ°ΠΉΠ½ΠΎ Π½Π°ΡΠΊΠ½ΡΠ»ΡΡ Π½Π° ΡΡΠΈ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΡ. ΠΡΡΠ΅ Π΅ΡΡΡ ΠΊΠΎΠΌΠΌΠ΅Π½ΡΠ°ΡΠΈΠΈ, Π² ΠΊΠΎΡΠΎΡΡΡ ΠΎΠ½ΠΈ ΡΠΏΠΎΠΌΠΈΠ½Π°ΡΡΡΡ, Π½ΠΎ Π½Π° GitHub ΡΡΠ°Π½ΠΎΠ²ΠΈΡΡΡ Π²ΡΠ΅ ΡΡΡΠ΄Π½Π΅Π΅ ΡΠ²ΠΈΠ΄Π΅ΡΡ ΠΊΠ°ΠΊΠΈΠ΅-Π»ΠΈΠ±ΠΎ, ΠΊΡΠΎΠΌΠ΅ ΠΏΠ΅ΡΠ²ΡΡ ΠΈ ΠΏΠΎΡΠ»Π΅Π΄Π½ΠΈΠ΅ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΎ ΠΊΠΎΠΌΠΌΠ΅Π½ΡΠ°ΡΠΈΠ΅Π² ΠΊ Π΄Π»ΠΈΠ½Π½ΠΎΠΉ ΡΠ΅ΠΏΠΎΡΠΊΠ΅: cry:. ΠΡΠ»ΠΎ Π±Ρ ΠΏΠΎΠ»Π΅Π·Π½ΠΎ, Π΅ΡΠ»ΠΈ Π±Ρ ΡΡΠΎ ΠΎΠ±Π½ΠΎΠ²Π»Π΅Π½ΠΈΠ΅ Π±ΡΠ»ΠΎ Π²ΠΊΠ»ΡΡΠ΅Π½ΠΎ Π² ΠΎΠΏΠΈΡΠ°Π½ΠΈΠ΅ ΠΏΡΠΎΠ±Π»Π΅ΠΌΡ.)
ΠΡΠΈΠ²Π΅Ρ Π²ΡΠ΅ΠΌ! ΠΠΎΠΆΠ΅Ρ Π»ΠΈ ΠΊΡΠΎ-Π½ΠΈΠ±ΡΠ΄Ρ ΡΠΊΠ°Π·Π°ΡΡ ΠΌΠ½Π΅, ΠΏΠΎΡΠ΅ΠΌΡ ΡΡΠΎΡ Π²Π°ΡΠΈΠ°Π½Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΡ Π½Π΅ ΡΠ°Π±ΠΎΡΠ°Π΅Ρ? ΠΡΠΈΠ±ΠΊΠΈ ΠΈΠ»ΠΈ ΠΎΠΆΠΈΠ΄Π°Π΅ΠΌΠΎΠ΅ ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅?
ΠΠ°ΠΊ ΡΡΠΎΡ ΠΏΡΠΈΠΌΠ΅Ρ . impl A for i32
Π² ΠΏΠΎΡΡΠ΄ΠΊΠ΅, Π½ΠΎ impl A for ()
Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ Π±ΡΡΡ ΡΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡΠΎΠ²Π°Π½ Π² 1.39.0-nightly.
#![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
Π² ΠΌΠ΅ΡΠΎΠ΄Ρ, Π° Π½Π΅ Π² ΠΈΠΌΠΏ.
@KrishnaSannasi, ΠΏΡΠΈΠΌΠ΅Ρ 2
@zserik Π΄Π°, Ρ Π·Π½Π°Ρ. Π― Π½Π΅ Π΄ΡΠΌΠ°Ρ, ΡΡΠΎ ΡΡΠΎ Π±ΡΠ»ΠΎ ΡΠ΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½ΠΎ, ΠΈΠ»ΠΈ ΠΎΡ Π½Π΅Π³ΠΎ ΠΎΡΠΊΠ°Π·Π°Π»ΠΈΡΡ. ΠΠΎ Π²ΡΡΠΊΠΎΠΌ ΡΠ»ΡΡΠ°Π΅ ΡΠ΅ΠΉΡΠ°Ρ Π½Π΅ ΡΠ°Π±ΠΎΡΠ°Π΅Ρ.
ΠΡΠ΅Π²ΠΈΠ΄Π½ΠΎ, ΡΠ΅ΠΉΡΠ°Ρ ΡΡΠΎ Π½Π΅ ΡΠ°Π±ΠΎΡΠ°Π΅Ρ, Π½ΠΎ Ρ Π΄ΡΠΌΠ°Ρ, ΡΡΠΎ Π΄ΠΎΠ»ΠΆΠ½ΠΎ ΡΠ°Π±ΠΎΡΠ°ΡΡ.
Π― ΡΠΏΡΠ°ΡΠΈΠ²Π°Ρ ΠΎΠ± ΡΡΠΎΠΌ Π·Π΄Π΅ΡΡ, ΠΏΠΎΡΠΎΠΌΡ ΡΡΠΎ Ρ Π½Π΅ Π·Π°ΠΌΠ΅ΡΠΈΠ», ΡΡΠΎΠ±Ρ ΡΡΠ° ΡΠ΅ΠΌΠ° ΠΏΠΎΠ΄Π½ΠΈΠΌΠ°Π»Π°ΡΡ Π³Π΄Π΅-Π»ΠΈΠ±ΠΎ Π΅ΡΠ΅ - Π΅ΡΡΡ Π»ΠΈ ΠΊΠ°ΠΊΠΈΠ΅-Π»ΠΈΠ±ΠΎ ΠΏΠ»Π°Π½Ρ ΠΏΠΎ default
-ΠΈΡΠΈΡΠΈΡΠΎΠ²Π°ΡΡ ΡΠ°Π·Π»ΠΈΡΠ½ΡΠ΅ ΡΡΠ½ΠΊΡΠΈΠΈ ΡΡΠ°Π½Π΄Π°ΡΡΠ½ΠΎΠΉ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠΈ, Π°Π½Π°Π»ΠΎΠ³ΠΈΡΠ½ΠΎ ΡΠΎΠΌΡ, ΠΊΠ°ΠΊ Ρ Π½Π°Ρ Π΅ΡΡΡ const
-ified ΡΡΠ½ΠΊΡΠΈΠΈ, ΠΊΠΎΠ³Π΄Π° ΡΡΠΎ ΡΡΠΈΡΠ°Π΅ΡΡΡ Π±Π΅Π·ΠΎΠΏΠ°ΡΠ½ΡΠΌ? ΠΡΠ½ΠΎΠ²Π½Π°Ρ ΠΏΡΠΈΡΠΈΠ½Π°, ΠΏΠΎ ΠΊΠΎΡΠΎΡΠΎΠΉ Ρ ΡΠΏΡΠ°ΡΠΈΠ²Π°Ρ, Π·Π°ΠΊΠ»ΡΡΠ°Π΅ΡΡΡ Π² ΡΠΎΠΌ, ΡΡΠΎ ΠΎΠ±ΡΠΈΠ΅ ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΠΈ From
ΠΈ Into
ΠΏΠΎ ΡΠΌΠΎΠ»ΡΠ°Π½ΠΈΡ ( impl<T, U: From<T>> Into<U> for T
ΠΈ impl<T> From<T> for T
) Π·Π°ΡΡΡΠ΄Π½ΡΡΡ Π½Π°ΠΏΠΈΡΠ°Π½ΠΈΠ΅ Π²ΡΠ΅ΠΎΠ±ΡΠ΅ΠΌΠ»ΡΡΠ΅Π³ΠΎ ΡΠ½ΠΈΠ²Π΅ΡΡΠ°Π»ΡΠ½ΠΎΠ³ΠΎ From
Π Π΅Π°Π»ΠΈΠ·Π°ΡΠΈΠΈ Into
Π½ΠΈΠΆΠ΅ ΠΏΠΎ ΡΠ΅ΡΠ΅Π½ΠΈΡ ΠΎΡ core
, ΠΈ Π±ΡΠ»ΠΎ Π±Ρ Π½Π΅ΠΏΠ»ΠΎΡ
ΠΎ, Π΅ΡΠ»ΠΈ Π±Ρ Ρ ΠΌΠΎΠ³ ΠΏΠ΅ΡΠ΅ΠΎΠΏΡΠ΅Π΄Π΅Π»ΠΈΡΡ ΡΡΠΈ ΠΏΡΠ΅ΠΎΠ±ΡΠ°Π·ΠΎΠ²Π°Π½ΠΈΡ Π² ΠΌΠΎΠΈΡ
ΡΠΎΠ±ΡΡΠ²Π΅Π½Π½ΡΡ
ΡΡΠΈΠΊΠ°Ρ
.
ΠΠ°ΠΆΠ΅ Π΅ΡΠ»ΠΈ ΠΌΡ ΡΠ°Π·ΡΠ΅ΡΠΈΠΌ ΡΠΏΠ΅ΡΠΈΠ°Π»ΠΈΠ·Π°ΡΠΈΡ Π΄Π»Ρ From
/ Into
ΡΡΠΎ Π½Π΅ ΠΏΠΎΠΌΠΎΠΆΠ΅Ρ ΡΠ½ΠΈΠ²Π΅ΡΡΠ°Π»ΡΠ½ΡΠΌ ΠΈΠΌΠΏΠ»Π΅ΠΌΠ΅Π½ΡΠ°ΠΌ ΠΈΠ·-Π·Π° ΠΏΡΠΎΠ±Π»Π΅ΠΌΡ Ρ ΡΠ΅ΡΠ΅ΡΠΊΠΎΠΉ.
@KrishnaSannasi Π― Π½Π΅ Π²Π΅ΡΡ, ΡΡΠΎ ΡΡΠΎ ΡΠ°ΠΊ. ΠΠ°ΠΏΡΠΈΠΌΠ΅Ρ, ΡΡΠΎΡ ΠΊΠΎΠ΄ Π΄ΠΎΠ»ΠΆΠ΅Π½ ΡΠ°Π±ΠΎΡΠ°ΡΡ, Π΅ΡΠ»ΠΈ 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=debug&edition= 2018 & gist = cc126b016ff62643946aebc6bab88c98
@Osspial Π§ΡΠΎ ΠΆ, Π΅ΡΠ»ΠΈ Π²Ρ ΠΏΠΎΠΏΡΡΠ°Π΅ΡΠ΅ΡΡ ΡΠΌΠΎΠ΄Π΅Π»ΠΈΡΠΎΠ²Π°ΡΡ Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ΠΌ ΠΈΠΌΠΏΠ»Π΅ΠΌΠ΅Π½ΡΠ°ΡΠΈΠΈ ΠΏΠΎ ΡΠΌΠΎΠ»ΡΠ°Π½ΠΈΡ, Π²Ρ ΡΠ²ΠΈΠ΄ΠΈΡΠ΅ ΠΏΡΠΎΠ±Π»Π΅ΠΌΡ,
Π― ΠΏΠΎΠ²ΡΠΎΡΡΡΡ, ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ From/Into
impl Π½Π° Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ ΠΏΠΎ ΡΠΌΠΎΠ»ΡΠ°Π½ΠΈΡ impl Π² ΡΡΠ°Π½Π΄Π°ΡΡΠ½ΠΎΠΉ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠ΅ Π½Π΅ ΡΠ΄Π΅Π»Π°Π΅Ρ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΡΠΌΠΈ ΡΠ½ΠΈΠ²Π΅ΡΡΠ°Π»ΡΠ½ΡΠ΅ impls Π΄Π»Ρ Into
. (ΠΈ ΡΡΠΎ Π½Π΅ Π²Π»ΠΈΡΠ΅Ρ Π½Π° ΠΎΠ±ΡΠΈΠ΅ ΠΈΠΌΠΏΠ»ΠΈΠΊΠ°ΡΠΈΠΈ From
)
ΠΡΠΈΠ²Π΅Ρ, Π² ΡΠ΅ΠΊΡΡΠ΅ΠΉ ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΠΈ ΡΠΏΠ΅ΡΠΈΠ°Π»ΠΈΠ·Π°ΡΠΈΠΈ Π΅ΡΡΡ ΡΠ΅ΡΡΠ΅Π·Π½Π°Ρ ΠΎΡΠΈΠ±ΠΊΠ°. Π― Π½Π°Π·ΡΠ²Π°Ρ ΡΡΠΎ ΠΎΡΠΈΠ±ΠΊΠΎΠΉ, ΠΏΠΎΡΠΎΠΌΡ ΡΡΠΎ Π΄Π°ΠΆΠ΅ Π΅ΡΠ»ΠΈ ΡΡΠΎ Π±ΡΠ»ΠΎ ΡΠ²Π½ΠΎΠ΅ Π΄ΠΈΠ·Π°ΠΉΠ½Π΅ΡΡΠΊΠΎΠ΅ ΡΠ΅ΡΠ΅Π½ΠΈΠ΅, ΠΎΠ½ΠΎ Π½Π΅ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ΅Ρ Π½Π°ΠΌ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ ΠΎΠ΄Π½Ρ ΠΈΠ· ΡΠ°ΠΌΡΡ ΠΌΠΎΡΠ½ΡΡ ΡΡΠ½ΠΊΡΠΈΠΉ ΡΠΏΠ΅ΡΠΈΠ°Π»ΠΈΠ·Π°ΡΠΈΠΈ, Π° ΠΈΠΌΠ΅Π½Π½ΠΎ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΡ ΡΠΎΠ·Π΄Π°Π½ΠΈΡ Β«Π½Π΅ΠΏΡΠΎΠ·ΡΠ°ΡΠ½ΡΡ ΡΠΈΠΏΠΎΠ²Β» (ΡΡΠΎ Π½Π΅ ΡΠΎΡΠΌΠ°Π»ΡΠ½ΠΎΠ΅ Π½Π°Π·Π²Π°Π½ΠΈΠ΅). ΠΡΠΎΡ ΡΠ°Π±Π»ΠΎΠ½ ΡΠ²Π»ΡΠ΅ΡΡΡ ΠΎΠ΄Π½ΠΈΠΌ ΠΈΠ· ΡΠ°ΠΌΡΡ ΠΏΡΠΈΠΌΠΈΡΠΈΠ²Π½ΡΡ ΡΡΡΠΎΠΈΡΠ΅Π»ΡΠ½ΡΡ Π±Π»ΠΎΠΊΠΎΠ² Π² Π΄ΡΡΠ³ΠΈΡ ΡΠ·ΡΠΊΠ°Ρ , ΠΏΡΠ΅Π΄ΠΎΡΡΠ°Π²Π»ΡΡΡΠΈΡ ΠΊΠ»Π°ΡΡΡ ΡΠΈΠΏΠΎΠ², ΡΠ°ΠΊΠΈΡ ΠΊΠ°ΠΊ Haskell ΠΈΠ»ΠΈ Scala.
ΠΡΠΎΡ ΡΠ°Π±Π»ΠΎΠ½ ΠΏΡΠΎΡΡ - ΠΌΡ ΠΌΠΎΠΆΠ΅ΠΌ ΠΎΠΏΡΠ΅Π΄Π΅Π»ΡΡΡ ΡΠ°ΠΊΠΈΠ΅ ΡΡΡΡΠΊΡΡΡΡ, ΠΊΠ°ΠΊ 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 Π²ΡΡΡΠ½ΡΡ:
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 ΠΠΎΠ΄ Π΄ΠΎΠ»ΠΆΠ΅Π½ ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡΠΎΠ²Π°ΡΡΡΡ ΠΏΠΎΡΠ»Π΅ ΡΠ°ΡΠΊΠΎΠΌΠΌΠ΅Π½ΡΠΈΡΠΎΠ²Π°Π½ΠΈΡ impls 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>>
.ΠΠΎΡΡΠΎΠΌΡ ΠΏΠ°ΡΠ° impls Π½Π΅ ΡΠ΄ΠΎΠ²Π»Π΅ΡΠ²ΠΎΡΡΠ΅Ρ ΡΠ»Π΅Π΄ΡΡΡΠ΅ΠΌΡ ΠΏΡΠ½ΠΊΡΡ RFC :
Π§ΡΠΎΠ±Ρ Π³Π°ΡΠ°Π½ΡΠΈΡΠΎΠ²Π°ΡΡ ΡΠΎΠ³Π»Π°ΡΠΎΠ²Π°Π½Π½ΠΎΡΡΡ ΡΠΏΠ΅ΡΠΈΠ°Π»ΠΈΠ·Π°ΡΠΈΠΈ, ΠΌΡ Π³Π°ΡΠ°Π½ΡΠΈΡΡΠ΅ΠΌ, ΡΡΠΎ Π΄Π»Ρ Π»ΡΠ±ΡΡ Π΄Π²ΡΡ ΠΏΠ΅ΡΠ΅ΡΠ΅ΠΊΠ°ΡΡΠΈΡ ΡΡ ΠΈΠΌΠΏΠΎΠ²
I
ΠΈJ
Ρ Π½Π°Ρ Π±ΡΠ΄Π΅Ρ Π»ΠΈΠ±ΠΎI < J
ΠΈΠ»ΠΈJ < I
. Π’ΠΎ Π΅ΡΡΡ ΠΎΠ΄Π½ΠΎ Π΄ΠΎΠ»ΠΆΠ½ΠΎ Π±ΡΡΡ Π΄Π΅ΠΉΡΡΠ²ΠΈΡΠ΅Π»ΡΠ½ΠΎ Π±ΠΎΠ»Π΅Π΅ ΠΊΠΎΠ½ΠΊΡΠ΅ΡΠ½ΡΠΌ, ΡΠ΅ΠΌ Π΄ΡΡΠ³ΠΎΠ΅.
Π Π² Π²Π°ΡΠ΅ΠΌ ΡΠ»ΡΡΠ°Π΅ ΡΡΠΎ ΡΠΎΠΆΠ΅ Π½Π°ΡΡΠΎΡΡΠ°Ρ ΠΏΡΠΎΠ±Π»Π΅ΠΌΠ°, ΠΏΠΎΡΠΎΠΌΡ ΡΡΠΎ HasLabel
impl ΠΈΠ· WithLabel<WithLabel<A>>
ΠΌΠΎΠΆΠ½ΠΎ ΠΈΠ½ΡΠ΅ΡΠΏΡΠ΅ΡΠΈΡΠΎΠ²Π°ΡΡ Π΄Π²ΠΎΡΠΊΠΎ.
ΠΠ°ΠΊ ΠΌΡ ΠΌΠΎΠΆΠ΅ΠΌ ΡΠ΅ΡΠΈΡΡ ΡΡΠΎΡ ΡΠ»ΡΡΠ°ΠΉ, ΡΠΆΠ΅ ΠΎΠ±ΡΡΠΆΠ΄Π°Π΅ΡΡΡ Π² RFC , ΠΈ Π²ΡΠ²ΠΎΠ΄ ΡΠ°ΠΊΠΎΠΉ:
ΠΠ³ΡΠ°Π½ΠΈΡΠ΅Π½ΠΈΡ, Π½Π°Π»Π°Π³Π°Π΅ΠΌΡΠ΅ ΠΏΡΠ°Π²ΠΈΠ»ΠΎΠΌ ΡΠ΅ΡΠ΅ΡΠΊΠΈ, Π΄ΠΎΠ²ΠΎΠ»ΡΠ½ΠΎ Π²ΡΠΎΡΠΎΡΡΠ΅ΠΏΠ΅Π½Π½Ρ ΠΏΠΎ ΡΡΠ°Π²Π½Π΅Π½ΠΈΡ Ρ ΠΎΡΠ½ΠΎΠ²Π½ΡΠΌΠΈ ΡΠ΅Π»ΡΠΌΠΈ ΡΠΏΠ΅ΡΠΈΠ°Π»ΠΈΠ·Π°ΡΠΈΠΈ (ΠΊΠ°ΠΊ ΠΈΠ·Π»ΠΎΠΆΠ΅Π½ΠΎ Π² ΠΌΠΎΡΠΈΠ²Π°ΡΠΈΠΈ), ΠΈ ΠΏΠΎΡΡΠΎΠΌΡ, ΠΏΠΎΡΠΊΠΎΠ»ΡΠΊΡ ΠΏΡΠ°Π²ΠΈΠ»ΠΎ ΡΠ΅ΡΠ΅ΡΠΊΠΈ ΠΌΠΎΠΆΠ΅Ρ Π±ΡΡΡ Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ΠΎ ΠΏΠΎΠ·ΠΆΠ΅, RFC ΠΏΠΎΠΊΠ° ΠΏΡΠΈΠ΄Π΅ΡΠΆΠΈΠ²Π°Π΅ΡΡΡ ΠΏΡΠ°Π²ΠΈΠ»Π° ΠΏΡΠΎΡΡΠΎΠΉ ΡΠ΅ΠΏΠΎΡΠΊΠΈ.
@qnighy , ΡΠΏΠ°ΡΠΈΠ±ΠΎ, ΡΡΠΎ ΠΏΠΎΠ΄ΡΠΌΠ°Π» ΠΎΠ± ΡΡΠΎΠΌ.
Π ΡΡΠΎ ΡΠ΅Π°Π»ΡΠ½Π°Ρ ΠΏΡΠΎΠ±Π»Π΅ΠΌΠ° ΠΈ Π² Π²Π°ΡΠ΅ΠΌ ΡΠ»ΡΡΠ°Π΅, ΠΏΠΎΡΠΎΠΌΡ ΡΡΠΎ ΠΈΠΌΠΏΠ»ΠΈΠΊΠ°ΡΠΈΡ HasLabel
WithLabel<WithLabel<A>>
ΠΌΠΎΠΆΠ΅Ρ Π±ΡΡΡ ΠΈΠ½ΡΠ΅ΡΠΏΡΠ΅ΡΠΈΡΠΎΠ²Π°Π½Π° Π΄Π²ΠΎΡΠΊΠΎ.
ΠΡΠΎ Π²Π΅ΡΠ½ΠΎ, Π΅ΡΠ»ΠΈ ΠΌΡ Π½Π΅ ΡΡΠΈΡΠ°Π΅ΠΌ impl<T> HasLabel for WithLabel<T>
Π±ΠΎΠ»Π΅Π΅ ΡΠΏΠ΅ΡΠΈΠ°Π»ΠΈΠ·ΠΈΡΠΎΠ²Π°Π½Π½ΡΠΌ, ΡΠ΅ΠΌ impl<T> HasLabel for T
Π΄Π»Ρ Π²Π²ΠΎΠ΄Π° WithLabel<WithLabel<A>>
. Π§Π°ΡΡΡ RFC, ΠΊΠΎΡΠΎΡΡΡ Π²Ρ Π²ΡΡΠ°Π²ΠΈΠ»ΠΈ, Π΄Π΅ΠΉΡΡΠ²ΠΈΡΠ΅Π»ΡΠ½ΠΎ ΠΎΡ
Π²Π°ΡΡΠ²Π°Π΅Ρ ΡΡΠΎ, ΠΎΠ΄Π½Π°ΠΊΠΎ Ρ ΡΡΠΈΡΠ°Ρ, ΡΡΠΎ ΡΡΠΎ ΡΠ΅ΡΡΠ΅Π·Π½ΠΎΠ΅ ΠΎΠ³ΡΠ°Π½ΠΈΡΠ΅Π½ΠΈΠ΅, ΠΈ Ρ Π±Ρ ΠΏΠΎΠΏΡΠΎΡΠΈΠ» ΠΏΠ΅ΡΠ΅ΡΠΌΠΎΡΡΠ΅ΡΡ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΊΡ ΡΡΠΎΠ³ΠΎ Π²Π°ΡΠΈΠ°Π½ΡΠ° ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΡ Π² ΠΏΠ΅ΡΠ²ΠΎΠΌ Π²ΡΠΏΡΡΠΊΠ΅ ΡΡΠΎΠ³ΠΎ ΡΠ°ΡΡΠΈΡΠ΅Π½ΠΈΡ.
Π’Π΅ΠΌ Π²ΡΠ΅ΠΌΠ΅Π½Π΅ΠΌ Ρ ΠΈΠ³ΡΠ°Π» Ρ 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) ΠΎΠ½ΠΈ ΡΠ°ΡΠΏΡΠΎΡΡΡΠ°Π½ΡΡΡΡΡ Π½Π° Π²ΡΠ΅ ΠΏΠΎΠ»Ρ Π² ΡΡΡΡΠΊΡΡΡΠ΅:
ΠΠ²ΡΠΎΠΌΠ°ΡΠΈΡΠ΅ΡΠΊΠΈΠ΅ ΡΠ²ΠΎΠΉΡΡΠ²Π°, ΡΠ°ΠΊΠΈΠ΅ ΠΊΠ°ΠΊ Send ΠΈΠ»ΠΈ Sync Π² ΡΡΠ°Π½Π΄Π°ΡΡΠ½ΠΎΠΉ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠ΅, ΡΠ²Π»ΡΡΡΡΡ Ρ Π°ΡΠ°ΠΊΡΠ΅ΡΠΈΡΡΠΈΠΊΠ°ΠΌΠΈ-ΠΌΠ°ΡΠΊΠ΅ΡΠ°ΠΌΠΈ, ΠΊΠΎΡΠΎΡΡΠ΅ Π°Π²ΡΠΎΠΌΠ°ΡΠΈΡΠ΅ΡΠΊΠΈ ΡΠ΅Π°Π»ΠΈΠ·ΡΡΡΡΡ Π΄Π»Ρ ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ ΡΠΈΠΏΠ°, Π΅ΡΠ»ΠΈ ΡΠΎΠ»ΡΠΊΠΎ ΡΠΈΠΏ ΠΈΠ»ΠΈ ΡΠΈΠΏ, ΠΊΠΎΡΠΎΡΡΠΉ ΠΎΠ½ ΡΠΎΠ΄Π΅ΡΠΆΠΈΡ, ΡΠ²Π½ΠΎ Π½Π΅ ΠΎΡΠΊΠ»ΡΡΠ΅Π½ ΡΠ΅ΡΠ΅Π· ΠΎΡΡΠΈΡΠ°ΡΠ΅Π»ΡΠ½ΡΠΉ impl.
Π ΠΠΠΠΠ’ΠΠ ΠΠΠΠ’Π¬
@qnighy ΠΊΠ°ΠΊ-ΡΠΎ ΡΠΏΡΡΡΠΈΠ» ΠΈΠ· Π²ΠΈΠ΄Ρ, ΡΡΠΎ Π²Ρ Π΄Π°Π»ΠΈ ΡΡΡΠ»ΠΊΡ Π½Π° Π΄Π΅ΡΡΠΊΡΡ ΠΏΠ»ΠΎΡΠ°Π΄ΠΊΡ. β€οΈ ΠΠΎΠ»ΡΡΠΎΠ΅ ΡΠΏΠ°ΡΠΈΠ±ΠΎ Π·Π° ΡΡΠΎ. ΠΡΠΎ ΡΠ°Π±ΠΎΡΠ°Π΅Ρ, ΠΈ Ρ ΠΏΠΎΡΠ°ΠΆΠ΅Π½ ΡΠ΅ΠΌ, Π½Π°ΡΠΊΠΎΠ»ΡΠΊΠΎ Ρ
Π°ΠΊΠ΅ΡΡΠΊΠΈΠΌ ΡΠ²Π»ΡΠ΅ΡΡΡ ΡΡΠΎ ΡΠ΅ΡΠ΅Π½ΠΈΠ΅. Π£Π΄ΠΈΠ²ΠΈΡΠ΅Π»ΡΠ½ΠΎ, ΡΡΠΎ ΠΌΡ ΠΌΠΎΠΆΠ΅ΠΌ Π²ΡΡΠ°Π·ΠΈΡΡ ΡΡΠΎ ΡΠ΅ΠΉΡΠ°Ρ, ΠΈ Ρ Π½Π°Π΄Π΅ΡΡΡ, ΡΡΠΎ ΡΡΠ° Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΡ Π½Π΅ ΠΈΡΡΠ΅Π·Π½Π΅Ρ Π² Π±ΡΠ΄ΡΡΠ΅ΠΌ!
Π ΡΠ°ΠΊΠΎΠΉ ΡΠΈΡΡΠ°ΡΠΈΠΈ 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 ΠΈ ΠΏΠΎΡΠΌΠΎΡΡΠ΅ΡΡ, ΠΏΠΎΠ»ΡΡΠΈΡΠ΅ Π»ΠΈ Π²Ρ ΡΠΏΠ΅ΡΠΈΠ°Π»ΠΈΠ·ΠΈΡΠΎΠ²Π°Π½Π½ΡΠΉ Π²Π°ΡΠΈΠ°Π½Ρ). ΠΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ, Π²Ρ Π³ΠΎΠ²ΠΎΡΠΈΡΠ΅, ΡΡΠΎ ΡΡΠΈ Π΄Π²Π° Π²Π°ΡΠΈΠ°Π½ΡΠ° ΡΠΊΠ²ΠΈΠ²Π°Π»Π΅Π½ΡΠ½Ρ, Π·Π° ΠΈΡΠΊΠ»ΡΡΠ΅Π½ΠΈΠ΅ΠΌ ΡΠΎΠ³ΠΎ, ΡΡΠΎ ΠΎΠ΄ΠΈΠ½ Π΄ΠΎΠ»ΠΆΠ΅Π½ Π±ΡΡΡ Π±ΡΡΡΡΠ΅Π΅, ΠΈ, ΡΠ»Π΅Π΄ΠΎΠ²Π°ΡΠ΅Π»ΡΠ½ΠΎ, Π²Ρ Π½Π΅ Π·Π½Π°Π΅ΡΠ΅, ΠΊΠ°ΠΊ ΠΏΡΠΎΠ²Π΅ΡΠΈΡΡ, ΠΊΠ°ΠΊΡΡ Π²Π΅ΡΡΠΈΡ Π²Ρ ΠΏΠΎΠ»ΡΡΠ°Π΅ΡΠ΅? Π ΡΠ°ΠΊΠΎΠΌ ΡΠ»ΡΡΠ°Π΅, Ρ ΡΠΎΠ³Π»Π°ΡΠ΅Π½, Ρ Π½Π΅ Π·Π½Π°Ρ, ΠΊΠ°ΠΊ Π²Ρ ΠΌΠΎΠΆΠ΅ΡΠ΅ ΡΡΠΎ ΠΏΡΠΎΠ²Π΅ΡΠΈΡΡ ΠΏΡΡΠΌΠΎ ΡΠ΅ΠΉΡΠ°Ρ.
Π― ΠΌΠΎΠ³ Π±Ρ ΠΏΡΠ΅Π΄ΠΏΠΎΠ»ΠΎΠΆΠΈΡΡ, ΡΡΠΎ Π²Ρ ΠΌΠΎΠΆΠ΅ΡΠ΅ ΡΠΎΠ·Π΄Π°ΡΡ ΠΊΠ°ΠΊΠΎΠΉ-Π½ΠΈΠ±ΡΠ΄Ρ Π΄ΡΡΠ³ΠΎΠΉ ΡΡΠ΅ΠΉΡ Ρ ΡΠ΅ΠΌ ΠΆΠ΅ Π½Π°Π±ΠΎΡΠΎΠΌ impl, Π½ΠΎ Π³Π΄Π΅ fns Π±ΡΠ΄ΡΡ Π²Π΅ΡΡΠΈ ΡΠ΅Π±Ρ ΠΏΠΎ-Π΄ΡΡΠ³ΠΎΠΌΡ, ΠΏΡΠΎΡΡΠΎ ΡΡΠΎΠ±Ρ ΡΡΠΏΠΎΠΊΠΎΠΈΡΡ ΡΠ΅Π±Ρ.
ΠΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ, Π²Ρ Π³ΠΎΠ²ΠΎΡΠΈΡΠ΅, ΡΡΠΎ ΡΡΠΈ Π΄Π²Π° Π²Π°ΡΠΈΠ°Π½ΡΠ° ΡΠΊΠ²ΠΈΠ²Π°Π»Π΅Π½ΡΠ½Ρ, Π·Π° ΠΈΡΠΊΠ»ΡΡΠ΅Π½ΠΈΠ΅ΠΌ ΡΠΎΠ³ΠΎ, ΡΡΠΎ ΠΎΠ΄ΠΈΠ½ Π΄ΠΎΠ»ΠΆΠ΅Π½ Π±ΡΡΡ Π±ΡΡΡΡΠ΅Π΅, ΠΈ, ΡΠ»Π΅Π΄ΠΎΠ²Π°ΡΠ΅Π»ΡΠ½ΠΎ, Π²Ρ Π½Π΅ Π·Π½Π°Π΅ΡΠ΅, ΠΊΠ°ΠΊ ΠΏΡΠΎΠ²Π΅ΡΠΈΡΡ, ΠΊΠ°ΠΊΡΡ Π²Π΅ΡΡΠΈΡ Π²Ρ ΠΏΠΎΠ»ΡΡΠ°Π΅ΡΠ΅? Π ΡΠ°ΠΊΠΎΠΌ ΡΠ»ΡΡΠ°Π΅, Ρ ΡΠΎΠ³Π»Π°ΡΠ΅Π½, Ρ Π½Π΅ Π·Π½Π°Ρ, ΠΊΠ°ΠΊ Π²Ρ ΠΌΠΎΠΆΠ΅ΡΠ΅ ΡΡΠΎ ΠΏΡΠΎΠ²Π΅ΡΠΈΡΡ ΠΏΡΡΠΌΠΎ ΡΠ΅ΠΉΡΠ°Ρ.
ΠΡ ΠΌΠΎΠΆΠ΅ΡΠ΅ ΠΏΡΠΎΠ²Π΅ΡΠΈΡΡ ΡΡΠΎ Ρ ΠΏΠΎΠΌΠΎΡΡΡ ΠΌΠ°ΠΊΡΠΎΡΠ°. Π― Π½Π΅ΠΌΠ½ΠΎΠ³ΠΎ Π·Π°ΡΠΆΠ°Π²Π΅Π» ΡΠΎ ΡΠ²ΠΎΠΈΠΌ Rust, Π½ΠΎ ΡΡΠΎ-ΡΠΎ Π² ΡΡΠΎΠΌ ΡΠΎΠ΄Π΅ ...
[#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!()
Π² ΡΠΏΠ΅ΡΠΈΠ°Π»ΠΈΠ·ΠΈΡΠΎΠ²Π°Π½Π½ΠΎΠΌ impl, Π° Π² ΡΠ΅ΡΡΠ°Ρ
ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠΉΡΠ΅ assert!(SPECIALIZATION_TRIGGERED);
[#cfg(test)] static mut SPECIALIZATION_TRIGGERED : bool = false; ...
ΠΡ Π·Π°Ρ
ΠΎΡΠΈΡΠ΅ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ thread_local! { static VAR: Cell<bool> = Cell::new(false); }
Π²ΠΌΠ΅ΡΡΠΎ static mut
ΠΏΠΎΡΠΎΠΌΡ ΡΡΠΎ Π² ΠΏΡΠΎΡΠΈΠ²Π½ΠΎΠΌ ΡΠ»ΡΡΠ°Π΅ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½Π°Ρ ΠΌΠΎΠΆΠ΅Ρ Π±ΡΡΡ ΡΡΡΠ°Π½ΠΎΠ²Π»Π΅Π½Π° ββΠ² ΠΎΠ΄Π½ΠΎΠΌ ΠΏΠΎΡΠΎΠΊΠ΅ ΡΠ΅ΡΡΠΎΠ²ΠΎΠ³ΠΎ ΠΏΡΠΈΠΌΠ΅ΡΠ° ΠΈ ΠΎΡΠΈΠ±ΠΎΡΠ½ΠΎ ΠΏΡΠΎΡΠΈΡΠ°Π½Π° ΠΈΠ· Π΄ΡΡΠ³ΠΎΠ³ΠΎ ΠΏΠΎΡΠΎΠΊΠ°. Π’Π°ΠΊΠΆΠ΅ Π½Π΅ Π·Π°Π±ΡΠ΄ΡΡΠ΅ ΡΠ±ΡΠ°ΡΡΠ²Π°ΡΡ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΡΡ Π² Π½Π°ΡΠ°Π»Π΅ ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ ΡΠ΅ΡΡΠ°, ΠΈΠ½Π°ΡΠ΅ Π²Ρ ΠΏΠΎΠ»ΡΡΠΈΡΠ΅ true
ΠΈΠ· ΠΏΡΠ΅Π΄ΡΠ΄ΡΡΠ΅Π³ΠΎ ΡΠ΅ΡΡΠ°.
Π£ ΠΌΠ΅Π½Ρ Π΅ΡΡΡ Π²ΠΎΠΏΡΠΎΡ ΠΏΠΎ ΡΠ΅ΠΊΡΡΡ RFC, Π½Π°Π΄Π΅ΡΡΡ, ΡΡΠΎ Ρ ΠΎΡΠΎΡΠ΅Π΅ ΠΌΠ΅ΡΡΠΎ.
Π ΡΠ°Π·Π΄Π΅Π»Π΅ ΠΏΠΎΠ²ΡΠΎΡΠ½ΠΎΠ³ΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΡ ΠΏΡΠΈΠ²Π΅Π΄Π΅Π½ ΡΡΠΎΡ ΠΏΡΠΈΠΌΠ΅Ρ:
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>
? ΠΠ»ΠΈ ΡΡΠΎ ΠΏΠ΅ΡΠ»Ρ ΠΏΡΠΈΡΠΈΠ½Π½ΠΎ-ΡΠ»Π΅Π΄ΡΡΠ²Π΅Π½Π½ΠΎΠΉ ΡΠ²ΡΠ·ΠΈ?
@RalfJung Π― ΡΠΎΠ³Π»Π°ΡΠ΅Π½, ΡΡΠΎ ΠΊΠ°ΠΆΠ΅ΡΡΡ Π½Π΅ΠΏΡΠ°Π²ΠΈΠ»ΡΠ½ΡΠΌ.
Π£ ΠΌΠ΅Π½Ρ Π²ΠΎΠΏΡΠΎΡ ΠΎ ΠΏΡΠΎΡΠ΅Π΄ΡΡΠ΅: Π½Π°ΡΠΊΠΎΠ»ΡΠΊΠΎ Π·Π½Π°ΡΠΈΠΌΠ° ΡΡΠ° ΠΏΡΠΎΠ±Π»Π΅ΠΌΠ° ΠΈ Π½Π°ΡΠΊΠΎΠ»ΡΠΊΠΎ Π²Π°ΠΆΠ½ΠΎ Π΄Π»Ρ Π»ΡΠ΄Π΅ΠΉ ΠΎΠΏΡΠΎΠ±ΠΎΠ²Π°ΡΡ ΡΡΡ ΡΡΠ½ΠΊΡΠΈΡ? ΠΠ°ΡΠΊΠΎΠ»ΡΠΊΠΎ Ρ ΠΏΠΎΠ½ΠΈΠΌΠ°Ρ, ΡΠ΅ΠΊΡΡΠ°Ρ ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΡ Π½Π΅ΡΠΎΡΡΠΎΡΡΠ΅Π»ΡΠ½Π° ΠΈ Π½Π΅ΠΏΠΎΠ»Π½Π° ΠΈ, ΡΠΊΠΎΡΠ΅Π΅ Π²ΡΠ΅Π³ΠΎ, Π±ΡΠ΄Π΅Ρ ΠΏΠΎΠ»Π½ΠΎΡΡΡΡ Π·Π°ΠΌΠ΅Π½Π΅Π½Π° ΠΌΠ΅Π»ΠΎΠΌ ΠΈΠ»ΠΈ ΡΠ΅ΠΌ-ΡΠΎ Π΅ΡΠ΅. ΠΡΠ»ΠΈ ΡΡΠΎ ΠΏΡΠ°Π²Π΄Π°, Π΄ΠΎΠ»ΠΆΠ½Ρ Π»ΠΈ ΠΌΡ ΠΏΡΠΎΡΡΠΎ ΠΎΡΠΌΠ΅Π½ΠΈΡΡ ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΡ ΡΡΠΎΠΉ ΠΈ Π΄ΡΡΠ³ΠΈΡ ΡΡΠ½ΠΊΡΠΈΠΉ (Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, GAT) Π΄ΠΎ ΡΠ΅Ρ ΠΏΠΎΡ, ΠΏΠΎΠΊΠ° ΠΎΠ½ΠΈ Π½Π΅ Π±ΡΠ΄ΡΡ Π΄ΠΎΠ»ΠΆΠ½ΡΠΌ ΠΎΠ±ΡΠ°Π·ΠΎΠΌ ΠΏΠ΅ΡΠ΅Π΄Π΅Π»Π°Π½Ρ?
ΠΠΎΠΆΠ°Π»ΡΠΉΡΡΠ°, Π½Π΅ ΠΎΡΠΌΠ΅Π½ΡΠΉΡΠ΅ ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΡ. Π‘Π»ΠΎΠΌΠ°Π½Π½ΡΠ΅, Π½Π΅ΡΠΎΡΡΠΎΡΡΠ΅Π»ΡΠ½ΡΠ΅ ΠΈ Π½Π΅ΠΏΠΎΠ»Π½ΡΠ΅ ΠΏΠΎ-ΠΏΡΠ΅ΠΆΠ½Π΅ΠΌΡ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡΡ ΡΠΊΡΠΏΠ΅ΡΠΈΠΌΠ΅Π½ΡΠΈΡΠΎΠ²Π°ΡΡ.
ΠΡΠ»ΠΈ ΡΡΠΎ ΠΏΡΠ°Π²Π΄Π°, Π΄ΠΎΠ»ΠΆΠ½Ρ Π»ΠΈ ΠΌΡ ΠΏΡΠΎΡΡΠΎ ΠΎΡΠΌΠ΅Π½ΠΈΡΡ ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΡ ΡΡΠΎΠΉ ΠΈ Π΄ΡΡΠ³ΠΈΡ ΡΡΠ½ΠΊΡΠΈΠΉ (Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, GAT) Π΄ΠΎ ΡΠ΅Ρ ΠΏΠΎΡ, ΠΏΠΎΠΊΠ° ΠΎΠ½ΠΈ Π½Π΅ Π±ΡΠ΄ΡΡ Π΄ΠΎΠ»ΠΆΠ½ΡΠΌ ΠΎΠ±ΡΠ°Π·ΠΎΠΌ ΠΏΠ΅ΡΠ΅Π΄Π΅Π»Π°Π½Ρ?
ΠΠΎΠΆΠ°Π»ΡΠΉΡΡΠ°, Π½Π΅ Π½Π°Π΄ΠΎ, PyO3 (Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠ° ΠΏΡΠΈΠ²ΡΠ·ΠΎΠΊ Python) Π² Π½Π°ΡΡΠΎΡΡΠ΅Π΅ Π²ΡΠ΅ΠΌΡ Π·Π°Π²ΠΈΡΠΈΡ ΠΎΡ ΡΠΏΠ΅ΡΠΈΠ°Π»ΠΈΠ·Π°ΡΠΈΠΈ. Π‘ΠΌ. Https://github.com/PyO3/pyo3/issues/210
Π Π°Π·Π²Π΅ ΠΎΡ ΡΡΠΎΠ³ΠΎ Π½Π΅ Π·Π°Π²ΠΈΡΠΈΡ ΠΈ ΠΈΠ·ΡΡΠ΄Π½ΠΎΠ΅ ΠΊΠΎΠ»ΠΈΡΠ΅ΡΡΠ²ΠΎ std
? Π₯ΠΎΡΡ Ρ Π²ΡΠΏΠΎΠΌΠ½ΠΈΠ», ΡΡΠΎ Π²ΠΈΠ΄Π΅Π» ΠΌΠ½ΠΎΠ³ΠΎ ΡΠΏΠ΅ΡΠΈΠ°Π»ΠΈΠ·ΠΈΡΠΎΠ²Π°Π½Π½ΡΡ
Π²Π½ΡΡΡΠ΅Π½Π½ΠΈΡ
ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΠΉ Π΄Π»Ρ Π²Π΅ΠΊΡΠΎΡΠ½ΡΡ
ΠΈ ΡΡΡΠΎΠΊΠΎΠ²ΡΡ
Π²Π΅ΡΠ΅ΠΉ. ΠΠ΅ ΡΠΎ ΡΡΠΎΠ±Ρ ΡΡΠΎ Π΄ΠΎΠ»ΠΆΠ½ΠΎ ΠΏΡΠ΅Π΄ΠΎΡΠ²ΡΠ°ΡΠΈΡΡ ΠΎΡΠΌΠ΅Π½Ρ ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΠΈ, ΠΏΡΠΎΡΡΠΎ ΡΡΠΎ Π±ΡΠ΄Π΅Ρ Π½Π΅ ΡΠ°ΠΊ ΠΏΡΠΎΡΡΠΎ, ΠΊΠ°ΠΊ ΡΠ΄Π°Π»ΠΈΡΡ ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²ΡΡΡΠΈΠ΅ ΡΠ°Π·Π΄Π΅Π»Ρ ΠΈΠ· ΡΡΠ΅Π΄ΡΡΠ²Π° ΠΏΡΠΎΠ²Π΅ΡΠΊΠΈ ΡΠΈΠΏΠΎΠ².
@Lucretiel: Π΄Π°, ΠΌΠ½ΠΎΠ³ΠΈΠ΅ ΠΏΠΎΠ»Π΅Π·Π½ΡΠ΅ ΠΎΠΏΡΠΈΠΌΠΈΠ·Π°ΡΠΈΠΈ (ΠΎΡΠΎΠ±Π΅Π½Π½ΠΎ Π²ΠΎΠΊΡΡΠ³ ΠΈΡΠ΅ΡΠ°ΡΠΎΡΠΎΠ²) Π·Π°Π²ΠΈΡΡΡ ΠΎΡ ΡΠΏΠ΅ΡΠΈΠ°Π»ΠΈΠ·Π°ΡΠΈΠΈ, ΠΏΠΎΡΡΠΎΠΌΡ Π΅Π΅ ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΡ Π±ΡΠ»Π° Π±Ρ ΠΎΠ³ΡΠΎΠΌΠ½ΠΎΠΉ ΡΠ΅Π³ΡΠ΅ΡΡΠΈΠ΅ΠΉ Π² ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡΠ΅Π»ΡΠ½ΠΎΡΡΠΈ.
ΠΠ°ΠΏΡΠΈΠΌΠ΅Ρ, FusedIterator
ΠΈ TrustedLen
Π±Π΅ΡΠΏΠΎΠ»Π΅Π·Π½Ρ Π±Π΅Π· ΡΠΏΠ΅ΡΠΈΠ°Π»ΠΈΠ·Π°ΡΠΈΠΈ.
PyO3 (Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠ° ΠΏΡΠΈΠ²ΡΠ·ΠΎΠΊ Python) Π² Π½Π°ΡΡΠΎΡΡΠ΅Π΅ Π²ΡΠ΅ΠΌΡ Π·Π°Π²ΠΈΡΠΈΡ ΠΎΡ ΡΠΏΠ΅ΡΠΈΠ°Π»ΠΈΠ·Π°ΡΠΈΠΈ
ΠΡΠΎ ΡΡΡΠ°ΡΠ½ΠΎ, ΠΈΠ·-Π·Π° Β«Π½Π΅ΠΊΠ°ΡΠ΅ΡΡΠ²Π΅Π½Π½ΠΎΠΉΒ» Π΄Π΅ΡΠ°Π»ΠΈ. Π ΡΡΠ°Π½Π΄Π°ΡΡΠ½ΠΎΠΉ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠ΅ Π±ΡΠ»ΠΈ ΠΊΡΠΈΡΠΈΡΠ΅ΡΠΊΠΈΠ΅ ΠΎΡΠΈΠ±ΠΊΠΈ Π½Π°Π΄Π΅ΠΆΠ½ΠΎΡΡΠΈ ΠΈΠ·-Π·Π° Π½Π΅ΠΏΡΠ°Π²ΠΈΠ»ΡΠ½ΠΎΠΉ ΡΠΏΠ΅ΡΠΈΠ°Π»ΠΈΠ·Π°ΡΠΈΠΈ. ΠΠ°ΡΠΊΠΎΠ»ΡΠΊΠΎ Π²Ρ ΡΠ²Π΅ΡΠ΅Π½Ρ, ΡΡΠΎ Ρ Π²Π°Ρ Π½Π΅Ρ ΡΠ°ΠΊΠΈΡ
ΠΆΠ΅ ΠΎΡΠΈΠ±ΠΎΠΊ? ΠΠΎΠΏΡΠΎΠ±ΡΠΉΡΠ΅ Π²ΠΌΠ΅ΡΡΠΎ ΡΡΠΎΠ³ΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ 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
ΡΡΠΎΠΉ ΠΏΡΠΎΠ±Π»Π΅ΠΌΠ΅ ΠΎΡΡΠ»Π΅ΠΆΠΈΠ²Π°Π½ΠΈΡ Π·Π° ΠΏΡΠ΅Π΄Π΅Π»Π°ΠΌΠΈ PR # 71321 - ΠΈ, ΡΠΎΠ³Π»Π°ΡΠ½ΠΎ ΠΊΠ½ΠΈΠ³Π΅ Unstable, ΡΡΠΎ ΠΏΡΠΎΠ±Π»Π΅ΠΌΠ° ΠΎΡΡΠ»Π΅ΠΆΠΈΠ²Π°Π½ΠΈΡ Π΄Π»Ρ ΡΡΠΎΠΉ ΡΡΠ½ΠΊΡΠΈΠΈ.
Π― ΡΠΎΠΆΠ΅ ΠΌΠ°Π»ΠΎ ΡΡΠΎ Π·Π½Π°Ρ ΠΎΠ± ΡΡΠΎΠΉ ΡΡΠ½ΠΊΡΠΈΠΈ, Ρ ΡΠΎΠ»ΡΠΊΠΎ ΡΡΠΎ Π²ΠΈΠ΄Π΅Π» ΠΈΡΠΏΡΠ°Π²Π»Π΅Π½ΠΈΡ ΠΊΠΎΡΡΠ΅ΠΊΡΠ½ΠΎΡΡΠΈ libstd. ΠΠ½ Π±ΡΠ» ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π»Π΅Π½ Π½Π° https://github.com/rust-lang/rust/pull/68970, ΡΡΠΎ ΠΎΠ±ΡΡΡΠ½ΡΠ΅Ρ Π΅ΡΠ΅ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΎ Π²Π΅ΡΠ΅ΠΉ ΠΎΠ± ΡΡΠΎΠΌ.
@matthewjasper, Π΅ΡΡΡ Π»ΠΈ ΡΠΌΡΡΠ» Π·Π°Π΄ΠΎΠΊΡΠΌΠ΅Π½ΡΠΈΡΠΎΠ²Π°ΡΡ ΡΡΠΎ Π΅ΡΠ΅ Π½Π΅ΠΌΠ½ΠΎΠ³ΠΎ ΠΈ ΠΏΠΎΠΏΡΠΎΡΠΈΡΡ Π΅ΠΆΠ΅Π½ΠΎΡΠ½ΡΡ
ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Π΅ΠΉ feature(specialization)
Π²ΡΠΏΠΎΠ»Π½ΠΈΡΡ ΠΌΠΈΠ³ΡΠ°ΡΠΈΡ?
ΠΡΠΎΠ΄Π΅ ΠΊΠ°ΠΊ ΠΌΠΈΠ½ΠΈΠΌΡΠΌ Π΄ΠΎΠ»ΠΆΠ½ΠΎ Π±ΡΡΡ ΠΏΡΠ΅Π΄ΡΠΏΡΠ΅ΠΆΠ΄Π΅Π½ΠΈΠ΅. ΠΠΎΡ ΠΎΠΆΠ΅, ΡΡΠΎ ΡΡΠ° ΡΡΠ½ΠΊΡΠΈΡ ΡΠ²Π½ΠΎ Π½Π°ΡΡΡΠ΅Π½Π° ΠΈ ΠΎΠΏΠ°ΡΠ½Π° Π΄Π»Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΡ Π² Π΅Π΅ ΡΠ΅ΠΊΡΡΠ΅ΠΌ ΡΠΎΡΡΠΎΡΠ½ΠΈΠΈ.
Π― Π±Ρ ΠΏΠΎΠ΄ΡΠΌΠ°Π», ΡΡΠΎ specialization
ΠΌΠΎΠΆΠ΅Ρ ΡΡΠ°ΡΡ ΡΠΈΠ½ΠΎΠ½ΠΈΠΌΠΎΠΌ min_specialization
, Π½ΠΎ Π΄ΠΎΠ±Π°Π²ΡΡΠ΅ Π΅ΡΠ΅ ΠΎΠ΄Π½Ρ ΡΡΠ½ΠΊΡΠΈΡ unsound_specialization
Π΅ΡΠ»ΠΈ ΡΡΠΎ Π½Π΅ΠΎΠ±Ρ
ΠΎΠ΄ΠΈΠΌΠΎ Π΄Π»Ρ ΡΡΡΠ΅ΡΡΠ²ΡΡΡΠΈΡ
ΠΏΡΠΎΠ΅ΠΊΡΠΎΠ², ΡΠ°ΠΊΠΈΡ
ΠΊΠ°ΠΊ PyO3 ΠΈΠ»ΠΈ ΡΡΠΎ-ΡΠΎ Π΅ΡΠ΅. ΠΡΠΎ ΠΈΠ·Π±Π°Π²ΠΈΡ Π»ΡΠ±ΠΎΠ³ΠΎ, ΠΊΡΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅Ρ ΡΠΎΠ»ΡΠΊΠΎ 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 (Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠ° ΠΏΡΠΈΠ²ΡΠ·ΠΎΠΊ Python) Π² Π½Π°ΡΡΠΎΡΡΠ΅Π΅ Π²ΡΠ΅ΠΌΡ Π·Π°Π²ΠΈΡΠΈΡ ΠΎΡ ΡΠΏΠ΅ΡΠΈΠ°Π»ΠΈΠ·Π°ΡΠΈΠΈ. Π‘ΠΌ. PyO3 / pyo3 # 210
Π‘ΠΎΠΏΡΠΎΠ²ΠΎΠΆΠ΄Π°ΡΡΠΈΠΉ PyO3 - ΠΌΡ Π·Π° ΠΎΡΡ
ΠΎΠ΄ ΠΎΡ ΡΠΏΠ΅ΡΠΈΠ°Π»ΠΈΠ·Π°ΡΠΈΠΈ, ΡΡΠΎΠ±Ρ ΠΏΠ΅ΡΠ΅ΠΉΡΠΈ Π½Π° ΡΡΠ°Π±ΠΈΠ»ΡΠ½ΡΠΉ Rust. ΠΡΠ΄Π΅Ρ Π»ΠΈ ΡΡΠ°Π±ΠΈΠ»ΠΈΠ·ΠΈΡΠΎΠ²Π°ΡΡΡΡ min_specialization
Π΄ΠΎ Π·Π°Π²Π΅ΡΡΠ΅Π½ΠΈΡ ΠΎΡΡΠ°Π»ΡΠ½ΠΎΠΉ ΡΠΏΠ΅ΡΠΈΠ°Π»ΠΈΠ·Π°ΡΠΈΠΈ?
Π― Π΄ΡΠΌΠ°Ρ, ΡΡΠΎ Π½Π° ΡΠΎΠ²Π΅ΡΠ°Π½ΠΈΠΈ ΠΏΠΎ ΠΏΠ»Π°Π½ΠΈΡΠΎΠ²Π°Π½ΠΈΡ ΡΠ·ΡΠΊΠΎΠ²ΠΎΠ³ΠΎ Π΄ΠΈΠ·Π°ΠΉΠ½Π° ΠΈΠ·Π΄Π°Π½ΠΈΡ 2021 Π³ΠΎΠ΄Π° Π±ΡΠ»ΠΎ Π½Π΅ΠΊΠΎΡΠΎΡΠΎΠ΅ ΠΎΠ±ΡΡΠΆΠ΄Π΅Π½ΠΈΠ΅ ΠΏΠΎΠΏΡΡΠΊΠΈ ΡΡΠ°Π±ΠΈΠ»ΠΈΠ·ΠΈΡΠΎΠ²Π°ΡΡ min_specialization (ΠΎΠ½ΠΎ Π΅ΡΡΡ Π½Π° YouTube; ΠΈΠ·Π²ΠΈΠ½ΠΈΡΠ΅, Ρ Π³ΠΎΠ²ΠΎΡΡ ΠΏΠΎ ΡΠ΅Π»Π΅ΡΠΎΠ½Ρ, ΠΈΠ»ΠΈ Ρ Π±Ρ ΠΏΠΎΠΏΡΡΠ°Π»ΡΡ Π½Π°ΠΉΡΠΈ ΡΡΡΠ»ΠΊΡ). Π― Π·Π°Π±ΡΠ», ΡΡΠΎ ΠΎΠ½ΠΈ Π³ΠΎΠ²ΠΎΡΠΈΠ»ΠΈ ΠΎΠ± ΡΡΠΎΠΌ
Π― Π΄ΡΠΌΠ°Ρ, ΡΡΠΎ Π½Π° ΡΠΎΠ²Π΅ΡΠ°Π½ΠΈΠΈ ΠΏΠΎ ΠΏΠ»Π°Π½ΠΈΡΠΎΠ²Π°Π½ΠΈΡ ΡΠ·ΡΠΊΠΎΠ²ΠΎΠ³ΠΎ Π΄ΠΈΠ·Π°ΠΉΠ½Π° ΠΈΠ·Π΄Π°Π½ΠΈΡ 2021 Π³ΠΎΠ΄Π° Π±ΡΠ»ΠΎ Π½Π΅ΠΊΠΎΡΠΎΡΠΎΠ΅ ΠΎΠ±ΡΡΠΆΠ΄Π΅Π½ΠΈΠ΅ ΠΏΠΎΠΏΡΡΠΊΠΈ ΡΡΠ°Π±ΠΈΠ»ΠΈΠ·ΠΈΡΠΎΠ²Π°ΡΡ min_specialization (ΠΎΠ½ΠΎ Π΅ΡΡΡ Π½Π° YouTube; ΠΈΠ·Π²ΠΈΠ½ΠΈΡΠ΅, Ρ Π³ΠΎΠ²ΠΎΡΡ ΠΏΠΎ ΡΠ΅Π»Π΅ΡΠΎΠ½Ρ, ΠΈΠ»ΠΈ Ρ Π±Ρ ΠΏΠΎΠΏΡΡΠ°Π»ΡΡ Π½Π°ΠΉΡΠΈ ΡΡΡΠ»ΠΊΡ). Π― Π·Π°Π±ΡΠ», ΡΡΠΎ ΠΎΠ½ΠΈ Π³ΠΎΠ²ΠΎΡΠΈΠ»ΠΈ ΠΎΠ± ΡΡΠΎΠΌ
ΠΡΠΌΠ°Ρ, ΡΡΠΎ ΠΏΡΠ°Π²ΠΈΠ»ΡΠ½Π°Ρ ΡΡΡΠ»ΠΊΠ° Π½Π° 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]
.
ΠΡΡ ΠΌΠΎΡ ΡΠΏΠ΅ΡΠΈΠ°Π»ΠΈΠ·Π°ΡΠΈΡ ΡΠ΄Π΅Π»Π°Π½Π° Π² ΡΡΠΎΠΌ ΡΠ°ΠΉΠ»Π΅, ΠΈ Π²ΠΎΡ ΠΏΡΠΈΠΌΠ΅Ρ ΠΏΡΠΈΠ·Π½Π°ΠΊΠ° ΠΏΡΠ΅Π΄ΠΈΠΊΠ°ΡΠ° ΡΠΏΠ΅ΡΠΈΠ°Π»ΠΈΠ·Π°ΡΠΈΠΈ.
Π€ΡΠ½ΠΊΡΠΈΡ ΡΠ°Π±ΠΎΡΠ°Π΅Ρ ΠΈ Π΄Π΅Π»Π°Π΅Ρ ΠΈΠΌΠ΅Π½Π½ΠΎ ΡΠΎ, ΡΡΠΎ ΠΌΠ½Π΅ Π½ΡΠΆΠ½ΠΎ. ΠΡΠ΅Π²ΠΈΠ΄Π½ΠΎ, ΡΡΠΎ Π·Π΄Π΅ΡΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΡΡ Π²Π½ΡΡΡΠ΅Π½Π½ΠΈΠΉ ΠΌΠ°ΡΠΊΠ΅Ρ rustc, ΠΏΠΎΡΡΠΎΠΌΡ ΠΎΠ½ ΠΌΠΎΠΆΠ΅Ρ ΡΠ»ΠΎΠΌΠ°ΡΡΡΡ Π±Π΅Π· ΠΏΡΠ΅Π΄ΡΠΏΡΠ΅ΠΆΠ΄Π΅Π½ΠΈΡ.
ΠΠ΄ΠΈΠ½ΡΡΠ²Π΅Π½Π½ΡΠΉ Π½Π΅Π³Π°ΡΠΈΠ²Π½ΡΠΉ ΠΎΡΠ·ΡΠ² Π·Π°ΠΊΠ»ΡΡΠ°Π΅ΡΡΡ Π² ΡΠΎΠΌ, ΡΡΠΎ Ρ Π½Π΅ ΡΡΠ²ΡΡΠ²ΡΡ ΡΠΌΡΡΠ»Π° Π² ΠΊΠ»ΡΡΠ΅Π²ΠΎΠΌ ΡΠ»ΠΎΠ²Π΅ default
. ΠΠΎ ΡΡΡΠΈ, default
ΠΎΠ·Π½Π°ΡΠ°Π΅Ρ ΠΏΡΡΠΌΠΎ ΡΠ΅ΠΉΡΠ°Ρ: Β«ΡΡΠΎΡ ΠΈΠΌΠΏΠ»Ρ ΡΠ²Π»ΡΠ΅ΡΡΡ ΡΠΏΠ΅ΡΠΈΠ°Π»ΠΈΠ·ΠΈΡΠΎΠ²Π°Π½Π½ΡΠΌ, ΠΏΠΎΡΡΠΎΠΌΡ ΠΈΠ½ΡΠ΅ΡΠΏΡΠ΅ΡΠΈΡΡΠΉΡΠ΅ ΠΈΠΌΠΏΠ»Π°Π½Ρ, ΠΊΠΎΡΠΎΡΡΠΉ ΠΏΠΎΠΊΡΡΠ²Π°Π΅Ρ ΠΏΠΎΠ΄ΠΌΠ½ΠΎΠΆΠ΅ΡΡΠ²ΠΎ ΡΡΠΎΠ³ΠΎ ΠΈΠΌΠΏΠ»Π°Π½ΡΠ°ΡΠ°, ΠΊΠ°ΠΊ Π΅Π³ΠΎ ΡΠΏΠ΅ΡΠΈΠ°Π»ΠΈΠ·Π°ΡΠΈΡ, Π° Π½Π΅ ΠΊΠΎΠ½ΡΠ»ΠΈΠΊΡΡΡΡΠΈΠΉ ΠΈΠΌΠΏΠ»Π°Π½ΡΒ». ΠΡΠΎΠ±Π»Π΅ΠΌΠ° Π² ΡΠΎΠΌ, ΡΡΠΎ ΡΡΠΎ ΠΏΡΠΈΠ²ΠΎΠ΄ΠΈΡ ΠΊ ΠΎΡΠ΅Π½Ρ ΡΡΡΠ°Π½Π½ΠΎΠΌΡ Π²ΠΈΠ΄Ρ ΠΊΠΎΠ΄Π°:
ΠΠ΄Π΅ΡΡ Π²ΡΠΎΡΠΎΠΉ impl ΡΠΏΠ΅ΡΠΈΠ°Π»ΠΈΠ·ΠΈΡΡΠ΅ΡΡΡ Π½Π° ΠΏΠ΅ΡΠ²ΠΎΠΌ, Π½ΠΎ ΡΡΠΎ ΡΠΎΠΆΠ΅ 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]) {
...
}
}
Π‘ΠΏΠ°ΡΠΈΠ±ΠΎ Π·Π° ΠΎΡΠ²Π΅Ρ.
ΠΠΎΠΉ ΠΊΠΎΠΌΠΌΠ΅Π½ΡΠ°ΡΠΈΠΉ Π·Π΄Π΅ΡΡ , Π² ΡΠ°ΡΡΠ½ΠΎΡΡΠΈ , ΠΏΡΠ½ΠΊΡ 6, ΠΎΠ±Π΅ΡΠΏΠ΅ΡΠΈΠ²Π°Π΅Ρ ΡΠ»ΡΡΠ°ΠΉ Π±Π΅ΡΠΎΠ½Π° Π² ΡΡΠ°Π½Π΄Π°ΡΡΠ½ΠΎΠΉ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠ΅ , Π³Π΄Π΅ ΠΎΠ½Π° ΠΌΠΎΠΆΠ΅Ρ Π±ΡΡΡ ΠΆΠ΅Π»Π°ΡΠ΅Π»ΡΠ½ΠΎ ΠΈΠΌΠ΅ΡΡ ΡΠΏΠ΅ΡΠΈΠ°Π»ΠΈΠ·Π°ΡΠΈΡ, ΠΊΠΎΡΠΎΡΠ°Ρ Π»ΠΈΡΡ ΡΠ°ΡΡΠΈΡΠ½ΠΎ ΠΏΠ΅ΡΠ΅ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅: IndexSet
ΠΏΠΎΡΡΠ΅Π±ΡΠ΅ΡΡΡ ΠΎΡΡΠ΅ΡΠ»ΠΈΠ²ΡΠΉ Output
ΡΠΈΠΏΠ° , ΠΏΠΎΡΠΎΠΌΡ ΡΡΠΎ IndexSet
ΠΌΠΎΠΆΠ½ΠΎ ΡΠ΅Π°Π»ΠΈΠ·ΠΎΠ²Π°ΡΡ Π±Π΅Π· Index
, Π½ΠΎ ΠΌΡ, Π²Π΅ΡΠΎΡΡΠ½ΠΎ, Π½Π΅ Ρ
ΠΎΡΠΈΠΌ, ΡΡΠΎΠ±Ρ Π΄Π²Π° ΡΠΈΠΏΠ° ΡΠΎΡΡΡΠ΅ΡΡΠ²ΠΎΠ²Π°Π»ΠΈ Ρ ΡΠ°Π·Π½ΡΠΌΠΈ ΡΠΈΠΏΠ°ΠΌΠΈ Output
. ΠΠΎΡΠΊΠΎΠ»ΡΠΊΡ IndexSet
ΠΌΠΎΠΆΠ΅Ρ ΠΈΠΌΠ΅ΡΡ ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΡ ΠΏΠΎ ΡΠΌΠΎΠ»ΡΠ°Π½ΠΈΡ Π² ΡΠ΅ΡΠΌΠΈΠ½Π°Ρ
IndexMut
, Π±ΡΠ»ΠΎ Π±Ρ ΡΠ°Π·ΡΠΌΠ½ΠΎ ΡΠ°Π·ΡΠ΅ΡΠΈΡΡ ΡΠΏΠ΅ΡΠΈΠ°Π»ΠΈΠ·Π°ΡΠΈΡ ΠΌΠ΅ΡΠΎΠ΄Π° index_set
Π½Π΅ Π΄ΠΎΠΏΡΡΠΊΠ°Ρ ΡΠΏΠ΅ΡΠΈΠ°Π»ΠΈΠ·Π°ΡΠΈΠΈ Output
.
Π£ ΠΌΠ΅Π½Ρ ΠΏΡΠΎΠ±Π»Π΅ΠΌΡ Ρ Π²ΠΈΠ΄Π΅ΠΎ, ΠΏΠΎΡΡΠΎΠΌΡ Ρ Π½Π΅ ΠΌΠΎΠ³Ρ Π½Π°ΠΉΡΠΈ ΡΠ²ΡΠ·Π°Π½Π½ΠΎΠ΅ Π²ΠΈΠ΄Π΅ΠΎ, ΠΎΠ΄Π½Π°ΠΊΠΎ Ρ ΠΌΠ΅Π½Ρ Π΅ΡΡΡ ΠΎΠ΄ΠΈΠ½ Π²ΠΎΠΏΡΠΎΡ ΠΏΠΎ ΠΏΠΎΠ²ΠΎΠ΄Ρ #[min_specialization]
. ΠΠ°ΠΊ Π΅ΡΡΡ, ΡΡΡΠ΅ΡΡΠ²ΡΠ΅Ρ Π°ΡΡΠΈΠ±ΡΡ rustc_unsafe_specialization_marker
Π΄Π»Ρ ΡΠ°ΠΊΠΈΡ
ΡΠ²ΠΎΠΉΡΡΠ², ΠΊΠ°ΠΊ FusedIterator
ΠΊΠΎΡΠΎΡΡΠ΅ ΠΏΡΠ΅Π΄ΠΎΡΡΠ°Π²Π»ΡΡΡ ΠΏΠΎΠ΄ΡΠΊΠ°Π·ΠΊΠΈ ΠΏΠΎ ΠΎΠΏΡΠΈΠΌΠΈΠ·Π°ΡΠΈΠΈ, ΡΡΠΎΠ±Ρ ΠΈΡ
ΠΌΠΎΠΆΠ½ΠΎ Π±ΡΠ»ΠΎ ΡΠΏΠ΅ΡΠΈΠ°Π»ΠΈΠ·ΠΈΡΠΎΠ²Π°ΡΡ. @matthewjasper Π½Π°ΠΏΠΈΡΠ°Π»:
ΠΡΠΎ Π½Π΅ΠΎΠ±ΠΎΡΠ½ΠΎΠ²Π°Π½Π½ΠΎ, Π½ΠΎ ΠΌΡ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ΅ΠΌ ΡΡΠΎ Π² ΠΊΡΠ°ΡΠΊΠΎΡΡΠΎΡΠ½ΠΎΠΉ ΠΏΠ΅ΡΡΠΏΠ΅ΠΊΡΠΈΠ²Π΅, ΠΏΠΎΡΠΎΠΌΡ ΡΡΠΎ ΡΡΠΎ Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ Π²ΡΠ·Π²Π°ΡΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ ΠΏΠΎΡΠ»Π΅ ΠΎΡΠ²ΠΎΠ±ΠΎΠΆΠ΄Π΅Π½ΠΈΡ Ρ ΡΠΈΡΡΠΎ Π±Π΅Π·ΠΎΠΏΠ°ΡΠ½ΡΠΌ ΠΊΠΎΠ΄ΠΎΠΌ ΡΠ°ΠΊ ΠΆΠ΅, ΠΊΠ°ΠΊ ΡΠΏΠ΅ΡΠΈΠ°Π»ΠΈΠ·Π°ΡΠΈΡ Π½Π° ΠΌΠ΅ΡΠΎΠ΄Π°Ρ ΡΠ²ΠΎΠΉΡΡΠ².
Π― ΠΏΡΠ΅Π΄ΠΏΠΎΠ»Π°Π³Π°Ρ, ΡΡΠΎ ΠΏΠ»Π°Π½ ΡΠΎΡΡΠΎΠΈΡ Π² ΡΠΎΠΌ, ΡΡΠΎΠ±Ρ ΡΠ΅Π°Π»ΠΈΠ·ΠΎΠ²Π°ΡΡ ΠΏΡΠ΅Π΄Π»ΠΎΠΆΠ΅Π½ΠΈΠ΅ @aturon ΠΈ Π΄ΠΎΠ±Π°Π²ΠΈΡΡ ΠΌΠΎΠ΄Π°Π»ΡΠ½ΠΎΡΡΡ ΡΠΏΠ΅ΡΠΈΠ°Π»ΠΈΠ·Π°ΡΠΈΠΈ Π΄Π»Ρ ΡΠ°ΠΊΠΈΡ
ΡΠ΅ΡΡ, ΠΊΠ°ΠΊ ΡΡΠΈ ( where specialize(T: FusedIterator)
). ΠΠΎ Π² Π½Π°ΡΡΠΎΡΡΠ΅Π΅ Π²ΡΠ΅ΠΌΡ ΠΊΠ°ΠΆΠ΅ΡΡΡ, ΡΡΠΎ Π»ΡΠ±ΠΎΠΉ ΠΊΠΎΠ΄ ΠΌΠΎΠΆΠ΅Ρ ΡΠΏΠ΅ΡΠΈΠ°Π»ΠΈΠ·ΠΈΡΠΎΠ²Π°ΡΡΡΡ Π½Π° ΡΡΠΈΡ
ΡΠ΅ΡΡΠ°Ρ
. ΠΡΠ»ΠΈ ΠΎΠ½ ΡΡΠ°Π±ΠΈΠ»ΠΈΠ·ΠΈΡΡΠ΅ΡΡΡ ΠΊΠ°ΠΊ Π΅ΡΡΡ, Π»ΡΠ΄ΠΈ ΠΌΠΎΠ³ΡΡ ΠΏΠΈΡΠ°ΡΡ ΡΡΠ°Π±ΠΈΠ»ΡΠ½ΡΠ΅ ΡΠΏΠ΅ΡΠΈΠ°Π»ΠΈΠ·Π°ΡΠΈΠΈ, ΠΊΠΎΡΠΎΡΡΠ΅ Π·Π°Π²ΠΈΡΡΡ ΠΎΡ Π½Π΅Π³ΠΎ, Π° ΡΡΠΎ ΠΎΠ·Π½Π°ΡΠ°Π΅Ρ, ΡΡΠΎ ΡΡΠ° Π½Π΅ΡΠΎΡΡΠΎΡΡΠ΅Π»ΡΠ½ΠΎΡΡΡ Π±ΡΠ΄Π΅Ρ ΡΡΠ°Π±ΠΈΠ»ΠΈΠ·ΠΈΡΠΎΠ²Π°Π½Π°.
ΠΠΎΠ»ΠΆΠ½Π° Π»ΠΈ ΡΠΎΠ³Π΄Π° ΡΠΏΠ΅ΡΠΈΠ°Π»ΠΈΠ·Π°ΡΠΈΡ Π½Π° ΡΡΠΈΡ ΡΠ΅ΡΡΠ°Ρ ΡΠ°ΠΊΠΆΠ΅ ΠΎΠ³ΡΠ°Π½ΠΈΡΠΈΠ²Π°ΡΡΡΡ ΡΡΠ°Π½Π΄Π°ΡΡΠ½ΠΎΠΉ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠΎΠΉ? ΠΠΎΡΡΠ°ΡΠΎΡΠ½ΠΎ Π»ΠΈ ΠΏΡΠ΅ΠΈΠΌΡΡΠ΅ΡΡΠ² Π΄Π»Ρ ΡΡΠ°Π½Π΄Π°ΡΡΠ½ΠΎΠΉ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠΈ Π΄Π°Π΅Ρ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΡ ΡΠΏΠ΅ΡΠΈΠ°Π»ΠΈΠ·ΠΈΡΠΎΠ²Π°ΡΡΡΡ Π½Π° Π½ΠΈΡ ?
ΠΡΠ»ΠΈ ΠΎΠ½ ΡΡΠ°Π±ΠΈΠ»ΠΈΠ·ΠΈΡΡΠ΅ΡΡΡ ΠΊΠ°ΠΊ Π΅ΡΡΡ, Π»ΡΠ΄ΠΈ ΠΌΠΎΠ³ΡΡ ΠΏΠΈΡΠ°ΡΡ ΡΡΠ°Π±ΠΈΠ»ΡΠ½ΡΠ΅ ΡΠΏΠ΅ΡΠΈΠ°Π»ΠΈΠ·Π°ΡΠΈΠΈ, ΠΊΠΎΡΠΎΡΡΠ΅ Π·Π°Π²ΠΈΡΡΡ ΠΎΡ Π½Π΅Π³ΠΎ, Π° ΡΡΠΎ ΠΎΠ·Π½Π°ΡΠ°Π΅Ρ, ΡΡΠΎ ΡΡΠ° Π½Π΅ΡΠΎΡΡΠΎΡΡΠ΅Π»ΡΠ½ΠΎΡΡΡ Π±ΡΠ΄Π΅Ρ ΡΡΠ°Π±ΠΈΠ»ΠΈΠ·ΠΈΡΠΎΠ²Π°Π½Π°.
ΠΠ°ΡΠΊΠΎΠ»ΡΠΊΠΎ Ρ ΠΏΠΎΠ½ΠΈΠΌΠ°Ρ, min_specialization
as-is Π½Π΅ ΠΏΡΠ΅Π΄Π½Π°Π·Π½Π°ΡΠ΅Π½ Π΄Π»Ρ ΡΡΠ°Π±ΠΈΠ»ΠΈΠ·Π°ΡΠΈΠΈ.
ΠΠΎ-Π²ΡΠΎΡΡΡ , Ρ Ρ ΠΎΡΠ΅Π» Π±Ρ ΠΈΠΌΠ΅ΡΡ ΠΊΠ°ΠΊΠΎΠΉ-ΡΠΎ ΠΌΠ°ΡΠΊΠ΅Ρ ΠΏΠΎ ΡΠΏΠ΅ΡΠΈΠ°Π»ΠΈΠ·Π°ΡΠΈΠΈ ΠΈΠΌΠΏ. ΠΡΠ»ΠΎ Π΄ΠΎΠ²ΠΎΠ»ΡΠ½ΠΎ ΠΌΠ½ΠΎΠ³ΠΎ ΡΠ»ΡΡΠ°Π΅Π², ΠΊΠΎΠ³Π΄Π° ΠΊΠΎΠ΄ Π² rustc ΠΈ ΡΡΠ°Π½Π΄Π°ΡΡΠ½ΠΎΠΉ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠ΅ Π½Π΅ Π²ΡΠΏΠΎΠ»Π½ΡΠ» ΡΠΎ, ΠΊΠ°ΠΊ Π²ΡΠ³Π»ΡΠ΄ΠΈΡ, ΠΏΠΎΡΠΎΠΌΡ ΡΡΠΎ Π½Π΅Ρ Π½ΠΈΠΊΠ°ΠΊΠΎΠ³ΠΎ ΡΠΏΠΎΡΠΎΠ±Π° ΡΠ·Π½Π°ΡΡ, ΡΡΠΎ Π½Π° ΡΠ°ΠΌΠΎΠΌ Π΄Π΅Π»Π΅ ΠΏΡΠΎΠΈΡΡ ΠΎΠ΄ΠΈΡ ΡΠΏΠ΅ΡΠΈΠ°Π»ΠΈΠ·Π°ΡΠΈΡ:
ΠΠ΅Π½ΡΠΆΠ½Π°Ρ ΡΠΏΠ΅ΡΠΈΠ°Π»ΠΈΠ·Π°ΡΠΈΡ Copy
:
https://github.com/rust-lang/rust/pull/72707/files#diff -3afa644e1d09503658d661130df65f59L1955
Β«Π‘ΠΏΠ΅ΡΠΈΠ°Π»ΠΈΠ·Π°ΡΠΈΡΒ», ΠΊΠΎΡΠΎΡΠΎΠΉ Π½Π΅Ρ:
https://github.com/rust-lang/rust/pull/71321/files#diff -da456bd3af6d94a9693e625ff7303113L1589
Π Π΅Π°Π»ΠΈΠ·Π°ΡΠΈΡ, ΡΠ³Π΅Π½Π΅ΡΠΈΡΠΎΠ²Π°Π½Π½Π°Ρ ΠΌΠ°ΠΊΡΠΎΡΠΎΠΌ, Π΅ΡΠ»ΠΈ Π½Π΅ ΠΏΠ΅ΡΠ΅Π΄Π°Π½ ΡΠ»Π°Π³, ΠΏΠ΅ΡΠ΅ΠΎΠΏΡΠ΅Π΄Π΅Π»ΡΡΡΠΈΠΉ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ ΠΏΠΎ ΡΠΌΠΎΠ»ΡΠ°Π½ΠΈΡ impl:
https://github.com/rust-lang/rust/pull/73851/files?file-filters%5B%5D=#diff -ebb36dd2ac01b28a3fff54a1382527ddR124
@matthewjasper ΠΏΠΎΡΠ»Π΅Π΄Π½ΡΡ ΡΡΡΠ»ΠΊΠ° Π½Π΅
Π― Π½Π΅ ΡΠ²Π΅ΡΠ΅Π½, ΡΡΠΎ ΡΡΠΎ ΡΠ²Π½Π°Ρ ΡΠ΅Π»Ρ, Π½ΠΎ ΡΠΎΡ ΡΠ°ΠΊΡ, ΡΡΠΎ AIUI Π½Π΅ ΠΏΠΎΠΌΠ΅ΡΠ°Π΅Ρ ΡΠΏΠ΅ΡΠΈΠ°Π»ΠΈΠ·ΠΈΡΠΎΠ²Π°Π½Π½ΡΠ΅ ΠΈΠΌΠΏΡ, Π΄Π°Π΅Ρ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΡ ΠΈΠ·Π±Π΅ΠΆΠ°ΡΡ Π½Π°ΡΡΡΠ΅Π½ΠΈΡ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΉ Π² ΠΎΠ±ΡΠΈΡ
ΠΈΠΌΠΏΠ»ΠΈΠ΅Π½ΡΠ°Ρ
. ΠΠΎΠ²ΡΠΉ default impl<T> Trait for T
Π½Π΅ ΠΊΠΎΠ½ΡΠ»ΠΈΠΊΡΡΠ΅Ρ Ρ ΠΏΠΎΡΠ»Π΅Π΄ΡΡΡΠΈΠΌΠΈ ΠΈΠΌΠΏΠ°ΠΌΠΈ - ΠΎΠ½ΠΈ ΠΏΡΠΎΡΡΠΎ ΡΡΠ°Π½ΠΎΠ²ΡΡΡΡ ΡΠΏΠ΅ΡΠΈΠ°Π»ΠΈΠ·ΠΈΡΠΎΠ²Π°Π½Π½ΡΠΌΠΈ.
ΠΠΎΠΆΠ΅Ρ Π»ΠΈ ΡΡΠΎ Π±ΡΡΡ ΠΏΡΠ΅Π΄ΡΠΏΡΠ΅ΠΆΠ΄Π΅Π½ΠΈΠ΅ΠΌ, ΡΠΎΠ»ΡΠΊΠΎ Π΅ΡΠ»ΠΈ ΠΎΠ½ Π½Π΅ ΠΏΠΎΠΌΠ΅ΡΠ΅Π½?
ΠΡΠ»ΠΎ Π΄ΠΎΠ²ΠΎΠ»ΡΠ½ΠΎ ΠΌΠ½ΠΎΠ³ΠΎ ΡΠ»ΡΡΠ°Π΅Π², ΠΊΠΎΠ³Π΄Π° ΠΊΠΎΠ΄ Π² rustc ΠΈ ΡΡΠ°Π½Π΄Π°ΡΡΠ½ΠΎΠΉ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠ΅ Π½Π΅ Π²ΡΠΏΠΎΠ»Π½ΡΠ» ΡΠΎ, ΠΊΠ°ΠΊ Π²ΡΠ³Π»ΡΠ΄ΠΈΡ, ΠΏΠΎΡΠΎΠΌΡ ΡΡΠΎ Π½Π΅Ρ ΡΠΏΠΎΡΠΎΠ±Π° ΡΠ·Π½Π°ΡΡ, ΡΡΠΎ Π½Π° ΡΠ°ΠΌΠΎΠΌ Π΄Π΅Π»Π΅ ΠΏΡΠΎΠΈΡΡ ΠΎΠ΄ΠΈΡ ΡΠΏΠ΅ΡΠΈΠ°Π»ΠΈΠ·Π°ΡΠΈΡ.
ΠΠΎΠΉ ΠΎΠΏΡΡ ΡΠ°Π±ΠΎΡΡ Ρ java Π°Π½Π°Π»ΠΎΠ³ΠΈΡΠ΅Π½ (Ρ ΠΎΡΡ ΠΈ Π½Π΅ ΡΠΎΠ²ΡΠ΅ΠΌ Π°Π½Π°Π»ΠΎΠ³ΠΈΡΠ΅Π½). ΠΠΎΠΆΠ΅Ρ Π±ΡΡΡ ΡΠ»ΠΎΠΆΠ½ΠΎ ΠΎΠΏΡΠ΅Π΄Π΅Π»ΠΈΡΡ, ΠΊΠ°ΠΊΠΎΠΉ ΠΏΠΎΠ΄ΠΊΠ»Π°ΡΡ ΠΊΠ»Π°ΡΡΠ° ΡΠ°ΠΊΡΠΈΡΠ΅ΡΠΊΠΈ Π·Π°ΠΏΡΡΠ΅Π½ ...
ΠΠΎ Π½Π°ΠΌ Π±Ρ ΡΠΎΠΆΠ΅ Π½ΡΠΆΠ΅Π½ ΠΌΠ°ΡΠΊΠ΅Ρ Π½Π° ΡΠΏΠ΅ΡΠΈΠ°Π»ΠΈΠ·ΠΈΡΠΎΠ²Π°Π½Π½ΡΡ ΠΈΠΌΠΏΠ»ΠΈΠ΅Π½ΡΠ°Ρ , ΡΠ°ΠΊΠΆΠ΅ Π΄Π»Ρ ΡΡΠ½ΠΎΡΡΠΈ ΠΏΡΠΈ ΡΡΠ΅Π½ΠΈΠΈ, Π²Π΅ΡΠ½ΠΎ?
ΠΡ ΠΌΠΎΠ³Π»ΠΈ Π±Ρ ΡΠ°Π·ΠΌΠ΅ΡΡΠΈΡΡ ΠΌΠ°ΡΠΊΠ΅ΡΡ Π² ΠΎΠ±ΠΎΠΈΡ ΠΌΠ΅ΡΡΠ°Ρ , ΡΡΠΎ Π·Π°ΡΠ΅ΠΌ ΡΠ»ΡΡΡΠΈΠ»ΠΎ Π±Ρ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΡ ΠΎΠ± ΠΎΡΠΈΠ±ΠΊΠ°Ρ ΠΈΠ»ΠΈ ΠΏΡΠ΅Π΄ΡΠΏΡΠ΅ΠΆΠ΄Π΅Π½ΠΈΡΡ rustc, ΠΏΠΎΡΠΎΠΌΡ ΡΡΠΎ ΡΠ΅ΠΏΠ΅ΡΡ ΠΎΠ½ΠΈ Π·Π½Π°ΡΡ, Π½ΡΠΆΠ½Π° Π»ΠΈ ΡΠΏΠ΅ΡΠΈΠ°Π»ΠΈΠ·Π°ΡΠΈΡ, ΠΈ ΠΌΠΎΠ³ΡΡ ΡΠΊΠ°Π·ΡΠ²Π°ΡΡ Π½Π° Π΄ΡΡΠ³ΠΎΠ΅ ΠΌΠ΅ΡΡΠΎ, Π΅ΡΠ»ΠΈ ΠΎΠ½ΠΎ ΡΡΡΠ΅ΡΡΠ²ΡΠ΅Ρ.
ΠΡΠ»ΠΈ ΠΊΡΠ΅ΠΉΡ Π²ΠΎΡΡ ΠΎΠ΄ΡΡΠ΅Π³ΠΎ ΠΏΠΎΡΠΎΠΊΠ° Π΄ΠΎΠ±Π°Π²Π»ΡΠ΅Ρ impl, ΡΠΎ, ΠΏΠΎΠΌΠΈΠΌΠΎ ΠΏΡΠΎΡΡΠΎΠ³ΠΎ ΠΎΠ±Π½ΠΎΠ²Π»Π΅Π½ΠΈΡ, ΠΊΡΠ΅ΠΉΡ Π½ΠΈΡΡ ΠΎΠ΄ΡΡΠ΅Π³ΠΎ ΠΏΠΎΡΠΎΠΊΠ° ΠΌΠΎΠΆΠ΅Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ ΡΠ»ΠΎΠ²ΠΊΠΈ, ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡΡΠΈΠ΅ ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡΠΎΠ²Π°ΡΡ ΠΊΠ°ΠΊ Π½ΠΎΠ²ΡΡ, ΡΠ°ΠΊ ΠΈ ΡΡΠ°ΡΡΡ Π²Π΅ΡΡΠΈΡ, Π½Π΅ ΡΠ²Π΅ΡΠ΅Π½, ΡΡΠΎ ΡΡΠΎ Π²ΡΠ³ΠΎΠ΄Π½ΠΎ.
Π― Π΄ΡΠΌΠ°Ρ, ΡΡΠΎ ΡΠ°Π·Π½ΠΈΡΠ° ΠΌΠΎΠΆΠ΅Ρ Π±ΡΡΡ ΡΠ»ΠΈΡΠΊΠΎΠΌ Π±ΠΎΠ»ΡΡΠΎΠΉ, ΡΡΠΎΠ±Ρ ΠΏΠΎΠΊΠ°Π·Π°ΡΡ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠ΅. ΠΡΠΎ ΡΠΊΠ°Π·ΡΠ²Π°Π΅Ρ Π½Π° ΡΡΠΎ: https://github.com/rust-lang/rust/blob/fb818d4321dee29e1938c002c1ff79b0e7eaadff/src/librustc_span/def_id.rs#L124
Re: Blanket ΠΏΠΎΠ΄ΡΠ°Π·ΡΠΌΠ΅Π²Π°Π΅Ρ, ΡΡΠΎ ΠΎΠ½ΠΈ Π²ΡΠ΅ ΡΠ°Π²Π½ΠΎ Π½Π°ΡΡΡΠ°ΡΡ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΡ:
min_specialization
).ΠΠ° ΡΠ°ΠΌΠΎΠΌ Π΄Π΅Π»Π΅ impl<T: Copy> Clone for T { }
imp. Π Π»ΡΠ±ΠΎΠΌ ΡΠ»ΡΡΠ°Π΅ Ρ Π½Π°ΠΏΠΈΡΠ°Π» ΠΎΠ± ΡΡΠΎΠΌ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠ΅ Π² Π±Π»ΠΎΠ³Π΅ ... Π½ΠΎ ΡΠ΅ΠΉΡΠ°Ρ Ρ Π½Π΅ ΠΌΠΎΠ³Ρ Π²ΡΠΏΠΎΠΌΠ½ΠΈΡΡ, ΠΊΠ°ΠΊΠΎΠ² Π±ΡΠ» ΠΌΠΎΠΉ Π²ΡΠ²ΠΎΠ΄ .
Π’Π΅ΠΌ Π½Π΅ ΠΌΠ΅Π½Π΅Π΅, ΠΌΡ ΠΌΠΎΠ³Π»ΠΈ Π±Ρ ΡΠ΄Π΅Π»Π°ΡΡ ΡΡΠΎ ΠΏΡΠ΅Π΄ΡΠΏΡΠ΅ΠΆΠ΄Π΅Π½ΠΈΠ΅ΠΌ ΠΎΠ± ΠΎΡΡΡΡΡΡΠ²ΠΈΠΈ Π°Π½Π½ΠΎΡΠ°ΡΠΈΠΈ #[override]
.
Π’Π΅ΠΌ Π½Π΅ ΠΌΠ΅Π½Π΅Π΅, Π΅ΡΠ»ΠΈ Π±Ρ ΠΌΡ ΠΌΠΎΠ³Π»ΠΈ ΡΠΊΠ°Π·Π°ΡΡ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Ρ, ΡΡΠΎ ΠΏΠΎΠ΄ΡΠ°Π·ΡΠΌΠ΅Π²Π°Π΅Ρ, ΡΡΠΎ ΠΎΠ½ ΡΠΏΠ΅ΡΠΈΠ°Π»ΠΈΠ·ΠΈΡΡΠ΅ΡΡΡ (Π½Π΅ Π·Π½Π°Ρ, ΠΊΠ°ΠΊ ΠΌΡ ΡΡΠΎ ΡΠ΄Π΅Π»Π°Π΅ΠΌ), ΡΡΠΎ ΡΠΏΡΠΎΡΡΠΈΠ»ΠΎ Π±Ρ Π½Π΅ΠΊΠΎΡΠΎΡΡΠ΅ Π²Π΅ΡΠΈ. ΠΡΡΠΌΠΎ ΡΠ΅ΠΉΡΠ°Ρ ΠΊΠΎΠΌΠΏΠΈΠ»ΡΡΠΎΡ Π΄ΠΎΠ»ΠΆΠ΅Π½ Π²ΡΠ²Π΅ΡΡΠΈ ΠΎΡΠ½ΠΎΡΠ΅Π½ΠΈΡ ΠΌΠ΅ΠΆΠ΄Ρ impls, Π° ΡΡΠΎ Π²ΡΠ΅Π³Π΄Π° Π½Π΅ΠΌΠ½ΠΎΠ³ΠΎ ΡΠ»ΠΎΠΆΠ½ΠΎ.
ΠΠ΄ΠΈΠ½ ΠΈΠ· Π½Π΅Π·Π°Π²Π΅ΡΡΠ΅Π½Π½ΡΡ ΠΏΡΠ½ΠΊΡΠΎΠ², ΠΊΠΎΡΠΎΡΡΠ΅ ΠΌΡ Π΄ΠΎΠ»ΠΆΠ½Ρ ΡΠ΄Π΅Π»Π°ΡΡ Π² ΠΏΡΠΎΠ΅ΠΊΡΠ΅ ΠΌΠ΅Π»Π°, - ΡΡΠΎ ΠΏΠΎΠΏΡΡΠ°ΡΡΡΡ Π²Π΅ΡΠ½ΡΡΡΡΡ ΠΈ ΡΠ°Π·ΡΡΡΠ½ΠΈΡΡ, ΠΊΠ°ΠΊ Π΄ΠΎΠ»ΠΆΠ½Π° Π±ΡΡΡ Π²ΡΡΠ°ΠΆΠ΅Π½Π° ΡΠΏΠ΅ΡΠΈΠ°Π»ΠΈΠ·Π°ΡΠΈΡ.
ΠΡΠ»ΠΎ Π΄ΠΎΠ²ΠΎΠ»ΡΠ½ΠΎ ΠΌΠ½ΠΎΠ³ΠΎ ΡΠ»ΡΡΠ°Π΅Π², ΠΊΠΎΠ³Π΄Π° ΠΊΠΎΠ΄ Π² rustc ΠΈ ΡΡΠ°Π½Π΄Π°ΡΡΠ½ΠΎΠΉ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠ΅ Π½Π΅ Π²ΡΠΏΠΎΠ»Π½ΡΠ» ΡΠΎ, ΠΊΠ°ΠΊ Π²ΡΠ³Π»ΡΠ΄ΠΈΡ, ΠΏΠΎΡΠΎΠΌΡ ΡΡΠΎ Π½Π΅Ρ ΡΠΏΠΎΡΠΎΠ±Π° ΡΠ·Π½Π°ΡΡ, ΡΡΠΎ Π½Π° ΡΠ°ΠΌΠΎΠΌ Π΄Π΅Π»Π΅ ΠΏΡΠΎΠΈΡΡ ΠΎΠ΄ΠΈΡ ΡΠΏΠ΅ΡΠΈΠ°Π»ΠΈΠ·Π°ΡΠΈΡ.
ΠΠΎΠΉ ΠΎΠΏΡΡ ΡΠ°Π±ΠΎΡΡ Ρ java Π°Π½Π°Π»ΠΎΠ³ΠΈΡΠ΅Π½ (Ρ ΠΎΡΡ ΠΈ Π½Π΅ ΡΠΎΠ²ΡΠ΅ΠΌ Π°Π½Π°Π»ΠΎΠ³ΠΈΡΠ΅Π½). ΠΠΎΠΆΠ΅Ρ Π±ΡΡΡ ΡΠ»ΠΎΠΆΠ½ΠΎ ΠΎΠΏΡΠ΅Π΄Π΅Π»ΠΈΡΡ, ΠΊΠ°ΠΊΠΎΠΉ ΠΏΠΎΠ΄ΠΊΠ»Π°ΡΡ ΠΊΠ»Π°ΡΡΠ° ΡΠ°ΠΊΡΠΈΡΠ΅ΡΠΊΠΈ Π·Π°ΠΏΡΡΠ΅Π½ ...
ΠΡΠ΅ Π² ΠΌΠ°Π΅ Ρ ΠΏΡΠ΅Π΄Π»ΠΎΠΆΠΈΠ» Π°Π»ΡΡΠ΅ΡΠ½Π°ΡΠΈΠ²Ρ ΡΠΏΠ΅ΡΠΈΠ°Π»ΠΈΠ·Π°ΡΠΈΠΈ Π½Π° 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
Π΄Π»Ρ ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΠΈ Β«ΡΠΏΠ΅ΡΠΈΠ°Π»ΠΈΠ·Π°ΡΠΈΠΈΒ», ΠΏΠΎΡΠΎΠΌΡ ΡΡΠΎ ΠΏΠΎ ΡΠΎΠ³Π»Π°ΡΠ΅Π½ΠΈΡ ΡΠ°ΠΊΠΎΠΉ 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"
}
ΠΡΠ° ΡΠΎΡΠΌΡΠ»ΠΈΡΠΎΠ²ΠΊΠ° Π΄Π°Π΅Ρ Π±ΠΎΠ»ΡΡΠ΅ ΠΊΠΎΠ½ΡΡΠΎΠ»Ρ Π΄Π»Ρ Π²ΠΎΡΡ ΠΎΠ΄ΡΡΠ΅Π³ΠΎ ΠΏΠΎΡΠΎΠΊΠ°, ΡΡΠΎΠ±Ρ Π²ΡΠ±ΡΠ°ΡΡ ΠΏΠΎΡΡΠ΄ΠΎΠΊ ΠΏΡΠΈΠΌΠ΅Π½ΠΈΠΌΡΡ ΠΈΠΌΠΏΠ»ΠΈΡΠΈΡΠΎΠ², ΠΈ, ΠΏΠΎΡΠΊΠΎΠ»ΡΠΊΡ ΡΡΠΎ ΡΠ°ΡΡΡ ΡΠΈΠ³Π½Π°ΡΡΡΡ ΠΏΡΠΈΠ·Π½Π°ΠΊΠ° / ΡΡΠ½ΠΊΡΠΈΠΈ, ΡΡΠΎ Π±ΡΠ΄Π΅Ρ ΠΎΡΠΎΠ±ΡΠ°ΠΆΠ°ΡΡΡΡ Π² Π΄ΠΎΠΊΡΠΌΠ΅Π½ΡΠ°ΡΠΈΠΈ. ΠΠΠ, ΡΡΠΎ ΠΏΡΠ΅Π΄ΠΎΡΠ²ΡΠ°ΡΠ°Π΅Ρ Β«ΠΈΠΌΠΏΡΠΎΠ²ΠΈΠ·ΠΈΡΠΎΠ²Π°Π½Π½ΠΎΠ΅ ΠΏΡΠ΅ΡΠ»Π΅Π΄ΠΎΠ²Π°Π½ΠΈΠ΅Β», ΡΡΠΎΠ±Ρ ΡΠ·Π½Π°ΡΡ, ΠΊΠ°ΠΊΠ°Ρ Π²Π΅ΡΠ²Ρ Π΄Π΅ΠΉΡΡΠ²ΠΈΡΠ΅Π»ΡΠ½ΠΎ ΠΏΡΠΈΠΌΠ΅Π½ΠΈΠΌΠ°, ΠΏΠΎΡΠΊΠΎΠ»ΡΠΊΡ ΠΏΠΎΡΡΠ΄ΠΎΠΊ ΡΠ°Π·ΡΠ΅ΡΠ΅Π½ΠΈΡ ΡΠ²Π½ΡΠΉ.
ΠΡΠΎ ΠΌΠΎΠ³Π»ΠΎ Π±Ρ ΡΠ΄Π΅Π»Π°ΡΡ Π±ΠΎΠ»Π΅Π΅ ΠΎΡΠ΅Π²ΠΈΠ΄Π½ΡΠΌΠΈ ΠΎΡΠΈΠ±ΠΊΠΈ, ΡΠ²ΡΠ·Π°Π½Π½ΡΠ΅ Ρ ΠΏΡΠΎΠ΄ΠΎΠ»ΠΆΠΈΡΠ΅Π»ΡΠ½ΠΎΡΡΡΡ ΠΆΠΈΠ·Π½ΠΈ ΠΈ ΡΠ°Π²Π΅Π½ΡΡΠ²ΠΎΠΌ ΡΠΈΠΏΠΎΠ², ΠΏΠΎΡΠΊΠΎΠ»ΡΠΊΡ ΡΠΎΠ»ΡΠΊΠΎ Π²ΠΎΡΡ ΠΎΠ΄ΡΡΠΈΠΉ ΠΏΠΎΡΠΎΠΊ ΠΌΠΎΠΆΠ΅Ρ Π²ΡΡΡΠ΅ΡΠΈΡΡ ΠΈΡ ΠΏΡΠΈ ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΠΈ ΡΠΏΠ΅ΡΠΈΠ°Π»ΠΈΠ·Π°ΡΠΈΠΈ (ΠΏΠΎΡΠΊΠΎΠ»ΡΠΊΡ Π½ΠΈΡΡ ΠΎΠ΄ΡΡΠΈΠΉ ΠΏΠΎΡΠΎΠΊ ΡΠ΅Π°Π»ΠΈΠ·ΡΠ΅Ρ ΡΠΎΠ»ΡΠΊΠΎ Β«ΠΏΡΠΈΠ·Π½Π°ΠΊ ΡΠΏΠ΅ΡΠΈΠ°Π»ΠΈΠ·Π°ΡΠΈΠΈΒ».
ΠΠ΅Π΄ΠΎΡΡΠ°ΡΠΊΠΈ ΡΡΠΎΠΉ ΡΠΎΡΠΌΡΠ»ΠΈΡΠΎΠ²ΠΊΠΈ Π·Π°ΠΊΠ»ΡΡΠ°ΡΡΡΡ Π² ΡΠΎΠΌ, ΡΡΠΎ ΡΡΠΎ ΡΠΎΠ²ΡΠ΅ΠΌ Π΄ΡΡΠ³ΠΎΠΉ ΠΏΡΡΡ, ΡΠ΅ΠΌ Π² RFC, ΠΈ ΠΎΠ½ Π²Π½Π΅Π΄ΡΡΠ΅ΡΡΡ Ρ 2016 Π³ΠΎΠ΄Π°, ΠΈ ΡΡΠΎ ΠΏΠΎ ΠΊΡΠ°ΠΉΠ½Π΅ΠΉ ΠΌΠ΅ΡΠ΅ Π½Π΅ΠΊΠΎΡΠΎΡΡΠ΅ Π»ΡΠ΄ΠΈ Π² ΠΏΠΎΡΠΎΠΊΠ΅ Π²ΡΡΠ°Π·ΠΈΠ»ΠΈ ΠΎΠΏΠ°ΡΠ΅Π½ΠΈΡ, ΡΡΠΎ ΠΎΠ½ Π½Π΅ Π±ΡΠ΄Π΅Ρ ΡΠ°ΠΊΠΈΠΌ Π²ΡΡΠ°Π·ΠΈΡΠ΅Π»ΡΠ½ΡΠΌ ΠΈ / ΠΈΠ»ΠΈ ΠΈΠ½ΡΡΠΈΡΠΈΠ²Π½ΠΎ ΠΏΠΎΠ½ΡΡΠ½ΡΠΌ, ΠΊΠ°ΠΊ ΡΠ΅ΠΊΡΡΠΈΠΉ. ΠΎΡΠΎΠ±Π΅Π½Π½ΠΎΡΡΡ ΡΠΏΠ΅ΡΠΈΠ°Π»ΠΈΠ·Π°ΡΠΈΠΈ (Ρ ΡΡΠΈΡΠ°Ρ Β«ΡΠΎΠΏΠΎΡΡΠ°Π²Π»Π΅Π½ΠΈΠ΅ ΠΏΠΎ ΡΠΈΠΏΠ°ΠΌΒ» Π΄ΠΎΠ²ΠΎΠ»ΡΠ½ΠΎ ΠΈΠ½ΡΡΠΈΡΠΈΠ²Π½ΠΎ ΠΏΠΎΠ½ΡΡΠ½ΡΠΌ, Π½ΠΎ Ρ ΠΏΡΠ΅Π΄Π²Π·ΡΡΠΎ ΠΏΡΠ΅Π΄Π»Π°Π³Π°Ρ ΡΠΎΡΠΌΡΠ»ΠΈΡΠΎΠ²ΠΊΡ).
Π‘ΠΈΠ½ΡΠ°ΠΊΡΠΈΡ ΡΠΎΠΏΠΎΡΡΠ°Π²Π»Π΅Π½ΠΈΡ ΠΌΠΎΠΆΠ΅Ρ ΠΈΠΌΠ΅ΡΡ Π΅ΡΠ΅ ΠΎΠ΄Π½ΠΎ (ΡΠΈΠ½ΡΠ°ΠΊΡΠΈΡΠ΅ΡΠΊΠΎΠ΅) ΠΏΡΠ΅ΠΈΠΌΡΡΠ΅ΡΡΠ²ΠΎ: Π΅ΡΠ»ΠΈ Π±Ρ ΠΎΠ½ Π±ΡΠ» Π² ΠΊΠ°ΠΊΠΎΠΉ-ΡΠΎ ΠΌΠΎΠΌΠ΅Π½Ρ Π² Π±ΡΠ΄ΡΡΠ΅ΠΌ ΡΠ°ΡΡΠΈΡΠ΅Π½ Ρ ΠΏΠΎΠΌΠΎΡΡΡ ΠΊΠΎΠ½ΡΡΠ°Π½Ρ-ΠΎΡΠ΅Π½ΠΈΠ²Π°Π΅ΠΌΡΡ
ΠΏΡΠ΅Π΄ΠΎΡ
ΡΠ°Π½ΠΈΡΠ΅Π»Π΅ΠΉ ΡΠΎΠΏΠΎΡΡΠ°Π²Π»Π΅Π½ΠΈΡ, ΡΠΎΠ³Π΄Π° Π½Π΅ Π½ΡΠΆΠ½ΠΎ Π±ΡΠ»ΠΎ Π±Ρ Π²ΡΠΏΠΎΠ»Π½ΡΡΡ Π³ΠΈΠΌΠ½Π°ΡΡΠΈΠΊΡ ΡΠΈΠΏΠΎΠ², ΡΡΠΎΠ±Ρ Π²ΡΡΠ°Π·ΠΈΡΡ Π³ΡΠ°Π½ΠΈΡΡ, ΠΎΠ±ΡΡΠ»ΠΎΠ²Π»Π΅Π½Π½ΡΠ΅ ΠΊΠΎΠ½ΡΡΠ°Π½ΡΠ½ΡΠΌΠΈ Π²ΡΡΠ°ΠΆΠ΅Π½ΠΈΡΠΌΠΈ. ΠΠ°ΠΏΡΠΈΠΌΠ΅Ρ, ΠΌΠΎΠΆΠ½ΠΎ ΠΏΡΠΈΠΌΠ΅Π½ΡΡΡ ΡΠΏΠ΅ΡΠΈΠ°Π»ΠΈΠ·Π°ΡΠΈΠΈ Π½Π° ΠΎΡΠ½ΠΎΠ²Π΅ size_of
, align_of
, needs_drop
ΠΈΠ»ΠΈ ΡΠ°Π·ΠΌΠ΅ΡΠΎΠ² ΠΌΠ°ΡΡΠΈΠ²Π°.
@dureuill ΡΠΏΠ°ΡΠΈΠ±ΠΎ Π·Π° ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡ! ΠΡΠΎ Π΄Π΅ΠΉΡΡΠ²ΠΈΡΠ΅Π»ΡΠ½ΠΎ ΠΈΠ½ΡΠ΅ΡΠ΅ΡΠ½Π°Ρ ΠΈΠ΄Π΅Ρ. ΠΠ΅Π½Ρ Π±Π΅ΡΠΏΠΎΠΊΠΎΠΈΡ ΡΠΎ, ΡΡΠΎ ΠΎΠ½ Π½Π΅ ΠΎΠ±ΡΠ·Π°ΡΠ΅Π»ΡΠ½ΠΎ ΡΠ΅ΡΠ°Π΅Ρ Π½Π΅ΠΊΠΎΡΠΎΡΡΠ΅ Π΄ΡΡΠ³ΠΈΠ΅ ΠΎΠΆΠΈΠ΄Π°Π΅ΠΌΡΠ΅ Π²Π°ΡΠΈΠ°Π½ΡΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΡ ΡΠΏΠ΅ΡΠΈΠ°Π»ΠΈΠ·Π°ΡΠΈΠΈ, ΠΎΡΠΎΠ±Π΅Π½Π½ΠΎ ΡΠ»ΡΡΠ°ΠΉ Β«ΠΏΠΎΡΡΠ΅ΠΏΠ΅Π½Π½ΠΎΠ³ΠΎ ΡΡΠΎΡΠ½Π΅Π½ΠΈΡ ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΡΒ», ΠΊΠ°ΠΊ ΠΎΠΏΠΈΡΠ°Π½ΠΎ @aturon Π² ΡΡΠΎΠΌ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠΈ Π²
@dureuill ΠΠ΄Π΅Ρ Π΄Π΅ΠΉΡΡΠ²ΠΈΡΠ΅Π»ΡΠ½ΠΎ ΠΈΠ½ΡΠ΅ΡΠ΅ΡΠ½Π°Ρ ΠΈ ΠΌΠΎΠΆΠ΅Ρ ΠΈΠΌΠ΅ΡΡ Π±ΠΎΠ»ΡΡΠΎΠΉ ΠΏΠΎΡΠ΅Π½ΡΠΈΠ°Π», Π½ΠΎ Π°Π»ΡΡΠ΅ΡΠ½Π°ΡΠΈΠ²Π° Π½Π΅ Π²ΡΠ΅Π³Π΄Π° ΡΠ°Π²Π½ΠΎΠ·Π½Π°ΡΠ½Π° ΠΎΠ±ΠΌΠ΅Π½Ρ.
ΠΡΠΈΡΠΈΠ½Π°, ΠΏΠΎ ΠΊΠΎΡΠΎΡΠΎΠΉ Ρ ΡΠ°ΠΊ Π½Π΅ Π΄ΡΠΌΠ°Ρ, Π·Π°ΠΊΠ»ΡΡΠ°Π΅ΡΡΡ Π² ΡΠΎΠΌ, ΡΡΠΎ Ρ ΡΠ΅Π»ΠΎΠ²Π΅ΠΊΠ° Π½Π΅Ρ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΠΈ ΠΏΠΎΠ»Π½ΠΎΡΡΡΡ Π·Π°ΠΌΠ΅Π½ΠΈΡΡ Π±ΠΎΠ»Π΅Π΅ ΠΎΠ±ΡΡΡ ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΡ. ΠΡΠ΅ ΠΎΠ΄Π½Π° ΠΏΡΠΎΠ±Π»Π΅ΠΌΠ° ΠΌΠΎΠΆΠ΅Ρ Π·Π°ΠΊΠ»ΡΡΠ°ΡΡΡΡ Π² ΡΠΎΠΌ, ΡΡΠΎ Π½Π° ΡΠ°ΠΌΠΎΠΌ Π΄Π΅Π»Π΅ Ρ Π½Π°Ρ Π½Π΅Ρ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΊΠΈ Π²ΡΠ΅Ρ
ΡΡΠ½ΠΊΡΠΈΠΉ, ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π»Π΅Π½Π½ΡΡ
Π² RFC ΡΠΈΠ½ΡΠ°ΠΊΡΠΈΡΠ° where
ΠΎΡ ΠΊΠΎΡΠΎΡΡΡ
Π·Π°Π²ΠΈΡΠΈΡ Π²Π°ΡΠ΅ ΠΏΡΠ΅Π΄Π»ΠΎΠΆΠ΅Π½ΠΈΠ΅.
ΠΡΠ΅Π΄Π»ΠΎΠΆΠ΅Π½ΠΈΠ΅ ΠΈΠ½ΡΡΠΈΠ³ΡΡΡΠ΅Π΅, ΡΠ°ΠΊ ΡΡΠΎ, Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ, ΠΎΠ½ ΠΌΠΎΠ³ Π±Ρ ΠΈΠΌΠ΅ΡΡ ΡΠ²ΠΎΠΉ ΡΠΎΠ±ΡΡΠ²Π΅Π½Π½ΡΠΉ RFC Π² ΠΊΠ°ΡΠ΅ΡΡΠ²Π΅ ΠΎΡΠ΄Π΅Π»ΡΠ½ΠΎΠΉ ΡΡΠ½ΠΊΡΠΈΠΈ, Π° Π½Π΅ ΠΊΠΎΠ½ΠΊΡΡΠ΅Π½ΡΠ° ΡΠΏΠ΅ΡΠΈΠ°Π»ΠΈΠ·Π°ΡΠΈΠΈ, ΠΏΠΎΡΠΎΠΌΡ ΡΡΠΎ ΠΎΠ±Π° Π±ΡΠ»ΠΈ Π±Ρ ΠΏΠΎΠ»Π΅Π·Π½Ρ, ΠΈ Ρ Π½Π΅ Π²ΠΈΠΆΡ ΠΏΡΠΈΡΠΈΠ½, ΠΏΠΎ ΠΊΠΎΡΠΎΡΡΠΌ ΠΎΠ½ΠΈ Π½Π΅ ΠΌΠΎΠ³ΡΡ ΠΆΠΈΡΡ Π²ΠΌΠ΅ΡΡΠ΅.
@ the8472 @nikomatsakis , @ Dark-Legion: Π‘ΠΏΠ°ΡΠΈΠ±ΠΎ Π·Π° ΠΏΠΎΠ»ΠΎΠΆΠΈΡΠ΅Π»ΡΠ½ΡΠΉ ΠΎΡΠ·ΡΠ²! Π― ΠΏΡΡΠ°ΡΡΡ ΠΎΡΠ²Π΅ΡΠΈΡΡ Π½Π° Π½Π΅ΠΊΠΎΡΠΎΡΡΠ΅ ΠΈΠ· Π²Π°ΡΠΈΡ Π·Π°ΠΌΠ΅ΡΠ°Π½ΠΈΠΉ Π² Π²Π΅ΡΠΊΠ΅ IRLO , ΡΠ°ΠΊ ΠΊΠ°ΠΊ Ρ Π½Π΅ Ρ ΠΎΡΡ ΡΠ»ΠΈΡΠΊΠΎΠΌ ΡΡΠΌΠ½ΠΎ
Π― ΠΌΠΎΠ³Ρ ΠΎΡΠΊΡΡΡΡ ΠΎΡΠ΄Π΅Π»ΡΠ½ΡΠΉ RFC, Π΅ΡΠ»ΠΈ ΠΌΠ½Π΅ ΡΠ΄Π°ΡΡΡΡ Π½Π°ΠΏΠΈΡΠ°ΡΡ ΡΡΠΎ-Π½ΠΈΠ±ΡΠ΄Ρ Π΄Π»Ρ ΠΏΡΠ±Π»ΠΈΠΊΠ°ΡΠΈΠΈ. ΠΠ΅ΠΆΠ΄Ρ ΡΠ΅ΠΌ, Ρ ΠΎΡΠ΅Π½Ρ ΠΎΡΠΊΡΡΡ Π΄Π»Ρ ΠΎΡΠ·ΡΠ²ΠΎΠ² ΠΎ ΡΠ²ΡΠ·Π°Π½Π½ΠΎΠΉ Π²Π΅ΡΠΊΠ΅ IRLO . Π― Π΄ΠΎΠ±Π°Π²ΠΈΠ» Π±ΠΎΠ»Π΅Π΅ Π΄Π»ΠΈΠ½Π½ΡΠΉ ΠΏΡΠΈΠΌΠ΅Ρ ΠΈΠ· ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΡ Π² Π±Π»ΠΎΠ³Π΅ aturon, ΡΠ°ΠΊ ΡΡΠΎ Π½Π΅ ΡΡΠ΅ΡΠ½ΡΠΉΡΠ΅ΡΡ Π΅Π³ΠΎ ΠΊΠΎΠΌΠΌΠ΅Π½ΡΠΈΡΠΎΠ²Π°ΡΡ!
Π― ΡΠ°ΠΊΠΆΠ΅ Π·Π° ΡΠΎ, ΡΡΠΎΠ±Ρ ΠΈΠΌΠ΅ΡΡ ΠΊΠ°ΠΊΠΎΠΉ-ΡΠΎ ΠΌΠ°ΡΠΊΠ΅Ρ ΠΏΠΎ ΡΠΏΠ΅ΡΠΈΠ°Π»ΠΈΠ·Π°ΡΠΈΠΈ ΠΈΠΌΠΏ.
ΠΡΠΈΠ±Π»ΠΈΠΆΠ°Π΅ΡΡΡ ΠΈΠ·Π΄Π°Π½ΠΈΠ΅ 2021 Π³ΠΎΠ΄Π°, ΠΊΠΎΡΠΎΡΠΎΠ΅ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ΅Ρ Π½Π°ΠΌ Π·Π°ΡΠ΅Π·Π΅ΡΠ²ΠΈΡΠΎΠ²Π°ΡΡ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡΠ΅Π»ΡΠ½ΡΠ΅ ΠΊΠ»ΡΡΠ΅Π²ΡΠ΅ ΡΠ»ΠΎΠ²Π° (Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, specialize
). ΠΠ»ΡΠ΄Ρ Π½Π° ΡΠ»ΠΎΠΆΠ½ΠΎΡΡΡ ΠΈ ΠΈΡΡΠΎΡΠΈΡ ΡΡΠΎΠΉ ΡΡΠ½ΠΊΡΠΈΠΈ, Ρ Π½Π΅ Π΄ΡΠΌΠ°Ρ, ΡΡΠΎ ΠΎΠ½Π° ΡΡΠ°Π±ΠΈΠ»ΠΈΠ·ΠΈΡΡΠ΅ΡΡΡ Π΄ΠΎ Π²ΡΠΏΡΡΠΊΠ° Π²Π΅ΡΡΠΈΠΈ 2021 (Π½Π΅ ΡΡΠ΅ΡΠ½ΡΠΉΡΠ΅ΡΡ Π΄ΠΎΠΊΠ°Π·ΡΠ²Π°ΡΡ, ΡΡΠΎ Ρ ΠΎΡΠΈΠ±Π°ΡΡΡ), ΡΡΠΎ ΠΎΠ·Π½Π°ΡΠ°Π΅Ρ, Π½Π° ΠΌΠΎΠΉ Π²Π·Π³Π»ΡΠ΄, ΠΈΠ³ΡΡ Ρ (a) Π½ΠΎΠ²ΡΠΌ ΠΊΠ»ΡΡΠ΅Π²ΡΠΌ ΡΠ»ΠΎΠ²ΠΎΠΌ (Π°ΠΌΠΈ) ) ΡΠ°Π·ΡΠΌΠ½ΠΎ.
Π ΠΏΡΠΎΡΠΈΠ²Π½ΠΎΠΌ ΡΠ»ΡΡΠ°Π΅ Π΅Π΄ΠΈΠ½ΡΡΠ²Π΅Π½Π½ΡΠΌ ΡΡΡΠ΅ΡΡΠ²ΡΡΡΠΈΠΌ ΠΊΠ»ΡΡΠ΅Π²ΡΠΌ ΡΠ»ΠΎΠ²ΠΎΠΌ, ΠΊΠΎΡΠΎΡΠΎΠ΅ ΠΊΠ°ΠΆΠ΅ΡΡΡ ... Π½Ρ ... ΠΏΠΎΠ΄Ρ
ΠΎΠ΄ΡΡΠΈΠΌ Π² ΠΊΠ°ΡΠ΅ΡΡΠ²Π΅ ΠΌΠ°ΡΠΊΠ΅ΡΠ°, ΠΌΠΎΠ³Π»ΠΎ Π±Ρ Π±ΡΡΡ super
?
Π Π΅Π·ΡΠΌΠ΅ ΠΏΡΡΠ΅ΠΌ ΠΏΠΎΠ²ΡΠΎΡΠ½ΠΎΠ³ΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΡ ΠΏΡΠΈΠΌΠ΅ΡΠ° @LLFourn ΠΈΠ· https://github.com/rust-lang/rust/issues/31844#issuecomment -639977601:
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
) (ΠΎΠ±ΠΎΡΠ½ΠΎΠ²Π°Π½Π½ΠΎΠ΅ Π±Π΅ΡΠΏΠΎΠΊΠΎΠΉΡΡΠ²ΠΎ, ΠΏΠΎΠ΄Π½ΡΡΠΎΠ΅ @ssokolow Π² https://github.com/rust-lang / rust / issues / 31844 # issuecomment-690980762)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
- Π·Π°ΡΠ΅Π·Π΅ΡΠ²ΠΈΡΠΎΠ²Π°Π½Π½ΠΎΠ΅ ΠΊΠ»ΡΡΠ΅Π²ΠΎΠ΅ ΡΠ»ΠΎΠ²ΠΎ, Ρ ΠΏΠΎΠ»Π°Π³Π°Ρ, ΠΎΠ½ΠΎ ΠΏΡΠ΅Π΄Π½Π°Π·Π½Π°ΡΠ°Π»ΠΎΡΡ Π΄Π»Ρ ΡΡΠ½ΠΊΡΠΈΠΉ, ΠΏΠΎΡΡΠΎΠΌΡ Π΅Π³ΠΎ ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ Π΄Π»Ρ Π±Π»ΠΎΠΊΠ° impl.
specialize ΡΠ°ΠΊΠΆΠ΅ Π·Π°Π²ΠΈΡΠΈΡ ΠΎΡ ΡΠ·ΡΠΊΠΎΠ²ΠΎΠ³ΠΎ ΡΡΠ°Π½Π΄Π°ΡΡΠ° - Ρ ΠΊΠ°ΠΊ Π°Π²ΡΡΡΠ°Π»ΠΈΠ΅Ρ ΡΠΏΠ΅ΡΠΈΠ°Π»ΠΈΠ·ΠΈΡΡΡΡΡ Π½Π° ΡΡΠΎΠΌ, ΠΏΠΎΡΡΠΎΠΌΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ ΡΠ»ΠΎΠ²Π° Β«specΒ» ΡΡΡΡΠ°Π½ΡΠ΅Ρ Π΄Π²ΡΡΠΌΡΡΠ»Π΅Π½Π½ΠΎΡΡΡ ΡΠ·ΡΠΊΠΎΠ²ΠΎΠ³ΠΎ ΡΡΠ°Π½Π΄Π°ΡΡΠ°.
specialize ΡΠ°ΠΊΠΆΠ΅ Π·Π°Π²ΠΈΡΠΈΡ ΠΎΡ ΡΠ·ΡΠΊΠΎΠ²ΠΎΠ³ΠΎ ΡΡΠ°Π½Π΄Π°ΡΡΠ° - Ρ ΠΊΠ°ΠΊ Π°Π²ΡΡΡΠ°Π»ΠΈΠ΅Ρ ΡΠΏΠ΅ΡΠΈΠ°Π»ΠΈΠ·ΠΈΡΡΡΡΡ Π½Π° ΡΡΠΎΠΌ, ΠΏΠΎΡΡΠΎΠΌΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ ΡΠ»ΠΎΠ²Π° Β«specΒ» ΡΡΡΡΠ°Π½ΡΠ΅Ρ Π΄Π²ΡΡΠΌΡΡΠ»Π΅Π½Π½ΠΎΡΡΡ ΡΠ·ΡΠΊΠΎΠ²ΠΎΠ³ΠΎ ΡΡΠ°Π½Π΄Π°ΡΡΠ°.
ΡΡΠΎ ΡΠ°Π±ΠΎΡΠ°Π΅Ρ, Π·Π° ΠΈΡΠΊΠ»ΡΡΠ΅Π½ΠΈΠ΅ΠΌ ΡΠΎΠ³ΠΎ, ΡΡΠΎ Β«ΡΠΏΠ΅ΡΠΈΡΠΈΠΊΠ°ΡΠΈΡΒ» - ΡΡΠΎ ΠΎΠ±ΡΡΠ½ΠΎΠ΅ ΡΠΎΠΊΡΠ°ΡΠ΅Π½ΠΈΠ΅ Π΄Π»Ρ ΡΠΏΠ΅ΡΠΈΡΠΈΠΊΠ°ΡΠΈΠΈ, ΠΏΠΎΡΡΠΎΠΌΡ Ρ Π΄ΡΠΌΠ°Ρ, ΡΡΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ Β«ΡΠΏΠ΅ΡΠΈΡΠΈΠΊΠ°ΡΠΈΠΈΒ» Π΄Π»Ρ ΠΎΠ±ΠΎΠ·Π½Π°ΡΠ΅Π½ΠΈΡ ΡΠΏΠ΅ΡΠΈΠ°Π»ΠΈΠ·Π°ΡΠΈΠΈ ΠΌΠΎΠΆΠ΅Ρ ΡΠ±ΠΈΡΡ Ρ ΡΠΎΠ»ΠΊΡ. ΠΠ°ΠΆΠ΅ Π΅ΡΠ»ΠΈ ΡΠ»ΠΎΠ²Π° Π² ΠΠ²ΡΡΡΠ°Π»ΠΈΠΈ ΠΏΠΈΡΡΡΡΡ ΠΏΠΎ-ΡΠ°Π·Π½ΠΎΠΌΡ, ΠΊΠ°ΠΆΠ΄ΡΠΉ ΠΌΠΎΠΆΠ΅Ρ ΠΏΠΎΠ½ΡΡΡ, ΠΊΠ°ΠΊΠΎΠ΅ ΡΠ»ΠΎΠ²ΠΎ ΠΈΠΌΠ΅Π΅Ρ Π² Π²ΠΈΠ΄Ρ, Π΅ΡΠ»ΠΈ ΠΎΠ½ΠΎ Π½Π°ΠΏΠΈΡΠ°Π½ΠΎ Ρ Π±ΡΠΊΠ²ΠΎΠΉ Β«zΒ» ΠΈΠ»ΠΈ Β«sΒ».
ΠΠ°ΠΊ ΠΊΠ°Π½Π°Π΄Π΅Ρ, Ρ Π΄ΠΎΠ»ΠΆΠ΅Π½ ΡΠΊΠ°Π·Π°ΡΡ, ΡΡΠΎ ΡΠΏΠ΅ΡΠΈΠ°Π»ΠΈΠ·Π°ΡΠΈΡ / ΡΠΏΠ΅ΡΠΈΠ°Π»ΠΈΠ·Π°ΡΠΈΡ - Π½Π΅ Π΅Π΄ΠΈΠ½ΡΡΠ²Π΅Π½Π½ΠΎΠ΅ ΡΠ»ΠΎΠ²ΠΎ, ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΠΌΠΎΠ΅ Π² ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠΈΡΠΎΠ²Π°Π½ΠΈΠΈ, ΠΊΠΎΡΠΎΡΠΎΠ΅ Π·Π°Π²ΠΈΡΠΈΡ ΠΎΡ Π»ΠΎΠΊΠ°Π»ΠΈ.
ΠΠ΄Π΅ΡΡ ΠΌΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΠΌ Β«ΡΠ²Π΅ΡΒ», Π½ΠΎ ΠΎΠ½ Π²ΡΠ΅Π³Π΄Π° ΡΠ±ΠΈΠ²Π°Π΅Ρ ΠΌΠ΅Π½Ρ Ρ ΡΠΎΠ»ΠΊΡ Π² ΡΠ΅Ρ ΡΠ΅Π΄ΠΊΠΈΡ ΡΠ»ΡΡΠ°ΡΡ , ΠΊΠΎΠ³Π΄Π° ΡΠ·ΡΠΊ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠΈΡΠΎΠ²Π°Π½ΠΈΡ ΠΈΠ»ΠΈ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠ° ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡΡ Π΅Π³ΠΎ Π²ΠΌΠ΅ΡΡΠΎ Β«ΡΠ²Π΅ΡΠ°Β». Π₯ΠΎΡΠΎΡΠΎ ΡΡΠΎ ΠΈΠ»ΠΈ ΠΏΠ»ΠΎΡ ΠΎ, Π½ΠΎ Π°ΠΌΠ΅ΡΠΈΠΊΠ°Π½ΡΠΊΠΈΠΉ Π°Π½Π³Π»ΠΈΠΉΡΠΊΠΈΠΉ - ΡΡΠΎ ΡΠ²ΠΎΠ΅Π³ΠΎ ΡΠΎΠ΄Π° ΡΡΠ°Π½Π΄Π°ΡΡ Π΄Π΅-ΡΠ°ΠΊΡΠΎ Π² Π΄ΠΈΠ·Π°ΠΉΠ½Π΅ API, ΠΈ Π΄Π»Ρ ΡΠ°ΠΊΠΈΡ ΡΠ»ΠΎΠ², ΠΊΠ°ΠΊ ΡΠ²Π΅Ρ / ΡΠ²Π΅Ρ, ΠΏΡΠ΅Π΄ΠΏΠΎΡΡΠ΅Π½ΠΈΠ΅ ΠΎΠ΄Π½ΠΎΠ³ΠΎ Π½Π°ΠΏΠΈΡΠ°Π½ΠΈΡ ΠΏΠΎ ΡΡΠ°Π²Π½Π΅Π½ΠΈΡ Ρ Π΄ΡΡΠ³ΠΈΠΌ Π½Π΅ΠΈΠ·Π±Π΅ΠΆΠ½ΠΎ, Π½Π΅ Π±ΡΠ΄ΡΡΠΈ ΠΏΠΎ-Π½Π°ΡΡΠΎΡΡΠ΅ΠΌΡ Π½Π°Π΄ΡΠΌΠ°Π½Π½ΡΠΌ.
Π£ΡΠΈΡΡΠ²Π°Ρ, Π½Π°ΡΠΊΠΎΠ»ΡΠΊΠΎ ΡΠΈΠ»ΡΠ½ΠΎ Ρ ΠΎΠΆΠΈΠ΄Π°Ρ, ΡΡΠΎ Β«specΒ» Π±ΡΠ΄Π΅Ρ ΠΎΠ·Π½Π°ΡΠ°ΡΡ Β«ΡΠΏΠ΅ΡΠΈΡΠΈΠΊΠ°ΡΠΈΡΒ», Ρ Π΄ΡΠΌΠ°Ρ, ΡΡΠΎ ΡΡΠΎ Π΅ΡΠ΅ ΠΎΠ΄Π½Π° ΡΠΈΡΡΠ°ΡΠΈΡ, ΠΊΠΎΠ³Π΄Π° ΠΌΡ Π΄ΠΎΠ»ΠΆΠ½Ρ ΠΏΡΠΎΡΡΠΎ ΡΠ°ΡΡΠΌΠ°ΡΡΠΈΠ²Π°ΡΡ Π½Π°ΠΏΠΈΡΠ°Π½ΠΈΠ΅ Π² Π°ΠΌΠ΅ΡΠΈΠΊΠ°Π½ΡΠΊΠΎΠΌ Π°Π½Π³Π»ΠΈΠΉΡΠΊΠΎΠΌ ΠΊΠ°ΠΊ Π½Π°ΠΈΠΌΠ΅Π½Π΅Π΅ Ρ ΡΠ΄ΡΠΈΠΉ Π²Π°ΡΠΈΠ°Π½Ρ.
ΠΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ, ΡΡΠΎ Π΄Π΅-ΡΠ°ΠΊΡΠΎ, Π½ΠΎ ΡΡΠΎ Π½Π΅ Π·Π½Π°ΡΠΈΡ, ΡΡΠΎ ΠΈΡ ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ. Π― ΠΎΠ±Π½Π°ΡΡΠΆΠΈΠ», ΡΡΠΎ Π΄Π΅Π»Π°Ρ ΠΈΠΌΠΏΠΎΡΡ, Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, Β«ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ ΡΠ²Π΅Ρ ΠΊΠ°ΠΊ ΡΠ²Π΅ΡΒ». Π― ΡΠΎΠΆΠ΅ Π²ΡΠ΅Π³Π΄Π° ΡΠΏΠΎΡΡΠΊΠ°ΡΡΡ ΠΎ s vs z. Π― Π΄ΡΠΌΠ°Ρ, ΡΡΠΎ, ΡΡΠΈΡΡΠ²Π°Ρ ΠΏΠΎΠ»ΠΎΠΆΠΈΡΠ΅Π»ΡΠ½ΠΎΠ΅ ΠΎΡΠ½ΠΎΡΠ΅Π½ΠΈΠ΅ Rust ΠΊ ΠΈΠ½ΠΊΠ»ΡΠ·ΠΈΠ²Π½ΠΎΡΡΠΈ ΠΈ Π΄ΠΎΡΡΡΠΏΠ½ΠΎΡΡΠΈ, ΠΈΠΌΠ΅Π΅Ρ ΡΠΌΡΡΠ» Π²ΡΠ±ΠΈΡΠ°ΡΡ ΡΠ·ΡΠΊΠΎΠ²ΡΠ΅ ΡΠ΅ΡΠΌΠΈΠ½Ρ, Π½Π΅ Π·Π°Π²ΠΈΡΡΡΠΈΠ΅ ΠΎΡ Π»ΠΎΠΊΠ°Π»ΠΈ, ΠΏΠΎΡΠΊΠΎΠ»ΡΠΊΡ Π½Π΅Π±ΠΎΠ»ΡΡΠΈΠ΅ ΡΠ°Π·ΠΎΡΠ°ΡΠΎΠ²Π°Π½ΠΈΡ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Π΅ΠΉ, ΡΠ°ΠΊΠΈΠ΅ ΠΊΠ°ΠΊ ΡΠ²Π΅Ρ / ΡΠ²Π΅Ρ ΠΈ s / z, Π΄Π΅ΠΉΡΡΠ²ΠΈΡΠ΅Π»ΡΠ½ΠΎ Π½Π°ΠΊΠ°ΠΏΠ»ΠΈΠ²Π°ΡΡΡΡ.
Π― Π² ΠΏΡΠΈΠ½ΡΠΈΠΏΠ΅ ΡΠΎΠ³Π»Π°ΡΠ΅Π½. Π― ΠΏΡΠΎΡΡΠΎ ΡΠΊΠ΅ΠΏΡΠΈΡΠ΅ΡΠΊΠΈ ΠΎΡΠ½ΠΎΡΡΡΡ ΠΊ ΡΠΎΠΌΡ, ΡΡΠΎ Π² ΡΡΠΎΠΌ ΡΠ»ΡΡΠ°Π΅ Π΅ΡΡΡ Π²ΡΠ±ΠΎΡ, Π½Π΅ Π·Π°Π²ΠΈΡΡΡΠΈΠΉ ΠΎΡ Π»ΠΎΠΊΠ°Π»ΠΈ, ΠΊΠΎΡΠΎΡΡΠΉ Π½Π΅ Π²ΡΠ·ΡΠ²Π°Π΅Ρ Π±ΠΎΠ»ΡΡΠ΅ ΠΏΡΠΎΠ±Π»Π΅ΠΌ, ΡΠ΅ΠΌ ΡΠ΅ΡΠ°Π΅Ρ.
ΠΠ°ΠΊ Π½Π΅ Π½ΠΎΡΠΈΡΠ΅Π»Ρ Π°Π½Π³Π»ΠΈΠΉΡΠΊΠΎΠ³ΠΎ ΡΠ·ΡΠΊΠ°, ΠΌΠ½Π΅ ΠΊΠ°ΠΆΠ΅ΡΡΡ Π·Π°Π±Π°Π²Π½ΡΠΌ, ΡΡΠΎ Π½ΠΎΡΠΈΡΠ΅Π»ΠΈ Π°Π½Π³Π»ΠΈΠΉΡΠΊΠΎΠ³ΠΎ ΡΠ·ΡΠΊΠ° ΠΆΠ°Π»ΠΎΠ²Π°Π»ΠΈΡΡ Π½Π° Π»ΠΈΡΠ½ΠΈΠ΅ u
ΠΊΠ°ΠΊ Π½Π° ΠΏΡΠ΅ΠΏΡΡΡΡΠ²ΠΈΠ΅ Π΄Π»Ρ ΠΈΠ½ΠΊΠ»ΡΠ·ΠΈΠ²Π½ΠΎΡΡΠΈ. Π’ΠΎΠ»ΡΠΊΠΎ ΠΏΡΠ΅Π΄ΡΡΠ°Π²ΡΡΠ΅, ΠΊΠ°ΠΊ Π±Ρ ΡΡΠΎ Π±ΡΠ»ΠΎ, Π΅ΡΠ»ΠΈ Π±Ρ Π²ΡΠ΅ Π½Π΅ Π±ΡΠ»ΠΎ Π½Π°ΠΏΠΈΡΠ°Π½ΠΎ Π½Π΅ΠΌΠ½ΠΎΠ³ΠΎ ΡΡΡΠ°Π½Π½ΠΎ, Π° Π±ΡΠ»ΠΎ Π½Π°ΠΏΠΈΡΠ°Π½ΠΎ ΡΠΎΠ²Π΅ΡΡΠ΅Π½Π½ΠΎ Π½Π° Π΄ΡΡΠ³ΠΎΠΌ ΡΠ·ΡΠΊΠ΅.
ΠΡΡΠ³ΠΈΠΌΠΈ ΡΠ»ΠΎΠ²Π°ΠΌΠΈ: ΠΊΠ°ΠΆΠ΄ΡΠΉ ΡΠ΅ΡΠΌΠΈΠ½, ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΠΌΡΠΉ Π² Rust, Π·Π°Π²ΠΈΡΠΈΡ ΠΎΡ Π»ΠΎΠΊΠ°Π»ΠΈ.
Π₯ΠΎΡΠΎΡΠΎ ΡΡΠΎ ΠΈΠ»ΠΈ ΠΏΠ»ΠΎΡ
ΠΎ, Π½ΠΎ Π² Rust Π²ΡΠ΅ Π½Π°ΠΏΠΈΡΠ°Π½ΠΎ Π½Π° Π°ΠΌΠ΅ΡΠΈΠΊΠ°Π½ΡΠΊΠΎΠΌ Π°Π½Π³Π»ΠΈΠΉΡΠΊΠΎΠΌ. ΠΠ»Ρ ΠΌΠ½ΠΎΠ³ΠΈΡ
Π·Π΄Π΅ΡΡ ΡΡΠΎ ΠΎΠ·Π½Π°ΡΠ°Π΅Ρ ΡΠ°Π±ΠΎΡΡ Π½Π° Π²ΡΠΎΡΠΎΠΌ ΠΈΠ»ΠΈ ΡΡΠ΅ΡΡΠ΅ΠΌ ΡΠ·ΡΠΊΠ΅; Π΄Π»Ρ Π΄ΡΡΠ³ΠΈΡ
ΡΡΠΎ ΠΎΠ·Π½Π°ΡΠ°Π΅Ρ Π½Π΅ΠΎΠ±Ρ
ΠΎΠ΄ΠΈΠΌΠΎΡΡΡ Π½Π΅ΠΌΠ½ΠΎΠ³ΠΎ ΠΏΠΎΠ΄ΠΏΡΠ°Π²ΠΈΡΡ ΠΎΡΡΠΎΠ³ΡΠ°ΡΠΈΡ. ΠΡΠΎ ΡΠΎ, ΡΡΠΎ Π½ΡΠΆΠ½ΠΎ, ΡΡΠΎΠ±Ρ Π·Π°ΡΡΠ°Π²ΠΈΡΡ ΡΠ°Π±ΠΎΡΠ°ΡΡ Π²ΠΌΠ΅ΡΡΠ΅ ΡΠ΅Π»ΡΡ Π³ΡΡΠΏΠΏΡ Π»ΡΠ΄Π΅ΠΉ. Π― Π΄ΡΠΌΠ°Ρ, ΡΡΠΎ ΠΏΠΎΠ»ΡΠ·Π° ΠΎΡ ΠΏΠΎΠΏΡΡΠΊΠΈ ΠΏΠΎΠ΄ΠΎΠ±ΡΠ°ΡΡ ΡΠ»ΠΎΠ²Π°, ΠΊΠΎΡΠΎΡΡΠ΅ ΠΏΠΈΡΡΡΡΡ ΠΎΠ΄ΠΈΠ½Π°ΠΊΠΎΠ²ΠΎ Π²ΠΎ ΠΌΠ½ΠΎΠ³ΠΈΡ
Π²Π°ΡΠΈΠ°Π½ΡΠ°Ρ
Π°Π½Π³Π»ΠΈΠΉΡΠΊΠΎΠ³ΠΎ ΡΠ·ΡΠΊΠ°, Π½Π΅Π·Π½Π°ΡΠΈΡΠ΅Π»ΡΠ½Π° ΠΏΠΎ ΡΡΠ°Π²Π½Π΅Π½ΠΈΡ Ρ Π²ΡΠ±ΠΎΡΠΎΠΌ Ρ
ΠΎΡΠΎΡΠ΅Π³ΠΎ ΠΎΠ΄Π½ΠΎΠ·Π½Π°ΡΠ½ΠΎΠ³ΠΎ ΡΠ΅ΡΠΌΠΈΠ½Π° - Π° spec
Π½Π΅ΠΎΠ΄Π½ΠΎΠ·Π½Π°ΡΠ½ΠΎ, ΠΊΠ°ΠΊ ΡΠΊΠ°Π·Π°Π½ΠΎ Π²ΡΡΠ΅.
ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ special
Π² ΠΊΠ°ΡΠ΅ΡΡΠ²Π΅ ΠΊΠ»ΡΡΠ΅Π²ΠΎΠ³ΠΎ ΡΠ»ΠΎΠ²Π°?
Π ΠΊΠ°ΡΠ΅ΡΡΠ²Π΅ Π°Π»ΡΡΠ΅ΡΠ½Π°ΡΠΈΠ²Ρ ΡΠΎΠ·Π΄Π°ΠΉΡΠ΅ Π΄Π²Π° ΠΊΠ»ΡΡΠ΅Π²ΡΡ
ΡΠ»ΠΎΠ²Π°: specialize
ΠΈ specialise
ΠΈ ΡΠ΄Π΅Π»Π°ΠΉΡΠ΅ ΠΈΡ
ΡΠΊΠ²ΠΈΠ²Π°Π»Π΅Π½ΡΠ½ΡΠΌΠΈ ...
(ΠΠ»ΠΈ Π²Ρ, Π·Π°Π±Π°Π²Π½ΡΠ΅ Π½Π΅Π°ΠΌΠ΅ΡΠΈΠΊΠ°Π½ΡΡ, ΠΌΠΎΠΆΠ΅ΡΠ΅ Π½Π°ΡΡΠΈΡΡΡΡ ΠΏΡΠ°Π²ΠΈΠ»ΡΠ½ΠΎ ΠΏΠΈΡΠ°ΡΡ: Π½Π°Ρ: π)
Π― Π½Π΅ ΠΌΠΎΠ³Ρ Π³ΠΎΠ²ΠΎΡΠΈΡΡ ΠΎ ΡΠΎΠΌ, ΡΡΠΎ Π΄Π΅Π»Π°ΡΡ Π±ΠΎΠ»ΡΡΠΈΠ½ΡΡΠ²ΠΎ ΡΠ·ΡΠΊΠΎΠ², Π½ΠΎ CSS ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅Ρ Π½Π°ΠΏΠΈΡΠ°Π½ΠΈΠ΅ Π°ΠΌΠ΅ΡΠΈΠΊΠ°Π½ΡΠΊΠΎΠ³ΠΎ Π°Π½Π³Π»ΠΈΠΉΡΠΊΠΎΠ³ΠΎ Π΄Π»Ρ Π²ΡΠ΅Π³ΠΎ Π½ΠΎΠ²ΠΎΠ³ΠΎ. ΠΠ°ΠΊ Π½ΠΈ ΡΡΡΠ°Π½Π½ΠΎ, ΠΏΠΎΡ ΠΎΠΆΠ΅, ΡΡΠΎ Π°ΠΌΠ΅ΡΠΈΠΊΠ°Π½ΡΠΊΠΈΠΉ Π°Π½Π³Π»ΠΈΠΉΡΠΊΠΈΠΉ ΡΠ°ΠΊΠΆΠ΅ ΡΠ°ΡΠ΅ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΡΡ Π² ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠΈΡΠΎΠ²Π°Π½ΠΈΠΈ.
@ mark-im Π ΡΠΎΠΆΠ°Π»Π΅Π½ΠΈΡ, ΡΡΠΎ ΡΠΊΠΎΠ»ΡΠ·ΠΊΠ°Ρ Π΄ΠΎΡΠΎΠΆΠΊΠ°, Π²Π΅Π΄ΡΡΠ°Ρ ΠΊ Π°ΡΠ³ΡΠΌΠ΅Π½ΡΠ°ΠΌ Π² ΠΏΠΎΠ»ΡΠ·Ρ ΡΠΎΠ³ΠΎ, ΡΡΠΎ Rust Π΄ΠΎΠ»ΠΆΠ΅Π½ ΠΈΠΌΠ΅ΡΡ Π°Π»ΡΡΠ΅ΡΠ½Π°ΡΠΈΠ²Π½ΡΠ΅ Π½Π°Π±ΠΎΡΡ ΠΊΠ»ΡΡΠ΅Π²ΡΡ ΡΠ»ΠΎΠ² Π½Π° Π²ΡΠ΅Ρ ΠΎΡΠ½ΠΎΠ²Π½ΡΡ ΡΠ·ΡΠΊΠ°Ρ , Ρ ΠΊΠΎΡΠΎΡΡΡ ΠΌΠΎΠ³ΡΡ ΠΏΡΠΈΡ ΠΎΠ΄ΠΈΡΡ ΠΈΠ·ΡΡΠ°ΡΡΠΈΠ΅.
ΠΡΠΎ ΡΠ°ΠΊΠΆΠ΅ ΠΈΠ·Π»ΠΈΡΠ½Π΅ ΡΡΠ»ΠΎΠΆΠ½ΡΠ΅Ρ ΡΠ·ΡΠΊ ΠΈΠ·-Π·Π° Π½Π°Π»ΠΈΡΠΈΡ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΈΡ ΡΠΈΠ½ΠΎΠ½ΠΈΠΌΠΎΠ² Π΄Π»Ρ ΠΊΠ»ΡΡΠ΅Π²ΡΡ ΡΠ»ΠΎΠ², ΠΏΠΎΡΠΊΠΎΠ»ΡΠΊΡ Π»ΡΠ΄ΠΈ ΠΈ ΠΏΠ°ΡΡΠ΅ΡΡ ΠΏΡΠΈΠ²ΡΠΊΠ»ΠΈ ΡΠΎΠ»ΡΠΊΠΎ ΠΊ ΠΌΡΡΠ»ΠΈ, ΡΡΠΎ ΠΏΡΠΎΠ±Π΅Π»Ρ ΠΌΠΎΠ³ΡΡ ΠΈΠ·ΠΌΠ΅Π½ΡΡΡΡΡ ΡΠ°ΠΊΠΈΠΌ ΠΎΠ±ΡΠ°Π·ΠΎΠΌ.
(ΠΠ΅ Π³ΠΎΠ²ΠΎΡΡ ΡΠΆΠ΅ ΠΎ ΡΠΎΠΌ, ΡΡΠΎ ΡΡΠΎ ΠΏΠΎΡΠ΅Π½ΡΠΈΠ°Π»ΡΠ½ΠΎ ΠΌΠΎΠΆΠ΅Ρ Π²ΡΠ·Π²Π°ΡΡ ΡΠΎΠ»ΡΠΎΠΊ Π΄Π»Ρ ΡΠΊΠ²ΠΈΠ²Π°Π»Π΅Π½ΡΠ½ΡΡ ΡΠΈΠ½ΠΎΠ½ΠΈΠΌΠΎΠ² Π² Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠ°Ρ , ΡΡΠΎ Π·Π°ΡΠ΅ΠΌ ΠΏΠΎΡΡΠ΅Π±ΡΠ΅Ρ ΡΠ°Π±ΠΎΡΡ ΠΏΠΎ ΠΏΡΠΎΠ΅ΠΊΡΠΈΡΠΎΠ²Π°Π½ΠΈΡ ΠΈ ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΠΈ rustdoc, ΡΡΠΎΠ±Ρ ΠΎΠ½ΠΈ Π½Π΅ Π±ΡΠ»ΠΈ ΡΠΈΡΡΡΠΌ Π½Π΅Π³Π°ΡΠΈΠ²ΠΎΠΌ.)
ΠΠΌΠ΅ΡΡΠΎ ΡΠΎΠ³ΠΎ, ΡΡΠΎΠ±Ρ ΡΠΏΠΎΡΠΈΡΡ ΠΎ ΡΠΎΠΌ, Π½Π° ΠΊΠ°ΠΊΠΎΠΌ Π΄ΠΈΠ°Π»Π΅ΠΊΡΠ΅ Π°Π½Π³Π»ΠΈΠΉΡΠΊΠΎΠ³ΠΎ ΡΠ·ΡΠΊΠ° ΠΌΡ Ρ ΠΎΡΠΈΠΌ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ ΡΡΠΎΡ ΠΈΠ΄Π΅Π½ΡΠΈΡΠΈΠΊΠ°ΡΠΎΡ, Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ, ΠΌΡ ΠΌΠΎΠΆΠ΅ΠΌ ΠΏΠΎΠΉΡΠΈ Π½Π° ΠΊΠΎΠΌΠΏΡΠΎΠΌΠΈΡΡ ΠΈ Π²ΠΌΠ΅ΡΡΠΎ ΡΡΠΎΠ³ΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ ΠΈΠ²ΡΠΈΡ ?
@ssokolow, Ρ ΠΎΡΡ Π°ΡΠ³ΡΠΌΠ΅Π½Ρ ΠΎ ΡΠΊΠΎΠ»ΡΠ·ΠΊΠΎΠΉ
a
Π½Π° ΡΠ»ΠΎΠ²Π°ΡΠΊΠΎΠΌ ΠΎΠ·Π½Π°ΡΠ°Π΅Ρ and
Π½Π° Π°Π½Π³Π»ΠΈΠΉΡΠΊΠΎΠΌ)Π’Π΅ΠΏΠ΅ΡΡ, ΡΠ°Π±ΠΎΡΠ°Ρ Π² ΠΎΠ±ΡΠ°ΡΠ½ΠΎΠΌ Π½Π°ΠΏΡΠ°Π²Π»Π΅Π½ΠΈΠΈ, ΠΏΠΎΡΠ΅ΠΌΡ ΡΠ»Π΅Π΄ΡΠ΅Ρ ΠΎΡΠ΄Π°Π²Π°ΡΡ ΠΏΡΠ΅Π΄ΠΏΠΎΡΡΠ΅Π½ΠΈΠ΅ Π΄ΡΡΠ³ΠΈΠΌ Π΄ΠΈΠ°Π»Π΅ΠΊΡΠ°ΠΌ Π°Π½Π³Π»ΠΈΠΉΡΠΊΠΎΠ³ΠΎ ΡΠ·ΡΠΊΠ°, Π° Π½Π΅ Π΄ΡΡΠ³ΠΈΠΌ ΡΠ·ΡΠΊΠ°ΠΌ? Π― Π½Π΅ Π²ΠΈΠΆΡ Π² ΡΡΠΎΠΌ ΡΠΌΡΡΠ»Π°. ΠΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°ΡΠ΅Π»ΡΠ½ΠΎΡΡΡ (Π²ΡΠ΅ Π½Π° Π°ΠΌΠ΅ΡΠΈΠΊΠ°Π½ΡΠΊΠΎΠΌ Π°Π½Π³Π»ΠΈΠΉΡΠΊΠΎΠΌ) ΠΊΠ°ΠΆΠ΅ΡΡΡ ΡΠ°ΠΌΡΠΌ ΠΏΡΠΎΡΡΡΠΌ, Π»Π΅Π³ΠΊΠΈΠΌ Π΄Π»Ρ ΠΏΠΎΠ½ΠΈΠΌΠ°Π½ΠΈΡ ΠΈ Π½Π°ΠΈΠΌΠ΅Π½Π΅Π΅ ΠΏΠΎΠ΄Π²Π΅ΡΠΆΠ΅Π½Π½ΡΠΌ ΠΎΡΠΈΠ±ΠΊΠ°ΠΌ.
ΠΠ°ΠΊ Π±Ρ ΡΠΎ Π½ΠΈ Π±ΡΠ»ΠΎ, Ρ Π±ΡΠ» Π±Ρ ΠΎΡΠ΅Π½Ρ ΡΠ°Π΄, Π΅ΡΠ»ΠΈ Π±Ρ Π²Ρ ΠΈΠΌΠ΅Π»ΠΈ Π² Π²ΠΈΠ΄Ρ XXX? ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠ΅ ΠΎΠ± ΠΎΡΠΈΠ±ΠΊΠ΅. ΠΠ΅ΠΉΡΡΠ°Π»ΡΠ½ΡΠ΅ ΡΠ»ΠΎΠ²Π°, Π½Π΅ ΠΈΠΌΠ΅ΡΡΠΈΠ΅ Π΄ΡΡΠ³ΠΈΡ ΠΏΡΠΎΠ±Π»Π΅ΠΌ, ΡΠΎΠΆΠ΅ ΠΏΠΎΠ΄ΠΎΠΉΠ΄ΡΡ.
ΠΠΎ ΠΊΡΠ°ΠΉΠ½Π΅ΠΉ ΠΌΠ΅ΡΠ΅, Π½ΠΈΠΊΠΎΠΌΡ Π½Π΅ Π½ΡΠΆΠ½ΠΎ ΠΎΠ±ΡΡΠΆΠ΄Π°ΡΡ ΡΡΡΠ±ΠΎΠ» Π² ΠΊΠΎΠ΄Π΅. ;)
ΠΠΊΠΎΠ»ΠΎ 70% Π½ΠΎΡΠΈΡΠ΅Π»Π΅ΠΉ Π°Π½Π³Π»ΠΈΠΉΡΠΊΠΎΠ³ΠΎ ΡΠ·ΡΠΊΠ° ΠΆΠΈΠ²ΡΡ Π² ΡΡΡΠ°Π½Π°Ρ , Π² ΠΊΠΎΡΠΎΡΡΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΡΡ ΠΎΡΡΠΎΠ³ΡΠ°ΡΠΈΡ Π‘Π¨Π.
Π’Π°ΠΊΠΆΠ΅..
"ΠΡΠ°Π²ΠΎΠΏΠΈΡΠ°Π½ΠΈΠ΅ -ize ΡΠ°ΡΡΠΎ ΠΎΡΠΈΠ±ΠΎΡΠ½ΠΎ Π²ΠΎΡΠΏΡΠΈΠ½ΠΈΠΌΠ°Π΅ΡΡΡ Π² ΠΡΠΈΡΠ°Π½ΠΈΠΈ ΠΊΠ°ΠΊ Π°ΠΌΠ΅ΡΠΈΠΊΠ°Π½ΠΈΠ·ΠΌ. ΠΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΡΡ Ρ 15 Π²Π΅ΠΊΠ°, Π±ΠΎΠ»Π΅Π΅ ΡΠ΅ΠΌ Π½Π° ΡΡΠΎΠ»Π΅ΡΠΈΠ΅ ΡΠ°Π½ΡΡΠ΅, ΡΠ΅ΠΌ -ise. -Ize ΠΏΡΠΎΠΈΡΡ ΠΎΠ΄ΠΈΡ Π½Π΅ΠΏΠΎΡΡΠ΅Π΄ΡΡΠ²Π΅Π½Π½ΠΎ ΠΎΡ Π³ΡΠ΅ΡΠ΅ΡΠΊΠΎΠ³ΠΎ -ι΢Ριν -izein ΠΈ Π»Π°ΡΠΈΠ½ΡΠΊΠΎΠ³ΠΎ -izΔre, Π° - ise ΠΈΠ΄Π΅Ρ ΡΠ΅ΡΠ΅Π· ΡΡΠ°Π½ΡΡΠ·ΡΠΊΠΈΠΉ -iser. ΠΠΊΡΡΠΎΡΠ΄ΡΠΊΠΈΠΉ ΡΠ»ΠΎΠ²Π°ΡΡ Π°Π½Π³Π»ΠΈΠΉΡΠΊΠΎΠ³ΠΎ ΡΠ·ΡΠΊΠ° (OED) ΡΠ΅ΠΊΠΎΠΌΠ΅Π½Π΄ΡΠ΅Ρ -ize ΠΈ ΠΏΠ΅ΡΠ΅ΡΠΈΡΠ»ΡΠ΅Ρ -ise Π² ΠΊΠ°ΡΠ΅ΡΡΠ²Π΅ Π°Π»ΡΡΠ΅ΡΠ½Π°ΡΠΈΠ²Ρ Β».
"ΠΡΠ±Π»ΠΈΠΊΠ°ΡΠΈΠΈ Oxford University Press (OUP) - ΡΠ°ΠΊΠΈΠ΅ ΠΊΠ°ΠΊ Π‘Π»ΠΎΠ²Π°ΡΡ ΡΠΎΠ²ΡΠ΅ΠΌΠ΅Π½Π½ΠΎΠ³ΠΎ Π°Π½Π³Π»ΠΈΠΉΡΠΊΠΎΠ³ΠΎ ΡΠ·ΡΠΊΠ° ΠΠ΅Π½ΡΠΈ ΠΠ°ΡΡΠΎΠ½Π° Π€Π°ΡΠ»Π΅ΡΠ°, ΠΡΠ°Π²ΠΈΠ»Π° Π₯Π°ΡΡΠ° ΠΈ ΠΠΊΡΡΠΎΡΠ΄ΡΠΊΠΎΠ΅ ΡΡΠΊΠΎΠ²ΠΎΠ΄ΡΡΠ²ΠΎ ΠΏΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΡ Π°Π½Π³Π»ΠΈΠΉΡΠΊΠΎΠ³ΠΎ ΡΠ·ΡΠΊΠ° - ΡΠ°ΠΊΠΆΠ΅ ΡΠ΅ΠΊΠΎΠΌΠ΅Π½Π΄ΡΡΡ -ize. ΠΠ΄Π½Π°ΠΊΠΎ Π² ΠΊΠ½ΠΈΠ³Π΅ Π ΠΎΠ±Π΅ΡΡΠ° ΠΠ»Π»Π°Π½Π° ΠΠ°ΡΠΌΠ°Π½Π½ΠΎΠ΅ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ Π°Π½Π³Π»ΠΈΠΉΡΠΊΠΎΠ³ΠΎ ΡΠ·ΡΠΊΠ° Π€Π°ΡΠ»Π΅ΡΠ° ΡΠ°ΡΡΠΌΠ°ΡΡΠΈΠ²Π°Π΅ΡΡΡ Π»ΡΠ±ΠΎΠΉ Π²Π°ΡΠΈΠ°Π½Ρ Π½Π°ΠΏΠΈΡΠ°Π½ΠΈΡ Π±ΡΡΡ ΠΏΡΠΈΠ΅ΠΌΠ»Π΅ΠΌΡΠΌ Π³Π΄Π΅ ΡΠ³ΠΎΠ΄Π½ΠΎ, ΠΊΡΠΎΠΌΠ΅ Π‘Π¨Π ".
ΠΈΡΡ . https://en.wikipedia.org/wiki/American_and_British_English_spelling_differences# -ise, _- ize _ (- isation, _- ization)
ΠΠΎΡ ΠΎΠΆΠ΅, ΡΡΠΎ Π² ΠΈΡΠΏΠ°Π½ΡΠΊΠΎΠΌ ΠΈ ΠΈΡΠ°Π»ΡΡΠ½ΡΠΊΠΎΠΌ Π΅ΡΡΡ az ΠΈΠ»ΠΈ Π΄Π²Π°, ΠΏΠΎΡΡΠΎΠΌΡ Π½Π΅ ΡΠ²Π΅ΡΠ΅Π½, Π³Π΄Π΅ ΡΡΠ°Π½ΡΡΠ·ΡΠΊΠΈΠΉ Π»ΡΡΡΠ΅, ΠΌΠΎΠΆΠ΅Ρ Π±ΡΡΡ, ΠΎΡ Π½Π΅ΠΌΠ΅ΡΠΊΠΎΠ³ΠΎ?
ΠΠΎΠΆΠ½ΠΎ Π»ΠΈ ΠΏΠ΅ΡΠ΅Π½Π΅ΡΡΠΈ Π΄Π°Π»ΡΠ½Π΅ΠΉΡΠ΅Π΅ ΠΎΠ±ΡΡΠΆΠ΄Π΅Π½ΠΈΠ΅ ΠΊΠΎΠ½ΠΊΡΠ΅ΡΠ½ΡΡ ΠΊΠ»ΡΡΠ΅Π²ΡΡ ΡΠ»ΠΎΠ² ΠΈ ΠΈΠΌΠ΅Π½ΠΎΠ²Π°Π½ΠΈΡ Π²ΠΎ Π²Π½ΡΡΡΠ΅Π½Π½ΠΈΠΉ ΠΏΠΎΡΠΎΠΊ ? Π― ΡΠ»Π΅ΠΆΡ Π·Π° ΡΡΠΎΠΉ ΠΏΡΠΎΠ±Π»Π΅ΠΌΠΎΠΉ, ΡΡΠΎΠ±Ρ ΡΠ»Π΅Π΄ΠΈΡΡ Π·Π° ΠΎΠ±Π½ΠΎΠ²Π»Π΅Π½ΠΈΡΠΌΠΈ ΡΡΠΎΠΉ ΡΡΠ½ΠΊΡΠΈΠΈ, ΠΈ ΡΡΠΎ ΠΎΠ±ΡΡΠΆΠ΄Π΅Π½ΠΈΠ΅ Π½Π°ΡΠΈΠ½Π°Π΅Ρ ΡΡΠ°Π½ΠΎΠ²ΠΈΡΡΡΡ Π½Π΅ΠΌΠ½ΠΎΠ³ΠΎ ΡΡΠΌΠ½ΡΠΌ.
Π‘Π°ΠΌΡΠΉ ΠΏΠΎΠ»Π΅Π·Π½ΡΠΉ ΠΊΠΎΠΌΠΌΠ΅Π½ΡΠ°ΡΠΈΠΉ
Π― ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π»
#[min_specialization]
Π² ΡΠΊΡΠΏΠ΅ΡΠΈΠΌΠ΅Π½ΡΠ°Π»ΡΠ½ΠΎΠΉ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠ΅, ΠΊΠΎΡΠΎΡΡΡ ΡΠ°Π·ΡΠ°Π±Π°ΡΡΠ²Π°Ρ, ΠΏΠΎΡΡΠΎΠΌΡ ΡΠ΅ΡΠΈΠ» ΠΏΠΎΠ΄Π΅Π»ΠΈΡΡΡΡ ΡΠ²ΠΎΠΈΠΌ ΠΎΠΏΡΡΠΎΠΌ. Π¦Π΅Π»Ρ ΡΠΎΡΡΠΎΠΈΡ Π² ΡΠΎΠΌ, ΡΡΠΎΠ±Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ ΡΠΏΠ΅ΡΠΈΠ°Π»ΠΈΠ·Π°ΡΠΈΡ Π² Π΅Π΅ ΠΏΡΠΎΡΡΠ΅ΠΉΡΠ΅ΠΉ ΡΠΎΡΠΌΠ΅: ΠΈΠΌΠ΅ΡΡ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΎ ΡΠ·ΠΊΠΈΡ ΡΠ»ΡΡΠ°Π΅Π² Ρ Π±ΠΎΠ»Π΅Π΅ Π±ΡΡΡΡΠΎΠΉ ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΠ΅ΠΉ, ΡΠ΅ΠΌ ΠΎΠ±ΡΠΈΠΉ ΡΠ»ΡΡΠ°ΠΉ. Π ΡΠ°ΡΡΠ½ΠΎΡΡΠΈ, ΡΡΠΎΠ±Ρ ΠΊΡΠΈΠΏΡΠΎΠ³ΡΠ°ΡΠΈΡΠ΅ΡΠΊΠΈΠ΅ Π°Π»Π³ΠΎΡΠΈΡΠΌΡ Π² ΠΎΠ±ΡΠ΅ΠΌ ΡΠ»ΡΡΠ°Π΅ ΡΠ°Π±ΠΎΡΠ°Π»ΠΈ Π² ΠΏΠΎΡΡΠΎΡΠ½Π½ΠΎΠ΅ Π²ΡΠ΅ΠΌΡ, Π½ΠΎ Π·Π°ΡΠ΅ΠΌ, Π΅ΡΠ»ΠΈ Π²ΡΠ΅ Π²Ρ ΠΎΠ΄Ρ ΠΏΠΎΠΌΠ΅ΡΠ΅Π½ΡPublic
ΡΡΠΎΠ±Ρ ΠΈΠΌΠ΅ΡΡ ΡΠΏΠ΅ΡΠΈΠ°Π»ΠΈΠ·ΠΈΡΠΎΠ²Π°Π½Π½ΡΡ Π²Π΅ΡΡΠΈΡ, ΠΊΠΎΡΠΎΡΠ°Ρ ΡΠ°Π±ΠΎΡΠ°Π΅Ρ Π² Π±ΠΎΠ»Π΅Π΅ Π±ΡΡΡΡΠΎΠΌ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΠΎΠΌ Π²ΡΠ΅ΠΌΠ΅Π½ΠΈ (ΠΏΠΎΡΠΎΠΌΡ ΡΡΠΎ, Π΅ΡΠ»ΠΈ ΠΎΠ½ΠΈ ΡΠ²Π»ΡΡΡΡΡ ΠΎΠ±ΡΠ΅Π΄ΠΎΡΡΡΠΏΠ½ΡΠΌΠΈ, ΠΌΡ Π½Π΅ Π·Π°Π±ΠΎΡΠΈΡΡΡΡ ΠΎΠ± ΡΡΠ΅ΡΠΊΠ΅ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΠΈ ΠΎ Π½ΠΈΡ Π²ΠΎ Π²ΡΠ΅ΠΌΡ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΡ). ΠΡΠΎΠΌΠ΅ ΡΠΎΠ³ΠΎ, Π½Π΅ΠΊΠΎΡΠΎΡΡΠ΅ Π°Π»Π³ΠΎΡΠΈΡΠΌΡ ΡΠ°Π±ΠΎΡΠ°ΡΡ Π±ΡΡΡΡΠ΅Π΅ Π² Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡΠΈ ΠΎΡ ΡΠΎΠ³ΠΎ, Π½ΠΎΡΠΌΠ°Π»ΠΈΠ·ΠΎΠ²Π°Π½Π° ΡΠΎΡΠΊΠ° ΡΠ»Π»ΠΈΠΏΡΠΈΡΠ΅ΡΠΊΠΎΠΉ ΠΊΡΠΈΠ²ΠΎΠΉ ΠΈΠ»ΠΈ Π½Π΅Ρ. Π§ΡΠΎΠ±Ρ Π·Π°ΡΡΠ°Π²ΠΈΡΡ ΡΡΠΎ ΡΠ°Π±ΠΎΡΠ°ΡΡ, ΠΌΡ Π½Π°ΡΠ½Π΅ΠΌ ΡΠΠ°ΡΠ΅ΠΌ, Π΅ΡΠ»ΠΈ Π²Π°ΠΌ Π½ΡΠΆΠ½ΠΎ ΡΠΎΠ·Π΄Π°ΡΡ ΡΠ΅ΡΡΡ _specialization predicate_, ΠΊΠ°ΠΊ ΠΎΠΏΠΈΡΠ°Π½ΠΎ Π² ΡΠ°Π·Π΄Π΅Π»Π΅ Ρ ΠΌΠ°ΠΊΡΠΈΠΌΠ°Π»ΡΠ½ΠΎΠΉ ΠΌΠΈΠ½ΠΈΠΌΠ°Π»ΡΠ½ΠΎΠΉ ΡΠΏΠ΅ΡΠΈΠ°Π»ΠΈΠ·Π°ΡΠΈΠ΅ΠΉ, Π²Ρ ΠΏΠΎΠΌΠ΅ΡΠ°Π΅ΡΠ΅ ΠΎΠ±ΡΡΠ²Π»Π΅Π½ΠΈΠ΅ ΡΠ²ΠΎΠΉΡΡΠ²Π° Ρ ΠΏΠΎΠΌΠΎΡΡΡ
#[rustc_specialization_trait]
.ΠΡΡ ΠΌΠΎΡ ΡΠΏΠ΅ΡΠΈΠ°Π»ΠΈΠ·Π°ΡΠΈΡ ΡΠ΄Π΅Π»Π°Π½Π° Π² ΡΡΠΎΠΌ ΡΠ°ΠΉΠ»Π΅, ΠΈ Π²ΠΎΡ ΠΏΡΠΈΠΌΠ΅Ρ ΠΏΡΠΈΠ·Π½Π°ΠΊΠ° ΠΏΡΠ΅Π΄ΠΈΠΊΠ°ΡΠ° ΡΠΏΠ΅ΡΠΈΠ°Π»ΠΈΠ·Π°ΡΠΈΠΈ.
Π€ΡΠ½ΠΊΡΠΈΡ ΡΠ°Π±ΠΎΡΠ°Π΅Ρ ΠΈ Π΄Π΅Π»Π°Π΅Ρ ΠΈΠΌΠ΅Π½Π½ΠΎ ΡΠΎ, ΡΡΠΎ ΠΌΠ½Π΅ Π½ΡΠΆΠ½ΠΎ. ΠΡΠ΅Π²ΠΈΠ΄Π½ΠΎ, ΡΡΠΎ Π·Π΄Π΅ΡΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΡΡ Π²Π½ΡΡΡΠ΅Π½Π½ΠΈΠΉ ΠΌΠ°ΡΠΊΠ΅Ρ rustc, ΠΏΠΎΡΡΠΎΠΌΡ ΠΎΠ½ ΠΌΠΎΠΆΠ΅Ρ ΡΠ»ΠΎΠΌΠ°ΡΡΡΡ Π±Π΅Π· ΠΏΡΠ΅Π΄ΡΠΏΡΠ΅ΠΆΠ΄Π΅Π½ΠΈΡ.
ΠΠ΄ΠΈΠ½ΡΡΠ²Π΅Π½Π½ΡΠΉ Π½Π΅Π³Π°ΡΠΈΠ²Π½ΡΠΉ ΠΎΡΠ·ΡΠ² Π·Π°ΠΊΠ»ΡΡΠ°Π΅ΡΡΡ Π² ΡΠΎΠΌ, ΡΡΠΎ Ρ Π½Π΅ ΡΡΠ²ΡΡΠ²ΡΡ ΡΠΌΡΡΠ»Π° Π² ΠΊΠ»ΡΡΠ΅Π²ΠΎΠΌ ΡΠ»ΠΎΠ²Π΅
default
. ΠΠΎ ΡΡΡΠΈ,default
ΠΎΠ·Π½Π°ΡΠ°Π΅Ρ ΠΏΡΡΠΌΠΎ ΡΠ΅ΠΉΡΠ°Ρ: Β«ΡΡΠΎΡ ΠΈΠΌΠΏΠ»Ρ ΡΠ²Π»ΡΠ΅ΡΡΡ ΡΠΏΠ΅ΡΠΈΠ°Π»ΠΈΠ·ΠΈΡΠΎΠ²Π°Π½Π½ΡΠΌ, ΠΏΠΎΡΡΠΎΠΌΡ ΠΈΠ½ΡΠ΅ΡΠΏΡΠ΅ΡΠΈΡΡΠΉΡΠ΅ ΠΈΠΌΠΏΠ»Π°Π½Ρ, ΠΊΠΎΡΠΎΡΡΠΉ ΠΏΠΎΠΊΡΡΠ²Π°Π΅Ρ ΠΏΠΎΠ΄ΠΌΠ½ΠΎΠΆΠ΅ΡΡΠ²ΠΎ ΡΡΠΎΠ³ΠΎ ΠΈΠΌΠΏΠ»Π°Π½ΡΠ°ΡΠ°, ΠΊΠ°ΠΊ Π΅Π³ΠΎ ΡΠΏΠ΅ΡΠΈΠ°Π»ΠΈΠ·Π°ΡΠΈΡ, Π° Π½Π΅ ΠΊΠΎΠ½ΡΠ»ΠΈΠΊΡΡΡΡΠΈΠΉ ΠΈΠΌΠΏΠ»Π°Π½ΡΒ». ΠΡΠΎΠ±Π»Π΅ΠΌΠ° Π² ΡΠΎΠΌ, ΡΡΠΎ ΡΡΠΎ ΠΏΡΠΈΠ²ΠΎΠ΄ΠΈΡ ΠΊ ΠΎΡΠ΅Π½Ρ ΡΡΡΠ°Π½Π½ΠΎΠΌΡ Π²ΠΈΠ΄Ρ ΠΊΠΎΠ΄Π°:https://github.com/LLFourn/secp256kfun/blob/6766b60c02c99ca24f816801fe876fed79643c3a/secp256kfun/src/op.rs#L196 -L206
ΠΠ΄Π΅ΡΡ Π²ΡΠΎΡΠΎΠΉ impl ΡΠΏΠ΅ΡΠΈΠ°Π»ΠΈΠ·ΠΈΡΡΠ΅ΡΡΡ Π½Π° ΠΏΠ΅ΡΠ²ΠΎΠΌ, Π½ΠΎ ΡΡΠΎ ΡΠΎΠΆΠ΅
default
. ΠΠ½Π°ΡΠ΅Π½ΠΈΠ΅default
ΠΊΠ°ΠΆΠ΅ΡΡΡ ΡΡΠ΅ΡΡΠ½Π½ΡΠΌ. ΠΡΠ»ΠΈ Π²Ρ ΠΏΠΎΡΠΌΠΎΡΡΠΈΡΠ΅ Π½Π° ΠΎΡΡΠ°Π»ΡΠ½ΡΠ΅ ΠΈΠΌΠΏΠ»Ρ, ΡΠΎ Π΄ΠΎΠ²ΠΎΠ»ΡΠ½ΠΎ ΡΠ»ΠΎΠΆΠ½ΠΎ ΠΏΠΎΠ½ΡΡΡ, ΠΊΠ°ΠΊΠΈΠ΅ ΠΈΠΌΠΏΠ»Ρ Π½Π° ΠΊΠ°ΠΊΠΈΡ ΡΠΏΠ΅ΡΠΈΠ°Π»ΠΈΠ·ΠΈΡΡΡΡΡΡ. ΠΠΎΠ»Π΅Π΅ ΡΠΎΠ³ΠΎ, ΠΊΠΎΠ³Π΄Π° Ρ ΡΠ΄Π΅Π»Π°Π» ΠΎΡΠΈΠ±ΠΎΡΠ½ΡΠΉ ΠΈΠΌΠΏΠ»ΠΈΠΌΠ΅Π½Ρ, ΠΊΠΎΡΠΎΡΡΠΉ ΠΏΠ΅ΡΠ΅ΠΊΡΡΠ²Π°Π»ΡΡ Ρ ΡΡΡΠ΅ΡΡΠ²ΡΡΡΠΈΠΌ, ΡΠ°ΡΡΠΎ Π±ΡΠ»ΠΎ ΡΡΡΠ΄Π½ΠΎ ΠΏΠΎΠ½ΡΡΡ, Π³Π΄Π΅ Ρ ΠΎΡΠΈΠ±ΡΡ.ΠΠ½Π΅ ΠΊΠ°ΠΆΠ΅ΡΡΡ, ΡΡΠΎ Π±ΡΠ»ΠΎ Π±Ρ ΠΏΡΠΎΡΠ΅, Π΅ΡΠ»ΠΈ Π±Ρ Π²ΡΠ΅ Π±ΡΠ»ΠΎ ΡΠΏΠ΅ΡΠΈΠ°Π»ΠΈΠ·ΠΈΡΠΎΠ²Π°Π½Π½ΡΠΌ, ΠΈ ΠΊΠΎΠ³Π΄Π° Π²Ρ ΡΠΏΠ΅ΡΠΈΠ°Π»ΠΈΠ·ΠΈΡΡΠ΅ΡΠ΅ ΡΡΠΎ-ΡΠΎ, Π²Ρ ΡΠ΅ΡΠΊΠΎ Π·Π°ΡΠ²Π»ΡΠ΅ΡΠ΅, ΡΡΠΎ ΠΏΠΎΠ΄ΡΠ°Π·ΡΠΌΠ΅Π²Π°Π΅Ρ, ΡΡΠΎ Π²Ρ ΡΠΏΠ΅ΡΠΈΠ°Π»ΠΈΠ·ΠΈΡΡΠ΅ΡΠ΅ΡΡ. ΠΡΠ΅ΠΎΠ±ΡΠ°Π·ΠΎΠ²Π°Π½ΠΈΠ΅ ΠΏΡΠΈΠΌΠ΅ΡΠ° ΠΈΠ· RFC Π² ΡΠΎ, ΡΡΠΎ Ρ ΠΈΠΌΠ΅Π» Π² Π²ΠΈΠ΄Ρ: