Rust: ΠŸΡ€ΠΎΠ±Π»Π΅ΠΌΠ° отслСТивания спСциализации (RFC 1210)

Π‘ΠΎΠ·Π΄Π°Π½Π½Ρ‹ΠΉ Π½Π° 23 Ρ„Π΅Π²Ρ€. 2016  Β·  236ΠšΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΈ  Β·  Π˜ΡΡ‚ΠΎΡ‡Π½ΠΈΠΊ: rust-lang/rust

Π­Ρ‚ΠΎ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ° отслСТивания спСциализации (rust-lang / rfcs # 1210).

ΠžΡΠ½ΠΎΠ²Π½Ρ‹Π΅ этапы Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ:

  • [x] ЗСмля https://github.com/rust-lang/rust/pull/30652 =)
  • [] ΠžΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½ΠΈΡ Π½Π° ΠΎΡ‚ΠΏΡ€Π°Π²ΠΊΡƒ Π² Ρ‚Π΅Ρ‡Π΅Π½ΠΈΠ΅ всСго срока слуТбы (Π² настоящСС врСмя ΠΏΡ€ΠΎΠ±Π΅Π» Π²
  • [] default impl (https://github.com/rust-lang/rust/issues/37653)
  • [] Π˜Π½Ρ‚Π΅Π³Ρ€Π°Ρ†ΠΈΡ со связанными константами
  • [] Π“Ρ€Π°Π½ΠΈΡ†Ρ‹ Π½Π΅ всСгда ΡΠΎΠ±Π»ΡŽΠ΄Π°ΡŽΡ‚ΡΡ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ (https://github.com/rust-lang/rust/issues/33017)
  • [] Π”ΠΎΠ»ΠΆΠ½Ρ‹ Π»ΠΈ ΠΌΡ‹ Ρ€Π°Π·Ρ€Π΅ΡˆΠ°Ρ‚ΡŒ пустыС ΠΈΠΌΠΏΠ»ΠΈΠΌΠ΅Π½Ρ‚Ρ‹, Ссли Ρƒ родитСля Π½Π΅Ρ‚ Ρ‡Π»Π΅Π½ΠΎΠ² default ? https://github.com/rust-lang/rust/issues/48444
  • [] рСализация «всСгда ΠΏΡ€ΠΈΠΌΠ΅Π½ΠΈΠΌΠΎΒ» ΠΏΠΎΠ΄Ρ€Π°Π·ΡƒΠΌΠ΅Π²Π°Π΅Ρ‚ https://github.com/rust-lang/rust/issues/48538
  • [] ΠΎΠΏΠΈΡΠ°Ρ‚ΡŒ ΠΈ ΠΏΡ€ΠΎΡ‚Π΅ΡΡ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Ρ‚ΠΎΡ‡Π½Ρ‹Π΅ условия Ρ†ΠΈΠΊΠ»Π° Π²ΠΎΠΊΡ€ΡƒΠ³ создания Π³Ρ€Π°Ρ„Π° спСциализации (см., Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, этот ΠΊΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΉ , Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ отмСчаСтся, Ρ‡Ρ‚ΠΎ сСгодня Ρƒ нас здСсь ΠΎΡ‡Π΅Π½ΡŒ остороТная Π»ΠΎΠ³ΠΈΠΊΠ°)

ΠΠ΅Ρ€Π΅ΡˆΠ΅Π½Π½Ρ‹Π΅ вопросы ΠΈΠ· 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 позволяСт ΠΈΠ·Π±Π΅ΠΆΠ°Ρ‚ΡŒ Π±ΠΎΠ»ΡŒΡˆΠΈΠ½ΡΡ‚Π²Π° ошибок .

A-specialization A-traits B-RFC-approved B-RFC-implemented B-unstable C-tracking-issue F-specialization T-lang

Π‘Π°ΠΌΡ‹ΠΉ ΠΏΠΎΠ»Π΅Π·Π½Ρ‹ΠΉ ΠΊΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΉ

Π― использовал #[min_specialization] Π² ΡΠΊΡΠΏΠ΅Ρ€ΠΈΠΌΠ΅Π½Ρ‚Π°Π»ΡŒΠ½ΠΎΠΉ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ΅, ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ Ρ€Π°Π·Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°ΡŽ, поэтому Ρ€Π΅ΡˆΠΈΠ» ΠΏΠΎΠ΄Π΅Π»ΠΈΡ‚ΡŒΡΡ своим ΠΎΠΏΡ‹Ρ‚ΠΎΠΌ. ЦСль состоит Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΡŽ Π² Π΅Π΅ ΠΏΡ€ΠΎΡΡ‚Π΅ΠΉΡˆΠ΅ΠΉ Ρ„ΠΎΡ€ΠΌΠ΅: ΠΈΠΌΠ΅Ρ‚ΡŒ нСсколько ΡƒΠ·ΠΊΠΈΡ… случаСв с Π±ΠΎΠ»Π΅Π΅ быстрой Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠ΅ΠΉ, Ρ‡Π΅ΠΌ ΠΎΠ±Ρ‰ΠΈΠΉ случай. Π’ частности, Ρ‡Ρ‚ΠΎΠ±Ρ‹ криптографичСскиС Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΡ‹ Π² ΠΎΠ±Ρ‰Π΅ΠΌ случаС Ρ€Π°Π±ΠΎΡ‚Π°Π»ΠΈ Π² постоянноС врСмя, Π½ΠΎ Π·Π°Ρ‚Π΅ΠΌ, Ссли всС Π²Ρ…ΠΎΠ΄Ρ‹ ΠΏΠΎΠΌΠ΅Ρ‡Π΅Π½Ρ‹ Public Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΈΠΌΠ΅Ρ‚ΡŒ ΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π½Π½ΡƒΡŽ Π²Π΅Ρ€ΡΠΈΡŽ, которая Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ Π² Π±ΠΎΠ»Π΅Π΅ быстром ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΌ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ (ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ, Ссли ΠΎΠ½ΠΈ ΡΠ²Π»ΡΡŽΡ‚ΡΡ общСдоступными, ΠΌΡ‹ Π½Π΅ Π·Π°Π±ΠΎΡ‚ΠΈΡ‚ΡŒΡΡ ΠΎΠ± ΡƒΡ‚Π΅Ρ‡ΠΊΠ΅ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ ΠΎ Π½ΠΈΡ… Π²ΠΎ врСмя выполнСния). ΠšΡ€ΠΎΠΌΠ΅ Ρ‚ΠΎΠ³ΠΎ, Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΡ‹ Ρ€Π°Π±ΠΎΡ‚Π°ΡŽΡ‚ быстрСС Π² зависимости ΠΎΡ‚ Ρ‚ΠΎΠ³ΠΎ, Π½ΠΎΡ€ΠΌΠ°Π»ΠΈΠ·ΠΎΠ²Π°Π½Π° Ρ‚ΠΎΡ‡ΠΊΠ° эллиптичСской ΠΊΡ€ΠΈΠ²ΠΎΠΉ ΠΈΠ»ΠΈ Π½Π΅Ρ‚. Π§Ρ‚ΠΎΠ±Ρ‹ Π·Π°ΡΡ‚Π°Π²ΠΈΡ‚ΡŒ это Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ, ΠΌΡ‹ Π½Π°Ρ‡Π½Π΅ΠΌ с

#![feature(rustc_attrs, min_specialization)]

Π—Π°Ρ‚Π΅ΠΌ, Ссли Π²Π°ΠΌ Π½ΡƒΠΆΠ½ΠΎ ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ Ρ‡Π΅Ρ€Ρ‚Ρƒ _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 Π² Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ я ΠΈΠΌΠ΅Π» Π² Π²ΠΈΠ΄Ρƒ:

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]) {
        ...
    }
}

ВсС 236 ΠšΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΉ

НСкоторыС Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚Ρ‹Π΅ вопросы:

  • Π‘Π»Π΅Π΄ΡƒΠ΅Ρ‚ Π»ΠΈ Π½Π°ΠΌ ΠΏΠ΅Ρ€Π΅ΡΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ ΠΏΡ€Π°Π²ΠΈΠ»Π° для сирот Π² свСтС спСциализации? Π•ΡΡ‚ΡŒ Π»ΠΈ способы ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ Π²Π΅Ρ‰ΠΈ Π±ΠΎΠ»Π΅Π΅ Π³ΠΈΠ±ΠΊΠΈΠΌΠΈ?
  • Π”ΠΎΠ»ΠΆΠ½Ρ‹ Π»ΠΈ ΠΌΡ‹ Ρ€Π°ΡΡˆΠΈΡ€ΠΈΡ‚ΡŒ Β«Ρ†Π΅ΠΏΠ½ΠΎΠ΅ ΠΏΡ€Π°Π²ΠΈΠ»ΠΎΒ» Π² RFC Π½Π° Ρ‡Ρ‚ΠΎ-Ρ‚ΠΎ Π±ΠΎΠ»Π΅Π΅ Π²Ρ‹Ρ€Π°Π·ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠ΅, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Ρ‚Π°ΠΊ Π½Π°Π·Ρ‹Π²Π°Π΅ΠΌΠΎΠ΅ Β«ΠΏΡ€Π°Π²ΠΈΠ»ΠΎ Ρ€Π΅ΡˆΠ΅Ρ‚ΠΊΠΈΒ»?
  • Π’ связи с ΠΎΠ±ΠΎΠΈΠΌΠΈ Π²Ρ‹ΡˆΠ΅ΠΏΠ΅Ρ€Π΅Ρ‡ΠΈΡΠ»Π΅Π½Π½Ρ‹ΠΌΠΈ, ΠΊΠ°ΠΊ Π½Π΅Π³Π°Ρ‚ΠΈΠ²Π½Ρ‹Π΅ Π΄ΠΎΠ²ΠΎΠ΄Ρ‹ Π²ΠΏΠΈΡΡ‹Π²Π°ΡŽΡ‚ΡΡ Π² ΠΈΡΡ‚ΠΎΡ€ΠΈΡŽ? МоТСм Π»ΠΈ ΠΌΡ‹ Π²ΠΎΡΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ Π½ΡƒΠΆΠ½Ρ‹Π΅ Π½Π°ΠΌ Π½Π΅Π³Π°Ρ‚ΠΈΠ²Π½Ρ‹Π΅ рассуТдСния с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ достаточно ΡƒΠΌΠ½ΠΎΠ³ΠΎ использования ΠΏΡ€Π°Π²ΠΈΠ» спСциализации / сиротства ΠΈΠ»ΠΈ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ ΠΈΡ… Π±ΠΎΠ»Π΅Π΅ пСрвоклассными?

Π― Π½Π΅ ΡƒΠ²Π΅Ρ€Π΅Π½, Ρ‡Ρ‚ΠΎ спСциализация мСняСт ΠΏΡ€Π°Π²ΠΈΠ»Π° сиротства:

  • Β«Π‘Π²ΡΠ·Ρ‹Π²Π°ΡŽΡ‰ΠΈΠ΅Β» сиротскиС ΠΏΡ€Π°Π²ΠΈΠ»Π° Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΠΎΡΡ‚Π°Π²Π°Ρ‚ΡŒΡΡ Π½Π΅ΠΈΠ·ΠΌΠ΅Π½Π½Ρ‹ΠΌΠΈ, ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ Π² ΠΏΡ€ΠΎΡ‚ΠΈΠ²Π½ΠΎΠΌ случаС Ρƒ вас Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚ бСзопасного связывания.
  • Π― Π½Π΅ Π΄ΡƒΠΌΠ°ΡŽ, Ρ‡Ρ‚ΠΎ ΠΏΡ€Π°Π²ΠΈΠ»Π° сиротской «совмСстимости Π² Π±ΡƒΠ΄ΡƒΡ‰Π΅ΠΌΒ» Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΠΈΠ·ΠΌΠ΅Π½ΠΈΡ‚ΡŒΡΡ. Π”ΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΠ΅ нСспСциализированного ΠΈΠΌΠΏΠ»Π°Π½Ρ‚Π°Ρ‚Π° ΠΏΠΎΠ΄ вас всС Ρ€Π°Π²Π½ΠΎ Π±ΡƒΠ΄Π΅Ρ‚ ΡΠ΅Ρ€ΡŒΠ΅Π·Π½Ρ‹ΠΌ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ΠΌ.

Π₯ΡƒΠΆΠ΅ Ρ‚ΠΎΠ³ΠΎ, сиротскиС ΠΏΡ€Π°Π²ΠΈΠ»Π° "Π±ΡƒΠ΄ΡƒΡ‰Π΅ΠΉ совмСстимости" Π΄Π΅Ρ€ΠΆΠ°Ρ‚ ΠΌΠ΅ΠΆΠΊΡ€Π΅ΠΉΡ‚Π½ΡƒΡŽ ΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΡŽ ΠΏΠΎΠ΄ довольно ТСстким ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»Π΅ΠΌ. Π‘Π΅Π· Π½ΠΈΡ… default-impls, оставляя свои ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹ ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚Ρ‹ΠΌΠΈ, становится Π½Π°ΠΌΠ½ΠΎΠ³ΠΎ Ρ…ΡƒΠΆΠ΅.

МнС Π½ΠΈΠΊΠΎΠ³Π΄Π° Π½Π΅ Π½Ρ€Π°Π²ΠΈΠ»ΠΈΡΡŒ явныС ΠΎΡ‚Ρ€ΠΈΡ†Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Ρ‹. Π― Π΄ΡƒΠΌΠ°ΡŽ, Ρ‡Ρ‚ΠΎ спСциализация Π½Π° Ρ‚ΠΎΡ‚Π°Π»ΡŒΠ½ΡƒΡŽ ΠΎΡ‚Ρ€ΠΈΡ†Π°Ρ‚Π΅Π»ΡŒΠ½ΡƒΡŽ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΡŽ являСтся Ρ…ΠΎΡ€ΠΎΡˆΠΈΠΌ компромиссом.

Π‘Π»Π΅Π΄ΡƒΠ΅Ρ‚ Π»ΠΈ Π΄ΠΎΠΏΡƒΡΡ‚ΠΈΡ‚ΡŒ это ΠΏΡ€ΠΈ Π²Π½Π΅Π΄Ρ€Π΅Π½ΠΈΠΈ спСциализации? Или я Ρ‡Ρ‚ΠΎ-Ρ‚ΠΎ ΡƒΠΏΡƒΡΠΊΠ°ΡŽ?
http://is.gd/3Ul0pe

Π’ΠΎ ΠΆΠ΅ самоС с этим, ΠΌΠΎΠΆΠ½ΠΎ Π±Ρ‹Π»ΠΎ Π±Ρ‹ ΠΎΠΆΠΈΠ΄Π°Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎ ΠΎΠ½ скомпилируСтся: http://is.gd/RyFIEl

ΠŸΠΎΡ…ΠΎΠΆΠ΅, Π΅ΡΡ‚ΡŒ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΏΡ€ΠΈΡ‡ΡƒΠ΄Ρ‹ Π² ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠΈ пСрСкрытия, ΠΊΠΎΠ³Π΄Π° задСйствованы связанныС Ρ‚ΠΈΠΏΡ‹. Π­Ρ‚ΠΎ ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡ€ΡƒΠ΅Ρ‚: http://is.gd/JBPzIX , Π² Ρ‚ΠΎ врСмя ΠΊΠ°ΠΊ этот фактичСски ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ‡Π½Ρ‹ΠΉ ΠΊΠΎΠ΄ Π½Π΅ компилируСтся: http://is.gd/0ksLPX

Π’ΠΎΡ‚ Ρ„Ρ€Π°Π³ΠΌΠ΅Π½Ρ‚ ΠΊΠΎΠ΄Π°, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ я ΠΎΠΆΠΈΠ΄Π°Π» ΡΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ со спСциализациСй:

http://is.gd/3BNbfK

#![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

Π£ мСня Π±Ρ‹Π»ΠΎ врСмя ΠΏΠΎΡΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ Π½Π° ΠΏΠ΅Ρ€Π²Ρ‹Π΅ Π΄Π²Π° ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π°. Π’ΠΎΡ‚ ΠΌΠΎΠΈ Π·Π°ΠΌΠ΅Ρ‚ΠΊΠΈ.

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ 1

Π’ ΠΏΠ΅Ρ€Π²ΠΎΠΌ случаС Ρƒ вас Π΅ΡΡ‚ΡŒ:

  • 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 для ΠΏΠ΅Ρ€Π΅ΠΊΡ€Ρ‹Π²Π°ΡŽΡ‰Π΅Π³ΠΎΡΡ случая ΠΈ ΡΠΊΠ°Π·Π°Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎ ΠΎΠ½ Π΄ΠΎΠ»ΠΆΠ΅Π½ Π΄Π΅Π»Π°Ρ‚ΡŒ. Π’ качСствС Π°Π»ΡŒΡ‚Π΅Ρ€Π½Π°Ρ‚ΠΈΠ²Ρ‹, ΠΎΡ‚Ρ€ΠΈΡ†Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ ΠΏΡ€ΠΈΠ·Π½Π°ΠΊΠΈ ΠΌΠΎΠ³ΡƒΡ‚ Π΄Π°Ρ‚ΡŒ Π²Π°ΠΌ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ ΠΈΡΠΊΠ»ΡŽΡ‡ΠΈΡ‚ΡŒ совпадСниС ΠΈΠ»ΠΈ ΠΈΠ½Ρ‹ΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ Π½Π°ΡΡ‚Ρ€ΠΎΠΈΡ‚ΡŒ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½Ρ‹Π΅ совпадСния.

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ 2

Π£ вас Π΅ΡΡ‚ΡŒ:

  • 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/

-
Π’Ρ‹ ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅Ρ‚Π΅ это, ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ вас упомянули.
ΠžΡ‚Π²Π΅Ρ‚ΡŒΡ‚Π΅ Π½Π° это письмо Π½Π°ΠΏΡ€ΡΠΌΡƒΡŽ ΠΈΠ»ΠΈ просмотритС Π΅Π³ΠΎ Π½Π° 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. ΠœΡ‹ Ρ…ΠΎΡ‚Π΅Π»ΠΈ ΡΠΊΠ°Π·Π°Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎ ΠΏΠΎΠ»Π½ΠΎΡΡ‚ΡŒΡŽ стандартныС ΠΈΠΌΠΏΠ»Π΅ΠΌΠ΅Π½Ρ‚Ρ‹ для Π±Π»Π°Π½ΠΊΠ΅Ρ‚ΠΎΠ² Ρ‚ΠΎΠΆΠ΅ допустимы, Π½ΠΎ я Π΄ΡƒΠΌΠ°ΡŽ, ΠΌΡ‹ просто Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΡΠΊΠ°Π·Π°Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎ Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΠ΅ ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΡ… ΠΈΠΌΠΏΠ»Π΅ΠΌΠ΅Π½Ρ‚ΠΎΠ² для Π±Π»Π°Π½ΠΊΠ΅Ρ‚ΠΎΠ² ΠΌΠΎΠΆΠ΅Ρ‚ ΡΡ‚Π°Ρ‚ΡŒ ΡΠ΅Ρ€ΡŒΠ΅Π·Π½Ρ‹ΠΌ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ΠΌ.

Вопрос Π² Ρ‚ΠΎΠΌ, ΠΊΠ°ΠΊΡƒΡŽ Π³Π°Ρ€Π°Π½Ρ‚ΠΈΡŽ ΠΌΡ‹ Ρ…ΠΎΡ‚ΠΈΠΌ Π΄Π°Ρ‚ΡŒ ΠΏΠ΅Ρ€Π΅Π΄ Π»ΠΈΡ†ΠΎΠΌ этого - Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, я Π΄ΡƒΠΌΠ°ΡŽ, Ρ‡Ρ‚ΠΎ Π±Ρ‹Π»ΠΎ Π±Ρ‹ ΠΎΡ‡Π΅Π½ΡŒ Ρ…ΠΎΡ€ΠΎΡˆΠΎ, Ссли Π±Ρ‹ хотя Π±Ρ‹ одСяло 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 . Π›ΡƒΡ‡ΡˆΠ΅ всСго это сработало Π±Ρ‹, Ссли Π±Ρ‹ Ρƒ нас Π±Ρ‹Π»ΠΎ:

  1. ΡΡ‚Π°Π±ΠΈΠ»ΡŒΠ½Π°Ρ спСциализация, прСдупрСТдСния ΠΌΠΎΠΆΠ½ΠΎ ΠΎΠ±ΠΎΠΉΡ‚ΠΈ, Π΄ΠΎΠ±Π°Π²ΠΈΠ² default Π² стратСгичСских мСстах (Π±ΠΎΠ»ΡŒΡˆΡƒΡŽ Ρ‡Π°ΡΡ‚ΡŒ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ);
  2. нСкоторая Ρ„ΠΎΡ€ΠΌΠ° явных ΠΎΡ‚Ρ€ΠΈΡ†Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹Ρ… ΠΈΠΌΠΏΠ»ΠΈΡ†ΠΈΠΉ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Ρ‚Π°ΠΊΠΈΠ΅ Ρ‚ΠΈΠΏΡ‹, ΠΊΠ°ΠΊ 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 Π§Ρ‚ΠΎ ΠΆ, Ссли Π²Ρ‹ ΠΏΠΎΠΏΡ‹Ρ‚Π°Π΅Ρ‚Π΅ΡΡŒ ΡΠΌΠΎΠ΄Π΅Π»ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ с использованиСм ΠΈΠΌΠΏΠ»Π΅ΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΠΈ ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ, Π²Ρ‹ ΡƒΠ²ΠΈΠ΄ΠΈΡ‚Π΅ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡƒ,

https://play.rust-lang.org/?version=nightly&mode=debug&edition=2018&gist=e5b9da0eeca05d063e2605135a0b5ead

Π― ΠΏΠΎΠ²Ρ‚ΠΎΡ€ΡŽΡΡŒ, ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ 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 Ρ‡Ρ‚ΠΎΠ±Ρ‹ Ρ€Π°Π·Ρ€Π΅ΡˆΠΈΡ‚ΡŒ ΠΏΠ΅Ρ€Π΅ΠΊΡ€Ρ‹Π²Π°ΡŽΡ‰ΠΈΠ΅ΡΡ

https://play.rust-lang.org/?version=nightly&mode=debug&edition=2018&gist=b66ee0021db73efaaa5d46edfb4f3990

@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 ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚ прямо сСйчас: «этот ΠΈΠΌΠΏΠ»Ρ‚ являСтся спСциализированным, поэтому ΠΈΠ½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚ΠΈΡ€ΡƒΠΉΡ‚Π΅ ΠΈΠΌΠΏΠ»Π°Π½Ρ‚, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΏΠΎΠΊΡ€Ρ‹Π²Π°Π΅Ρ‚ подмноТСство этого ΠΈΠΌΠΏΠ»Π°Π½Ρ‚Π°Ρ‚Π°, ΠΊΠ°ΠΊ Π΅Π³ΠΎ ΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΡŽ, Π° Π½Π΅ ΠΊΠΎΠ½Ρ„Π»ΠΈΠΊΡ‚ΡƒΡŽΡ‰ΠΈΠΉ ΠΈΠΌΠΏΠ»Π°Π½Ρ‚Β». ΠŸΡ€ΠΎΠ±Π»Π΅ΠΌΠ° Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ это ΠΏΡ€ΠΈΠ²ΠΎΠ΄ΠΈΡ‚ ΠΊ ΠΎΡ‡Π΅Π½ΡŒ странному Π²ΠΈΠ΄Ρƒ ΠΊΠΎΠ΄Π°:

https://github.com/LLFourn/secp256kfun/blob/6766b60c02c99ca24f816801fe876fed79643c3a/secp256kfun/src/op.rs#L196 -L206

Π—Π΄Π΅ΡΡŒ Π²Ρ‚ΠΎΡ€ΠΎΠΉ 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 ΠΈΠ»ΠΈ Π΄Π²Π°, поэтому Π½Π΅ ΡƒΠ²Π΅Ρ€Π΅Π½, Π³Π΄Π΅ французский Π»ΡƒΡ‡ΡˆΠ΅, ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ, ΠΎΡ‚ Π½Π΅ΠΌΠ΅Ρ†ΠΊΠΎΠ³ΠΎ?

МоТно Π»ΠΈ пСрСнСсти дальнСйшСС обсуТдСниС ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½Ρ‹Ρ… ΠΊΠ»ΡŽΡ‡Π΅Π²Ρ‹Ρ… слов ΠΈ имСнования Π²ΠΎ Π²Π½ΡƒΡ‚Ρ€Π΅Π½Π½ΠΈΠΉ ΠΏΠΎΡ‚ΠΎΠΊ ? Π― слСТу Π·Π° этой ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠΎΠΉ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΡΠ»Π΅Π΄ΠΈΡ‚ΡŒ Π·Π° обновлСниями этой Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, ΠΈ это обсуТдСниС Π½Π°Ρ‡ΠΈΠ½Π°Π΅Ρ‚ ΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒΡΡ Π½Π΅ΠΌΠ½ΠΎΠ³ΠΎ ΡˆΡƒΠΌΠ½Ρ‹ΠΌ.

Π‘Ρ‹Π»Π° Π»ΠΈ эта страница ΠΏΠΎΠ»Π΅Π·Π½ΠΎΠΉ?
0 / 5 - 0 Ρ€Π΅ΠΉΡ‚ΠΈΠ½Π³ΠΈ

Π‘ΠΌΠ΅ΠΆΠ½Ρ‹Π΅ вопросы

nikomatsakis picture nikomatsakis  Β·  3ΠšΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΈ

jmegaffin picture jmegaffin  Β·  3ΠšΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΈ

overvenus picture overvenus  Β·  3ΠšΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΈ

dnsl48 picture dnsl48  Β·  3ΠšΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΈ

cuviper picture cuviper  Β·  3ΠšΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΈ