RFC 1522ă§ćĺŽăăăžăăăăžă ä˝ćĽăĺż čŚăŞăŞăă¸ă§ăłăăăăžăă
let x: impl Trait
static
ăăăłconst T: impl Trait
abstract type
implçšć§ăŤé˘ăăĺ¤ăăŽRFCăăăăăăŽăăšăŚăăăŽä¸ĺ¤Žčż˝čˇĄăŽĺéĄăŤăăŁăŚčż˝čˇĄăăăŚăăžăă
abstract type
ă¨ăăĺĺlet
ă const
ăăăăłstatic
ä˝ç˝Žă§ăŽimplăăŹă¤ăăŽä˝żç¨impl Trait
ă¨dyn Trait
ăŽć§ćăč¤ć°ăŽĺ˘çă§ĺŽćăăăĺŽčŁ ăŤăăăăăă¤ăăŽčĺłćˇąă質ĺăć辡ăăăžăăă
impl
ăăźăŻăźăăŽĺŞĺ
é ä˝ăŻä˝ă§ăăďź ăăŁăšăŤăăˇă§ăłďź 1Send
ăwhere F: Fn() -> impl Foo + Send
ăŤé˘éŁäťăăćšćłfn
ăżă¤ăăžăăŻćŹĺź§ăŽç çłă§->
ĺžăŤimpl Trait
ă訹ĺŻăăĺż
čŚăăăăžăăďź ďź45994fn foo<T>(x: impl Iterator<Item = T>>)
ďźimpl Trait
ăăŞăšăĺ
ăŽĺźć°ă¨ăăŚćąăă秝čĄă訹ĺŻăăexistential type Foo: Bar
ăžăăŻtype Foo = impl Bar
ăžăăďź ďźč°čŤăŤă¤ăăŚăŻăăăĺç
§ăăŚăă ăăďźexistential type
ă使ç¨ăŽĺŽçžŠăăŽăťăăăŻăimplăŽĺăŞăă˘ă¤ăă ăŤăăăšăă§ăăăăăă¨ăimplé˘ć°ĺ
ăŤăăšăăăăă˘ă¤ăă ăĺŤăăăšăă§ăăďź ďźăă¨ăă°ăăăăĺç
§ăăŚăă ăăďź@aturonĺŽéăŤRFCăăŞăă¸ăăŞăŤĺ Ľăăăă¨ăŻă§ăăžăăďź ďź @mbrubeckăŻăăăăĺéĄă§ăłăĄăłăăăžăăăďź
çľăăă
ĺŽčŁ ăŽćĺăŽčŠŚăżăŻďź35091ă§ăďźć¨ĺš´ăăç§ăŽăăŠăłăăć°ăăă¨2çŞçŽă§ăďźă
ç§ăééăăĺéĄăŽ1ă¤ăŻă寿ĺ˝ăŤé˘ăăăăŽă§ăă ĺć¨čŤăŻăé ĺĺ¤ć°ă_ăŠăăŤă§ă_é
罎ăăăŽă弽ăă§ăé ĺăă§ăăŻăŽĺ¤ć´ăăŞăăă°ăăăăăŽĺ¤ć°ăŻăăźăŤăŤăšăłăźă䝼ĺ¤ăŽăăŽăć¨čŤăăžăăă
ăă ăăĺ
ˇčąĄĺăŻă¨ăŻăšăăźăĺŻč˝ă§ăăĺż
čŚăăăăăă 'static
ăŤĺśéăăćŠćăă¤ăłăăŽćĺšćéăăŠăĄăźăżăźăŤć示çăŤĺĺăäťăăžăăăăé˘ć°ăĺŤăžăăŚăăĺ ´ĺăŻăăăăăŽăăăăŤăăŞăăžăăăćĺĺăŞăăŠăŤă§ăăă 'static
ăăăăŻăťă¨ăăŠĺŽĺ
¨ăŤĺ˝šăŤçŤăăŞăă
ăŞăźă¸ă§ăłăă§ăăŻčŞä˝ăŤĺ˝ąéżăä¸ăăŞăă¨ç§ăčăă1ă¤ăŽăă¨ăŻăăŠă¤ăăżă¤ă ăćśĺťăăăă¨ă§ăă
impl Trait
ăŽĺ
ˇä˝çăŞăżă¤ăăĺ
ŹéăăăăŽăŻăĺçśćéăć°ăŤăăĺż
čŚăŻăăăžăă- Reveal::All
ăă°ăăć¤ç´˘ăăă¨ăăłăłăă¤ăŠăźă§ăŻăă§ăŤăăă§ăăăă¨ăăăăăžăimpl Trait
ăăšăŚăŽĺ
ˇčąĄĺăŤĺ˘çăč¨ĺŽăăĺż
čŚăăăăžăăăăăŻăăăŽé˘ć°ăŽĺźăłĺşăăăăéˇçăăăăă¨ăćĺłăăžăăă¤ăžăăäťťćăŽĺçśćéăŻăĺż
çśçăŤ'static
ăăăăăŤăŞăăžăă 'a
ă¨'b
ćçăďźimpl Trait
ăŽćéťăŽăŠă¤ăăżă¤ă ăăŠăĄăźăżăŽĺćŁăé¸ćăăĺż
čŚăăăăžăďźă¤ăžăăăżă¤ăăăŠăĄăźăżăŽĺ ´ĺă¨ĺć§ăŤăăšăłăźăĺ
ăŽăăšăŚăŽăŠă¤ăăżă¤ă ăăŠăĄăźăżă§ďźďźä¸ĺ¤ć§ăŻćăç°Ąĺă§ăĺźăłĺşăĺ
ăŤăăĺ¤ăăŽĺśĺžĄăä¸ăăžăăăĺĺ¤ć§ăŻĺźăłĺşăĺ
ăŤăăăŤăăŞăżăźăłăżă¤ăăŽăăšăŚăŽăŠă¤ăăżă¤ă ăĺĺ¤ăŽä˝ç˝ŽăŤăăăă¨ă確čŞăăĺż
čŚăăăăžăďźä¸ĺ¤ă§ăŻăŞăĺ
ąĺ¤ăżă¤ăăŽăăŠăĄăźăżăźă¨ĺăďźX<'a, 'a>
ăžăăŻX<'static>
ďźăĺż
čŚă¨ăăĺŻč˝ć§ăăăă¨ăăäşĺŽăŤăăăžăăç术čŞĺçšć§ăŞăźăŻăŤé˘ăăćĺžăŽăă¤ăłăăŻç§ăŽĺŻä¸ăŽĺżé
ă§ăăäťăŽăăšăŚăŻç°ĄĺăŤćăăžăă
çžćçšă§ăŻăăŞăźă¸ă§ăłăă§ăăŻăŽăŠăă ăăăăŽăžăžĺĺŠç¨ă§ăăăăŻĺŽĺ
¨ăŤăŻćăăă§ăŻăăăžăăă ăăžăăăă°ăăăšăŚă
cc @ rust-lang / lang
@eddyb
ăăăăç术ăŻimpl Trait
éčŚă§ă-äžďź
fn get_debug_str(s: &str) -> impl fmt::Debug {
s
}
fn get_debug_string(s: &str) -> impl fmt::Debug {
s.to_string()
}
fn good(s: &str) -> Box<fmt::Debug+'static> {
// if this does not compile, that would be quite annoying
Box::new(get_debug_string())
}
fn bad(s: &str) -> Box<fmt::Debug+'static> {
// if this *does* compile, we have a problem
Box::new(get_debug_str())
}
ç§ăŻRFCăšăŹăăă§ä˝ĺşŚăč¨ĺăăžăă
ăăŹă¤ăăŞăă¸ă§ăŻăăŞăăŽăăźă¸ă§ăłďź
fn as_debug(s: &str) -> impl fmt::Debug;
fn example() {
let mut s = String::new("hello");
let debug = as_debug(&s);
s.truncate(0);
println!("{:?}", debug);
}
ăăăŻă as_debug
ĺŽçžŠăŤĺżăăŚăUBă§ăăăăŠăăăŽăŠăĄăăă§ăă
@ arielb1ăăăăăă§ăăç§ăăăŁăççąăŽ1ă¤ăŻăĺŽéăŤăŻćŠč˝ăăŞăăă¨ăé¤ăăŚăĺżĺăŽăŹă¤ăăăŚăłăăăŠăĄăźăżă§ăŻăŞăăăŠă¤ăăżă¤ă ăăŠăĄăźăżăŽăżăăăŁăăăŁăăăă¨ă§ăăŁăăă¨ăĺżăăžăăă
@ arielb1ĺ
ˇä˝çăŞăżă¤ăăŽäşĺćśĺťă§čŚă¤ăăŁăăŠă¤ăăżă¤ă ă¨ă署ĺăŽăŹă¤ăăăŚăłăăŽăŠă¤ăăżă¤ă ăŽéăŤăĺłĺŻăŞ'a outlives 'b
ă¤ăłăšăăźăŤăăŞăăă¨ăŻćŞăčăă§ăŻăŞăăăăăăžăăăăăă§ă 'a
ăŻ'static
ăžăăŻç术ăăŠăĄăźăżäťĽĺ¤ăŽ_ä˝ă_ă§ăă 'b
ăŻă impl Trait
ăŽĺ
ˇä˝çăŞăżă¤ăă§čĄ¨ç¤şăăăžăă
ăăăŤčżäżĄăăăŽăŤćéăăăăŁăŚăăżăžăăă ă ăăç§ăŻčăăŚăăžăă
ăăŽĺéĄăŤă¤ăăŚă ç§ăŽć°ćăĄăŻăćçľçăŤăŻăăăăŞăăă°ăŞăăŞăă¨ăăăă¨ă§ăďźăăăŚ
ăăăďźć°ăă税éĄăŽĺśç´ă§regionckăćĄĺźľăă-ç§ăŻăăăĺźăłăžă
\in
ĺśç´ăăăăŻă '0
\in {'a, 'b, 'c}
ăăăŞăăŽăč¨ăăă¨ăă§ăăăăă§ăăă¤ăžăă '0
使ç¨ăăăé ĺăŻćŹĄăŽăăăŤăŞăăžăă
'a
ă 'b
ăăžăăŻ'c
ă çľąĺăăăăăŽćčŻăŽćšćłăăăăăžăă
ăăăŻăăčŞä˝ă解湺ăăăă¨ăŤăŞăăžă-確ăăŤ\in
ăťăăăăˇăłă°ăŤăăłăŽĺ ´ĺ
ăťăăăăăăŻĺăŞăĺçăŽé˘äżă§ăďźăăăŻçžĺ¨ă
ä¸ćľăŽăăŽă§ăăă2ă¤ăŽĺ˘çăăć§ćăăăă¨ăă§ăăžăďźăăăă
ăăă§ăŞăăă°ăăăăŻçŠäşăč¤éăŤăăžăă
ăăăŻăăšăŚăä¸éŁăŽé ĺĺśç´ăä˝ćăăăă¨ăăç§ăŽéĄćăŤé˘éŁăăŚăăžă
äťćĽăŽç§ăăĄăăă襨çžĺčąăă§ăă 確ăăŤäşşăŻä˝ć˛ăăăă¨ăă§ăăžă
\in
OR
ăăăł==
ĺśç´ăŽăăĄ
襨çžä¸ăŽĺśç´ăŻč§ŁćąşăéŁăăă \in
ăŻăăăžăăă
ă¨ăŤăăăăăă§ç§ăŽčăăĺ°ă誏ćăăăŚăă ăăă ăăă§ä˝ćĽăăžăăă
äžďź
pub fn foo<'a,'b>(x: &'a [u32], y: &'b [u32]) -> impl Iterator<Item=u32> {...}
impl Trait
ăŽćăćŁç˘şăŞčąçłăŻăăăăă
ć°ăăăżă¤ăďź
pub struct FooReturn<'a, 'b> {
field: XXX // for some suitable type XXX
}
impl<'a,'b> Iterator for FooReturn<'a,'b> {
type Item = <XXX as Iterator>::Item;
}
ăăă§ă impl Iterator<Item=u32>
ăŽfoo
ăŻćŹĄăŽăăăŤĺä˝ăăăŻăă§ăă
FooReturn<'a,'b>
ăŻĺä˝ăăžăă ăă ăăĺŽĺ
¨ăŤä¸č´ăăăăă§ăŻăăăžăăă ä¸
ăă¨ăă°ăeddybăč˛ăŚăăăăŤăéăăŻĺćŁă§ă-ç§ăŻ
impl Foo
ăăăŞĺăĺăŤĺŻžăăŚä¸ĺ¤ăŤăăăă¨ăćłĺŽăăŚăăžă
foo
ăăŠăĄăźăżă ăă ăăčŞĺçšć§ăŽĺä˝ăŻćŠč˝ăăžăă
ďźä¸č´ăçćłçă§ăŻăŞăĺŻč˝ć§ăăăĺĽăŽé ĺăŻă
impl Iterator
ć˝čąĄĺăăăă˘ăšăăăćŠč˝ăă¤ăžăăłăźă
ć˝čąĄĺăŽăĺ
é¨ăăŻćŁç˘şăŞăżă¤ăăçĽăŁăŚăăžă-ăăăăăăăŻă˝ăźăăăžă
ćéťăŽăă˘ăłăŠăăăćä˝ăĺŽčĄăăăžăăďź
ăăă¤ăăŽçšă§ăăăéŠĺăŞä¸č´ăŻăä¸ç¨ŽăŽĺćçšć§ăć¤č¨ăăăă¨ă§ăă
trait FooReturn<'a,'b> {
type Type: Iterator<Item=u32>;
}
impl<'a,'b> FooReturn<'a,'b> for () {
type Type = XXX;
}
ăăă§ă impl Iterator
ăżă¤ăă<() as
FooReturn<'a,'b>>::Type
ăăăŤčăăăă¨ăă§ăăžăă ăăăĺŽĺ
¨ăŤä¸č´ăăăăă§ăŻăăăžăăă
é常ăŻăăăćŁčŚĺăăžăă ăăŞăăŻĺ°éĺă使ç¨ăăăă¨ăćłĺăăăăăăăžăă
ăăăé˛ăăăăŤďź
trait FooReturn<'a,'b> {
type Type: Iterator<Item=u32>;
}
impl<'a,'b> FooReturn<'a,'b> for () {
default type Type = XXX; // can't really be specialized, but wev
}
ăăŽĺ ´ĺă <() as FooReturn<'a,'b>>::Type
ăŻćŁčŚĺăăăžăăăă
ăăăŚăç§ăăĄăŻăŻăăăŤčżăä¸č´ăćăŁăŚăăžăă çšăŤăĺćŁăŻĺä˝ăăžă
ćŁăă; ăĺ
é¨ăăŤăăăżă¤ăăĺż
čŚăŞĺ ´ĺ
ć˝čąĄĺăăăăăŻĺăă§ăăă訹ĺŻăăăŚăăžă
ăăźăăŠă¤ăşă ăă ăăč˝ă¨ă犴ăăăăžăăčŞĺăăŹă¤ăăŽăăŽăŻăăă§ăŻăăăžăăă
ăăŞăăăžăăăăžăă ďźăăă§çŠäşă調ĺăăăăă¨ăć¤č¨ăăăăăăăăžăăăă
ĺŽéăŤăďź
ă¨ăŤăăăăăăăŽć˝ĺ¨çăŞčąçłăć˘ćąăăç§ăŽăă¤ăłăăŻ
_ĺŽéăŽ_čąçłă¨ăăŚăimplTraităăĺŽčŁ
ăăăă¨ăăĺ§ăăăžă
ďźăăăŻăăăăăăăžăăă...ďźăăăăç§ăăĄăŽäťäşăŤç´ćăä¸ăăăăă§ăă ç§
2çŞçŽăŽčąçłďźäşć¸ŹăŽčŚłçšăăďźăŻ
ç§ăăĄăĺé˛ăăăăŽăŤé常ăŤĺ˝šçŤă¤ăăŽă§ăă
ăăŽć役čąçłăćŹĺ˝ăŤĺ˝šçŤă¤ăŹă¤ăăŽ1ă¤ăŻ
ăéˇçăăăăé˘äżă <() as
FooReturn<'a,'b>>::Type: 'x
ăăŠăăă確čŞăăăĺ ´ĺăRFC 1214ăŻăăăă訟ćă§ăăăă¨ă示ăăŚăăžăă
'a: 'x
_ăăăł_ 'b: 'x
ăćçŤăăéăă ăăăŻç§ăăĄăćăćšćłă ă¨ćăăžă
implăăŹă¤ăăŽĺŚçăčĄăăžăă
ăăŠăłăšćăăăăłčŞĺçšć§ăŽĺ ´ĺă XXX
ăçĽăĺż
čŚăăăăžă
ăăĄăăă§ăă ăăă§ăŽĺşćŹçăŞčăćšăŻăăżă¤ăăä˝ćăăăă¨ă ă¨ćăăžă
XXX
ĺ¤ć°ă§ăăăčżăăăĺŽéăŽĺ¤ă確čŞăăžă
ăăšăŚXXX
ă§çľąĺă§ăăžăă ăăŽĺĺ¤ć°ăŻăçčŤçăŤăŻă
ç§ăăĄăŽçăăćăăŚăă ăăă ăăăăăĄăăĺéĄăŻăăŽăżă¤ăă§ă
ĺ¤ć°ăŻăăšăłăźăĺ
ăŤăŞăĺ¤ăăŽé ĺăĺç
§ăăĺ ´ĺăăăăžă
fn署ĺ-ăă¨ăă°ăfnćŹä˝ăŽé ĺă ďźăăă¨ĺăĺéĄ
ăżă¤ăă§ăŻçşçăăžăăă ćčĄçăŤăŻă
ăă¨ăă°ăfnćŹä˝ăŽć§é ä˝ĺŽŁč¨ă§ăăăĺĺăäťăăăă¨ăŻă§ăăžăăă
ăăăŻä¸ç¨ŽăŽäşşçşçăŞĺśéă§ă-秝ĺăăăă¨ăă§ăăžă
fnăŽĺ¤ĺ´ăŽć§é ä˝ăďź
ć§é ä˝ăŽčąçłăžăăŻimplăŽä¸ĄćšăčŚăă¨ă
ďźRustăŽĺĺĽć§é ă§ćéťçăŤďź XXX
ăă§ăăĺśé
'static
ăžăăŻ'a
ă'b
ăăăŞăŠă¤ăăżă¤ă ăŽăăăăăŤăŽăżĺĺăäťăăžăă
é˘ć°ăˇă°ăăăŁăŤčĄ¨ç¤şăăăžăă ăăăŻç§ăăĄăăăă§ăŻăŞăăă¨ă§ă
ăăă§ă˘ăăŞăłă°ă ç§ăŻăăăčĄăăăăŽćčŻăŽćšćłăăăăăžăă-ăăă¤ăăŽăżă¤ă
ć¨čŤăšăăźă ăŤăŻăăšăłăźăăŽăăç´ćĽçăŞčĄ¨çžăăăă
ăŻăăźă¸ăŁăćäźăăăăŤăç§ăŻăă¤ăăăăRustăŤčż˝ĺ ăăăă¨ćăŁăŚăăžăăă ăăă
ăžăăĺ°ăăŞăăŤăżăŤă¤ăăŚčăăŚăżăžăăăă
ăăă\in
ĺśç´ăŽçąćĽă§ăă čż˝ĺ ăăăă¨ăćłĺăăăă¨ăă§ăăžă
ďźĺşćŹçăŤďź FR(XXX) \subset {'a, 'b}
-ă¨ăăăżă¤ăăă§ăăŻăŤăźăŤ
ă¤ăžăăXXXăŤčĄ¨ç¤şăăăăçĄćăŽĺ°ĺăăŻ'a
ă¨
'b
ă ăăăŻăćçľçăŤ\in
čŚäťśăŤĺ¤ćăăăžăă
XXX
襨示ăăăăăžăăžăŞĺ°ĺă
ĺŽéăŽäžăčŚăŚăżăžăăăă
fn foo<'a,'b>(x: &'a [u32], y: &'b [u32]) -> impl Iterator<Item=u32> {
if condition { x.iter().cloned() } else { y.iter().cloned() }
}
ăăă§ă condition
ătrueăŽĺ ´ĺăŽăżă¤ăăŻă揥ăŽăăăŤăŞăăžăă
Cloned<SliceIter<'a, i32>>
ă ăăăă condition
ăĺ˝ăŽĺ ´ĺă
Cloned<SliceIter<'b, i32>>
揲ăăă ăăĄăăăăŠăĄăăŽĺ ´ĺă
ďźăżă¤ă/ăŞăźă¸ă§ăłĺ¤ć°ăŤć°ĺ¤ă使ç¨ăăŚďźćŹĄăŽăăăŤăŞăăžăă
Cloned<SliceIter<'0, i32>> <: 0
'a: '0 // because the source is x.iter()
Cloned<SliceIter<'1, i32>> <: 0
'b: '1 // because the source is y.iter()
揥ăŤăĺ¤ć°0ăCloned<SliceIter<'2, i32>>
ăŤă¤ăłăšăżăłăšĺăăă¨ă
'0: '2
ă¨'1: '2
ăăžăăŻĺ°ĺé˘äżăŽĺč¨ăťăăăăăăžă
ăć°ăŤĺ
Ľăďź
'a: '0
'0: '2
'b: '1
'1: '2
'2: 'body // the lifetime of the fn body
ă§ăŻă '2
ăŻăŠăŽăăăŞĺ¤ă使ç¨ăăĺż
čŚăăăăžăăďźčż˝ĺ ăăăăžă'2 in {'a, 'b}
ă¨ăăĺśç´ăć¸ăăăfnă§ăç§ăŻç§ăăĄăćă'a
ă'b
ăă¨ăŠăźăĺ ąĺăăĺż
čŚăăăăžăă
ćŁăăé¸ćăăă ăăčĺłćˇąăăă¨ăŤăĺśç´'a:
'b
ăčż˝ĺ ăăă¨ăćŁăăĺ¤ďź 'b
ďźăĺĺ¨ăăžăă
_normal_ă˘ăŤă´ăŞăşă ăĺŽčĄăăă ăă§ăŻă揥ăŽăăăŤăŞăăă¨ăŤćł¨ćăăŚăă ăăă
'2
ăŻ'body
ă§ăă \in
é˘äżăĺŚçăăćšćłăăăăăžăă
ĺžšĺşçăŞć¤ç´˘ăé¤ăăŚďźç§ăŻăăă¤ăăŽçšĺĽăŞăăŽăćłĺăăăă¨ăă§ăăžăă
ăąăźăšďźă
OKăăăăŻç§ăĺžăéăă§ăă =ďź
PRďź35091ă§ă @ arielb1ăŻćŹĄăŽăăăŤć¸ăăŚăăžăă
ç§ăŻăćéťăŽçšć§ă§ăăšăŚăŽç术ăăăŁăăăŁăăăă˘ăăăźăă弽ăă§ăŻăŞăăç术ăŽă¨ăŞă¸ăŞăłăŽăăăŞăăŽă弽ăżăžăă
ăăă§č°čŤăăćšăçăŤăăŞăŁăŚăăă¨ćăăžăăă @ arielb1 ăăăŞăăčăăŚăăăă¨ăŤă¤ăăŚăăŁă¨čŠłăă誏ćăăŚăăăăžăăďź ç§ăŻä¸č¨ăŽčŁ˝ăŽéĄäźźăŽé˘ă§ăŻăç§ăŻăăŞăăĺşćŹçăŤnewtypeăŽä¸ăžăăŻć役ăŽăăŠăĄăźăżăŽăăăăă¨ăăŚçžăă寿ĺ˝ăŽăťăăďźăăŞăăĄăăĺŞĺŽăăŤă¤ăăŚčŠąăăŚăăă¨ćăăžă<() as FooReturn<'a>>::Type
䝣ăăăŤ<() as FooReturn<'a,'b>>::Type
ăä˝ăďź
ĺĺ¨ăăç术ă¨ăŞă¸ăŞăłăŤăźăŤăăăŽçšă§čŻăăŹă¤ăăŤăŞăă¨ăŻćăăžăăă &self
ăŽç术ăŽăżăĺŤăăăăăŤé¸ćăăĺ ´ĺăĺż
ăăăĺŤăăăă¨ăă§ăăă¨ăŻéăăžăăă Self
ć§é ä˝ăăăŽĺăăŠăĄăźăżăźăăžăăŻăĄă˝ăăăăăŽĺăăŠăĄăźăżăźăăăăăŤăŻăäťăŽăŠă¤ăăżă¤ă ăŽăăă¤ăăŤĺĺăäťăăĺż
čŚăăăWFćĄäťśăăăĺ ´ĺăăăăăă§ăă
ă¨ăŤăăăăăŞăăčăăŚăăăŤăźăŤă¨ăăăăăăăŽĺŠçšă誏ćăăăăă¤ăăŽäžăčŚăăŽăŻç´ ć´ăăăăă¨ă§ăă ďźďźďźăžăăé¸ćăăŞăźăăźăŠă¤ăăăăŤăŻăăăă¤ăăŽć§ćăĺż čŚăŤăŞăă¨ćăăžăăďźäťăŽăăšăŚăŽćĄäťśăĺăă§ăăă°ăNĺăŽăŠă¤ăăżă¤ă ăăé¸ćăăĺż čŚăăŞăĺ ´ĺăŻăăăăăĺ§ăăăžăă
impl Trait
ă¨ăăŠă¤ăăˇăźăŽç¸äşä˝ç¨ăăŠăă§ăč°čŤăăăŚăăăŽăčŚăăă¨ăăăăžăăă
ăăă§ă fn f() -> impl Trait
ăŻăăăŹă¤ăăŞăă¸ă§ăŻăfn f() -> Box<Trait>
ă¨ĺć§ăŤăăăŠă¤ăăźăăżă¤ăS: Trait
fn f() -> impl Trait
ăčżăăă¨ăă§ăăžăă ă¤ăžăăăăŠă¤ăăźăăżă¤ăăŽăŞăă¸ă§ăŻăăŻăĺżĺĺăăă形ĺźă§ă˘ă¸ăĽăźăŤăŽĺ¤ăčŞçąăŤćŠăăă¨ăă§ăăžăă
ăăăŻĺççă§ćăžăăăăă§ăăăżă¤ăčŞä˝ăŻĺŽčŁ
ăŽčŠłç´°ă§ăăăăăăŞăăŻçšć§Trait
äťăăŚĺŠç¨ă§ăăă¤ăłăżăźăă§ăźăšăŽăżăăăăŞăăŻă§ăă
ăă ăăçšć§ăŞăă¸ă§ăŻăă¨impl Trait
1ă¤ăŽéăăăăăžăă çšć§ăŞăă¸ă§ăŻăăŽăżă使ç¨ăăă¨ăăăŠă¤ăăźăăżă¤ăăŽăăšăŚăŽçšć§ăĄă˝ăăăĺ
é¨ăŞăłăąăźă¸ăĺĺžă§ăăžăăăé˘ć°ăă¤ăłăżăźăäťăăŚĺźăçśăĺźăłĺşăăă¨ăă§ăăžăă impl Trait
使ç¨ăăă¨ăăăŠă¤ăăźăăżă¤ăăŽăăŹă¤ăăĄă˝ăăăäťăŽĺ¤ćăŚăăăăăç´ćĽĺźăłĺşăăă¨ăă§ăăžăă ăˇăłăăŤăŽăĺ
é¨ĺăăčĄăă˘ăŤă´ăŞăşă ăŻă impl Trait
ă§ĺżĺĺăăăŚăăŞăăżă¤ăăăžăăŻé常ăŤć˛čŚłçă§ăăăżă¤ăăŤĺŻžăăŚăŽăżăăĄă˝ăăăĺ
é¨ĺăăăăăŤăăăŤĺŞĺăăĺż
čŚăăăăžăă
@nikomatsakis
foo
ăć¸ăăć示çăŞăćšćłăŻćŹĄăŽăăăŤăŞăăžă
fn foo<'a: 'c,'b: 'c,'c>(x: &'a [u32], y: &'b [u32]) -> impl Iterator<Item=u32> + 'c {
if condition { x.iter().cloned() } else { y.iter().cloned() }
}
ăăă§ăŻă寿ĺ˝ăŽéçăŤă¤ăăŚçĺăŽä˝ĺ°ăŻăăăžăăă ćăăăŤăćŻĺăăŚăłăăŠă¤ăăżă¤ă ăč¨čż°ăăŞăăă°ăŞăăŞăăă¨ăŻé常ăŤçš°ăčżăăŤăŞăăžăă ăăăăç§ăăĄăăăŽç¨ŽăŽçš°ăčżăăŤĺŻžĺŚăăćšćłăŻăä¸čŹçăŤç术ăŽă¨ăŞă¸ăŞăłăŤăăăăŽă§ăă foo
ĺ ´ĺăççĽăŻĺ¤ąćăăăăă°ăŠăăźăŤăŠă¤ăăżă¤ă ăć示çăŤćĺŽăăăăăŤĺźˇĺśăăžăă
@eddybăimpl Trait
ăŽçšĺŽăŽĺ ´ĺăŤăŽăżĺŽčĄăăăă䝼ĺ¤ăŽĺ ´ĺăŤăŻĺŽčĄăăŞăăŁăăăăć示ć§ăŤććăŞăŠă¤ăăżă¤ă
@ arielb1ăăźăăç§ăč°čŤăăăčąçłăăŽčŚłçšăăăăăŽććĄăăăć§ćăăŠăŽăăăŤčăăăăŻ100ďź ăăăăžăăă ăŠă¤ăăżă¤ă ăăŚăłăăŽăăăŤčŚăăăăŽăćĺŽă§ăăžăăăç§ăăĄăć¨ć¸Źăăăă¨ăăŚăăăŽăŻăăťă¨ăăŠăŽĺ ´ĺăé襨示ăżă¤ăăŤčĄ¨ç¤şăăăăŠă¤ăăżă¤ă ă§ăă ăăăŻăĺ¤ăăŚă1ă¤ăŽăŠă¤ăăżă¤ă ăăé襨示ăăŤăăăă¨ăă§ăăăă¨ă示ĺăăŚăăžăăďźćŁç˘şăŤćĺŽăăĺż čŚăăăăžăăďźďź
ăĺä¸ăŽăŠă¤ăăżă¤ă ăăŠăĄăźăżăă§ĺĺă§ăăă¨ăŻéăăŞăăăă§ăă
fn foo<'a, 'b>(x: &'a [u32], y: &'b [u32]) -> impl Iterator<Item=u32> {
x.iter().chain(y).cloned()
}
ăăŽĺ ´ĺăé襨示ăŽă¤ăăŹăźăżăżă¤ăăŻă 'a
ă¨'b
严ćšăĺç
§ăăžăďźăă ăăăŠăĄăăăăŞă˘ăłăă§ăăăä¸ĺ¤ăŽäžăčăĺşăăă¨ăă§ăăă¨ćăăžăďźă
ăăă§ă @ aturonă¨ç§ăŻăăŽĺéĄăŤă¤ăăŚăăăă芹ăĺăăĺ
ąćăăăă¨ćăăžăăă ăăăŤăŻĺŽéăŤăăă¤ăăŽç´äş¤ăă質ĺăăăăăăăăĺé˘ăăăă¨ćăăžăă ćĺăŽčłŞĺăŻăăé襨示ăŽăżă¤ăă§ä˝żç¨ă§ăăĺŻč˝ć§ăŽăăăżă¤ă/ăŠă¤ăăżă¤ă ăăŠăĄăźăżăźăŻä˝ă§ăăďźăă§ăă default type
ă¸ăŽďźćşďźčąçłĺăŤé˘ăăŚăŻăăăăŻăĺ°ĺ
Ľăăçšć§ăŤăŠăŽăżă¤ăăŽăăŠăĄăźăżăźă襨示ăăăăăăŤĺ¸°çăăžăă ăăăăŁăŚăăă¨ăă°ăăăŽé˘ć°ăŽĺ ´ĺďź
fn foo<'a, 'b, T>() -> impl Trait { ... }
揥ăŽăăăŞăăŽăŤčąçłăăăžăďź
fn foo<'a, 'b, T>() -> <() as Foo<...>>::Type { ... }
trait Foo<...> {
type Type: Trait;
}
impl<...> Foo<...> for () {
default type Type = /* inferred */;
}
揥ăŤăăăŽčłŞĺăŻăăăŹă¤ăFoo
ă¨ăăŽimplăŤăŠăŽăżă¤ăăŽăăŠăĄăźăżăźă襨示ăăăăăăŤĺ¸°çăăžăăďź ĺşćŹçăŤăăăă§ăŻ...
ă§ăă ćăăăŤăăăŤăŻă Trait
čŞä˝ăŤăăŁăŚä˝żç¨ăăăăăăŤčŚăăĺăăŠăĄăźăżăźăŽăťăăăĺŤăžăăžăăăčż˝ĺ ăŽĺăăŠăĄăźăżăźăŻä˝ă§ăăďź ďźĺăŤčż°ăšăăăăŤăăăŽčąçłăŻăčŞĺçšć§ăŽăŞăźăŻăé¤ăăŚ100ďź
ĺż ĺŽă§ăăăçšćŽăŞĺŽčŁ
ăŤĺŻžăăŚăčŞĺçšć§ăăŞăźăŻăăĺż
čŚăăăă¨ä¸ťĺźľăăžăăďź
ç§ăăĄă使ç¨ăăŚăăăăăŠăŤăăŽçăăŻăăăăăăšăŚăă§ăăăăăăăă§ăŻ...
ăŻ'a, 'b, T
ďźčĄ¨ç¤şăăăĺŻč˝ć§ăŽăăĺżĺăăŠăĄăźăżăźă¨ă¨ăăŤďźă ăăăŻĺŚĽĺ˝ăŞăăăŠăŤăă§ăăĺŻč˝ć§ăăăăžăăăĺż
ăăăćčŻăŽăăăŠăŤăă§ăŻăăăžăăă ďź @ arielb1ăććăăăăăŤăďź
<() as Foo<...>>::Type
ďź impl Trait
çšĺŽăŽä¸éćăŞă¤ăłăšăżăłăšĺă'x
ăăăéˇçăăăăă¨ă確čŞăăăŤăŻăĺšćçăŤčĄ¨ç¤şăăĺż
čŚăăăăăăăăăŻéˇçăăŽé˘äżăŤĺ˝ąéżăä¸ăăžăăăăŽ...: 'x
ďźă¤ăžăăăăšăŚăŽăŠă¤ăăżă¤ă ă¨ăżă¤ăăăŠăĄăźăżăźďźă
ăăăăăŠă¤ăăżă¤ă ăăŠăĄăźăżăčć
Žăăă ăă§ăŻä¸ĺĺă ă¨ç§ăč¨ăççąă§ăă foo::<'a0, 'b0, &'c0 i32>
ăăăŞfoo
ă¸ăŽĺźăłĺşăăăăă¨ćłĺăăŚăă ăăă ăăăŻă3ă¤ăŽăŠă¤ăăżă¤ă ăăšăŚ'[abc]0
'x
ăăăéˇçăăăĺż
čŚăăăăă¨ăćĺłăăžăăă¤ăžăăćťăĺ¤ă使ç¨ăăăŚăăéăăăăăŻé˘ć°ăŤä¸ăăăăăăšăŚăŽăăźăżăŽč˛¸ăĺşăăăăăăźă°ăăžăă ă ăăăă @ arielb1ăććăăăăăŤăă¨ăŞă¸ăŞăłăŻăăăăé常ĺż
čŚäťĽä¸ăŤéˇăăŞăăă¨ă示ĺăăŚăăžăă
ă§ăăăăç§ăăĄăŤĺż čŚăŞăŽăŻćŹĄăŽăă¨ă ă¨ćăăžăă
@aturonăŻăć示çăŞć§ćă¨ăăŚimpl<...> Trait
ăăăŞăăŽăĺăĺşăăžăăăăăăăŻĺŚĽĺ˝ăŞăăă§ăă ăăăăŁăŚă揥ăŽăăăŤć¸ăăă¨ăă§ăăžăă
fn foo<'a, 'b, T>(...) -> impl<T> Trait { }
é襨示ăŽĺăĺŽéăŤăŻ'a
ăžăăŻ'b
T
ăăăă impl<'a> Trait
ă¨č¨čż°ăăŚă 'b
ăT
ăăăŁăăăŁăăăŞăăă¨ă示ăĺ ´ĺăăăăžăă
ăăăŠăŤăăŤé˘ăăŚăŻăăăĺ¤ăăŽăăźăżăăăă¨é常ăŤäžżĺŠăŞăăă§ăăăä¸čŹçăŞă¨ăŞă¸ăŞăłăŽăă¸ăăŻă§ăŻă芲ĺ˝ăăĺ ´ĺăŻă self
ăŽăżă¤ăă§ćĺŽăăăăăšăŚăŽăăŠăĄăźăżăźăăăŁăăăŁăăăŽăéŠĺă§ăăăă¨ă示ăăăŚăăžăă ăă¨ăă°ă fn foo<'a,'b>(&'a self, v: &'b [u8])
ăăăăżă¤ăăBar<'c, X>
ĺ ´ĺă self
ăŽăżă¤ăăŻ&'a Bar<'c, X>
ăŤăŞăăăă 'a
ăăăŁăăăŁăăžăăăăăŠăŤăă§ăŻ'c
ăăăăłX
ă§ăăă 'b
ăŻăăăžăăă
ăă1ă¤ăŽé˘éŁăă注ćäşé
ăŻăăŠă¤ăăżă¤ă ăăŚăłăăŽćĺłă§ăă ăľăŚăłăăŽćĺšćéăŽĺ˘çăŤăŻăĺ¤ć´ăăŚăŻăŞăăŞăć˘ĺăŽćĺłăăăă¨ćăăžăă impl (Trait+'a)
ă¨ć¸ăă¨ăé襨示ăŽăżă¤ăT
'a
éˇçăăăăă¨ăćĺłăăžăă ĺć§ăŤă impl (Trait+'static)
ă¨č¨čż°ăăŚăĺç¨ăăăă¤ăłăżăźăĺĺ¨ăăŞăăă¨ă示ăăă¨ăă§ăăžăďźä¸é¨ăŽăŠă¤ăăżă¤ă ăăăŁăăăŁăăăĺ ´ĺă§ăďźă é襨示ĺT
ć¨čŤăăĺ ´ĺăăăăŻ$T: 'static
ăăăŞăŠă¤ăăżă¤ă ĺ˘çăćĺłăăžăăăăă§ă $T
ăŻé襨示ĺç¨ăŤä˝ćăăć¨čŤĺ¤ć°ă§ăă ăăăŻé常ăŽćšćłă§ĺŚçăăăžăă é襨示ăŽĺăé襨示ăŤăŞăŁăŚăăçşäżĄč
ăŽčŚłçšăăăăă¨ă 'static
ĺ˘çăŤăăăăŠă¤ăăżă¤ă ăăŠăĄăźăżăăăŁăăăŁăăăŚăăĺ ´ĺă§ăă impl (Trait+'static)
'static
ăéˇçăăăă¨çľčŤäťăăăă¨ăă§ăăžăă
ăăă§ăŻăčąçłăĺä˝ăăăŽă¨ăžăŁăăĺăăăăŤĺä˝ăăžăă
fn foo<'a, 'b, T>() -> <() as Foo<'a, 'b, 'T>>::Type { ... }
trait Foo<'a, 'b, T> {
type Type: Trait + 'static; // <-- note the `'static` bound appears here
}
impl<'a, 'b, T> Foo<...> for () {
default type Type = /* something that doesn't reference `'a`, `'b`, or `T` */;
}
ăăăŻăăšăŚăć¨čŤăăç´äş¤ăăŚăăžăă ăchoosefromăĺśç´ăŽćŚĺżľăčż˝ĺ ăăăăă¤ăăŽăăĽăźăŞăšăăŁăăŻă¨ăĺ ´ĺăŤăăŁăŚăŻĺžšĺşçăŞć¤ç´˘ă使ç¨ăăŚć¨čŤăĺ¤ć´ăăĺż
čŚăăăăžăďźRFC 1214ăŽçľé¨ăăăäżĺŽçăŞăăŠăźăŤăăăŻă使ç¨ăăăăĽăźăŞăšăăŁăăŻăŻĺŽéăŤé常ăŤé ăăžă§ĺ°éă§ăăăă¨ăăăăăžăăăăăăăŠăăăŤĺéĄăăăăăăăăžăăăăç§ăŻăăŽçšă§ĺśéăŤăśă¤ăăŁăŚăăäşşă
ăçĽăăžăăďźă 確ăăŤă 'static
ă 'a`ăŽăăăŞăŠă¤ăăżă¤ă ĺ˘çăčż˝ĺ ăăă¨ăć¨čŤăŤĺ˝ąéżăä¸ăăĺŻč˝ć§ăăăăăă彚çŤăĄăžăăăăăăŻĺŽĺ
¨ăŞč§Łćąşçă§ăŻăăăžăăăăă¨ăă°ăĺźăłĺşăĺ
ăŤčĄ¨ç¤şăăăAPIăŽä¸é¨ăŤăŞăăžăăăăăŻćăžăăăŞăĺ ´ĺăăăăžăă
ĺŻč˝ăŞăŞăăˇă§ăłďź
äťćĽăŽçšć§ăŞăă¸ă§ăŻăă¨ĺć§ăŤă impl Trait
ăŞăă¸ă§ăŻăăŤăŻăă¨ăŞă¸ăŞăłăŤăźăŤă使ç¨ăăŚć¨ć¸Źăăăĺä¸ăŽăŠă¤ăăżă¤ă ăă¤ăłăăăŠăĄăźăżăăăăžăă
çćďźéäşşé塼ĺŚç
ĺŠçšďźć確
äťćĽăŽçšć§ăŞăă¸ă§ăŻăă¨ĺć§ăŤă impl Trait
ăŞăă¸ă§ăŻăăŤăŻĺä¸ăŽăŠă¤ăăżă¤ă ăă¤ăłăăăŠăĄăźăżăăăăžăă
ăă ăăă¨ăŞă¸ăŞăłăŻăăăšăŚăŽć示çăŞăăŠăĄăźăżăźăăăéˇćăĄăăć°ăăćŠćăă¤ăłăăăŠăĄăźăżăźăä˝ćăăžăă
fn foo<T>(&T) -> impl Foo
-->
fn foo<'total, T: 'total>(&T) -> impl Foo + 'total
çćďźćŠćăă¤ăłăăăŠăĄăźăżăčż˝ĺ ăăžă
ăăŁă¨ă
impl Trait + 'aă¨ĺç¨ă§ăăŽĺéĄăŤééăăžăăďź https ďź
ăăŽĺ¤ć´ăćŁăăç解ăăŚăăĺ ´ĺďźăăăŚăăŽĺŻč˝ć§ăŻăăăăä˝ăă§ăďźďźăăăŽéăłĺ ´ăłăźăăŻćŠč˝ăăăŻăă§ăďź
https://play.rust-lang.org/?gist=496ec05e6fa9d3a761df09c95297aa2a&version=nightly&backtrace=0
ThingOne
ă¨ThingTwo
ăŠăĄăăă Thing
çšć§ăĺŽčŁ
ăăŚăăžăă build
ăŻă Thing
ăĺŽčŁ
ăăăăŽăčżăă¨č¨ăŁăŚăăžăă ăăăăăăăŻăłăłăă¤ăŤăăăžăăă ă ăăç§ăŻćăăăŤä˝ăă誤解ăăŚăăžăă
ăăŽăä˝ăăăŤăŻĺăĺż
čŚă§ăăăăăŞăăŽĺ ´ĺă2ă¤ăŽçŤśĺăăĺăăăăžăă @nikomatsakisăŻäťĽĺăĺăŽä¸ä¸č´ă襨示ăăăă¨ăăŤThingOne | ThingTwo
ăä˝ćăăŚăăăăä¸čŹçăŤćŠč˝ăăăăă¨ăććĄăăžăăă
@eddyb ThingOne | ThingTwo
ăŤă¤ăăŚčŠłăăćăăŚăăă ăăžăăďź ĺŽčĄćăŤăżă¤ăăăăăăăŞăĺ ´ĺăŻă Box
ăĺż
čŚă§ăŻăăăžăăăďź ăăă¨ăä¸ç¨ŽăŽenum
ă§ăăďź
ăăăăăăŻă˘ăăăăŻăŞenum
ăăăŞăżă¤ăă§ăăăĺŻč˝ă§ăăă°ăăăŹă¤ăăĄă˝ăăăŽĺźăłĺşăăăăŽăăŞă˘ăłăăŤĺ§äťťăăžăă
ăăăŞăă¨ă䝼ĺăă揲ăăăŁăă ĺżĺĺćĺRFCďź https ďź
ä¸ä¸č´ă§ăăăăŽăżă¤ăăä˝ćăăă ăăŽĺ ´ĺăăăŞă˘ăłăăç°ăŞăăăďźä¸čŹĺăăă形ĺźăŽĺéĄă§ăďźăć¨čŤé§ĺĺăŽĺ ´ĺăŤăăžăćŠč˝ăăăă¨ăŻăžăă§ăă
ăžăăăăżăźăłăăăăłă°ăăŞăăă¨ăăä˝ăăĺžăăă¨ăă§ăăžăďźćăăăŤäşăăŤç´ ăŞĺ ´ĺăé¤ăăŚďźďźă
ăă ăăIMOĺ§äťťăˇăĽăŹăźăŻă T | T
ăĺĺžă§ăăă¨ăăŚăăé˘éŁăăăăšăŚăŽăąăźăšă§ăćŁĺ¸¸ăŤćŠč˝ăăăžăă
ăăăăŽćăŽäťăŽćéťăŽĺĺă芳ăă誏ćăăŚăăă ăăžăăďź ç§ăŻăăăŽăťă¨ăăŠăç解ăăŚăăžăăăăăăŚç§ăăăă¤ăăŽćčăéăăŚăăăŽă§ăŻăŞăăă¨ćăăžăă ĺ
ąç¨ä˝ĺăŽĺéĄăŤćéťçăŤĺŻžĺżăăŚăăžăăăďź ăăŽRFCăŻĺç´ăŤĺżĺăŽĺćĺă§ăăăĺ
ąç¨ä˝ĺă§ăŻăăăžăă- (T|T)
ăŻResult<T, T>
ă¨ăžăŁăăĺăăăăĺéĄăăăăžăă
ăăăć°ăŤăăŞăă§ăă ăăăç§ăŻććĄă桡䚹ăăăžăăďźç§ă夹ćăăHDDăć´çăăăžă§ă˘ăă¤ăŤă§ăçŤăĄĺžçăăŚăăăŽă§ăTwitterăŽăăăŤčăăăăă¨ăă芍ăłăăžăďźă
ç§ăŻďźä˝ç˝Žăă¤ăžăT|U != U|T
ďźĺżĺăŽĺćĺăŤčĺłăăăăăăžăăĺŻĺ¤ĺĺźć°ăŽă¸ă§ăăŞăăŻăăăă°ďź hlist
ă使ç¨ăăŚăăăĺéżă§ăăžăďźăăŠă¤ăăŠăŞă§ĺŽé¨ă§ăăă¨ćăăžăă constă¸ă§ăăŞăăŻďźĺä¸ăăă˘ăçŞĺˇäťăďźă
ăăăĺćăŤăä˝ăăŤĺŻžăăč¨čŞăľăăźăăăăă°ăăăăŻĺżĺăŽĺćĺă§ăŻăŞăăĺ
ąç¨ä˝ĺăŤăŞăăžăă ăă¨ăă°ă Result
ăŞăăă¨ăŠăźăżă¤ăďźĺĺäťăăŠăăăźăŽé˘ĺăŞä˝ćĽăĺéżăăăăďźă
ăăăéŠĺăŞĺ ´ćăăŠăăăŻăăăăžăăăăăŞăimpl
ăăăŞăăźăŻăźăăĺż
čŚăŞăŽă§ăăďź ăăŁăšăŤăăˇă§ăłăčŚă¤ăăăžăăă§ăăďźç§ăŽăăăăăăăžăăďźă
é˘ć°ăimplTraităčżăĺ ´ĺăăăŽćŹä˝ăŻTraităĺŽčŁ ăăäťťćăŽăżă¤ăăŽĺ¤ăčżăăă¨ăă§ăăžă
䝼ćĽ
fn bar(a: &Foo) {
...
}
ăçšć§Foo
ăĺŽčŁ
ăăĺă¸ăŽĺç
§ăĺăĺ
Ľăăăă¨ăăćĺłă§ăă
fn bar() -> Foo {
...
}
ăçšć§Foo
ăĺŽčŁ
ăăĺăčżăăă¨ăăćĺłă§ăă ăăăŻä¸ĺŻč˝ă§ăăďź
@ kud1ingăŽççąăŻăĺçăľă¤ăşăŽćťăĺ¤ăŽăľăăźăăĺ°ćĽčż˝ĺ ăăăĺ ´ĺăŤăĺçăľă¤ăşăŽĺTrait
ăčżăé˘ć°ăćă¤ĺŻč˝ć§ăćé¤ăăŞăăăă§ăă çžĺ¨ă Trait
ăŻăă§ăŤćĺšăŞDSTă§ăăăDSTăčżăăă¨ăŻă§ăăŞăăăăăľă¤ăşăĺ¤ć´ăăăăăŤăăăŻăšĺăăĺż
čŚăăăăžăă
硨éďźăŞăłăŻăăăRFCăšăŹăăă§ăăăŤă¤ăăŚăăă¤ăăŽč°čŤăăăăžăă
ăăă¨ăĺçăŤăľă¤ăşč¨ĺŽăăăćťăĺ¤ăčż˝ĺ ăăăăăŠăăăŤé˘äżăŞăăç§ăŻçžĺ¨ăŽć§ćă弽ăżăžăă çšć§ăŞăă¸ă§ăŻăă§çşçăăăă¨ă¨ăŻç°ăŞăăăăăŻĺćśĺťă§ăŻăŞăăăăăŠăĄăźăżf: &Foo
ăŻFoo
ăćĺłăăăăŽăĺăăžăăăăăăŻFoo
ăćĺłăăăăŽăčżăăžăă誤解ăćăĺŻč˝ć§ăăăăžăă
ç§ăŻRFCăŽč°čŤăăăçžĺ¨impl
ăŻăăŹăźăšăăŤăăźăŽĺŽčŁ
ă§ăăă impl
ăŻăăžăćăžăăŚăăŞăăă¨ăĺéăăžăăă ćťăĺ¤ăDSTă§ăŞăĺ ´ĺă impl
ăăŹă¤ăăĺż
čŚăŞăççąăŻăăăžăăďź
ăčŞĺăăŹă¤ăăŞăźăŻăăĺŚçăăăăăŽçžĺ¨ăŽimplććłăŤăŻĺéĄăăăă¨ćăăžăă 䝣ăăăŤăDAGé ĺşăéŠç¨ăăŚăfn fn foo() -> impl Iterator
ăĺŽçžŠăăĺźăłĺşăĺ
ăfn bar() { ... foo() ... }
ĺ ´ĺă bar()
ĺăŤfoo()
ăĺ
Ľĺăă§ăăŻăăĺż
čŚăăăăžăă bar()
ďźé襨示ăżă¤ăăä˝ă§ăăăăçĽăăăďźă ăľă¤ăŻăŤăçşçăăĺ ´ĺăŻăă¨ăŠăźăĺ ąĺăăžăă ăăăŻäżĺŽçăŞăšăżăłăšă§ăăăăăăăăăŁă¨ăăžăăăĺŻč˝ć§ăăăăžăăăčŞĺăăŹă¤ăăŽçžŠĺăĺéăăŚćĺžăŤăă§ăăŻăăă¨ăăçžĺ¨ăŽććłăŻăä¸čŹçăŤăŻćŠč˝ăăŞăă¨ćăăžăă ăă¨ăă°ăăšăăˇăŁăŠă¤ăźăźăˇă§ăłă§ăŻăăžăćŠč˝ăăžăăă
ďźĺłĺŻăŞDAGăčŚćąăăăăăĺŻĺŽšă§ăăĺŻč˝ć§ăăăĺĽăŽĺŻč˝ć§ăŻă严ćšăŽfnsăăăç¨ĺşŚăä¸çˇăŤăăżă¤ăăă§ăăŻăăăă¨ă§ăăăăăŻăçšć§ăˇăšăă ăĺ°ăĺć§çŻăăĺžă§ăŽăżć¤č¨ăăĺż čŚăăăă¨ćăăžăăďź
@Nercuryăăăăžăăă fn foo() -> Trait
ă-> impl Trait
ăćĺłăăăă¨ăćăžăŞăççąăăăăăŠăăĺ°ăăŚăăžăăďź
@nikomatsakisăŻăăç§ăŻćŁç˘şăŤăăăćąăăŚăăžăăă桡䚹ăăč¨čă§çłă訳ăăăžăă:)ă implăăźăŻăźăăŞăă§ăăăčĄăćšăç°Ąĺă ă¨ćăăžăăăăăăŻăăăŽĺä˝ăăžăăŤćĺž ăŠăăă§ăăăăă§ăďźtrait returntypeăŽäťŁăăăŤconcretetypeăčżăăăĺ ´ĺďźă ăăăăä˝ăăčśłăăŞăăăăăăŞăăŽă§ăç§ăŻĺ°ăăŚăăžăăă
éăăŻă impl Trait
ăčżăé˘ć°ăŻĺ¸¸ăŤĺăĺăčżăăă¨ă§ăăăăăŻăĺşćŹçăŤĺć¨čŤăčżăăžăă IIUCă Trait
ă ăăčżăé˘ć°ăŻăăăŽçšć§ăŽĺŽčŁ
ăĺçăŤčżăăă¨ăă§ăăžăăăĺźăłĺşăĺ
ăŻă box foo()
ăăăŞăăŽăäťăăŚćťăĺ¤ăŤăšăăźăšăĺ˛ăĺ˝ăŚăćşĺăăăĺż
čŚăăăăžăă
@Nercuryĺç´ăŞççąăŻă -> Trait
ć§ćăŤăŻăă§ăŤćĺłăăăăăăăăŽćŠč˝ăŤăŻĺĽăŽăăŽă使ç¨ăăĺż
čŚăăăă¨ăăăă¨ă§ăă
ç§ăŻĺŽéăŤäşşă
ăăăăŠăŤăă§ä¸ĄćšăŽç¨ŽéĄăŽĺä˝ăćĺž
ăăŚăăăŽăčŚăŚăăžăăăăăăŚăăŽç¨ŽăŽćˇˇäšąăŻĺĺé ťçšăŤčľˇăăăžăç§ăŻćŁç´ăŤč¨ăŁăŚfn foo() -> Trait
ăŻä˝ăćĺłăăŞăďźăžăăŻăăăŠăŤăă§čŚĺă§ăăďźă¨ć示çă§ăăăăłăłăă¤ăŤćăŤé¸ćă§ăăăăĺźăłĺşăĺ
ăŤăŻčĄ¨ç¤şăăăŞăăżă¤ăăăŽĺ ´ĺă¨ăăăŹă¤ăăĺŽčŁ
ăăäťťćăŽăżă¤ăăŤĺçăŤăăŁăšăăăă§ăăăăŹă¤ăăŞăă¸ă§ăŻăăăŽĺ ´ĺăŽä¸ĄćšăŽăăźăŻăźăďźäžďź fn foo() -> impl Trait
vs fn foo() -> dyn Trait
ă ăăăăćăăăŤăăăăŽčšăŻĺşčŞăăžăăă
ăłăłăă¤ăŠăé˘ć°ăŽăăšăŚăŽç°ăŞăćťăĺăäżćăăĺćĺăçćăăăĺăăŞă˘ăłăă¸ăŽĺźć°ăééăăçšć§ăĺŽčŁ ăă䝣ăăăŤăăăčżăăŽăŻăŞăă§ăăďź
ăăăŻă訹ĺŻăăăĺŻä¸ăŽćťăăżă¤ăă§ăăăŤăźăŤăăă¤ăăšăăžăă
@NeoLegendsăăăćĺă§čĄăăă¨ăŻăăŞăä¸čŹçă§ăăăăăŽăăăŽăăă¤ăăŽç çłăŻç´ ć´ăăăăăimpl Trait
ăžăăŻçšć§ăŞăă¸ă§ăŻăăčżăăă¨ă¨ăŻăžăŁăăç°ăŞăăťăăłăăŁăŻăšăŽ3çŞçŽăŽăťăăă§ăăăăăăăă§ăŻăăăžăăăăŽč°čŤăŤćŹĺ˝ăŤé˘éŁăăŚăăžăă
@IxrecăăăăăăŻćĺă§čĄăăăŚăăăă¨ăŻçĽăŁăŚăăžăăăăłăłăă¤ăŠăźăçćăăćťăĺă¨ăăŚăŽĺżĺĺćĺăŽĺŽéăŽăŚăźăšăąăźăšăŻăă¤ăăŹăźăżăźăŽéˇăăă§ăźăłăĺ°ćĽăŽă˘ăăăżăźăŽăăăŤă
ăăŽç°ăŞăăťăăłăăŁăŻăšăŻăŠăă§ăăďź ĺżĺăŽĺćĺďźĺżĺăŽĺćĺRFCăŤăăăŽă§ăŻăŞăăăłăłăă¤ăŠăźăçćăăéăďźăŻăăăžăăžăŞăăŞă˘ăłăăć˝čąĄĺăăăăŹă¤ăăŽăăăŞĺ ąéăŽAPIăăăĺ ´ĺăŤăŽăżăćťăĺ¤ă¨ăăŚĺŽéăŤćĺłăăăăžăă APIăŽăłăłăˇăĽăźăăźăç´ćĽčŚăăă¨ăŽăŞăĺćĺăŽăłăłăă¤ăŠăźăŤăăŁăŚ1ă¤ăŽăżă¤ăăŽĺśéăĺé¤ăăăă ăă§ăé常ăŽimplăăŹă¤ăăŽăăăŤčŚăăŚĺä˝ăăćŠč˝ăććĄăăŚăăžăă ćśč˛ťč ăŻĺ¸¸ăŤăimplTraităăŽăżă襨示ăăĺż čŚăăăăžăă
ĺżĺăŽčŞĺçćăăăĺćĺăŻimpl Trait
ăŤé ăăăłăšăăä¸ăăčŚéăăăăăŽă§ăăăăŻčć
Žăăšăăă¨ă§ăă
ăčŞĺĺćĺăăšăšăŤăźăăŻăăŞăă¸ă§ăŻăăťăźăăŞçšć§ăŤăŽăżćĺłăăăă¨ćăăžăă impl Trait
čŞä˝ăŤăĺăăă¨ăĺ˝ăŚăŻăžăăžăăďź
@rpjohnstăăăăŞăéăăĺŽéăŽăĄă˝ăăăăŞă˘ăłăăŻăŻăŹăźăăĄăżăăźăżăŤăăăĺźăłĺşăăľă¤ăă§ĺ
@glaebhoerl
ăčŞĺĺćĺăăšăšăŤăźăăŻăăŞăă¸ă§ăŻăăťăźăăŞçšć§ăŤăŽăżćĺłăăăă¨ćăăžăă implăăŹă¤ăčŞä˝ăŤăĺăăă¨ăĺ˝ăŚăŻăžăăžăăďź
ăăăŻčĺłćˇąăçšă§ăďź ç§ăŻăimplçšć§ăăčąçłăăăćŁăăćšćłăŤă¤ăăŚč°čŤăăŚăżă¤ăăŽć´žçăŤăăäźźăŚăăăă¨ăćĺłăăŚăăăăă§ăăăăĄăăF<T>
ăżă¤ăăŽçšć§ăŽĺŽčŁ
ăčŞĺçăŤçćăăĺ ´ĺăŻăăăă§é常ăŤćł¨ćăăĺż
čŚăăăăăă§ăă T
ă
@nikomatsakis
ĺéĄăŻăăăłăŽč¨čă§č¨ăă°
trait Foo {
type Output;
fn get() -> Self::Output;
}
fn foo() -> impl Foo {
// ...
// what is the type of return_type::get?
}
tl; drăŻăä¸čŹĺăăăăăĽăźăżă¤ăăŽć´žçăŻăvtableăĺăŤtransmute
ăăăă¨ăŤăăŁăŚĺŽčŁ
ăăăďźăăăŚĺŽčŁ
ăăăŚăăďźă¨ăăăă¨ă§ă-çľĺąăŽă¨ăăăvtableăŻăżă¤ăăŽé˘ć°ă§ć§ćăăăăżă¤ăă¨ăăŽăăĽăźăżă¤ăăŻĺă襨çžăćăŁăŚăăžăăăăă§ĺ¤§ä¸ĺ¤ŤăŞăŻăă§ăăăďź ăăăăăăăăŽé˘ć°ăăćĺŽăăăĺăŽID ďźčĄ¨çžă§ăŻăŞăďźăŽĺăŹăăŤăŽĺĺ˛ăŤăăŁăŚćąşĺŽăăăĺă使ç¨ăăĺ ´ĺăăă¨ăă°ăĺé˘ć°ăžăăŻé˘éŁăăĺďźăžăăŻHaskellăGADTďźă使ç¨ăăĺ ´ĺăŻćŠč˝ăăžăăă ăăăăŽăżă¤ăăŽčĄ¨çžăŤăäşćć§ăăăă¨ăăäżč¨źăŻăŞăăăă§ăă
ăăŽĺéĄăŻăĺŽĺ
¨ă§ăŞăăăŠăłăšăăĽăźăă使ç¨ăăŚăăĺ ´ĺăŤăŽăżçşçăăĺŻč˝ć§ăăăăă¨ăŤćł¨ćăăŚăă ăăă 䝣ăăăŤăć°ăăăżă¤ăăăŠăă§ăăŠăă/ă˘ăłăŠăăăăăăšăŚăŽăĄă˝ăăăĺşćŹăżă¤ăăăăăŽĺŽčŁ
ăŤăăŁăšăăăăăăăăŽéĺąăŞăă¤ăŠăźăăŹăźăăłăźăăçćăăĺ ´ĺďźRust IIRCăŽčŞĺĺ§äťťććĄăŽä¸é¨ăŽăăăŤďźďźăčăăăăććŞăŽçľćăŻăżă¤ăăŤăŞăăžăă¨ăŠăźăžăăŻĺ¤ĺICEă çľĺąăŽă¨ăăăć§é ä¸ăĺŽĺ
¨ă§ăŞăăłăźăă使ç¨ăăŞăĺ ´ĺăĺŽĺ
¨ă§ăŞăçľćăăăăăăă¨ăŻă§ăăžăăă ĺć§ăŤăăă税ăŽăčŞĺĺćăăšăšăŤăźăăŽăłăźăăçćăăăăăăŽăăăŤunsafe
ăăŞăăăŁăă使ç¨ăăŞăăŁăĺ ´ĺăĺąéşăŻăăăžăăă
ďźăăăă impl Trait
ă§ä˝żç¨ăăăçšć§ăăăăł/ăžăăŻčŞĺĺćĺăăšăšăŤăźăĺż
çśçăŤăŞăă¸ă§ăŻăăťăźăă§ăăĺż
čŚăăăăăŠăăă¨ăăç§ăŽćĺăŽčłŞĺăŤé˘éŁăăăăŠăăăăžăăŻăŠăŽăăăŤé˘éŁăăăăŻăăăăžăăăďźďź
@rpjohnstăłăšăăăăźăŻăăăăăŤĺćĺăąăźăšăăŞăăă¤ăłăŤăăăă¨ăă§ăăžăďź
fn foo() -> enum impl Trait { ... }
ăăăăăăăŻăťăźééăăŞăĺĽăŽRFCăŽçł§ă§ăă
@glaebhoerlăăăç§ăŻăăŽĺéĄăćăä¸ăăăŽăŤćéă貝ăăăĺ°ăŞăă¨ăăăă§ăŻĺéĄăŤăŞăăŞăă ăăă¨ăăŞă確俥ăăŚăăžăăă
ćăăăŞăă¨ă§ăăă°ă芍ăłăăžăăă impl Trait
ăćťăĺăŽçšć§ăĄă˝ăăăŤčĄ¨ç¤şăăăŞăççąăăžăăŻăăăăăăăăžăŁăăćĺłăăăăăŠăăăç解ăăăă¨ăăŚăăžăăďź äžăă°ďź
trait IterInto {
type Output;
fn iter_into(&self) -> impl Iterator<Item=impl Into<Self::Output>>;
}
@aldanorăăăŻĺŽĺ ¨ăŤçăŤăăŞăŁăŚăăăAFAIKăŽćĺłăŻăăăćŠč˝ăăăăă¨ă§ăăăăžă ĺŽčŁ ăăăŚăăžăăă
ăăăŻăăćĺłçăŤăăŞăŁăŚăăžăăăăăăŻĺăĺşćŹçăŞćŠč˝ă§ăŻăăăžăăďźăăăŻĺ¤ăăŽă¨ăăă§č°čŤăăăŚăăžăďźďź
// What that trait would desugar into:
trait IterInto {
type Output;
type X: Into<Self::Output>;
type Y: Iterator<Item=Self::X>;
fn iter_into(&self) -> Self::Y;
}
// What an implementation would desugar into:
impl InterInto for FooList {
type Output = Foo;
// These could potentially be left unspecified for
// a similar effect, if we want to allow that.
type X = impl Into<Foo>;
type Y = impl Iterator<Item=Self::X>;
fn iter_into(&self) -> Self::Y {...}
}
ĺ
ˇä˝çăŤăŻă impl Trait for Type
é˘éŁăżă¤ăăŽRHSăŽimpl Trait
ăŻăĺŽĺŽăăRustăŤčąçłă§ăăŞăă¨ăăçšă§ăäťćĽĺŽčŁ
ăăăŚăăćŠč˝ăŤäźźăŚăăžăăă trait
ăăăă
ăăăŻăăăăćé
ăă§ăăăăťă¨ăăŠăăă¤ăŻăˇă§ăăă§ăăăă¨ăç§ăŻçĽăŁăŚăăžăăăăăźăŻăźăimpl
ăĺ°ĺ
ĽăăăççąăŻăŠăăăŤćć¸ĺăăăŚăăžăăďź çžĺ¨ăŽRustăłăźăăŤăŻăăăłăłăă¤ăŠăźăŻăăăŤăŠăŽăżă¤ăăĺ
Ľăăăç解ăăăăă¤ăžă_
ăč¨ăćšćłăăă§ăŤăăăăăŤćăăžăă ăăă§ăăăĺĺŠç¨ăăŚć§ćăä¸ăăăă¨ăŻă§ăăžăăăďź
fn foo() -> _ as Iterator<Item=u8> {}
@jonhooăăăŻćŠč˝ăčĄăăă¨ă§ăŻăŞăăĺăŻé˘ć°ăăčżăăăăăŽă§ăŻăŞăăé¸ćăăăAPIďźăăăłOIBITăŻé˘ĺăŞăŽă§ďźäťĽĺ¤ăŽăăšăŚăé ăăăťăăłăăŁăăŻăŠăăăźăă§ăă
ä¸é¨ăŽé˘ć°ăDAGă埡ĺśăăăă¨ă§ç˝˛ĺăŽĺăć¨ć¸Źă§ăăăăăŤăăăă¨ăă§ăăžăăăăăŽăăăŞćŠč˝ăŻćżčŞăăăŚăăăăăă°ăăźăăŤć¨čŤăăŤč§ŚăăŚăăăăăRustăŤčż˝ĺ ăăăĺŻč˝ć§ăŻăťă¨ăăŠăăăžăăă
ĺŠç¨ććĄ@Trait
罎ăćăăăăăŽć§ćăimpl Trait
čż°ăšăăăăŤăăăăŤă
Box<@MyTrait>
ă&@MyTrait
ăăăŞć§ćă§ăŻăäťăŽăżă¤ăăŽä˝ç˝ŽăŤćĄĺźľăăćšăç°Ąĺă§ăă
@Trait
ĺ ´ĺăŻany T where T: Trait
ă ~Trait
ĺ ´ĺăŻsome T where T: Trait
ďź
fn compose<T, U, V>(f: @Fn(T) -> U, g: @Fn(U) -> V) -> ~Fn(T) -> V {
move |x| g(f(x))
}
fn func(t: T) -> V
ă§ăŻăçšć§ă¨ăăŚătăžăăŻvăĺşĺĽăăĺż
čŚăŻăăăžăăă
fn compose<T, U, V>(f: @Fn(T) -> U, g: @Fn(U) -> V) -> @Fn(T) -> V {
move |x| g(f(x))
}
ăžă ĺä˝ăăžăă
@ JF-Liuç§ăŻĺäşşçăŤany
ă¨some
ă1ă¤ăŽăăźăŻăźă/ĺ°çŤ ăŤăžă¨ăăăă¨ăŤĺ寞ăăŚăăžăăăĺä¸ăŽĺ°çŤ ăćăŁăŚĺ
ăŽimpl Trait
ăăăŤä˝żç¨ă§ăăăă¨ăŻćčĄçăŤćŁăăă§ă
@ JF-Liu @ eddybăˇă¸ăŤăč¨čŞăăĺé¤ăăăççąăăăăžăăă ăŞăăăŽççąăŻăăŽĺ ´ĺăŤăŻĺ˝ăŚăŻăžăăŞăăŽă§ăăăăďź
@
ăŻăč¨čŞăăĺé¤ăăăăŽă§ăŻăŞăăăăżăźăłăăăăłă°ă§ă使ç¨ăăăžăă
ç§ăĺżľé ăŤç˝ŽăăŚăăăŽăŻăAFAIKăˇă¸ăŤă使ăăăăŚăăă¨ăăăă¨ă§ăă
ć§ćbikeshedingďź impl Trait
襨č¨ăŤă¤ăăŚăŻé常ăŤä¸ćşă§ăăăăźăŻăźăďźă¨ăăŁăżăźă§ăŻĺ¤ŞĺăŽăăŠăłăďźă使ç¨ăăŚĺăŤĺĺăäťăăăŽăŻĺ¤§ăăăăăăă§ăă CăŽstruct
ă¨StroustroupăŽĺ¤§éłéăŽć§ć茳ĺŻďźăšăŠă¤ă14ďźăčŚăăŚă
https://internals.rust-lang.org/t/ideas-for-making-rust-easier-for-beginners/4761ă§ă @ konstinăŻ<Trait>
ć§ćăććĄăăžăăă çšăŤĺ
Ľĺä˝ç˝Žă§ăŻăă¨ăŚăčŚć ăăăăžăă
fn take_iterator(iterator: <Iterator<Item=i32>>)
UFCSă¨ĺ¤ĺ°çŤśĺăăăăă§ăăăăăăăăăăŻč§Łćąşă§ăăă§ăăăăă
ç§ăăĺ°ăŞăă¨ăăŞăżăźăłăżă¤ăăŽä˝ç˝Žă§ăŻăimpl TraităŽäťŁăăăŤĺąąăăŁăă使ç¨ăăćšăčŻăé¸ćă ă¨ćăăŚăăžăăäžďź
fn returns_iter() -> <Iterator<Item=i32>> {...}
fn returns_closure() -> <FnOnce() -> bool> {...}
<Trait>
ć§ćăă¸ă§ăăŞăăŻăšă¨çŤśĺăăŚăăĺ ´ĺăŻă揥ăŽăă¨ăčć
ŽăăŚăă ăăă
Vec<<FnOnce() -> bool>>
vs Vec<@FnOnce() -> bool>
Vec<FnOnce() -> bool>
ă訹ĺŻăăăŚăăĺ ´ĺăŻă <Trait>
ăăĺ§ăăăžăăăăăŻăă¸ă§ăăŞăăŻĺăăŠăĄăźăżăźă¨ĺçă§ăăăă¨ăćĺłăăžăă ăă ăă Box<Trait>
ăŻBox<@Trait>
ă¨ăŻç°ăŞăăăă <Trait>
ć§ćăăăăăăĺż
čŚăăăăžăă
ç§ăŻimpl
ăăźăŻăźăć§ćă弽ăżăžăăăŞăăŞăăăăăĽăĄăłăăăă°ăăčŞăă¨ăăăăăżă¤ăă誤čŞăăćšćłăĺ°ăŞăăŞăăăă§ăă
ăŠăćăăžăă ďź
ç§ăŻĺ é¨ăšăŹăăă§ăăŽRFCăŤăšăźăăźăťăăăććĄăăăă¨ăŤć°ăĽăăŚăăžăďźăăă§ç§ăćăăŚăăăŚăăăă¨ă@matklad ďźďź
揥ăŽäžăŽăăăŤăé˘ć°ăăŠăĄăźăżăźă¨ćťăĺăŽçšć§ăĺąąăăŁăă§ĺ˛ăăă¨ăŤăăăăăăă使ç¨ă§ăăăăăŤăăžăă
fn transform(iter: <Iterator>) -> <Iterator> {
// ...
}
揥ăŤăăłăłăă¤ăŠăźăŻăă¸ă§ăăŞăăŻăšăŤçžĺ¨éŠç¨ăăăŚăăăŽă¨ĺăăŤăźăŤă使ç¨ăăŚăăŠăĄăźăżăźăă˘ăă˘ăźăăŁăłă°ăăžăă ćťăĺăŻăăă¨ăă°é˘ć°ăŽĺŽčŁ
ăăć´žçăăăăă¨ăă§ăăžăă ăăăŻăăăŽăĄă˝ăăăBox<Trait_with_transform>
ĺźăłĺşăăăăĺçăŤăăŁăšăăăăăăăŞăă¸ă§ăŻăă§ä¸čŹçăŤä˝żç¨ăăăăăăă¨ăŻă§ăăŞăăă¨ăćĺłăăžăăăăăă§ăăŤăźăŤăŻăăĺŻĺŽšăŤăŞăăžăă ç§ăŻRFCăŽč°čŤăŽăăšăŚăčŞăă ăăă§ăŻăŞăăŽă§ăç§ăčŚéăăăăčŻă解湺çăăă§ăŤăăăŤăăăăăăăžăăă
ăăăĽăĄăłăăăă°ăăčŞăă¨ăăăăăżă¤ăăčŞăżééăăĺŻč˝ć§ăĺ°ăŞăăŞăăăăimplăăźăŻăźăć§ćă使ç¨ăăžăă
ć§ćăŽĺźˇčŞżčĄ¨ç¤şăŽĺĽăŽč˛ă§ăăžăăăăŻăă§ăă
StroustrupăŤăăăăŽăăźăăźă§ăŻăăťăŻăˇă§ăł7ă§C ++ăŽćŚĺżľăŤĺŻžăăĺć§ăŽć§ćä¸ăŽé¸ćăŤă¤ăăŚčŞŹćăăŚăăžăăhttp ďź//www.stroustrup.com/good_concepts.pdf
ă¸ă§ăăŞăăŻăšă¨ăăŹăźăłăšăŤĺăć§ćă使ç¨ăăŞăă§ăă ăăă ăăăăŻĺăăăŽă§ăŻăăăžăăă ă¸ă§ăăŞăăŻăšă使ç¨ăăă¨ăĺźăłĺşăĺ ăŻĺ ˇä˝çăŞăżă¤ăăćąşĺŽă§ăăžăăăďźăăŽĺśéăăăăľăăťăăăŽďźăăŹăźăłăšă使ç¨ăăă¨ăĺźăłĺşăăăé˘ć°ă使ç¨ăăŚĺ ˇä˝çăŞăżă¤ăăćąşĺŽă§ăăžăă ăăŽäžďź
fn transform(iter: <Iterator>) -> <Iterator>
ăăă¨ĺçă§ăăĺż čŚăăăăžă
fn transform<T: Iterator, U: Iterator>(iter: T) -> U
ăžăăŻăăă¨ĺçă§ăăĺż čŚăăăăžă
fn transform(iter: impl Iterator) -> impl Iterator
ćĺžăŽäžăŻăĺ¤éă§ăćŁăăăłăłăă¤ăŤăăăăă¤ăăŹăźăżăăŹă¤ăă§ăŻĺŽéăŤăŻĺźăłĺşăăžăăăă FromIter
ăăăŞăăŹă¤ăă使ç¨ăăă¨ăĺźăłĺşăĺ
ăŻă¤ăłăšăżăłăšăä˝ćăăŚăăăăé˘ć°ăŤć¸Ąăăă¨ăă§ăăžăă彟ăăééăăŚăăăăŽăŽĺ
ˇä˝çăŞăżă¤ăăćąşĺŽăăăăăŤă
ć§ćăŻäźźăŚăăăŻăă§ăăăĺăă§ăăŁăŚăŻăŞăăžăăă
ăżă¤ăĺăŽďźă¸ă§ăăŞăăŻďźăžăăŻďźĺĺ¨ďźăŽä¸é¨ăĺşĺĽăăĺż čŚăŻăăăžăăăăżă¤ăă使ç¨ăăăĺ ´ćăŤăăŁăŚç°ăŞăăžăă ĺ¤ć°ă§ä˝żç¨ăăăĺ ´ĺăĺźć°ă¨ć§é ä˝ăăŁăźăŤăăŻĺ¸¸ăŤTăŽăăăăăĺăĺ Ľăăfnă§ä˝żç¨ăăăĺ ´ĺăćťăĺăŻĺ¸¸ăŤTăŽä¸é¨ăĺĺžăăžăă
Type
ă &Type
ă Box<Type>
ăĺ
ˇä˝çăŞăăźăżĺăéçăăŁăšăăăăŤä˝żç¨ăăžă@Trait
ă &@Trait
ă Box<@Trait>
ă¨ăć˝čąĄăăźăżĺăŽă¸ă§ăăŞăăŻĺăăŠăĄăźăżăźăéçăăŁăšăăăă使ç¨ăăžă&Trait
ă Box<Trait>
ă使ç¨ăăžăfn func(x: @Trait)
ăŻfn func<T: Trait>(x: T)
ă¨ĺçă§ăă
fn func<T1: Trait, T2: Trait>(x: T1, y: T2)
ăŻăĺç´ăŤfn func(x: <strong i="22">@Trait</strong>, y: @Trait)
ă¨ć¸ăăă¨ăă§ăăžăă
T
ăăŠăĄăźăżăŻfn func<T: Trait>(x: T, y: T)
ă§ăĺż
čŚă§ăă
struct Foo { field: <strong i="28">@Trait</strong> }
ăŻstruct Foo<T: Trait> { field: T }
ă¨ĺçă§ăă
ĺ¤ć°ă§ä˝żç¨ăăăĺ ´ĺăĺźć°ă¨ć§é ä˝ăăŁăźăŤăăŻĺ¸¸ăŤTăŽăăăăăĺăĺ Ľăăfnă§ä˝żç¨ăăăĺ ´ĺăćťăĺăŻĺ¸¸ăŤTăŽä¸é¨ăĺĺžăăžăă
çžĺ¨ăć˘ĺăŽćąç¨ć§ćă使ç¨ăăŚăĺŽĺŽăăRustă§any-of-Traităčżăăă¨ăă§ăăžăă ăăăŻé常ăŤé ťçšăŤä˝żç¨ăăăćŠč˝ă§ăă serde_json::de::from_slice
ăŻăăăŠăĄăźăżă¨ăăŚ&[u8]
ăĺăă T where T: Deserialize
ăčżăăžăă
ăăă¤ăăŽçšć§ăćĺłăŽăă形ă§čżăăă¨ăă§ăăžăăăăăăç§ăăĄăč°čŤăăŚăăćŠč˝ă§ăă ă¸ă§ăăŞăăŻăšă使ç¨ăăŚăăăŻăšĺăăăŚăăŞăăŻăăźă¸ăŁăčżăăă¨ăă§ăăŞăăŽă¨ĺăăăăŤăăăˇăŞă˘ăŠă¤ăşé˘ć°ăŤĺĺ¨ă使ç¨ăăăă¨ăŻă§ăăžăăă ăăăăŻç°ăŞăćŠč˝ă§ăă
ăă錴ćăżăŽăăäžă¨ăăŚă Iterator::collect
ăŻäťťćăŽT where T: FromIterator<Self::Item>
ăčżăăă¨ăă§ăăžăăăăfn collect(self) -> any FromIterator<Self::Item>
ăćĺłăăžăă
ć§ćăŻăŠăă§ăăfn foo () -> _ : Trait { ... }
ćťăĺ¤ă¨fn foo (m: _1, n: _2) -> _ : Trait where _1: Trait1, _2: Trait2 { ... }
ăăŠăĄăźăżăŤă¤ăăŚăŻďź
ç§ăŤă¨ăŁăŚăć°ăăććĄăŻăŠăăăăăŽĺŞé
ăăŽä¸ă§impl Trait
ăŤčżăĽăăă¨ăŻăăăžăăă impl
ăŻăăăšăŚăŽRustăăă°ăŠăăźăŤăă§ăŤçĽăăăŚăăăăźăŻăźăă§ăăăăăŹă¤ăăŽĺŽčŁ
ăŤä˝żç¨ăăăăăăĺŽéăŤăŻăćŠč˝ăăăčŞä˝ă§ä˝ăăăŚăăăŽăă示ĺăăŚăăžăă
ăăăć˘ĺăŽăăźăŻăźăăŤĺşĺˇăăăă¨ăŻç§ăŤă¨ăŁăŚçćłçăŞăăă§ăă ăăŹăźăłăšăŤăŻimpl
for
ăăŚăăăźăľăŤăŤăŻ
ç§ăŻă
any
ă¨some
ă1ă¤ăŽăăźăŻăźă/ĺ°çŤ ăŤăžă¨ăăăă¨ăŤĺäşşçăŤĺ寞ăăŚăăžăă
@eddybç§ăŻăăă
((â T . Fâ¨TâŠ) â R) â â T . (Fâ¨T⊠â R)
硨éďźăăăŻä¸ćšĺă§ăăăĺĺă§ăŻăăăžăăă
çĄé˘äżďź impl Trait
ă揥ăŽăăăŞäťăŽĺ
ąĺ¤ä˝ç˝Žă§ă訹ĺŻăăé˘éŁććĄăŻăăăžăă
ăăăłfn fooďźăłăźăŤăăăŻďźFďź-> Răăă§ăFďźFnOnceďźimpl SomeTraitďź-> R {callbackďźcreate_somethingďźďźďź}ă
äťăŽă¨ăăăăăăŻĺż
čŚăŞćŠč˝ă§ăŻăăăžăăă impl SomeTrait
ăŤăă¤ă§ăĺ
ˇä˝çăŞćéăč¨ĺŽă§ăăăăăčŞăżăăăăćăŞăăăžăăăăă䝼ĺ¤ăŻĺ¤§ăăăă¨ă§ăŻăăăžăăă
ăăăăRFC 1522ćŠč˝ăĺŽĺŽăăĺ ´ĺă create_something
ăimpl SomeTrait
ďźĺ°ăŞăă¨ăăăăŻăšĺăăăŤďźăä¸č¨ăŽăăăŞăăă°ăŠă ăŤĺ署ĺăĺ˛ăĺ˝ăŚăăă¨ăŻ
@RufflewindçžĺŽăŽä¸çă§ăŻăçŠäşăŻăăăťăŠć確ă§ăŻăŞăăăăŽćŠč˝ăŻé常ăŤçšćŽăŞăăŠăłăăŽĺĺ¨ă§ăďźRustăŤăŻçžĺ¨ăăă¤ăăăăžăďźă
ăăăăăăă§ăăĺ
ąĺćŁă使ç¨ăăŚăé˘ć°ăŽĺźć°ăŽĺ
ĺ´ă¨ĺ¤ĺ´ă§impl Trait
ä˝ăćĺłăăăăĺ¤ćăăă ăă§ăă
ăăă ăă§ăŻä¸ĺĺă§ăďź
any
ă¨some
严ćšăçăăćăžăăĺ ´ĺďź@RufflewindăăăŻă impl Trait
ăä˝ă§ăăăăŤă¤ăăŚééăŁăăăŠăąăăăŽăăă§ăă HaskellăăăŽé˘äżăĺŠç¨ăăŚforall
ăăźăŻăźăăŽăżă使ç¨ăăŚćŽéć§ă¨ĺĺ¨ć§ăŽä¸Ąćšă襨ăăă¨ăŻçĽăŁăŚăăžăăăăăăŻç§ăăĄăč°čŤăăŚăăćčă§ăŻăăžăăăăžăăă
ăăŽĺŽçžŠăäžăŤă¨ăŁăŚăżăžăăăă
fn foo(x: impl ArgTrait) -> impl ReturnTrait { ... }
ăĺźć°ăŽimpl
ăŻćŽéçă§ăăăćťăĺăŽimpl
ăŻĺŽĺçă§ăăăă¨ăăăŤăźăŤă使ç¨ăăĺ ´ĺă foo
é˘ć°é
çŽĺăŽĺăŻčŤççăŤăăă§ăďźăĄă¤ăŻă˘ăăăżă¤ă襨č¨ďźďź
forall<T: ArgTrait>(exists<R: ReturnTrait>(fn(T) -> R))
impl
ăćčĄçăŤăŻćŽéçăžăăŻĺĺ¨çăŽăżăćĺłăăăăŽă¨ăăŚĺç´ăŤćąăăăă¸ăăŻčŞä˝ăćŠč˝ăăăăă¨ăŻĺŽéăŤăŻćŠč˝ăăžăăă ăăŞăăŻăăăĺžăă§ăăăďź
forall<T: ArgTrait, R: ReturnTrait>(fn(T) -> R)
ăžăăŻăăďź
exists<T: ArgTrait, R: ReturnTrait>(fn(T) -> R)
ăăăŚăăăăăŽăŠăĄăăăčŤççăŞăŤăźăŤăŤăăŁăŚç§ăăĄăćăăăŽăŤéĺ
ăăăžăăă ăăăăŁăŚăćçľçăŤany
/ some
ăŻăĺä¸ăŽăăźăŻăźăă§ăŻćăăăă¨ăă§ăăŞăéčŚăŞéăăćăăžăă std
ăăŚăăăźăľăŤăăŞăżăźăłăă¸ăˇă§ăłăŤé
罎ăăăă¨ăăĺççăŞäžăăăăžăă ăă¨ăă°ăăăŽIterator
ăĄă˝ăăăŻćŹĄăŽă¨ăăă§ăă
fn collect<B>(self) -> B where B: FromIterator<Self::Item>;
// is equivalent to
fn collect(self) -> any FromIterator<Self::Item>;
ăăăŚă impl
ă¨ĺźć°/ćťăčŚĺă§ăăăć¸ăćšćłăŻăăăžăăă
impl
ăćă¤tl; drăŻăćčä¸ăćŽéçăžăăŻĺŽĺçăŽăăăăă示ăăĺŽéăŤăŻ2ă¤ăŽç°ăŞăćĺłăä¸ăăžăă
ĺčăžă§ăŤăç§ăŽčĄ¨č¨ă§ăŻă @ Rufflewindăč¨ĺăăforall / existsăŽé˘äżăŻćŹĄăŽăăăŤăŞăăžăă
fn(exists<T: Trait>(T)) -> R === forall<T: Trait>(fn(T) -> R)
ăăăŻăçšć§ăŞăă¸ă§ăŻăďźĺĺ¨ďźăă¸ă§ăăŞăăŻďźăŚăăăźăľăŤďźă¨ĺçă§ăăă¨ăăćŚĺżľăŤé˘éŁăăŚăăžăăăăăŽimpl Trait
質ĺăŤăŻé˘éŁăăŚăăžăăă
ăăăŻč¨ăŁăŚăăç§ăŻăăany
/ some
埡ăćŻćăăŚăăžăăă ç§ăŻç§ăăĄă芹ăăŚăăăă¨ăŤă¤ăăŚćŁç˘şăŤč¨ăăăăŁăăŽă§ăăă any
/ some
ăŻăăŽçčŤçăăăłčŚčŚçăŞç´ ć´ăăăăćăŁăŚăăžăăăăłăłăăăšăă§impl
ă使ç¨ăăŚăĺéĄăăăžăăăŤăźăŤă ç§ăŻăăăăăšăŚăŽä¸čŹçăŞăąăźăšăăŤăăźăăćčä¸ăŽăăźăŻăźăććłăŽĺéĄăĺéżăăćŽăăŽĺĺäťăăżă¤ăăŽăăŠăĄăźăżăźăŤăăăăă§ăăă¨ćăăžăă
ăăŽçšă§ăăŚăăăźăľăŤăŽĺŽĺ ¨ăŞä¸čŹć§ă¨ä¸č´ăăăăŤăŻăćçľçăŤĺĺäťăĺŽĺăŽć§ćăĺż čŚăŤăŞăă¨ćăăžăăăăăŤăăăäťťćăŽwhereĺĽă¨ă署ĺăŽč¤ć°ăŽĺ ´ćă§ĺăĺŽĺă使ç¨ă§ăăăăăŤăŞăăžăă
čŚç´ăăă¨ăç§ăŻćşčśłăăŚăăă§ăăăďź
impl Trait
ăŻăăŚăăăźăľăŤă¨ăăŹăźăłăšăŽä¸ĄćšăŽççĽĺ˝˘ă§ăďźăłăłăăăšăăŤĺżăăŚďźăimplăćčĄçăŤăŻćŽéçăžăăŻĺĺ¨çăŽăżăćĺłăăăăŽă¨ăăŚĺç´ăŤćąăăăă¸ăăŻčŞä˝ăćŠč˝ăăăăă¨ăŻĺŽéăŤăŻćŠč˝ăăžăăă ăăŞăăŻăăăĺžăă§ăăăďź
@solsonç§ăŤă¨ăŁăŚăăăă¤ăźăăŞăĺ¤ćăŻăć°éĺăăăĺăŽč¨ĺˇăăăăăă§ăăăă ăăăăŁăŚă
ăăăłďźimpl MyTraitďźă
ăŽăăăŽĺăŞăć§ćçłă§ă
ăăăłďźĺĺ¨ăăTďźă
ăăăŻĺç´ăŞăăźăŤăŤĺ¤ćă§ăă ăăăăŁăŚăă impl
ăŻĺ¸¸ăŤĺĺ¨ăăăă¨ăăăŤăźăŤăŤĺžăĺç´ăŞçżťč¨łăŻă揥ăŽăăăŤăŞăăžăă
ăăăłfnďźĺĺ¨ăăTďź->ďźĺĺ¨ăăRďźă
揥ăŤăé˘ć°ăŽĺźć°ăăć°éčŠăĺźăĺşăă¨ă揥ăŽăăăŤăŞăăžăă
ăăăłăŤă¨ăŁăŚfnďźTďź->ďźĺĺ¨ăăRďźă
ăăăăŁăŚă T
ăŻĺ¸¸ăŤăăčŞä˝ăŤĺŻžăăŚĺĺ¨ăăžăăăé˘ć°ĺĺ
¨ä˝ăŤĺŻžăăŚăŻćŽéçă§ăăăăăŤčŚăăžăă
IMOăç§ăŻimpl
ăĺŽĺĺăŽäşĺŽä¸ăŽăăźăŻăźăăŤăŞăăăăăăŞăă¨ćăăžăă ĺ°ćĽçăŤăŻăăăăă揥ăŽăăăŞăăč¤éăŞĺĺ¨ĺăć§çŻăăĺŻč˝ć§ăăăăžăă
~~ăăłďźimplďźVecăTďźďźă
ăŚăăăźăľăŤăżă¤ăă¨ĺć§ăŤďźHRTBçľçąďź
ăăăłďź<'a> FnOnceďźďź' a TďźăŽĺ ´ĺďźă
@Rufflewind fn(T) -> (exists<R: ReturnTrait>(R))
ăŻčŤççăŤexists<R: ReturnTrait>(fn(T) -> R)
ă¨ĺçă§ăŻăŞăăăăăăŽăăĽăźăŻćŠč˝ăăžăăăăăăŻăreturn-type impl Trait
ĺŽéăŤćĺłăăăăŽă§ăă
ďźĺ°ăŞăă¨ăăĺŽĺ丝瞊ăŽăăăŤé¸ćăăăçšĺŽăŽč¨źäşşăé˘éŁăăĺăˇăšăă ăŤé常éŠç¨ăăăĺťşč¨çčŤçă§ăŻăăăžăăăĺč
ăŻăé˘ć°ăăăă¨ăă°ĺźć°ăŤĺşăĽăăŚčżăăăžăăžăŞĺăé¸ćă§ăăăă¨ăćĺłăăĺžč
ăŻă impl Trait
ăŽĺ ´ĺăŽăăăŤăé˘ć°ăŽăăšăŚăŽĺźăłĺşăăŤĺŻžăă1ă¤ăŽçšĺŽăŽăżă¤ăăďź
ç§ăăĄăĺ°ăé ăăăŁăŚăăă¨ćăăŚăăžăă ăłăłăăăšăimpl
ăŻĺŚĽĺćĄă¨ăăŚăŻĺéĄăŞăă¨ćăăžăăăăŽç¨ŽăŽćŁĺ˝ĺăŤĺ°éăăĺż
čŚăŻăŞăăçšăŤĺ˝šçŤă¤ă¨ăŻćăăžăăďźăăŽç¨ŽăŽčŤççăŞćĽçśăŤé˘ăăŚăŻăăŤăźăŤăćăăžăăă ďźă
@solsonăăă§ăăăĺĺ¨ă
(T â âR. f(R)) ⼠âR. T â f(R)
ăăăăŻä¸čŹçăŤĺ˝ăŚăŻăžăăžăăďź
(âR. T â f(R)) â T â âR. f(R)
(âA. g(A) â T) â ((âA. g(A)) â T)
ćĺžăŽăăŽăŻăă¸ă§ăăŞăăŻă¨ăăŚăŽĺźć°ăŽĺĺ¨ăŽĺ解éăŤč˛Źäťťăăăăžăă
硨éďźăăŁă¨ă (âA. g(A) â T) â (âA. g(A)) â T
ăŻćăçŤăĄăžăă
impl Trait
ăćĄĺźľăăŚĺŽĺŽăăăăăăŽčŠłç´°ăŞććĄăĺŤăRFCăć稿ăăžă
https://github.com/rust-lang/rfcs/pull/1951ăĺăĺ Ľăăăăăă¨ăŻćł¨çŽăŤĺ¤ă
çžĺ¨ăăăăŽçśćłăŻăŠăă§ăăďź ç§ăăĄăŻçé¸ăăRFCăćăŁăŚăăăćĺăŽĺŽčŁ ă使ç¨ăăŚăăäşşă ăăăžăăăç§ăŻä˝ăăăšăăăŻăŁăăăăŚăăžăăă
ďź43869ă§ă -> impl Trait
é˘ć°ăç´ç˛ăŤçşćŁăăćŹä˝ăăľăăźăăăŚăăŞăăă¨ăăăăăžăăă
fn do_it_later_but_cannot() -> impl Iterator<Item=u8> { //~ ERROR E0227
unimplemented!()
}
ăăăŻäşćłăăăžăăďź !
ăŻIterator
ćĺłăăŞăăăďźăăžăăŻăă°ă¨čŚăŞăăăžăăďź
ćťăĺ¤ă¨ăăŚä˝żç¨ă§ăăă ăă§ăŞăăçžĺ¨ăżă¤ăă使ç¨ă§ăăăăŽă¨ăăŚďźăăăăďźć¨ć¸ŹăăăĺăĺŽçžŠăăăŽăŻăŠăă§ăăďź
ä˝ăăŽăăăŞăăŽďź
type Foo: FnOnce() -> f32 = #[infer];
ăžăăŻăăźăŻăźăă§ďź
infer Foo: FnOnce() -> f32;
ăżă¤ăFoo
ăŻăăŞăżăźăłăżă¤ăăăăŠăĄăźăżăźăżă¤ăăăžăăŻăżă¤ăă使ç¨ă§ăăăăŽäťăŽăżă¤ăă¨ăăŚä˝żç¨ă§ăăžăăăç°ăŞăăżă¤ăăĺż
čŚă¨ăă2ă¤ăŽç°ăŞăĺ ´ćă§ä˝żç¨ăăăă¨ăŻéćłă§ăă type FnOnce() -> f32
ăăŠăĄăăŽĺ ´ĺă
infer Foo: FnOnce() -> f32;
fn return_closure() -> Foo {
|| 0.1
}
fn return_closure2() -> Foo {
|| 0.2
}
fn main() {
println!("{:?}, {:?}", return_closure()(), return_closure2()());
}
return_closure
ă¨return_closure2
ăăăŽćťăĺă严ćšă¨ăFnOnce() -> f32
ă§ăăăăăăăăŻăłăłăă¤ăŤăăăăšăă§ăŻăăăžăăăRustă§ăŻ2ă¤ăŽăŻăăźă¸ăŁăĺăĺăćăăŞăăăăăăăăŽĺăŻĺŽéăŤăŻç°ăŞăăžăă ă ăăăăŁăŚăä¸č¨ăăłăłăă¤ăŤăăăŤăŻă2ă¤ăŽç°ăŞăć¨ĺŽĺăĺŽçžŠăăĺż
čŚăăăăžăă
infer Foo: FnOnce() -> f32;
infer Foo2: FnOnce() -> f32; //Added this line
fn return_closure() -> Foo {
|| 0.1
}
fn return_closure2() -> Foo2 { //Changed Foo to Foo2
|| 0.2
}
fn main() {
println!("{:?}, {:?}", return_closure()(), return_closure2()());
}
ăăă§ä˝ă辡ăăŁăŚăăăŽăăŻăinferăăźăŻăźăăä˝ăăăăŽăăäşĺăŤçĽăăŞăăŚăăăłăźăăčŚăă°é常ăŤćç˝ă§ăăăé常ăŤćčťă ă¨ćăăžăă
inferăăźăŻăźăďźăžăăŻăăŻăďźăŻăĺşćŹçăŤă使ç¨ăăăŚăăĺ ´ćăŤĺşăĽăăŚăĺăä˝ă§ăăăăç解ăăăăăŤăłăłăă¤ăŠăźăŤć示ăăžăă ăłăłăă¤ăŠăĺăć¨ć¸Źă§ăăŞăĺ ´ĺăă¨ăŠăźăăšăăźăăăžăăăăăŻăĺż čŚăŞĺăçľăčžźăăăăŽĺĺăŞć ĺ ąăăŞăĺ ´ĺăŤçşçăăĺŻč˝ć§ăăăăžăďźăă¨ăă°ăć¨ć¸ŹăăăĺăăŠăăŤă使ç¨ăăăŚăăŞăĺ ´ĺăăăăăăăăŽçšĺŽăŽăąăźăšăčŚĺăŤăăćšăčŻăă§ăăăďźăăžăăŻăăă使ç¨ăăăăăšăŚăŽĺ ´ćăŤéŠĺăăăżă¤ăăčŚă¤ăăăă¨ăä¸ĺŻč˝ăŞĺ ´ĺďźä¸č¨ăŽäžăŽăăăŤďźă
@alvitawahttps ďź //github.com/rust-lang/rfcs/pull/2071ăĺç §ăăŚăă ăă
@cramertjăăăăăăăăăă§ăăŽĺéĄăŻă¨ăŚăć˛éťăăŚăăžăăă
ăăă§ă @ cramertjăŻăPRă§ééăăăŹă¤ăăăŚăłăăŞăźă¸ă§ăłăŽĺéĄă解湺ăăăŽăćĺă ă¨ç§ăăŠăŽăăăŤčăăŚăăăăŤă¤ăăŚç§ăŤĺ°ăăŚăăžăăă ç§ăŽčăă§ăŻăăăăăĺŽčŁ
ăĺ°ăăăŞăăźăŤăăăŚă anonymous type Foo
ă˘ăăŤă漽ăăżăŤăăŚăăžăă
ćčä¸ăă˘ă¤ăă˘ăŻĺ¤§ăžăăŤăăă§ă
fn foo<'a, 'b, T, U>() -> impl Debug + 'a
ăăŽăăăŞăăŽăŤďźä¸ç¨ŽăŽďźčąçłăăăžă
anonymous type Foo<'a, T, U>: Debug + 'a
fn foo<'a, 'b, T, U>() -> Foo<'a, T, U>
ăăŽăăŠăźă ă§ăŻă Foo
ĺźć°ă¨ăăŚčĄ¨ç¤şăăăăăăăŠăŽćąç¨ăăŠăĄăźăżăźăăăŁăăăŁăăăăă確čŞă§ăăžăăçšăŤă 'b
ăŻăăŽçšć§ĺç
§ăŤčĄ¨ç¤şăăăŞăăăăăăŁăăăŁăăăžăăăă¨ăŤăăăăżă¤ăăăŠăĄăźăżT
ă¨U
常ăŤă§ăă
ă¨ăŤăăăçžĺ¨ăłăłăă¤ăŠăźă§ăŻă impl Debug
ĺç
§ăăăĺ ´ĺăăăŽĺżĺĺă-äşĺŽä¸-襨ădef-idăä˝ćăăžăă 揥ăŤăă¸ă§ăăŞăăŻăăŠăĄăźăżăźăč¨çŽăăgenerics_of
ăŻă¨ăŞăăăăžăă çžĺ¨ăăăăŻăĺ˛ăăăłăłăăăšăă¨ĺăăăŽăă¤ăžăé˘ć°foo
čżăăžăă ăăăç§ăăĄăĺ¤ăăăăăŽă§ăă
ăĺ寞ĺ´ăăă¤ăžăfoo
ăŽç˝˛ĺă§ăŻă impl Foo
ăTyAnon
ă¨ăăŚčĄ¨ăăžăă ăăăŻĺşćŹçăŤćŁăăă§ă- TyAnon
ăŻăä¸č¨ăŽčąçłă§čŚăăăFoo
ă¸ăŽĺç
§ă襨ăăŚăăžăă ăăăăăăŽăżă¤ăăŽăsubstsăăĺĺžăăćšćłăŻăăidentityăé˘ć°ă使ç¨ăăăă¨ă§ăăăăăŻćăăăŤééăŁăŚăăžăăăžăăŻăĺ°ăŞăă¨ăä¸čŹĺăăăŚăăžăăă
ăăăăŁăŚăçšăŤăăă§çşçăăŚăăä¸ç¨ŽăŽăĺĺ犺ééĺăăăăăžăă ă˘ă¤ăă ăŽăIDăăľăăšăżăłăšăçćăăă¨ăé常ăăăŽă˘ă¤ăă ăăżă¤ăăă§ăăŻăăă¨ăăŤä˝żç¨ăă罎ćăĺžăăăžăăă¤ăžăăăšăłăźăĺ
ăŽăăšăŚăŽă¸ă§ăăŞăăŻăăŠăĄăźăżăźă使ç¨ăăžăă ăă ăăăăŽĺ ´ĺăé˘ć°foo()
ĺ
ăŤčĄ¨ç¤şăăăFoo
ă¸ăŽĺç
§ăä˝ćăăăăă foo()
ăŽă¸ă§ăăŞăăŻăăŠăĄăźăżăźăSubsts
ă Foo
ăăŽă§ăŻăăăžăăă äťăŽă¨ăăăăăăŻĺăă§ăăăăăăăăŻăăžăăžćŠč˝ăăžăăăĺŽéăŤăŻćŁăăăăăžăăă
ç§ăăĄăăăšăăă¨ăŻćŹĄăŽăăăŞăăŽ
ăžăă Foo
ăŽă¸ă§ăăŞăăŻĺăăŠăĄăźăżăźďźă¤ăžăăĺżĺĺčŞä˝ďźăč¨çŽăăă¨ăăŤăă¸ă§ăăŞăăŻăŽć°ăăăťăăăŽä˝ćăéĺ§ăăžăă ĺ˝çśăăżă¤ăăĺŤăžăăžăă ăăăăç术ăŤăăăŁăŚăç§ăăĄăŻçšć§ăŽĺ˘çăčśăăŚăăăŽä¸ăŤçžăăĺé ĺăçšĺŽăăžăă ăăăŻăcramertjăä˝ćăăăç°ăŞăăžăă
ç§ăăĄăăăăăăŽăŻă襨示ăăăé ĺăŽăťăăăčçŠăăŚä¸Śăšćżăă foo()
ăŽčŚłçšăăăăăăŽé ĺăŽĺ¤ă追补FreeRegion
ăŽćŚĺżľăăăăžăăăăăăăŻăťă¨ăăŠćŠč˝ăăŚăăžăăăă FreeRegion
ăćŠćăŤä˝żç¨ăăăăŽă§ăŻăŞăăĺžćăŤä˝żç¨ăăăăŽăŤăŽăżä˝żç¨ăăžăăďź
ăăăăćăç°Ąĺă§ćčŻăŽăŞăăˇă§ăłăŻRegion<'tcx>
使ç¨ăăăă¨ă§ăăăĺ°ĺ
Ľăăăăă¤ăłăăźăăăăŁăłăťăŤăăăăăăŤădebruijnă¤ăłăăăŻăšăŽćˇąăăăˇăăăăĺż
čŚăăăăžăă ăăăăăăăŻăăăăćčŻăŽé¸ćă§ăă
ăăăăŁăŚăĺşćŹçăŤvisit_lifetime
ă§ăłăźăŤăăăŻăĺĺžăăă¨ăăăăăĺćăŽćˇąăă§čĄ¨ăăăRegion<'tcx>
ĺ¤ćăăžăďźăă¤ăłăăźăééăăă¨ăăŤčż˝čˇĄăăĺż
čŚăăăăžăďźă ăăăăăăŻăăŤăŤčçŠăăéč¤ăćé¤ăăžăă
ĺŽäşăăăă2ă¤ăŽăă¨ăăăăžăă
RegionParameterDef
ăăźăżć§é ă確čŞăăĺż
čŚăăăăžă...ďź ăOKăăăăä¸ĺŻč§ŁăŞĺ ´ĺăŻçłă訳ăăăžăăă ç§ăŻăăăăăć確ăŤč¨ăćšćłăĺŽĺ ¨ăŤç解ăăăă¨ăŻă§ăăžăăă ăăăăăăŞăăă¨ă§ăăăäťăŽă¨ăăăăŞăźă¸ă§ăłăŽĺŚçăŻăăŞăč¤éă ă¨ćăăŚăăăŽă§ăăŞăăĄăŻăżăŞăłă°ăăŚăăĺä¸ăŤăăćšćłăăăăŽă§ăŻăŞăă§ăăăăă @eddybăăăă§ăăă¤ăăŽčăăćăŁăŚăăăă¨ă$ 10ăŤčłăăžăă ;ďź
@nikomatsakisăăăŽĺ¤ăăŻç§ă@cramertjăŤč¨ăŁăăă¨ă¨äźźăŚăăă¨ćăăžăăăăăŁă¨čäťăăăăŚăăžăďź
ç§ăŻĺŽĺçăŞimpl Trait
ăŤă¤ăăŚčăăŚăăžăăăăć
éăŤé˛ăăĺż
čŚăăăă¨ćăĺĽĺŚăŞăąăźăšăŤééăăžăăă ăăŽé˘ć°ăŤă¤ăăŚčăăŚăżăžăăăă
trait Foo<T> { }
impl Foo<()> for () { }
fn foo() -> impl Foo<impl Debug> {
()
}
ăăŹă¤ćăŤć¤č¨źă§ăă
ĺ
ˇä˝çăŤăŻăăăă§čżăăăĺďź ()
ďźăăŠăŽăăăŤć¨ć¸ŹăăăăŻćăăă§ăă impl Debug
ăăŠăĄăźăżăźăŽăżă¤ăăăŠăŽăăăŤć¨ć¸ŹăăăăŻăăžăć確ă§ăŻăăăžăăă ă¤ăžăăăăŽćťăĺ¤ăŻ-> ?T
ăăăŞăăŽă¨čăăăă¨ăă§ăăžăăăăă§?T: Foo<?U>
ă§ăă ?T = ()
ă¨ăăäşĺŽă ăăŤĺşăĽăăŚă ?T
�U
ăŽĺ¤ăć¨ć¸Źăăĺż
čŚăăăăžăă
çžĺ¨ăăăăčĄăăŤăŻăimplă1ă¤ăăăŞăă¨ăăäşĺŽăĺŠç¨ăăžăă ăă ăăăăăŻĺŁăăăăăăăăăŁă§ăă ć°ăăimplăčż˝ĺ ăăăă¨ăăłăźăăŻăłăłăă¤ăŤăăăŞăăŞăăžăăăăăŻă ?U
ä˝ă§ăăăăä¸ćăŤĺ¤ĺĽă§ăăŞăăăă§ăă
ăăăŻăRustăŽĺ¤ăăŽăˇăăŞăŞă§çşçăăĺŻč˝ć§ăăăăžăăăăăŻĺĺăŤć¸ĺżľăăăŚăăžăăăç´äş¤ăăŚăăžăăă impl Trait
ĺ ´ĺăŤăŻĺĽăŽăă¨ăăăăžăă impl Trait
ĺ ´ĺăăŚăźăśăźăĺ注éăčż˝ĺ ăăŚć¨čŤăăŹă¤ăăăćšćłăăăăžăăă ăžăăăăŽăăăŞćšćłăŽč¨çťăĺŽéăŤăŻăăăžăăă ĺŻä¸ăŽč§ŁćąşçăŻăfnă¤ăłăżăźăă§ăźăšăimpl Foo<()>
ăžăăŻăăŽäťăŽć示çăŞăăŽăŤĺ¤ć´ăăăă¨ă§ăă
ĺ°ćĽçăŤăŻă abstract type
ă使ç¨ăăŚăăŚăźăśăźăé襨示ăŽĺ¤ăć示çăŤćĺŽă§ăăăăăŤăăăă¨ăćłĺă§ăăžăďźăžăăŻă _
ă使ç¨ăăŚăä¸ĺŽĺ
¨ăŞăăłăă使ç¨ăăăă¨ăă§ăăžăďźăĺăăăăŞăăŻă¤ăłăżăźăă§ă¤ăš
abstract type X: Debug = ();
fn foo() -> impl Foo<X> {
()
}
ăăă§ăăé˘éŁăăĺăă¤ăłăăŁăłă°ăé¤ăăŚăć˘ĺăŽimplăăŹă¤ăăŽăăăšăăăăă使ç¨ăĺŽĺŽăăăăă¨ăéżăăăŽă賢ćă ă¨ćăăžăďźăă¨ăă°ă impl Iterator<Item = impl Debug>
ăŻăăăăŽăăăžăăăŽĺ˝ąéżăĺăăžăăďźă
impl TraităŽĺ ´ĺăăŚăźăśăźăĺ注éăčż˝ĺ ăăŚć¨čŤăăŹă¤ăăăćšćłăăăăžăăă ăžăăăăŽăăăŞćšćłăŽč¨çťăĺŽéăŤăŻăăăžăăă
ăăăăăăăŻUFCSăŽăăăŤčŚăăăăăăăžăăăďź äžďź <() as Foo<()>>
-裸ăŽas
ăăăŤăżă¤ăăĺ¤ć´ăăăćć§ăă解ćśăăă ăă§ăă ::
䝼ä¸ăçśăăă¨ăćłĺŽăăŚăăăăăăăăŻçžĺ¨çĄĺšăŞć§ćă§ăă
Fn
implTraită使ç¨ăăĺć¨čŤăŤé˘ăăčĺłćˇąăăąăźăšăčŚă¤ăăžăăă
揥ăŽăłăźăăŻĺéĄăŞăăłăłăă¤ăŤăăăžăă
fn op(s: &str) -> impl Fn(i32, i32) -> i32 {
match s {
"+" => ::std::ops::Add::add,
"-" => ::std::ops::Sub::sub,
"<" => |a,b| (a < b) as i32,
_ => unimplemented!(),
}
}
ăľăăŠă¤ăłăăłăĄăłăă˘ăŚăăăă¨ăăłăłăă¤ăŤă¨ăŠăźăăšăăźăăăžăă
error[E0308]: match arms have incompatible types
--> src/main.rs:4:5
|
4 | / match s {
5 | | "+" => ::std::ops::Add::add,
6 | | // "-" => ::std::ops::Sub::sub,
7 | | "<" => |a,b| (a < b) as i32,
8 | | _ => unimplemented!(),
9 | | }
| |_____^ expected fn item, found closure
|
= note: expected type `fn(_, _) -> <_ as std::ops::Add<_>>::Output {<_ as std::ops::Add<_>>::add}`
found type `[closure@src/main.rs:7:16: 7:36]`
note: match arm with an incompatible type
--> src/main.rs:7:16
|
7 | "<" => |a,b| (a < b) as i32,
| ^^^^^^^^^^^^^^^^^^^^
error: aborting due to previous error
@oberienăăăŻimpl Trait
ăŻé˘äżăăŞăăăă§ăăăăăŻăä¸čŹçăŞć¨čŤăŤĺ˝ăŚăŻăžăăžăă ăăŞăăŽäžăŽăăŽăăăăŞäżŽćŁă芌ăăŚăă ăăďź
fn main() {
let _: i32 = (match "" {
"+" => ::std::ops::Add::add,
//"-" => ::std::ops::Sub::sub,
"<" => |a,b| (a < b) as i32,
_ => unimplemented!(),
})(5, 5);
}
ăăăŻçžĺ¨ééăăăŚăăăăă§ăďź
ă¨ăŞă¸ăŞăłă¨ç¸äşä˝ç¨ăăă¨ăăŽICE
ăăŽĺˇăăăŁăšăŤăăˇă§ăłăŤč¨čźăăăŚăăŞăăă¨ăŽ1ă¤ăŻăĺźăłĺşăĺ
ăăćäžăăăŚăăŞăăŻăăźă¸ăŁă¨ă¸ă§ăăŹăźăżăć§é ä˝ăăŁăźăŤăăŤć źç´ăăćŠč˝ă§ăă çžĺ¨ăăăăŻĺŻč˝ă§ăăăčŚăçŽăŻéăă§ăăĺăŻăăźă¸ăŁăź/ă¸ă§ăăŹăźăżăźăăŁăźăŤăăŽć§é ä˝ăŤĺăăŠăĄăźăżăźăčż˝ĺ ăăŚăăăăłăłăšăăŠăŻăżăźé˘ć°ăŽăˇă°ăăăŁă§ăăăŽĺăăŠăĄăźăżăźăimpl FnMut/impl Generator
ăŤç˝Žăćăăžăă ăăăäžă§ăăăăăŚăăăŻăăŞăăŻăźăŤă§ăďź ăăăăăăăŻćăžăăăă¨ăăăăăćŽăŁăŚăăžăă typeăăŠăĄăźăżăĺăé¤ăăă¨ăă§ăăă°ăăŻăăăŤčŻăă§ăăăďź
struct Counter(impl Generator<Yield=i32, Return=!>);
impl Counter {
fn new() -> Counter {
Counter(|| {
let mut x: i32 = 0;
loop {
yield x;
x += 1;
}
})
}
}
impl Trait
ăŻăăăăčĄăćŁăăćšćłă§ăŻăŞăĺŻč˝ć§ăăăăžăăRFC2071ăćŁăăčŞăă§ç解ăăŚăăă°ăăăăăć˝čąĄĺă§ăă ĺż
čŚăŞăŽăŻăĺŽéăŽĺďź [generator@src/main.rs:15:17: 21:10 _]
ďźăć¨ć¸Źă§ăăăăăŤć§é ä˝ĺŽçžŠăŤč¨čż°ă§ăăăăŽă§ăă
@mikeyhewć˝čąĄĺăŻă確ăăŤç§ăăĄăćĺž ăăćšćłă§ăăă¨ç§ăŻäżĄăăŚăăžăă ć§ćăŻăăăă揥ăŽăăăŤăŞăăžă
abstract type MyGenerator: Generator<Yield = i32, Return = !>;
pub struct Counter(MyGenerator);
impl Counter {
pub fn new() -> Counter {
Counter(|| {
let mut x: i32 = 0;
loop {
yield x;
x += 1;
}
})
}
}
ç§ăć§é ăŤĺ
ĽăăăăŽăäťăŽčŞ°ăăŽimpl Generator
ăăăă彟ăăç§ă使ç¨ăăăăăŽabstract type
ăä˝ćăăŞăăŁăĺ ´ĺăăăŠăźăŤăăăŻăăšăŻăăăžăăďź
@scottmcmăăŞăăŻăžă ăăŞăčŞčşŤăŽabstract type
厣č¨ăăăă¨ăă§ăăžăďź
// library crate:
fn foo() -> impl Generator<Yield = i32, Return = !> { ... }
// your crate:
abstract type MyGenerator: Generator<Yield = i32, Return = !>;
pub struct Counter(MyGenerator);
impl Counter {
pub fn new() -> Counter {
let inner: MyGenerator = foo();
Counter(inner)
}
}
@cramertjĺž ăŁăŚăă ăăăć˝čąĄĺăŻăă§ăŤćŻćŠăăăžăăďźďź PRăŻăŠăăŤăăăžăăďź
@alexregăăăăăăă§ăŻăăăžăăă
硨éďźăć¨ćśăćŞćĽăăăŽč¨Şĺč ďź äťĽä¸ăŽĺéĄăŻč§Łćąşăăăžăăă
ďź47348ăŤçťĺ ´ăăăăŽăăĄăłăăźăŞă¨ăă¸ăąăźăšăŤćł¨çŽăăă
use ::std::ops::Sub;
fn test(foo: impl Sub) -> <impl Sub as Sub>::Output { foo - foo }
ăăŽăăăŞimpl Trait
äşć¸Źăčżăăă¨ă訹ĺŻăăăăšăă§ăăďź ďźçžĺ¨ă__ăăăŻ.__ă§ăăăăďź
ăăŽăăăŞä˝żç¨ćłăŤă¤ăăŚăŽč°čŤăŻčŚă¤ăăăžăăă§ăăăăăăŽăăšăăąăźăšăčŚă¤ăăăžăăă§ăăă
@ExpHPăăźăă impl Foo<impl Bar>
ăĺéĄăŤăŞăăŽă¨ĺăççąă§ăĺéĄăăăăăăŤčŚăăžăă ĺşćŹçăŤăĺéĄăŽăżă¤ăăŤĺŽéăŽĺśç´ăŻăăăžăăăăżă¤ăăăć役ăăăăăŽă ăăŤ
implsăŽăĺśç´äťăĺăăŠăĄăźăżăźăăŤé˘ăăăă¸ăăŻăĺĺŠç¨ăăăă¨ćăăžăă ă¤ăžăăăŞăżăźăłăżă¤ăăćĺŽăăă¨ă impl Sub
ăăĺśç´ăăăăăŻăă§ăă ç§ăĺç
§ăăŚăăé˘ć°ăŻăăă§ăďź
ăă§ăăŻăăăŻăšă弽ăăŞäşşăŽăăăŽăĄăăŁă¨ăăăăŞă˘ăźă¸ďź
@rfcbotfcpăăźă¸
conservative_impl_trait
ă¨universal_impl_trait
ćŠč˝ăĺŽĺŽăăă1ă¤ăŽĺ¤ć´ăäżçăăăă¨ăććĄăăžăďźhttps://github.com/rust-lang/rust/issues/46541ăŽäżŽćŁďźă
ăăăăŽćŠč˝ăŽăăšăăŻă揥ăŽăăŁăŹăŻăăŞăŤăăăžăă
run-pass / impl-trait
ui / impl-trait
compile-fail / impl-trait
impl Trait
ăŽč§ŁćăŽčŠłç´°ăŻă RFC 2250ă§č§Łćąşăăă httpsďź//github.com/rust-lang/rust/pull/45294ă§ĺŽčŁ
ăăăžăă
impl Trait
ăŻăăăăžăăăé˛ăăăăŤăăăšăăăăéé˘éŁäťăăżă¤ăăŽä˝ç˝Žă¨çšĺŽăŽäżŽéŁžăăăăăšăŽä˝ç˝ŽăăçŚć˘ăăăŚăăžăă ăăăŻhttps://github.com/rust-lang/rust/pull/48084ă§ĺŽčŁ
ăăăžăă
ăăŽĺŽĺŽĺăŽĺžăĺźć°ăŽä˝ç˝Žă¨éçšć§é˘ć°ăŽćťăä˝ç˝Žă§impl Trait
ă使ç¨ă§ăăăăăŤăŞăăžăă ăă ăăĺ°ćĽăŽč¨č¨ăŽĺ垊ăĺŻč˝ăŤăăăăăŤă Fn
ć§ćăŽăŠăă§ăimpl Trait
ă使ç¨ăăăă¨ăŻĺźăçśă訹ĺŻăăăŚăăžăăă ăăăŤăĺźć°ăŽä˝ç˝Žă§impl Trait
ă使ç¨ăăé˘ć°ăŽĺăăŠăĄăźăżăźăćĺă§ćĺŽăăăă¨ăŻă§ăăžăăă
ăăźă ăĄăłăăźăŽ@cramertjăŻăăăăăăźă¸ăăăă¨ăććĄăăžăăă 揥ăŽăšăăăăŻăăżă°äťăăăăćŽăăŽăăźă ăŤăăăŹăăĽăźă§ăă
çžĺ¨ăŞăšăăăăŚăăć¸ĺżľăŻăăăžăăă
ăŹăăĽăźă˘ăŽéĺć°ăćżčŞăăă¨ďźăăăŚĺ寞ăŻăăăžăăďźăăăăŻćçľăłăĄăłăćéăŤĺ Ľăăžăă ăăŽăăăťăšăŽăŠăŽćçšă§ăć辡ăăăŚăăŞă大ăăŞĺéĄăčŚă¤ăăĺ ´ĺăŻă声ăä¸ăăŚăă ăăă
ăżă°äťăăăăăăźă ăĄăłăăźăç§ăŤä¸ăăăă¨ăă§ăăăłăăłăăŤă¤ăăŚăŻăăăŽăăăĽăĄăłăăĺç §ăăŚăă ăăă
ăăŽĺŽĺŽĺăŽĺžăéăăŹă¤ăé˘ć°ăŽĺźć°ä˝ç˝Žă¨ćťăä˝ç˝Žă§implăăŹă¤ăă使ç¨ă§ăăăăăŤăŞăăžăă ăă ăăĺ°ćĽăŽč¨č¨ăŽĺ垊ăĺŻč˝ăŤăăăăăŤăFnć§ćăŽăŠăă§ăimplTraită使ç¨ăăăă¨ăŻĺźăçśă訹ĺŻăăăŚăăžăăă ăăăŤăĺźć°ăŽä˝ç˝Žă§implTraită使ç¨ăăé˘ć°ăŽĺăăŠăĄăźăżăźăćĺă§ćĺŽăăăă¨ăŻă§ăăžăăă
çšć§é˘ć°ăŽĺźć°/ćťăä˝ç˝ŽăăžăăŻFnć§ćă§impl Trait
ă使ç¨ăăçśćłăŻăŠăăŞăŁăŚăăžăăďź
@alexreg Return-ăăŹă¤ăĺ
ăŽimpl Trait
ä˝ç˝ŽăŻăRFCă§ăăăăŻăăăžăăăRFC 2071ăŻăĺŽčŁ
ăăăă¨ĺć§ăŽćŠč˝ă訹ĺŻăăžăă çšć§ĺ
ăŽĺźć°ä˝ç˝Žimpl Trait
ăŻăç§ăçĽăŁăŚăăćčĄçćŠč˝ă§ăŻăăăăŻăăăŚăăžăăăăRFCă§ć示çăŤč¨ąĺŻăăăŚăăŞăăăăĺ˝é˘ăŻççĽăăăŚăăžăă
impl Trait
Fn
ć§ćăŽĺźć°ä˝ç˝ŽăŤăăT: Fn(impl Trait)
ăT: for<X: Trait> Fn(X)
ăăˇăĽăŹăźăăĺż
čŚăăăă¨čăăäşşăăăăăă§ăă impl Trait
Fn
ć§ćăŽćťăä˝ç˝ŽăŤăăimpl Trait
ăŻăç§ăçĽăŁăŚăăćčĄçăŞççąă§ăăăăŻăăăŚăăžăăăăRFCă§ăŻăăăăŞăč¨č¨ä˝ćĽăčĄăăăăžă§č¨ąĺŻăăăŚăăžăăă§ăăăăăăĺŽĺŽăăăĺăŤăĺĽăŽRFCăžăăŻĺ°ăŞăă¨ăĺĽăŽFCPăĺç
§ăăŚăă ăăă
@cramertjăăăăžăăăć´ć°ăăŚăăă ăăăăă¨ăfoo: T
ăŤćĺłăăăăžăăăăă§ă T: Trait
ăŻăç§ăééăŁăŚăăŞăéăă foo: impl Trait
ă¨ĺçă§ăă
ć¸ĺżľäşé ďź https ďź//github.com/rust-lang/rust/issues/34511#issuecomment-322340401ăŻĺźăçśăĺăă§ăă 䝼ä¸ă訹ĺŻăăăă¨ăŻĺŻč˝ă§ăăďź
fn do_it_later_but_cannot() -> impl Iterator<Item=u8> { //~ ERROR E0227
unimplemented!()
}
@kennytmăăăăçžćçšă§ăŻä¸ĺŻč˝ă§ăă ăăŽé˘ć°ăŻ!
čżăăžăăăăăăŻćĺŽăăçšć§ăĺŽčŁ
ăăŚăăăăéŠĺăŞĺăŤĺ¤ćăăăĄăŤăăşă ăăăăžăăă ăăăŻćŽĺżľăŞăă¨ă§ăăăçžćçšă§äżŽćŁăăç°ĄĺăŞćšćłăŻăăăžăăďź !
ăăăŤĺ¤ăăŽçšć§ăĺŽčŁ
ăăăă¨ăé¤ăă°ďźă ăžăăĺ°ćĽäżŽćŁăăăăăŽä¸ä˝äşćć§ăăăăžăăăăăćŠč˝ăăăă¨ăĺłĺŻăŤĺ¤ăăŽăłăźăăăłăłăă¤ăŤă§ăăăăăŤăŞăăăă§ăă
ăżăźăăăŁăăˇăĽăŽčłŞĺăŻĺĺăă解湺ăăăŚăăžăăă ĺźć°ăŽimpl Trait
ăăăăŞăăŻăă§ăăŻăŽć°ăăimpl Trait
ăŤă¤ăăŚĺ°ăŞăă¨ăčŚĺăăĺż
čŚăăăăžăă
ĺćŠăŻăĺźć°ăć示çăŞă¸ă§ăăŞăăŻăăimpl Trait
ĺ¤ć´ăăăă¨ăŤăăăăŠă¤ăăŠăŞăăŚăźăśăźăŽăżăźăăăŁăăˇăĽăĺŁăăŞăăăăŤăăăă¨ă§ăă é大ăŞĺ¤ć´ă§ăăăăŠăăăăŠă¤ăăŠăŞăçĽăăăăŽĺŞăăăŞăăĄăŹăłăšăŹă¤ăăŻăžă ăăăžăăăăăšăă§ăăăć¤ĺşăăăĺŻč˝ć§ăŻăťă¨ăăŠăăăžăăă ăăŽĺéĄăŤă¤ăăŚăŻĺĺăŤč°čŤăăăŚăăžăăă§ăăăĺŽĺ
¨ăŤćąşĺŽăăĺăŤĺŽĺŽăăăăĺ ´ĺăŻăĺ°ăŞăă¨ăéălibä˝ćč
ăŽčśłĺ
ăăé ăăăĺż
čŚăăăăžăă
ĺćŠăŻăĺźć°ăć示çăŞă¸ă§ăăŞăăŻăă
impl Trait
ĺ¤ć´ăăăă¨ăŤăăăăŠă¤ăăŠăŞăăŚăźăśăźăŽăżăźăăăŁăăˇăĽăĺŁăăŞăăăăŤăăăă¨ă§ăă
ăăă辡ăăĺ§ăăäşşă
ăçžĺ¨çăăălang-teamăŽäşşă
ăä¸ĺšłăč¨ăĺ§ăăă¨ăă impl Trait
ăăżăźăăăŁăăˇăĽă§ĺĺźć°ăć示çăŤćäžăăăă¨ăăľăăźăăăăšăă§ăăă¨ç˘şäżĄăăăă¨ăéĄăŁăŚăăžăă
@leodasvacas
ăżăźăăăŁăăˇăĽăŽčłŞĺăŻĺĺăă解湺ăăăŚăăžăăă ĺźć°ăŽimplTraităŻăăăăŞăăŻăă§ăăŻăŽć°ăăăăŠă¤ăăźăăŽăăŠă¤ăăźăăżă¤ăă§ăăă¨čăăŚăĺ°ăŞăă¨ăăĺšćçăŤăăăŞăăŻé˘ć°ăŽĺźć°ăŽimplTraităŤă¤ăăŚčŚĺăăĺż čŚăăăăžăă
ç§ăŻĺćăăžăă-ăăăŻč§Łćąşăăăžăăă ĺ˝é˘ăăăăăŽćŠč˝ăŽăăăŤăżăźăăăŁăăˇăĽăĺŽĺ
¨ăŤçŚć˘ăăžăă ć示çăŞă¸ă§ăăŞăăŻăăŠăĄăźăżăźăŽäťŁăăăŤimpl Trait
ă使ç¨ăăăăăŤăăăŞăăŻé˘ć°ăŽăˇă°ăăăŁăĺ¤ć´ăăăă¨ăŻăé大ăŞĺ¤ć´ă§ăă
ĺ°ćĽăăăăăŽé˘ć°ăŤăżăźăăăŁăăˇăĽă訹ĺŻăăĺ ´ĺă impl Trait
ăżă¤ăăŽăăŠăĄăźăżăźăŽăżăćĺŽă§ăăăăăŤăŞăĺŻč˝ć§ăăăăžăă
https://github.com/rust-lang/rust/pull/49041ăçé¸ăăăžă§ĺŽĺŽăăăăăŞăăă¨ăäťăĺ ăăŚăăăžăă ďźăăăăăăžăăăă°ăăăăŻăăăŤăŞăăžăăďź
ăăăăŁăŚăďź49041ăŤăŻďź46541ăŽäżŽćŁăĺŤăžăăŚăăžăăăăăŽäżŽćŁăŻç§ăäşćłăăăăă大ăăŞĺ˝ąéżăĺăźăăžăďźăă¨ăă°ăăłăłăă¤ăŠăŻçžĺ¨ăăźăăšăăŠăăăăăžăăďźăăăăŤăăăăăă§ćŁăăăłăźăšăŤă¤ăăŚä¸ćĺć˘ăăăă¨ăă§ăăžăă ďź49041ăŽĺéĄăŻăćłĺŽĺ¤ăŽăŠă¤ăăżă¤ă ă誤ăŁăŚăŞăźăŻăăĺŻč˝ć§ăăăăă¨ă§ăă ăăăăłăłăă¤ăŠă§ăŠăŽăăăŤçžăăăă揥ăŤç¤şăăžăă ăăŽăăăŞćšćłăăăăăăăăžăăďź
impl TyCtxt<'cx, 'gcx, 'tcx>
where 'gcx: 'tcx, 'tcx: 'cx
{
fn foos(self) -> impl Iterator<Item = &'tcx Foo> + 'cx {
/* returns some type `Baz<'cx, 'gcx, 'tcx>` that captures self */
}
}
ăăă§éčŚăŞăă¨ăŻă TyCtxt
ăŻ'tcx
ă¨'gcx
ă§ä¸ĺ¤ă§ăăăăăăŞăżăźăłăżă¤ăăŤčĄ¨ç¤şăăăĺż
čŚăăăă¨ăăăă¨ă§ăă ăăă§ăă 'cx
ă¨'tcx
ăŽăżăimplăăŹă¤ăăŽĺ˘çăŤčĄ¨ç¤şăăăăăăăăă2ă¤ăŽăŠă¤ăăżă¤ă ăŽăżăăăăŁăăăŁăăăăăă¨ăŤăŞăŁăŚăăžăă ĺ¤ăăłăłăă¤ăŠăŻ'gcx: 'cx
ăăăŤăăăĺăĺ
ĽăăŚăăžăăăăç§ăăĄăčăăŚăăčąçłăŤă¤ăăŚčăăă¨ăăăăŻĺŽéăŤăŻćŁăăăăăžăăă ăăŽčąçłăŻă揥ăŽăăăŞć˝čąĄĺăä˝ćăăžăă
abstract type Foos<'cx, 'tcx>: Iterator<Item = &'tcx Foo> + 'cx;
ăăă§ăăăăŽć˝čąĄĺăŽĺ¤ăŻBaz<'cx, 'gcx, 'tcx>
ăă 'gcx
ăŻăšăłăźăăŤĺŤăžăăŚăăžăăă
ăăă§ăŽĺéżçăŻăĺ˘çĺ
ăŤ'gcx
ă¨ăăĺĺăäťăăĺż
čŚăăăăă¨ă§ăă ăăăŻăăŁăăăŞăă¨ă§ăă 'cx + 'gcx
ăŻä˝żç¨ă§ăăžăăă ăăăźăŽçšć§ăä˝ćăăă¨äťŽĺŽă§ăăžăă
trait Captures<'a> { }
impl<T: ?Sized> Captures<'a> for T { }
揥ăŤăăăŽimpl Iterator<Item = &'tcx Foo> + Captures<'gcx> + Captures<'cx>
ăăăŞăăŽăčżăăžăă
注ćăĺżăăăă¨ăăăăžăă厣č¨ăăăăŞăżăźăłăżă¤ăădyn Iterator<Item = &'tcx Foo> + 'cx
ĺ ´ĺă dyn
ăżă¤ăăŻćĺšćéăćśĺťăăă¨äşćłăăăăăăĺéĄăăăžăăă ăăăăŁăŚă dyn Trait
ä¸ĺŻč˝ăŞimpl Trait
ă§ĺéĄăŽăăăă¨ăŻä˝ăă§ăăŞăă¨äťŽĺŽăăŚăăăă§ä¸ĺĽĺ
¨ăçşçăăĺŻč˝ć§ăŻăŞăă¨ćăăžăă
ć˝čąĄĺăŽĺ¤ăĺć§ăŽĺŽĺçă§ăăă¨ăăčăăćź çśă¨ćłĺăăăă¨ăă§ăăžăďź exists<'gcx> Baz<'cx, 'gcx, 'tcx>
ă
ăă ăăäżĺŽçăŞăľăăťăăďźä¸č¨ăŽfnsăé¤ĺ¤ăăďźăĺŽĺŽăăăĺžă§ăŠăŽăăăŤčăăăăăćąşĺŽăăăăăăăćĄĺźľăŽĺŻč˝ć§ă¨ăăŚĺć¤č¨ăăăă¨ăŻĺéĄăŞăăăă§ăă
ć´ć°ďź dyn
çšć§ăŤă¤ăăŚăŽç§ăŽćĺłăć確ăŤăăăăăŤďźĺ˘çďźăăă§ăŻ'cx
ďźăăăăäżč¨źăăéăă 'gcx
ăăăŞăŠă¤ăăżă¤ă ăăé ăăăă¨ăă§ăăă¨č¨ăŁăŚăăžă'gcx
dyn Trait
ă使ç¨ăăăŚăăĺ ´ćă§ăŻă 'gcx
ăŻĺźăçśăćĺšă§ăă
@nikomatsakisăăăŻčĺłćˇąăäžă§ăăăăăă§ăŽĺşćŹçăŞč¨çŽăĺ¤ăăă¨ăŻćăăžăăăă¤ăžăăé˘éŁăăăăšăŚăŽăŠă¤ăăżă¤ă ăăŞăżăźăłăżă¤ăă ăăăć確ăŤăăĺż čŚăăăăžăă
Captures
çšć§ăŻăăăŽçśćłăŤéŠăăčť˝éăŽă˘ăăăźăăŽăăă§ăă äťăŽă¨ăăä¸ĺŽĺŽăŞstd::marker
ăŤĺ
ĽăĺŻč˝ć§ăăăăăă§ăăďź
@nikomatsakisăăŞăăŽăăŠăăźă˘ăăăłăĄăłăăŻăăăŽĺ ´ĺăŤ'gcx
ăĺé¤ăăăă¨ăćĺž
ăăççąăç解ăăăăăŤăăăă§ăăšăŚăŽé¨ĺăĺŽĺ
¨ăŤăžă¨ăăŚăăŞăăŁăăă¨ăŤć°ăĽăăžăăăă¤ăžăă 'gcx
ăŻăŻăŠă¤ă˘ăłăăŽčŚłçšăăčŚăăé˘éŁăăç术ăă ăăăăŤăăăäżĺŽçăŞăšăżăźăăŻĺéĄăŞăăăă§ăă
ç§ăŽĺäşşçăŞćčŚă§ăŻă httpsďź//github.com/rust-lang/rust/issues/46541ăŻĺŽéăŤăŻăă°ă§ăŻăăăžăăTrait
ăĺŽčŁ
ăăăŠă¤ăăżă¤ă 'a
ăimpl Trait + 'a
ă¨ăăŚĺçśăăăăżă¤ăăăäťăŽăŠă¤ăăżă¤ă ăŤé˘äżăŞăčżăăă¨ăă§ăăăŻăă§ăă ăă ăă@ rust-lang / langă弽ăăŽă§ăăă°ăăăäżĺŽçăŞă˘ăăăźăăĺŽĺŽăăăŚéĺ§ăăăă¨ăŻĺéĄăăăžăăă
ďźăă1ă¤ć確ăŤăăĺż
čŚăăăăžăăďź49041ăŽäżŽćŁă§ă¨ăŠăźăçşçăăăŽăŻăé襨示ăŽĺăćŹ č˝ăăŚăăăŠă¤ăăżă¤ă 'gcx
ăŤé˘ăăŚä¸ĺ¤ă§ăăĺ ´ĺăŽăżă§ăăăăăăăăçşçăăăă¨ăŻćŻčźçăžăă§ăăďź
@cramertj
ç§ăŽĺäşşçăŞćčŚă§ăŻăďź46541ăŻĺŽéăŤăŻăă°ă§ăŻăăăžăăăăăăŻç§ăćĺž ăăĺä˝ă§ăăăăŠăŽăăăŤä¸ĺĽĺ ¨ăŤăăăă¨ăă§ăăăăăăăžăăăĺéżăăăŽăŻé˘ĺă§ăă
ç§ăŻăăŽPOVăŤĺć ăăŚăăžăăăăăăčąçłăăćšćłăăăăăŞăăăŽăĺŽĺŽăăăăŽăŻć°ăé˛ăžăŞăďźăă¨ăă°ăĺŽĺçăŞç术ăŽćź çśă¨ăăćŚĺżľăŤäžĺăăŚăăăăăŤčŚăăăăďźă
@rfcbotăŻč¤ć°ăŽčżĺăľă¤ăăŤé˘äżăăžă
ç§ăŻăĺŽĺçăŞimplçšć§ăŤé˘ăăćĺžăŽć¸ĺżľă1ă¤çťé˛ăăăă¨ćăăžăă implăăŹă¤ăă使ç¨ăăăćéăŽăăŞăăŽé¨ĺă§ăĺŽéăŤăŻč¤ć°ăŽăżă¤ăăčżăăăă¨ćăŁăŚăăžăă äžăă°ďź
fn foo(empty: bool) -> impl Iterator<Item = u32> {
if empty { None.into_iter() } else { &[1, 2, 3].cloned() }
}
ăăĄăăăăăăŻäťćĽăŻćŠč˝ăăžăăăăăăćŠč˝ăăăăă¨ăŻééăăŞăçŻĺ˛ĺ¤ă§ăă ăă ăă implăăŹă¤ăăçžĺ¨ćŠč˝ăăćšćłă§ăŻăďźăăŽć§ćă§ďźăăăžă§ćŠč˝ăăăăăŽćăĺšćçăŤéăăŚăăžăă ăăăŻăçžĺ¨ăč¤ć°ăŽčżĺăľă¤ăăăĺśç´ăčçŠă§ăăăăă§ăă
fn foo(empty: bool) -> (impl Debug, impl Debug) {
if empty { return (22, Default::default()); }
return (Default::default(), false);
}
ăăă§ăć¨ć¸ŹăăăĺăŻ(i32, bool)
ă§ăćĺăŽreturn
ăŻi32
é¨ĺăĺśç´ăă2çŞçŽăŽreturn
bool
é¨ĺăĺśç´ăăžăă
ăăăŻă2ă¤ăŽreturn
ăšăăźăăĄăłăăçľąĺăăăŞăĺ ´ĺďźç§ăŽćĺăŽäžăŽăăăŤďźăăľăăźăă§ăăŞăăă¨ăćĺłăăžăăăăă§ăŞăĺ ´ĺăçľąĺăăăŽăŻé常ăŤé˘ĺă§ăă
ĺreturn
ďźé常ăĺśç´ăŽĺă˝ăźăšďźăĺĺĽăŤĺŽĺ
¨ăŤćĺŽăăĺż
čŚăăăĺśç´ăč¨ĺŽăăĺż
čŚăăăăŽă§ăăăăă ďźăăăŚăäşĺžăŤăăăăçľąĺăăžăăďźďź
ăăăŻç§ăŽ2çŞçŽăŽäžăéćłăŤăăĺ°ćĽăŽăăćçšă§ćĺăŽăąăźăšăăľăăźăăăä˝ĺ°ăćŽăăžăă
@rfcbotăŻč¤ć°ăŽăŞăżăźăłăľă¤ăă解湺ăăžă
ă ăăç§ăŻďźrust-langă§@cramertjă¨ăžăăă impl Trait
ă§ăă˘ăźăŞăźăŞăżăźăłăăä¸ĺŽĺŽăŤăăă¨ăăă˘ă¤ăă˘ăŤă¤ăăŚčŠąăĺăŁăŚăăăŽă§ăćçľçăŤăŻĺ¤ć´ăăĺŻč˝ć§ăăăăžăă
彟ăăŻăăăŽç¨ŽăŽć§ćăŤć示çăŤăŞăăă¤ăłăăćšăăăă¨ä¸ťĺźľăăžăăăçšăŤăăăăĺż
čŚăŞäťăŽăąăźăšďź let x: impl Trait = if { ... } else { ... }
ďźăăăăćĺž
ă§ăăŞăăăă§ăăăăăăăšăŚăćéťçăŤĺŚçăăžăďźçľśĺŻžăŤăăă§ăŻăăăžăăďźă
ăăăŻăăŞă誏ĺžĺăăăă¨ćăăžăă ăă䝼ĺăŻăă¨ăŤăăăăă§ăŞăăă¤ăłć§ćă使ç¨ăăăă¨ăćłĺŽăăŚăăžăăăăăă˘ăććĺ°ćŠăŤéăăŞăăăăŤăăăăŁăă ăă§ăă çľĺąăŽă¨ăăăăăă¤ăăăăŻăˇă ăăăă¤ćżĺ Ľăăĺż čŚăăăăă誏ćăăăŽăŻăĄăăŁă¨éŁăăă§ăă
@nikomatsakisç§ăŽăăăăăăžăçĽăăăŚăăŞăćčŚďźĺŽčĄćăŤĺŻč˝ăŞč¤ć°ăŽĺăŽ1ă¤ăčżăé˘ć°ăćĺšăŤăăăă¨ăŻćç¨ă§ăăăĺä¸ăŽĺă¸ăŽéçăŞćťăĺăŽć¨čŤă¨ăĺ é¨ă§ĺŽčĄćăŽćąşĺŽăĺż čŚăŞçśćłă訹ĺŻăăžăďźĺăŤăĺçăˇă ăă¨ĺźăă§ăăžăďźă
ăăŽćĺăŽfoo
äžăŻăç§ăĺéĄăç解ăăŚăăéăăďź1ďźăăăŻăšĺăăă+ĺćśĺťăăăIterator<Item = u32>
ăăžăăŻďź2ďźĺč¨ĺstd::option::Iter
ăăăăăŤč§Łćąşă§ăăžăă std::slice::Iter
ăŻă Iterator
ĺŽčŁ
ăĺ°ăĺşăăžăă č°čŤăŤăăă¤ăăŽć´ć°ăăăďźă¤ăžăăç§ăŻäťIRCăă°ăčŞăă§ăăžăďźăăăăç解ăăăŽăéŁăăăŞăŁăŚăăăŽă§ăçăăăăă¨ăăŚăăžăďźç§ăŻĺçăˇă ăŽdynăŽăăăŞć§ćăŤç˘şăăŤĺćăăžăăăç§ădyn
ă¨ĺźăśăŽăŻçćłçă§ăŻăŞăăăăăăŞăăă¨ăç解ăăŚăă ăăă
ćĽçĽăăăŞăăŠă°ă¨č¨é˛ăŽăăăŽĺ°ăăŞăĄă˘ďźăĺżĺăăŽĺč¨ăżă¤ăă¨čŁ˝ĺăç°ĄĺăŤĺ Ľćă§ăăžăă
@CentrilăăăCoprodInjector::inject
ăćŠč˝ăăăăăŤăŻăçľćăŽĺăć¨ć¸ŹĺŻč˝ă§ăăĺż
čŚăăăăă¨ăŤćł¨ćăăŚăă ăăăăăăŻé常ăçľćăŽĺăŤĺĺăäťăăŞăă¨ä¸ĺŻč˝ă§ăďźăă¨ăă°ă -> Coprod!(A, B, C)
ďźă ĺĺăŽăŞăăżă¤ăă§ä˝ćĽăăŚăăăă¨ăăăăăăŽă§ă -> Coprod!(impl Trait, impl Trait, impl Trait)
ĺż
čŚăŤăŞăăžăăăăăŻăăŠăŽăăŞă˘ăłăăŤăŠăŽimpl Trait
ăżă¤ăăĺŤăžăăăšăăăăăăŞăăăăć¨čŤăŤĺ¤ąćăăžăă
@cramertjé常ăŤćŁăăďźčŁčśłďźĺăăăŞă˘ăłăăăŻĺŽĺ
¨ăŤĺĺăäťăăăăŞăăăă§ăŻăăăžăăăăé¨ĺçăŤăŽăżă§ăăäžďź Map<Namable, Unnameable>
ďźă
enum impl Trait
ă˘ă¤ăă˘ăŻă httpsďź//internals.rust-lang.org/t/pre-rfc-anonymous-enums/5695ă§äťĽĺăŤčŞŹćăăăŚă
@CentrilăăăăăăŻćŹĺ˝ă§ăă ç§ăŻçšăŤĺ çŠăŤă¤ăăŚčăăŚăăžăă
fn foo(x: Foo) -> impl Future<Item = (), Error = Never> {
match x {
Foo::Bar => do_request().and_then(|res| ...).left().left(),
Foo::Baz => do_other_thing().and_then(|res| ...).left().right(),
Foo::Boo => do_third_thing().and_then(|res| ...).right(),
}
}
@kennytmăăă httpsďź//github.com/rust-lang/rfcs/pull/1154ă¨https://github.com/rust-lang/rfcs/issues/294ăăă
@cramertjĺżĺăŽĺćĺăenum impl Trait
ăŤäźźăŚăăă¨ăŻč¨ăăžăăăăăăŻă X: Tr
&& Y: Tr
â (X|Y): Tr
ďźĺäžďź Default
çľčŤäťăăăă¨ăă§ăăŞăăăă§ăă impl Future for (X|Y|Z|...)
ăä˝ćăăĺż
čŚăăăăžăă
@kennytmăăăăăĺżĺĺćĺăŽăăă¤ăăŽăăŹă¤ăimplăčŞĺçćăăăăŽă§ăĺşćŹçăŤĺăćŠč˝ăŽăăă§ăă
ĺżĺăŽĺćĺăŻĺĺăäťăăăă¨ăă§ăăžăăŽă§@cramertjďźăăăďźĺ ´ĺă Default
IMPLăăăăŤçćăăă(i32|String)
ăćă
ăŻć¸ăăă¨ăă§ăăă ăă<(i32|String)>::default()
ă OTOH <enum impl Default>::default()
ĺăŤăłăłăă¤ăŤăăăŞăăŽă§ăä˝ăčŞĺçćăăŚăăăžăŁăăĺźăłĺşăăŞăăŽă§ĺŽĺ
¨ă§ăă
ăăă§ăăčŞĺçćăŤăăŁăŚenum impl Trait
ĺéĄăçşçăăĺ ´ĺăăăăžăă ć¤č¨
pub trait Rng {
fn next_u32(&mut self) -> u32;
fn gen<T: Rand>(&mut self) -> T where Self: Sized;
fn gen_iter<'a, T: Rand>(&'a mut self) -> Generator<'a, T, Self> where Self: Sized;
}
mut rng: (XorShiftRng|IsaacRng)
ăăăĺ ´ĺă rng.next_u32()
ăžăăŻrng.gen::<u64>()
č¨çŽă§ăăăŽăŻăžăŁăăćŁĺ¸¸ăŞăă¨ă§ăă ăă ăăčŞĺçćă§ăŻ(Generator<'a, u16, XorShiftRng>|Generator<'a, u16, IsaacRng>)
ăăçćă§ăăŞăăăă rng.gen_iter::<u16>()
ăć§çŻă§ăăžăăăăĺŽéăŤĺż
čŚăŞăŽăŻGenerator<'a, u16, (XorShiftRng|IsaacRng)>
ă§ăă
ďźăăśăăăłăłăă¤ăŠăŻă Sized
ăă§ăăŻăŽăăăŤăĺ§äťťăĺŽĺ
¨ă§ăŞăĺźăłĺşăăčŞĺçăŤćĺŚă§ăăžăăďź
FWIWăăŽćŠč˝ăŻăăżăăŤďźăăĄăăă䝎ćłăŽĺżĺenum
寞ĺżăăĺżĺăŽstruct
ăăăăŻăăźă¸ăŁăźăŤç˛žçĽçăŤčżăă¨ç§ăŻćăăžăă ăăăăŽăăŽăăĺżĺăă§ăăćšćłăŻç°ăŞăăžăă
ĺżĺăŽstruct
ă¨enum
ďźăżăăŤă¨ăĺé˘ăďźăŽĺ ´ĺăăĺżĺăăŻăć§é çăďźăĺçŽăă§ăŻăŞăďźăżă¤ăăŽćĺłă§ăăĺçľăżčžźăżăăăăłăłăăźăăłăăżă¤ăăŤĺŻžăăŚĺŽĺ
¨ăŤćąç¨çă§ăăăă˝ăźăšăăĄă¤ăŤăŽĺĺäťă厣č¨ă§ăŻăăăžăăă ăăăăăăă°ăŠăăźăŻăăă§ăăăăăć¸ăĺşăăŚäťăŽăżă¤ăă¨ĺăăăăŤä˝żç¨ăăăăăăŽăăŹă¤ăĺŽčŁ
ăŻé常ăŠăăć示çăŤć¸ăçăăăăçšăŤéćłă§ăŻăăăžăăďźçľăżčžźăżăŽć§ćă¨ăĺŻĺ¤ĺĺźć°ăă§ăăăă¨ăé¤ăă°ăäťăŽăżă¤ăăžă ă§ăăžăăďźă ăăćĺłă§ăŻă彟ăăŻĺĺăćăŁăŚăăžă
ä¸ćšăăŻăăźă¸ăŁăźăŻăăăŽĺĺăç§ĺŻă§ăăă¨ăăćĺłă§ĺżĺă§ăă ăłăłăă¤ăŠăźăŻăä˝ćăăăăłăŤć°ăăĺĺăŽć°ăăĺăçćăăžăăăăŽĺĺăä˝ă§ăăăă調ăšăăăĺż čŚăŞĺ ´ĺă§ăĺç §ăăăăăćšćłăŻăăăžăăă ăłăłăă¤ăŠăźăŻăăăŽăˇăźăŻăŹăăĺăŤĺŻžăăŚ1ă¤ăžăăŻ2ă¤ăŽçšć§ăĺŽčŁ ăăžăăăłăłăă¤ăŠăźă¨ĺŻžčŠąă§ăăĺŻä¸ăŽćšćłăŻăăăăăŽçšć§ă使ç¨ăăăă¨ă§ăă
impl Trait
čĺžăŤăăif
ăăžăăžăŞăăŠăłăăăăăžăăžăŞĺăčżăăă¨ăă§ăăăŽăŻăĺžč
ăŤčżăăăă§ă-ăłăłăă¤ăŠăŻăăăžăăžăŞăăŠăłăăäżćăăĺăćéťçăŤçćăăčŚćąăăăçšć§ăĺŽčŁ
ăăžăéŠĺăŞăăŽăŤăăŁăšăăăăăăăăŤăăŽä¸ăŤăăăăăă°ăŠăăźăŻăăŽăżă¤ăăä˝ă§ăăăăć¸ăçăăăčŚăăăăăă¨ăŻăŞăăăăăĺç
§ăăăă¨ăăăăăćŹĺ˝ăŽççąăăăăžăăă
ďźĺŽéăăăŽćŠč˝ăŻă䝎ćłăŽăăŞăă¸ă§ăŻăăŞăăŠăŤăăŤé˘éŁăăŚăăăăăŤćăăžăăăăăŻăäťăŽçšć§ăŽĺ ´ĺăć˘ĺăŽăŻăăźă¸ăŁć§ćăFn
ĺ ´ĺă¨ĺăă§ăăă¤ăžăăĺä¸ăŽăŠă ăĺźăŽäťŁăăăŤăăšăłăźăĺ
ăŽĺ¤ć°ă使ç¨ăăŚăćĺŽăăăçšć§ăŽĺăĄă˝ăăăĺŽčŁ
ăďź self
ăŻćéťçďźăăłăłăă¤ăŠăźăŻupvarsăäżćăăĺżĺĺăçćăăćĺŽăăăçšć§ăĺŽčŁ
ăăžăăĺăăăăŤăŞăăˇă§ăłăŽmove
ă˘ăźăăăăăžăăă¨ăŤăăă if foo() { (some future) } else { (other future) }
ă襨çžăăĺĽăŽćšćłăŻobject Future { fn poll() { if foo() { (some future).poll() } else { (other future).poll() } } }
ăŤăŞăă¨ćăăžăďźăžăăăăŞăăĺż
čŚă§ăçľććăĄä¸ăăăăăŤfoo()
ăŤĺşălet
ăăăŻä¸ĺşŚă ăĺŽčĄăăăă¨ćăăžăăŽă§ďźăŻăăăăĺ°ăŞăäşşé塼ĺŚçă ă¨ăăăăăäťăŤ
@glaebhoerlăăăŻé常ăŤčĺłćˇąăă˘ă¤ăă˘ă§ăďź ăăăŤăŻăJavaăŽĺ čĄćčĄăăăă¤ăăăăžăă
ç§ăŽé ăŽăŚăŁăşăăăăŽăăă¤ăăŽčăďźăăăťăŠçźăăăŚăăžăăďźďź
object
ăŻăăăăĺăŞăĺĺ¨ă§ăŻăŞăçšć§ăŞăă¸ă§ăŻăă§ăăăă¨ă示ăăŚăăžăăăăăă§ăŻăăăžăăăĺŻč˝ăŞäťŁćżć§ćďź
impl Future { fn poll() { if foo() { a.poll() } else { b.poll() } } }
// ^ --
// this conflicts with inherent impls for types, so you have to delay
// things until you know whether `Future` is a type or a trait.
// This might be __very__ problematic.
// and perhaps (but probably not...):
dyn Future { fn poll() { if foo() { a.poll() } else { b.poll() } } }
future!(if foo() { a.poll() } else { b.poll() })
ăăăć§ćăŽčłŞĺăŻćˇˇäšąăăŚăăžăă struct
ăŞăăŠăŤăăŻăăźă¸ăŁăăžăăŻimpl
ăăăăŻăăă¤ăłăšăăŹăźăˇă§ăłăĺžăăăăŠăăăć確ă§ăŻăŞăăăă§ă:)ăă¨ăă°ăé ăŽăŚăŁăşăăă1ă¤é¸ăă ă ăă§ăăé
ă ďźă¨ăŤăăăç§ăŽä¸ťăŞăă¤ăłăăŻăăŞăă¸ă§ăŻăăŞăăŠăŤăčż˝ĺ ăăĺż
čŚăăăă¨ăăăă¨ă§ăŻăăăžăăă§ăăăăĺżĺăŽenum
ăŻăăăă§ăŻčľ¤ăăăˇăłă ă¨ćăăžă[ăă ăăčż˝ĺ ăăĺż
čŚăăăăžă]ăďź
ifăŽç°ăŞăăăŠăłăăăç°ăŞăăżă¤ăăčżăăă¨ăă§ăăăă¨ăŻăimplăăŹă¤ăăŽčĺžă§ăĺžč ăŤčżăăăăŤčŚăăžă-ăłăłăă¤ăŠăŻăç°ăŞăăăŠăłăăäżćăăăżă¤ăăćéťçăŤçćăăčŚćąăăăăăŹă¤ăăĺŽčŁ ăăŚéŠĺăŞăăŹă¤ăăŤăăŁăšăăăăăžăăăăăŚăăăă°ăŠăăźăŻăăŽăżă¤ăăä˝ă§ăăăăć¸ăçăăăčŚăăăăăă¨ăŻćąşăăŚăŞăăăăăĺç §ăăăă¨ăăăăăćŹĺ˝ăŽççąăăăăžăăă
ăăźăă ăăăăŁăŚăĺćĺăŽăć°ăăĺĺăăçćăăăŽă§ăŻăŞăă揥ăŽăăăŞimplăŤĺŻžĺżăă|
ĺăĺŠç¨ăăă¨ćłĺŽăăŚăăžăăă
impl<A: IntoIterator, B: IntoIterator> IntoIterator for (A|B) { /* dispatch appropriately */ }
č¤ć°ăŽé˘ć°ăĺä¸ăŽimplăçćăăă¨ăăćĺłă§ăăăăŤăŻćăăăŤä¸č˛Ťć§ăŽĺéĄăăăăžăă ăăăăăăăăčăŤç˝ŽăăŚăăăăŽă˘ă¤ăă˘ăŻäťăŽççąă§ćŠč˝ăăŞăĺŻč˝ć§ăăăăă¨ăŤć°äťăăžăăăăă¨ăă°ăé˘éŁăăăżă¤ăăč¤ć°ăăĺ ´ĺăăłăłăăăšăăŤăăŁăŚăŻĺăă§ăăĺż čŚăăăăžăăăç°ăŞăĺ ´ĺăăăăžăă ăă¨ăă°ă揥ăŽăăăŤăŞăăžăă
-> impl IntoIterator<Item = Y>
ăăăăăŠăăäťăŽĺ ´ćă§
-> impl IntoIterator<IntoIter = X, Item = Y>
ăăăăŻăăĺä˝ăă§ăăŞăă¨ç§ăć¨ć¸Źăă2ă¤ăŽéč¤ăăĺŽčŁ ăŤăŞăăžăă ăžăăĺ¤ĺĺ°éă§ă
ă¨ăŤăăăăç§ĺŻăŽĺćĺăăŽćŚĺżľăŻăç§ăćăăŤăăšăŚăŽĺ¨ăă§ăăăăăăŤčŚăăžăă
ç§ăŻăĺŽĺçăŞimplçšć§ăŤé˘ăăćĺžăŽć¸ĺżľă1ă¤çťé˛ăăăă¨ćăăžăă implăăŹă¤ăă使ç¨ăăăćéăŽăăŞăăŽé¨ĺă§ăĺŽéăŤăŻč¤ć°ăŽăżă¤ăăčżăăăă¨ćăŁăŚăăžăă
@nikomatsakisďźăăăŻăăăŽĺ ´ĺăŤăŻăä˝ăčżăăăŚăăăă¨ăč¨ăăă¨ăŻĺ
ŹćŁăčżăĽăăăăă¨ăŤăădyn Trait
ăăimpl Trait
ĺć/ĺżĺăŽćťăĺ¤ăĺŽčŁ
ăăŚăăăŽă§ăăă¤ăăăăŻăăŁăšăăăăŤäźźä˝ăăďź
cc https://github.com/rust-lang/rust/issues/49288 ăćčżă Future
ă¨Future
使ç¨ăăŚăĺ¤ăăŽĺéĄăŤç´é˘ăăŚăăžăă
ăăăŻFCPăçľäşăăĺăŽćĺžăŽăăŁăłăšăŞăŽă§ăčŞĺčŞĺçšć§ăŤĺŻžăăŚćĺžăŽč°čŤăăăăă¨ćăăžăă ăăăŻĺ°ăăăăăăŽăă¨ă ă¨ćăăžăăŽă§ăçžĺ¨ăŽĺŽčŁ ăŤăłăăăăăĺăŤăăăăăăăŽĺéĄăŤćŁĺźăŤĺŻžĺŚăăăă¨ćăăžăă
impl Trait
ăăŠăăźăăŚăăŞăäşşăŽăăăŤć確ăŤăăăăăŤăăăăŻç§ăć示ăăŚăăĺéĄă§ăă impl X
ĺă§čĄ¨ăăăĺăŻăçžĺ¨ăăăŽčĺžăŤăăĺ
ˇä˝çăŞĺăčŞĺçšć§ăĺŽčŁ
ăăŚăăĺ ´ĺăŤăŽăżăčŞĺçšć§ăčŞĺçăŤĺŽčŁ
ăăžăă ĺ
ˇä˝çăŤăŻă揥ăŽăłăźăĺ¤ć´ăčĄăăăĺ ´ĺăé˘ć°ăŻăłăłăă¤ăŤăçśčĄăăžăăăčżăăăĺăSend
ăĺŽčŁ
ăăŚăăă¨ăăäşĺŽăŤäžĺăăé˘ć°ăŽä˝żç¨ăŻĺ¤ąćăăžăă
fn does_some_operation() -> impl Future<Item=(), Error=()> {
- let data_stored = Arc::new("hello");
+ let data_stored = Rc::new("hello");
return some_long_operation.and_then(|other_stuff| {
do_other_calculation_with(data_stored)
});
}
ďźăăç°ĄĺăŞäžďźĺä˝ä¸ăĺ é¨ĺ¤ć´ăŤăăé厳ăçşçăăžăďź
ăăŽĺéĄăŻć確ă§ăŻăăăžăăă čŞĺçšć§ăăăŞăźăŻăăăăă¨ăăé常ăŤć
éăŞćąşĺŽăăăăžăăăăăă§ăŞăĺ ´ĺăŻăé俥ăžăăŻĺć䝼ĺ¤ăŽä˝ăăčżăăăšăŚăŽé˘ć°ăŤ+ !Send + !Sync
ăč¨ĺŽăăĺż
čŚăăăăžăăé˘ć°ăčżăĺ
ˇä˝çăŞăżă¤ăăŤĺç´ăŤĺŽčŁ
ă§ăăŞăĺŻč˝ć§ăŽăăäťăŽăŤăšăżă čŞĺçšć§ăŤă¤ăăŚăŽä¸ć確ăŞčŠąăăăăžăă ăăăăŻăĺžă§č§Śăă2ă¤ăŽĺéĄă§ăă
ăžăăăăŽĺéĄăŤĺŻžăăç§ăŽĺ寞ćčŚăç°ĄĺăŤčż°ăšăăă¨ćăăžăăăăăŤăăăé˘ć°ćŹä˝ăĺ¤ć´ăăŚăĺ ŹéăăăŚăăAPIăĺ¤ć´ă§ăăžăă ăăăŤăăăăłăźăăŽäżĺŽć§ăç´ćĽä˝ä¸ăăžăă
ăăłăŽçşçăéăăŚă使ăăăăăăăĺéˇć§ăŽĺ´ă§čޤăăçŻăćąşĺŽăăŞăăăŚăăžăăă ć°čŚĺĺ Ľč ăăăăăčŚăă¨ăĺéˇć§ăŽăăăŤĺéˇć§ă§ăăă¨čăăžăăăăăă§ăŻăăăžăăă ć§é ä˝ăŤăłăăźăčŞĺçăŤĺŽčŁ ăăăŞăăăé˘ć°ăˇă°ăăăŁă§ăăšăŚăŽĺăć示çăŤăăăăŠăăăŤăăăăăăĺćąşĺŽăŻäżĺŽć§ăŽăăă§ăă
ç§ăäşşă ăŤRustăç´šäťăăă¨ăă確ăăŤăç§ăŻĺ˝źăăŤăšăăźăăççŁââć§ăăĄă˘ăŞăŽĺŽĺ ¨ć§ă示ăăă¨ăă§ăăžăă ăăăăčĄăăŤăŻăšăăźăăăăăžăă ă¨ă¤ăăŻăĄă˘ăŞĺŽĺ ¨ć§ăăăăžăă PythonăŤăŻççŁć§ăăăăžăă RustăćăŁăŚăăăăŽăŻăăăăăšăŚăŤĺăŁăŚăăăäżĺŽć§ăăăăžăă ăŠă¤ăăŠăŞăŽä˝ćč ăă˘ăŤă´ăŞăşă ăăăĺšççăŤĺ¤ć´ăăăĺ ´ĺăăžăăŻăŻăŹăźăăŽć§é ăăăç´ăăăĺ ´ĺăŻăééăăçŻăăă¨ăăŤéçĽăăă¨ăă埡ĺăŞäżč¨źăăłăłăă¤ăŠăăăăăžăă ăăłăă¨ăăă§ăç§ăŽăłăźăăŻăĄă˘ăŞăŽĺŽĺ ¨ć§ă ăă§ăŞăăăă¸ăăŻă¨ă¤ăłăżăźăă§ă¤ăšăŽčŚłçšăăăćŠč˝ăçśăăă¨ç˘şäżĄă§ăăžăă _RustăŽăăšăŚăŽé˘ć°ă¤ăłăżăźăă§ăźăšăŻăé˘ć°ăŽĺ厣č¨ă§ĺŽĺ ¨ăŤčĄ¨çžă§ăăžă_ă
impl Trait
ăăŽăžăžĺŽĺŽăăăăă¨ăŻăăăŽäżĄĺżľăŤĺăăĺŻč˝ć§ăéŤăă§ăă 確ăăŤăăłăźăăăă°ăăä˝ćăăăăăŤăŻé常ăŤäžżĺŠă§ăăăăăăăżă¤ăăä˝ćăăĺ ´ĺăŻPythonă使ç¨ăăžăă RustăŻăçćéăŽć¸ăčžźăżĺ°ç¨ăłăźăă§ăŻăŞăăéˇćçăŞäżĺŽć§ăĺż
čŚăŞĺ ´ĺăŤé¸ćăăăč¨čŞă§ăă
ăăă§ăăĺéĄăć確ă§ăŻăŞăăăăăăăćŞăĺŻč˝ć§ăŻă大ăăăă¨č¨ăăžăă ăăăăăčŞĺçšć§ăăŽĺ
¨ä˝çăŞčăćšăŻéć示çă§ăă Sendă¨SyncăŻăăăăŞăăŻĺŽŁč¨ă§ăŻăŞăăć§é ä˝ăŽĺ
厚ăŤĺşăĽăăŚĺŽčŁ
ăăăžăă ăăŽćąşĺŽăŻăăłăŽăăăŤăăžăăăŁăăŽă§ăĺć§ăŤčĄĺăăimpl Trait
ăăăžăăăĺŻč˝ć§ăăăăžăă
ăă ăăé˘ć°ă¨ć§é ăŻăłăźăăăźăšă§ç°ăŞăćšćłă§ä˝żç¨ăăăăăăăŻĺăĺéĄă§ăŻăăăžăăă
ć§é ä˝ăŽăăŁăźăŤăăĺ¤ć´ăăă¨ăăăŠă¤ăăźăăăŁăźăŤăă§ăăŁăŚăăĺŽéăŽĺ 厚ăĺ¤ć´ăăŚăăăă¨ăăăăŤăăăăžăă éé俥ăžăăŻéĺćăăŁăźăŤăăćă¤ć§é ăŻăăŽé¸ćăčĄăăăŠă¤ăăŠăŞăŽăĄăłăăăŻăPRăć§é ăŽăăŁăźăŤăăĺ¤ć´ăăă¨ăăŤĺ確čŞăăăă¨ăçĽăŁăŚăăžăă
é˘ć°ăŽĺ
é¨ăĺ¤ć´ăăĺ ´ĺăăăăŠăźăăłăšă¨ćŁç˘şăăŽä¸ĄćšăŤĺ˝ąéżăä¸ăăĺŻč˝ć§ăăăăă¨ăŻćăăă§ăă ăă ăăRustă§ăŻăćŁăăăżă¤ăăčżăăăŚăăăă¨ă確čŞăăĺż
čŚăŻăăăžăăă é˘ć°ĺŽŁč¨ăŻç§ăăĄăĺŽăăŞăăă°ăŞăăŞăĺłăăĺĽç´ă§ăăă rustc
ăŻç§ăăĄăŽĺžăăçŁčŚăăžăă ăăăŻăć§é ä˝ăŽčŞĺçšć§ă¨é˘ć°ăŽćťăĺ¤ăŽéăŽç´°ăçˇă§ăăăé˘ć°ăŽĺ
é¨ăĺ¤ć´ăăăă¨ăŻăŻăăăŤćĽĺ¸¸çă§ăă ă¸ă§ăăŹăźăżăźăĺŠç¨ăăĺŽĺ
¨ăŞFuture
ăă§ăăăă -> impl Future
čżăé˘ć°ăĺ¤ć´ăăăŽăăăăŤćĽĺ¸¸çăŤăŞăăžăă ăăăăŻăăšăŚăăłăłăă¤ăŠăăăăăăŁăăăăŞăĺ ´ĺăĺ¤ć´ăăăé俥/ĺćĺŽčŁ
ăŤă¤ăăŚä˝ćč
ăăšăŻăŞăźăăłă°ăăĺż
čŚăăăĺ¤ć´ăŤăŞăăžăă
ăăă解湺ăăăăăŤăĺ ăŽRFCăŽčŞŹćă¨ă¨ĺ¤ćă§ăăžăă äżĺŽçăŞimplçšć§RFCăŽăăŽăťăŻăˇă§ăłă§ăŻăčŞĺçšć§ăŽăŞăźăŻăŤé˘ăăć大ăŽč°čŤă示ăăŚăăžăďźăOIBITăăŻčŞĺçšć§ăŽĺ¤ăĺĺă§ăďźă
ăăăŤĺŻžăăç§ăŽä¸ťăŞĺçăŻăă§ăŤčŞŹćăăžăăăăćĺžăŤăă1ă¤ćł¨ćăăŚăăăžăă ć§é ăŽăŹă¤ă˘ăŚăăĺ¤ć´ăăăă¨ăŻăăăťăŠä¸čŹçă§ăŻăăăžăăă ăăăé˛ăăă¨ăă§ăăžăă é˘ć°ăĺăčŞĺçšć§ăĺŽčŁ ăçśăăăă¨ăäżč¨źăăăăăŽäżĺŽăŽč˛ ć ăŻăé˘ć°ăĺ¤§ĺš ăŤĺ¤ć´ăăăă¨ăăççąă ăă§ăć§é ăŽăăăăă大ăăăŞăăžăă
ćĺžăŤăčŞĺčŞĺçšć§ă ăăé¸ćč˘ă§ăŻăŞăăă¨ăăäźăăăăă¨ćăăžăă ăăăŻç§ăăĄăé¸ćăăăŞăăˇă§ăłă§ăăăăŞăăă˘ăŚăăŽčŞĺçšć§ăŽäťŁćżć掾ăŻäžçśă¨ăăŚäťŁćżć掾ă§ăă
éé俥/éĺćă˘ă¤ăă ăčżăé˘ć°ăŤăçść
+ !Send + !Sync
ăăăăăăŽĺ˘çăćă¤çšć§ďźĺĽĺďźďźăčżăăăăŤčŚćąăăăă¨ăă§ăăžăă ăăăŻčŻăćąşĺŽă§ăŻăăăžăăăăçžĺ¨é¸ćăăŚăăăăŽăăăčŻăăăăăăžăăă
ăŤăšăżă čŞĺçšć§ăŤé˘ăăć¸ĺżľăŤă¤ăăŚăŻăć°ăăčŞĺçšć§ăŻĺŽčŁ ăăăăšăă§ăŻăŞăă¨ä¸ťĺźľăăžăăčŞĺçšć§ăŽĺžăŤĺ°ĺ Ľăăăć°ăăăżă¤ăăŤĺŻžăăŚăŽăżĺŽčŁ ăăăžăă ăăăŻăç§ăçžĺ¨ĺŻžĺŚă§ăăăăăĺ¤ăăŽĺéĄăćäžăăĺŻč˝ć§ăăăăžăăăăăĺ¤ăăŽč¨č¨ă§ĺŻžĺŚă§ăăŞăĺéĄă§ăŻăăăžăăă
ăăăŻé常ăŤé ăăé常ăŤéˇăé塝ăčžźăžăăŚăăăç§ăŻäťĽĺăŤăăăăŽç°č°ăĺąăăăă¨ăăăă¨ç˘şäżĄăăŚăăžăă ćĺžăŤăăä¸ĺşŚăłăĄăłăă§ăăŚăăăăă§ăăăăăŚăç§ăăĄăä¸ăăŚăăćąşĺŽăŤĺŽĺ ¨ăŤćşčśłăăŚăăăă¨ă確čŞăăžăă
čŞăă§ăăă ăăăăă¨ăăăăăžăăćçľćąşĺŽăŤăăăRustăćĺăŽćšĺăŤé˛ăăă¨ăéĄăŁăŚăăžăă
@daborossăŽăŹăăĽăź
trait FutureNSS<T, E> = Future<Item = T, Error= E> + !Send + !Sync;
fn does_some_operation() -> impl FutureNSS<(), ()> {
let data_stored = Rc::new("hello");
some_long_operation.and_then(|other_stuff| {
do_other_calculation_with(data_stored)
});
}
ăăăŻăăăťăŠćŞăăŻăăăžăăăéŠĺăŞĺĺăčăĺşăĺż
čŚăăăăžăďź FutureNSS
ăŻăăă§ăŻăăăžăăďźă 丝ăŞĺŠçšăŻăĺ˘çăŽçš°ăčżăăŤăăŁăŚçşçăăç´ĺăăć¸ăăăă¨ă§ăă
čŞĺçšć§ăć示çăŤčż°ăšăčŚäťśă§ăăŽćŠč˝ăĺŽĺŽăăăĺžă§ăăŽăĄăłăăăłăšăŽĺéĄăŤĺŻžăăéŠĺăŞč§ŁćąşçăčŚă¤ăăăăăžăăŻĺŽéăŤăĄăłăăăłăšăŽč˛ ć ăăŞăăă¨ăĺĺăŤăăăŁăăăăăăăŽčŚäťśăĺé¤ăăăă¨ăŻă§ăăžăăăďźčŚäťśă解é¤ăăćąşĺŽďź
!Send
ă¨ăăŚăăźăŻăăăŚăăŞăéăSend
čŚćąăăĺćă¨ăăŚăăźăŻăăăŚăăŞăéăSync
ăŞăăŽăŻăŠăă§ăăďź é俥ăŻĺćă¨ćŻčźăăŚăăä¸čŹçă§ăăă¨ćăăăžăăăďź
ăăŽăăăŞďź
fn provides_send_only1() -> impl Trait { compatible_with_Send_and_Sync }
fn provides_send_only2() -> impl Trait { compatible_with_Send_only }
fn fails_to_complile1() -> impl Trait { not_compatible_with_Send }
fn provides_nothing1() -> !Send + impl Trait { compatible_with_Send}
fn provides_nothing2() -> !Send + impl Trait { not_compatible_with_Send }
fn provides_send_and_sync() -> Sync + impl Trait { compatible_with_Send_and_Sync }
fn fails_to_compile2() -> Sync + impl Trait { compatible_with_Send_only }
ĺźć°ä˝ç˝ŽăŽimpl Trait
ă¨ćťăä˝ç˝ŽwrtăŽéăŤççžăăăăžăăďź čŞĺçšć§ďź
fn foo(x: impl ImportantTrait) {
// Can't use Send cause we have not required it...
}
ăăăŻăăăă§é俥ăćłĺŽăăăă¨ă訹ĺŻăăăŚăăĺ ´ĺăĺźć°ăŽä˝ç˝ŽăŽĺĺ ă¨ăăŚćĺłăăăăžăăă˘ăă˘ăŤăăŁăźăźăˇă§ăłĺžăŽă¨ăŠăźăçşçăăžăă ăăĄăăăăăă§ăŻćťăä˝ç˝Žă¨ĺźć°ä˝ç˝ŽăŽčŚĺăä¸č´ăăŚăăĺż čŚăŻăăăžăăăăĺŚçżĺŻč˝ć§ăŽçšă§ĺéĄăăăăžăă
ăŤăšăżă čŞĺçšć§ăŤé˘ăăć¸ĺżľăŤă¤ăăŚăŻăć°ăăčŞĺçšć§ăŻĺŽčŁ ăăăăšăă§ăŻăŞăă¨ä¸ťĺźľăăžăăčŞĺçšć§ăŽĺžăŤĺ°ĺ Ľăăăć°ăăăżă¤ăăŤĺŻžăăŚăŽăżĺŽčŁ ăăăžăă
ăžăăăăăŻćŹĄăŽčŞĺăăŹă¤ăUnpin
ďźčŞĺˇąĺç
§ă¸ă§ăăŹăźăżăźăŤăŻĺŽčŁ
ăăăŚăăŞăďźăŤăĺ˝ăŚăŻăžăăžăă...ăăăŻéăćŞăăăă§ăăďź ăăăŻç§ăăĄăćŹĺ˝ăŤçăăăă¨ăă§ăăĺśéă§ăăďź ĺ°ćĽăăă¨ăă°&mut
ăRc
ă§çĄĺšăŤăăĺż
čŚăŽăăăăŽăăŞăăŞăă¨ăŻäżĄăăăăžăă...
ç§ăŻăăăč°čŤăăăă¨äżĄăăŚăăžăăăăăŚăăăŻăăĄăăé常ăŤé
ăă§ăăăăăç§ăŻăžă č°čŤăŽä˝ç˝ŽăŤimpl Trait
ăŤćşčśłăăŚăăžăăă
ĺ¤ăŤăăŁăŚéé/ĺ çŠăŽä¸ĄćšaďźăŽäťäşăŤč˝ĺăăăăłbďźăŻăăĺşĺăăŽă§ăĺŽčŁ ăŽčŠłç´°ă¨ăăŚăăăă¤ăăŽç¨ŽéĄăćąăć Łç¨çă§ăăă彟ăăŻç´ćĽăć§č˝ăĺŽĺŽć§ăŽéăŽăłă˘ăăŞăĽăźăăľăăźăăăŚăăăăă1.0䝼ĺăăăăăŚăăžăă¨ĺŽĺ ¨ć§ă
ăăăăŁăŚă -> impl Trait
ăŻă1.0ăŤăăç´ćăćăăăăă¨ăă¸ăąăźăšăĺé¤ăăăăć˘ĺăŽćŠč˝ăä¸čŹĺăăă ăă§ăăăăăŻăĺżĺĺăŽĺŚçăŤĺ¸¸ăŤä˝żç¨ăăăŚăăăŽă¨ĺăăĄăŤăăşă ă使ç¨ăăŚăé˘ć°ăŤĺşĺĺăčż˝ĺ ăăăăăéŠç¨ăăžăăĺ¤ăăŽĺ ´ĺă abstract type
ăă¤ăžăă˘ă¸ăĽăźăŤăŽĺşĺăżă¤ăăăĺ§ăăćšăĺĺçă ăŁăăăăăăžăăăăRustăŤMLă˘ă¸ăĽăźăŤăˇăšăă ăăŞăăă¨ăčăăă¨ăé ĺşăŻĺ¤§ăăăă¨ă§ăŻăăăžăăă
fn f(t: impl Trait)
䝣ăăăŤăă§ăăă¨ăăççąă ăă§ăčż˝ĺ ăăăăăăŤćăăčŚčżăăŤĺĺăŞćŠčżăăăăăŤč¨čŞăăă大ăăăčŚçĽăăŹăăŽăŤăăžăă ç§ăŻčŚĺ´ăăăăăŤéŠĺăăć˘ĺăŽăăŹăźă ăŻăźăŻăčŚă¤ăăăă¨ăă§ăăžăăă§ăăă fn f(f: impl Fn(...) -> ...)
ăŽç°Ąć˝ăăŤé˘ăăč°čŤă¨ăĺ˘çăăă§ăŤ<T: Trait>
ă¨where
严ćšăŽĺĽăŤĺŤăžăăŚăăĺŻč˝ć§ăăăăă¨ăŽćŁĺ˝ć§ăç解ăăŚăăžăăăăăăăŻä¸çŠşăŤćăăžăă 彟ăăŻćŹ çšăĺŚĺŽăăžăăďź
<>
/ where
ăŻ1ă¤ăŽć§ćăĺ
ąćăăžăădyn Trait
ă¨ăŽéĄäźźć§ăŻăćŁç´ăŞă¨ăăă誤ăŁăăăŽă§ăădyn Trait
常ăŤĺăăă¨ăćĺłăăć˘ĺăŽčŞĺăăŹă¤ăăĄăŤăăşă ăäťăă䝼ĺ¤ăŻăĺ¨ĺ˛ăŽĺŽŁč¨ăŤăććăăăžăăădyn Trait
ăŻăăźăżć§é ă§ä˝żç¨ă§ăăăăăŻĺŽéăŤăŻăăŽä¸ťčŚăŞăŚăźăšăąăźăšăŽ1ă¤ă§ăă ăăźăżć§é ăŽimpl Trait
ăŻăăăźăżć§é ăŽăăšăŚăŽç¨éă調ăšăŞăăă°ćĺłăăăăžăăădyn Trait
ćĺłăŽä¸é¨ăŻĺćśĺťă§ăăă impl Trait
ăŻăăŽĺŽčŁ
ăŤă¤ăăŚä˝ăćĺłăăžăăăfn f(t: impl Trait)
ăŻăaďźć°ćŠč˝ă§ăŻćŠč˝ăăŞăăăăăł/ăžăăŻbďźčŞĺçšć§ăŽĺéĄăŽăăăŤăăăŤĺ¤ăăŽă¨ăă¸ăąăźăšăŽĺźčˇĺŁŤăĺż
čŚă¨ăăĺŻč˝ć§ăăăăžăă fn f<dyn T: Trait>(t: T, u: dyn impl Urait)
ćłĺăăŚăżăŚăă ăăďź ďźć˛éł´ďźă¤ăžăăĺźć°ăŽä˝ç˝ŽăŤăăimpl Trait
ăŻă¨ăă¸ăąăźăšăčż˝ĺ ăăĺĽĺŚăŞäşçŽăăăĺ¤ă使ç¨ăăč¨čŞăăă大ăăćăăăăăŞăŠă§ăăăćťăăŽä˝ç˝ŽăŤăăimpl Trait
ăŻçľąä¸ăăăžăăç°Ąç´ ĺăăč¨čŞăăăçˇĺŻăŤçľăłäťăăžăă
ďźSendă¨ăăŚăăźăŻăăăŚăăŞăéăSendăčŚćąăăSyncă¨ăăŚăăźăŻăăăŚăăŞăéăSyncăćäžăăŞăăŽăŻăŠăă§ăăďź é俥ăŻĺćă¨ćŻčźăăŚăăä¸čŹçă§ăăă¨ćăăăžăăăďź
ăăăŻé常ăŤâŚćŁćçă§ă˘ăăăăŻăŞćăăăăžăă ĺ¤ĺăăăŻăżă¤ăăłă°ăĺ°ăŞăă§ăăăăăĺ¤ăăŽč¨ćśă¨ăăĺ¤ăăŽćˇˇäšąă§ăă
ăă¤ăŻăŻĺ°ĺą-yăŽčăăăăăŤăŞăăăăŤć°ăăăăăŤä¸č¨ăŽç§ăŽçšăăďźäťŁăăăŤimpl
ă使ç¨type
ďź ăăăŻé˘éŁăăĺăŤä˝żç¨ăăăăăźăŻăźăă§ăăă abstract type
ăŤä˝żç¨ăăăăăźăŻăźăďźăŽ1ă¤ďźă§ăăĺŻč˝ć§ăéŤăăăăă§ăăăŞăčŞçśă§ăăăăé˘ć°ăŽĺşĺĺăăŽćŚĺżľăăă示ĺăăŚăăžăă
// keeping the same basic structure, just replacing the keyword:
fn f() -> type Trait
// trying to lean further into the concept:
fn f() -> type R: Trait
fn f() -> type R where R: Trait
fn f() -> (i32, type R) where R: Trait
// or perhaps:
fn f() -> type R: Trait in R
// or maybe just:
fn f() -> type: Trait
čŞăă§ăăă ăăăăă¨ăăăăăžăăćçľćąşĺŽăŤăăăRustăćĺăŽćšĺăŤé˛ăăă¨ăéĄăŁăŚăăžăă
ăăć¸ăăăç°č°ăŤćčŹăăžăă ăăŞăăććăăăăăŤăčŞĺçšć§ăŻĺ¸¸ăŤăé ăăăăžăžă§ăăă¨äşćłăăăăăăăăŞăăăă¤ăăŽĺŽčŁ ăŽčŠłç´°ăăĺ ŹéăăăăăăŽćĺłçăŞé¸ćă§ăăă ăăăžă§ăŽă¨ăăăăăŽé¸ćăŻĺŽéăŤăŻăăŞăăăžăăăŁăă¨ćăăžăăăç§ăŻĺ¸¸ăŤăăăŤă¤ăăŚçˇĺźľăăŚăăă¨ĺç˝ăăžăă
éčŚăŞĺéĄăŻé˘ć°ăĺŽéăŤć§é ä˝ç°ăŞăŁăŚăăç¨ĺşŚă§ăăăăăŤç§ăŤăŻćăăžăă
ć§é ăŽăŹă¤ă˘ăŚăăĺ¤ć´ăăăă¨ăŻăăăťăŠä¸čŹçă§ăŻăăăžăăă ăăăé˛ăăă¨ăă§ăăžăă é˘ć°ăĺăčŞĺçšć§ăĺŽčŁ ăçśăăăă¨ăäżč¨źăăăăăŽäżĺŽăŽč˛ ć ăŻăé˘ć°ăĺ¤§ĺš ăŤĺ¤ć´ăăăă¨ăăççąă ăă§ăć§é ăŽăăăăă大ăăăŞăăžăă
ăăăăŠăăťăŠçĺŽă§ăăăăçĽăăŽăŻćŹĺ˝ăŤéŁăăă§ăă Rc
ĺ°ĺ
ĽăŻć
éăŤčĄăĺż
čŚăăăă¨ăăăŽăä¸čŹçăŞăŤăźăŤăŽăăă§ăăăăăŻăăŠăăŤäżĺăăăă¨ăăĺéĄă§ăŻRc
ă§ăŻăŞăă dyn Trait
ĺ°ĺ
Ľăăăă¨ă§ăăăăăŻăăăžăćç˝ă§ăŻăŞăĺŻč˝ć§ăăăăăă§ăăďź
futuresăčżăăłăźăă§ăŻăăšăŹăăăťăźăă§ăŞăĺăŞăŠăćä˝ăăăă¨ăŻăžăă§ăăă¨ĺźˇăćăăžăă ăăŞăăŻăăăăŽç¨ŽéĄăŽăŠă¤ăăŠăŞăéżăăĺžĺăăăăžăă ďźăăĄăăăçžĺŽçăŞăˇăăŞăŞă§ăłăźăăĺŽčĄăăăăšăăčĄăăă¨ăŻĺ¸¸ăŤćçă§ăăďź
ăăăăŤăăăĺŽĺŽĺćéăăăăä¸ăăŚăăäşĺăŤçĽăăŽăŻéŁăăăŽă§ă¤ăŠă¤ăŠăăžăă
ćĺžăŤăčŞĺčŞĺçšć§ă ăăé¸ćč˘ă§ăŻăŞăăă¨ăăäźăăăăă¨ćăăžăă ăăăŻç§ăăĄăé¸ćăăăŞăăˇă§ăłă§ăăăăŞăăă˘ăŚăăŽčŞĺçšć§ăŽäťŁćżć掾ăŻäžçśă¨ăăŚäťŁćżć掾ă§ăă
確ăăŤă Send
ăăăŞçšĺŽăŽčŞĺçšć§ăăé¸ăłĺşăăă¨ăăčăăŤăŻééăăŞăçˇĺźľăăŚăăžăă ăžăăĺ
çŠäťĽĺ¤ăŤăimplăăŹă¤ăăŽăŚăźăšăąăźăšăăăăă¨ăŤăçćăăŚăă ăăă ăă¨ăă°ăă¤ăăŹăźăżăžăăŻăŻăăźă¸ăŁăčżă-ăăăŚăăŽăăăŞĺ ´ĺăăăăŠăŤăă§é俥ăžăăŻĺćăăăăŠăăăŻćăăă§ăŻăăăžăăă ăăăăŤăăăăăŞăăćŹĺ˝ăŤćăă§ăăăă¨ăăăăŚç§ăăĄăĺťśćăăăă¨ăăŚăăăă¨=ďźăŻăä¸ç¨ŽăŽăćĄäťśäťăăăă¤ăłăă§ăďź T
ăé俥ăŽĺ ´ĺăŻé俥ďźă ăăăŻăžăăŤčŞĺçšć§ăăăŞăăŤä¸ăăăăŽă§ăă
@rpjohnst
ăăăŻč°čŤăăăă¨ćăăžă
確ăăŤăăăăŻ:)ä˝ĺš´ăĺăŽćĺăŽimpl Trait
RFClo䝼ćĽăăŁă¨ăăăžăă ďźăăăă2014ĺš´ăç§ăŻĺš´ăă¨ăŁăŚăăžăăďź
ç§ăŻčŚĺ´ăăăăăŤéŠĺăăć˘ĺăŽăăŹăźă ăŻăźăŻăčŚă¤ăăăă¨ăă§ăăžăăă§ăăă
ăžăŁăăéăŽćăăăăžăă ç§ăŤăŻăăŞăimpl Trait
ăĺźć°ăŽä˝ç˝ŽăŤăăimpl Trait
垊帰ä˝ç˝Žă§ăŻăăăšăŚăŽăăĺ¤ăăéçŤăŁăŚăăžăă ç§ăčŚăçľąä¸ăšăŹăăăŻćŹĄăŽă¨ăăă§ăă
impl Trait
-襨示ăăăĺ ´ćăŤăŻăă Trait
ăĺŽčŁ
ăăăăă¤ăăŽĺ形ĺăăăĺăăăăăă¨ă示ăăŚăăžăă ďźčŞ°ăăăŽăżă¤ăďźçşäżĄč
ăžăăŻç俥č
ďźăćĺŽăăăăŻă impl Trait
ă襨示ăăăĺ ´ćăŤăăŁăŚç°ăŞăăžăăďźdyn Trait
-襨示ăăăŚăăĺ ´ćăŻă Trait
ăĺŽčŁ
ăăăżă¤ăăăăăă¨ă示ăăŚăăžăăăăżă¤ăăŽé¸ćăŻĺçăŤčĄăăăŚăăžăăăăŽç´ćăŤĺşăĽăăŚă impl Trait
ă襨示ăăăĺ ´ćăŽăťăăăćĄĺźľăăč¨çťăăăăžăă ăă¨ăă°ă httpsďź//github.com/rust-lang/rfcs/pull/2071ăŻč¨ąĺŻăăžă
let x: impl Trait = ...;
ĺăĺĺăéŠç¨ăăăžăăăżă¤ăăŽé¸ćăŻéçăŤçĽăăăŚăăžăă ĺć§ăŤăĺăRFCă§abstract type
ďź impl Trait
ăŻä¸ç¨ŽăŽĺćçłă¨ăăŚç解ă§ăăžăďźăĺ°ĺ
ĽăăăŚăăžăăăăăŻăăăŹă¤ăimplăŤčĄ¨ç¤şăăăă˘ă¸ăĽăźăŤăŽăĄăłăăźă¨ăăŚă襨示ăăăžăă
ăă¤ăŻăŻĺ°ĺą-yăŽčăăăăăŤăăă§ăŻăŞăăăăă¨ăăŚăŽç§ăŽçšăăä¸ďźäťŁăăăŤ
impl
ă使ç¨type
ďź
ĺäşşçăŤăŻăăăă§čŞčť˘čťĺ°ĺąă垊洝ăăăć°ăŻăăăžăăă https://github.com/rust-lang/rfcs/pull/2071ăŞăŠă§ć§ćăŤă¤ăăŚč°čŤăăăŽăŤăăŞăăŽćéă貝ăăăžăăă ăĺŽç§ăŞăăźăŻăźăăăŻăŞăăăă§ăăă impl
ăăĺŽčŁ
ăăăżă¤ăăă¨ăăŚčŞăżĺăă¨ăé常ăŤăăžăćŠč˝ăăžăă
čŞĺăăŹă¤ăăŞăźăŻăŤă¤ăăŚăăĺ°ăčż˝ĺ ăăžăăăďź
ăžăăćçľçăŤăŻăčŞĺăăŹă¤ăăŞăźăŻăŻĺŽéăŤăŻăăă§čĄăăŽăćŁăăăă¨ă ă¨ćăăžăăăăăŻăäťăŽč¨čŞă¨ä¸č˛ŤăăŚăăăăă§ăă čŞĺçšć§ăŻăĺăŤčż°ăšăăăăŤă常ăŤăŽăŁăłăăŤă§ăăăăĺşćŹçăŤăŻććăä¸ăăŚăăăăă§ăă impl Trait
ăăăăťăŠĺ¤§ăăç°ăŞăă¨ăŻćăăžăăă
ăăăăžăăç§ăŻăăă§é ăăăă¨ăŤă¤ăăŚăăŞăçˇĺźľăăŚăăžăă ç§ăŻäťăŽčĺłćˇąăçšăŻăč¨č¨çŠşéă§ăăăă¨ăŤĺćăăç§ăăĄăŻĺłăŽăšăăăăç´ćăăŚăă100ďź ăŽčŞäżĄăćăŁăŚăăŞăăăç§ăŻăç§ăăĄăäťăžă§ăăăŽç˘şĺŽă§ăăăă¨ăçĽăăžăăă äťé ăăă¨ăäťĺš´ăŽăăźăăăăăĺŽçžăăăŽăŤčŚĺ´ăăăŽă§ăŻăŞăăă¨ăăŞăĺżé ăăŚăăžăă
ćĺžăŤăç§ăééăŁăŚăăĺ ´ĺăŽĺ˝ąéżăŤă¤ăăŚčăăŚăżăžăăăăăăă§ĺşćŹçăŤčŠąăăŚăăăŽăŻăsemverăŽĺ¤ćăăăăŤĺžŽĺŚăŤăŞăă¨ăăăă¨ă§ăă ăăăŻć¸ĺżľäşé
ă ă¨ćăăžăăăăăžăăžăŞćšćłă§čť˝ć¸ă§ăăĺéĄă§ăă ăă¨ăă°ă !Send
ăžăăŻ!Sync
ăżă¤ăăĺ°ĺ
Ľăăăă¨ăăŤčŚĺăăăŞăłăă使ç¨ă§ăăžăă ĺśçşçăŞsemveréĺăé˛ăăŽăŤĺ˝šçŤă¤semvercheckerăŽĺ°ĺ
ĽăŤă¤ăăŚăŻăéˇăé芹ăĺăŁăŚăăžăăăăăăŻăăăă彚çŤă¤ĺĽăŽăąăźăšăŽăăă§ăă čŚăăăŤăĺéĄă§ăăăç§ăŻé大ăŞĺéĄă§ăŻăŞăă¨ćăăžăă
ă§ăăăăĺ°ăŞăă¨ăçžćçšă§ăŻăç§ăŻăžă çžĺ¨ăŽéăćŠăżçśăăăă¨ćăŁăŚăăžăă
ĺäşşçăŤăŻăăăă§čŞčť˘čťĺ°ĺąă垊洝ăăăć°ăŻăăăžăăă
ç§ăăăăŤă˛ăŠăćčłăăŚăăžăăă ĺźć°ăŽä˝ç˝ŽăŤăăimpl Trait
ăŻăćĺłçăŤă§ăŻăŞă
ç§ăŤăŻăăŞă
impl Trait
ăĺźć°ăŽä˝ç˝ŽăŤăăimpl Trait
垊帰ä˝ç˝Žă§ăŻăăăšăŚăŽăăĺ¤ăăéçŤăŁăŚăăžăă
é˘éŁăăĺă¨ăŽéĄäźźć§ăčăăă¨ăăăăŻăĺźć°ăŽä˝ç˝ŽăŤtype T
ăăŞăă¨ăé˘éŁăăĺăăăăŤçŽçŤă¤ăăŽăăăŤăŞăăžăă ç§ăăĄăé¸ćăăć§ćăŻçĄćĺłăŤćăăăăăăăçšĺŽăŽç°č°ăŻĺşăŚăăŞăăŽă§ăŻăŞăăă¨ćăăžăăć˘ĺăŽć§ćăŻă trait Trait<type SomeAssociatedType>
ăăăŞć§ćçłčĄŁăŽĺż
čŚć§ă誰ăćăăŞăăťăŠĺĺă§ăă
ă Trait
ăĺŽčŁ
ăăăăă¤ăăŽĺ形ĺăăăĺăăŽć§ćăŻăă§ăŤăăăžăă ăăŹă¤ăăŽĺ ´ĺăăĺźăłĺşăĺ
ăă¨ăĺźăłĺşăĺ
ăăŽä¸Ąćšă§ćĺŽăăăăăŞă˘ăłăăăăăžăă é˘ć°ăŽĺ ´ĺăĺźăłĺşăĺ
ăćĺŽăăăăŞă˘ăłăăăăŞăăăăĺźăłĺşăĺ
ăćĺŽăăăăŞă˘ăłăăŽć°ăăć§ćăĺż
čŚă§ăă
ăăŽć°ăăć§ćăăăźăŤăŤĺ¤ć°ăŤćĄĺźľăăăă¨ăŻćŁĺ˝ĺăăăĺŻč˝ć§ăăăăžăăăăăŻăé˘éŁäťăăăăăżă¤ăăŽăăăŞçśćłă§ăăăăăă§ăăăăăŻăĺźăŽĺşĺăżă¤ăăé襨示ăŤăăŚĺĺăäťăăćšćłă§ăăăĺźăłĺşăĺ é˘ć°ăŽĺşĺăżă¤ăă蝢éăăăŽăŤĺ˝šçŤăĄăžăă
䝼ĺăŽăłăĄăłăă§čż°ăšăăăăŤăç§ăŻabstract type
ăăĄăłă§ăăăăžăă çš°ăčżăăŤăŞăăžăăăăăăŻĺăŤăĺşĺăżă¤ăăăŽćŚĺżľăă˘ă¸ăĽăźăŤăŤćĄĺźľăăăăŽă§ăă ăžăă -> impl Trait
ă let x: impl Trait
ăăăăłabstract type
ăŽć¨čŤăăăŹă¤ăimplsăŽé˘éŁăăĺăŤéŠç¨ăăăă¨ăç´ ć´ăăăăă¨ă§ăă
ĺ ˇä˝çăŤăŻăç§ăĺŤăăŞé˘ć°ăŽĺźć°ăŤăăŽć°ăăć§ćăčż˝ĺ ăăă¨ăăćŚĺżľă§ăă ĺźăčžźăžăăŚăăäťăŽćŠč˝ă¨ĺăăă¨ăŻăăžăăă ăăăŻăăă§ăŤćăŁăŚăăć§ćă¨ĺăăă¨ăčĄăăžăăăă¨ăă¸ăąăźăšăĺ¤ăăéŠç¨ć§ăä˝ăăŞăŁăŚăăžăă ďź/
@nikomatsakis
ăăăăŠăăťăŠçĺŽă§ăăăăçĽăăŽăŻćŹĺ˝ăŤéŁăăă§ăă
ăăăŞăäżĺŽçă§ăăă¨ăăĺ´ă§čޤăăçŻăăšăă ă¨ç§ăŤăŻćăăžăăďź ăăĺ¤ăăŽćéă§č¨č¨ăŽäżĄé źć§ăéŤăăăă¨ăă§ăăžăăďźčŞĺçšć§ăŽăŞăźăŻăĺĽăŽćŠč˝ă˛ăźăăŽä¸ăŤç˝ŽăăćŽăăŽimpl Trait
ăĺŽĺŽăăăŚăăéăŻĺ¤éăŽăżďźďź äťăŞăźăŻăăŞăăă°ăĺžă§ăă¤ă§ăčŞĺăăŹă¤ăăŞăźăŻăŽăľăăźăăčż˝ĺ ă§ăăžăă
ăăăăžăăç§ăŻăăă§é ăăăă¨ăŤă¤ăăŚăăŞăçˇĺźľăăŚăăžăă [..]äťé ăăă¨ăäťĺš´ăŽăăźăăăăăĺŽçžăăăŽăŤčŚĺ´ăăăŽă§ăŻăŞăăă¨ăăŞăĺżé ăăŚăăžăă
ăăăăžăăďź ăăăăăăŞăăčăăŚăăă¨ç˘şäżĄăăŚăăăăăŤăăăă§ăŽćąşĺŽăŻăäťĺžä˝ĺš´ăŤăăăăŁăŚç§ăăĄă¨ĺ ąăŤçăăŚăăăžăă
ăă¨ăă°ă
!Send
ăžăăŻ!Sync
ăżă¤ăăĺ°ĺ Ľăăăă¨ăăŤčŚĺăăăŞăłăă使ç¨ă§ăăžăă ĺśçşçăŞsemveréĺăé˛ăăŽăŤĺ˝šçŤă¤semvercheckerăŽĺ°ĺ ĽăŤă¤ăăŚăŻăéˇăé芹ăĺăŁăŚăăžăăăăăăŻăăăă彚çŤă¤ĺĽăŽăąăźăšăŽăăă§ăă čŚăăăŤăĺéĄă§ăăăç§ăŻé大ăŞĺéĄă§ăŻăŞăă¨ćăăžăă
ăăăŻčăăŚčŻăăŁăă§ăďź đăăăŚăăăăŻç§ăŽć¸ĺżľăăťă¨ăăŠĺăăăă¨ćăăžăă
確ăăŤă
Send
ăăăŞçšĺŽăŽčŞĺçšć§ăăé¸ăłĺşăăă¨ăăčăăŤăŻééăăŞăçˇĺźľăăŚăăžăă
ç§ăŻăăŽćć ăŤé常ăŤĺćăăžăđă
ăăăăŤăăăăăŞăăćŹĺ˝ăŤćăă§ăăăă¨ăăăăŚç§ăăĄăĺťśćăăăă¨ăăŚăăăă¨=ďźăŻăä¸ç¨ŽăŽăćĄäťśäťăăăă¤ăłăă§ăďź
T
ăé俥ăŽĺ ´ĺăŻé俥ďźă ăăăŻăžăăŤčŞĺçšć§ăăăŞăăŤä¸ăăăăŽă§ăă
ăłăźăăăăăć示çăŤčż°ăšăŚăăă°ă T: Send => Foo<T>: Send
ćšăăăç解ă§ăăă¨ćăăžăă
fn foo<T: Extra, trait Extra = Send>(x: T) -> impl Bar + Extra {..}
WG-Traitsă§čŞŹćăăăăăŤăăăă§ăŻăžăŁăăć¨čŤă§ăăŞăĺŻč˝ć§ăăăăăă Send
䝼ĺ¤ăŽăăŽăĺż
čŚăŞĺ ´ĺăŻă常ăŤExtra
ăćĺŽăăĺż
čŚăăăăžăă ă
@rpjohnst
dyn Trait
ă¨ăŽéĄäźźć§ăŻăćŁç´ăŞă¨ăăă誤ăŁăăăŽă§ăă
ĺźć°ăŽä˝ç˝ŽăŤăăimpl Trait
ăŤé˘ăăŚăŻăfalseă§ăăă -> impl Trait
ăŻăŠăĄăăĺŽĺĺă§ăăăăăăăă§
- ăăă§ăé˘ć°ăŽĺŽčŁ ăŽčŠłç´°ďźĺăăŠăĄăźăżăźăŽĺŽŁč¨ćšćłďźăă¤ăłăżăźăă§ă¤ăšăŽä¸é¨ăŤăŞăăžăăăăăŻăĺăč¨čż°ă§ăăŞăăăă§ăă
ăżăźăăăŁăăˇăĽăŽăăă§ăĺăăŠăĄăźăżăźăŽé ĺşăĺŽčŁ
ăŽčŠłç´°ăŤăŞăŁăăă¨ăăŞăăă¨ăŤćł¨ćăăŚăă ăăăăăŽçšă§ă impl Trait
ăŻăăżăźăăăŁăăˇăĽă§çšĺŽăŽĺĺźć°ăćĺŽăăŞăăžăžăŤăăŚăăăă¨ăă§ăăăăă彚çŤă¤ă¨ćăăžăă ă
[..]ăăăŤăăć˘ĺăŽć§ćăŻătraitTraităŽăăăŞć§ćçłčĄŁć§ćăŽĺż čŚć§ă誰ăćăăŞăăťăŠĺĺăŤĺŞăăŚăăžăă
ă
羜寞ă¨ăŻçľśĺŻžč¨ăăŞďź https://github.com/rust-lang/rfcs/issues/2274
@nikomatsakisăŽăăăŤăăăăăŽĺĺŁĺ ´ă§ăŽăłăĄăłăăŤćł¨ćăćăŁăŚăăăăă¨ăŤćŹĺ˝ăŤćčŹăăŚăăžăă 貨çŠĺčťăŽĺăŤčşŤăćăĺşăăă¨ăăŚăăăăăŤćăăăă¨ăăăăă¨ăç§ăŻçĽăŁăŚăăžăăçšăŤăăă¨ĺăăăăéˇăéćăžăăćŠč˝ăŽăăăŤďź
@daboross ăăŞăăă˘ăŚăăŽă˘ă¤ăă˘ăăăĺ°ăćăä¸ăăăă¨ćăăžăăă ä¸čŚăăă¨ă署ĺăĺŽĺ ¨ăŤčż°ăšăăă¨ăă§ăăăŽă§ăăăăŻććăŤćăăžăăăä¸čŹçăŞăąăźăšăç°Ąć˝ăŤăăăăăŠăŤăă使ç¨ăăžăă
ăă ăăćŽĺżľăŞăăăĺ ¨ä˝ĺăčŚĺ§ăăă¨ăăăă¤ăăŽĺéĄăçşçăăžăă
impl Trait
ăŞăăă˘ăŚăă¨ăăŚćąăăăĺ ´ĺăăăăădyn Trait
ăŞăăă˘ăŚăă§ăăĺż
čŚăăăăžăăfn foo<T>(t: T)
ĺ ´ĺăăăăŠăŤăă§T: Send
ĺççăŤćĺž
ă§ăăžăăSized
ăŽăżéŠç¨ăăăŚăăžăă ăăăŻăăăăŠăŤăă§ăŠăă§ăćłĺŽăăăŚăăçšć§ă§ăăă ?Sized
ć¸ăăă¨ă§ăŞăăă˘ăŚăăăžăă?Sized
ăĄăŤăăşă ăŻăRustăŽćăăăăžăă§ăćăăăŽăéŁăăĺ´é˘ăŽ1ă¤ă§ăăăä¸čŹăŤăäťăŽćŚĺżľăŤćĄĺźľăăăă¨ăé常ăŤĺŤăăŁăŚăăžăă Send
ăăăŤä¸ĺżçăŞćŚĺżľăŤăăă使ç¨ăăăă¨ăŻĺąéşă§ăăăăăŤćăăăžă-ăăĄăăăăăă大ăăŞé大ăŞĺ¤ĺăŤăŞăăă¨ăŻč¨ăăžă§ăăăăžăăă
ăăăŠăăăăĺ¤ăăŽć
ĺ ąďźă¸ă§ăăŞăăŻĺťčŹĺăŽçžăăăŽä¸é¨äťćĽăŻăăŞăăĺšćçăŤĺăĺŽčŁ
čŞĺăăŹă¤ăăă¸ă§ăăŞăăŻçľăăŁăŚăăăăŚăĄăăăŠăăŽć
ĺ ąăćă¤ăă¨ăă§ăăă¨ăăăă¨ă§ăăŽă§ăç§ăăĄăŻćŹĺ˝ăŤăă¸ă§ăăŞăăŻĺťčŹĺăŽčŞĺ形質ĺćăŤçźăăŤăăăăăăžăăăăăăźăšăŤăźăă ăă¨ăă°ă fn f<T>(t: T) -> Option<T>
ăŤă¤ăăŚčăăŚăżăžăă Send
ă§ăăăăŠăăăŤé˘äżăŞăă T
ă渥ăăă¨ăă§ăă T
ĺ ´ĺăĺşĺăŻSend
T
ăŤăŞăăžăă ăăăŻăRustăŽă¸ă§ăăŞăăŻăšăăźăŞăźăŽé常ăŤéčŚăŞé¨ĺă§ăă
dyn Trait
ăĺéĄăăăăžăă çšăŤăĺĺĽăŤăłăłăă¤ăŤăăăăăăăŽăăŞăăă˘ăŚăăăŽć§čłŞăă Send
ăSync
ăŞăŠăŽăăăçĽăăăŚăăăčŞĺçšć§ăŽăżăŤĺśéăăĺż
čŚăăăăžăă ăăăŻăăăăăĺ¤é¨ä˝żç¨ăŽăăăŤauto trait
ăćąşăăŚĺŽĺŽăăăŞăăă¨ăćĺłăăă§ăăăă
ćĺžăŤăăăŞăźăŻăăăśă¤ăłăŻăä¸éćďźOPAQUEďźĺăčżăăăăŤnewtypeăŠăăăźăä˝ćăăă¨ăăŤäťćĽčľˇăăŁăăă¨ăć示çăŤă˘ăăŤĺăăăă¨ăçš°ăčżă䞥ĺ¤ăăăăžăă ĺşćŹçăŤăăćźăăăŻăăăăčŞĺčťăŽçšć§ăŤĺşćăŽĺ´é˘ă§ăăă¨ç§ăŻäżĄăăŚăăžăă ăăŹăźăăŞăăăăăžăăăăăăćŠč˝ăŽć ¸ĺżă§ăăăăăăŤĺżăăŚć°ăăćŠč˝ăç¸äşä˝ç¨ăăăăăŤĺŞĺăăĺż čŚăăăă¨ćăăžăă
@rpjohnst
ä¸č¨ăŽRFCă¨@nikomatsakisăŽčŚç´ăłăĄăłăăŤé˘ăăĺşçŻăŞč°čŤăŽĺžăč°čŤăŽä˝ç˝ŽăŽĺéĄăŤă¤ăăŚčż˝ĺ ăăăă¨ăŻăăžăăăăžăăă
ăăă§ăé˘ć°ăŽĺŽčŁ ăŽčŠłç´°ďźĺăăŠăĄăźăżăźăŽĺŽŁč¨ćšćłďźăă¤ăłăżăźăă§ă¤ăšăŽä¸é¨ăŤăŞăăžăăăăăŻăĺăč¨čż°ă§ăăŞăăăă§ăă
ăăăä˝ăćĺłăăăŽăăăăăžăăă ćĄĺ¤§ă§ăăžăăďź
ăžăă揥ăŽăăăŞăăŹăźăşăŤă注ćăăăă¨ćăăžăă
fn fďźtďźimpl TraitďźăŻă䝣ăăăŤăă§ăăă¨ăăççąă ăă§ăčż˝ĺ ăăăăăăŤćăăžă
čŞ ĺŽăŞč°čŤăćăŞăďźçš°ăčżăăăăăżăźăłă§ăăăăăăăăĺźăłĺşăăŚăăžăďźă RFCăŻăćŠč˝ăĺćŠäťăăăăă§čĄăŁăŚăăč°čŤăŽăăă¤ăăŤĺčŤăăăăăŤăăŞăăŽéˇăă貝ăăăŚăăžăăăăĄăăăăšăŹăăăŤé˘ăăč°čŤăăRFCăŽäťĽĺăŽĺ垊ăŞăŠă§ăŽč°čŤăŻč¨ăăžă§ăăăăžăăă
ăăŹăźăăŞăăĺĺ¨ăă確ăăŤćŹ çšăăăăžăăăăăăŻç§ăăĄăč°čŤăŽăĺ寞ĺ´ăăŽäźźéĄçľľăŤĺççăŞçľčŤăĺşăăŽăŤĺ˝šçŤăĄăžăăă
芳細ăŞăłăĄăłăăăăăă¨ăăăăăžăăďź ă¤ăăŤĺŽĺŽçă§impl Trait
ăĺşčˇă§ăăăă¨ăŤă¨ăŚăč弎ăăŚăăăŽă§ăçžĺ¨ăŽĺŽčŁ
ă¨ăăăŤčłăăžă§ăŽč¨č¨ä¸ăŽćąşĺŽăŤĺ¤§ăăĺăŁăŚăăžăă ă¨ăŻč¨ăăăŽăŽăç§ăŻĺŻč˝ăŞéăĺ
ŹĺšłăŤĺŻžĺżăăăźăăăĺ§ăăŚăăăăŽăăăŤçŠäşăć¤č¨ăăăăăŤćĺăĺ°˝ăăăžăă
auto Trait
ćźăauto Trait
ăŞăźăŻăŽă˘ă¤ăă˘ăŻăéˇăéç§ăćŠăžăăŚăăžăăăăăćĺłă§ăŻăRustăŽč¨č¨çŽć¨ăŽĺ¤ăă¨ăŻćŁĺ寞ăŤćăăăăăăăžăăă C ++ăMLăăĄăăŞăźăŞăŠăŽçĽĺ
ă¨ćŻčźăăă¨ăRustăŻăé˘ć°ĺŽŁč¨ă§ć示çăŤć示çăŤćĺŽăăĺż
čŚăăăă¨ăăçšă§çăăăăŽă§ăă ç§ăŽćčŚă§ăŻăăăăŤăăRustăŽă¸ă§ăăŞăăŻé˘ć°ăčŞăżăăăăŞăăç解ăăăăăŞăăžăăăžăăĺžćšäşćć§ăŽăŞăĺ¤ć´ăčĄăăăŚăăĺ ´ĺăŻćŻčźçć確ăŤăŞăăžăă const fn
ă¸ăŽă˘ăăăźăă§ăăăŽăăżăźăłăçśçśăăé˘ć°ćŹä˝ăăconst
ć¨ć¸ŹăăăŽă§ăŻăŞăăé˘ć°ăčŞĺčŞčşŤăconst
ă¨ăăŚć示çăŤćĺŽăăĺż
čŚăăăăžăă ć示çăŞăăŹă¤ăĺ˘çă¨ĺć§ăŤăăăăŤăăăăŠăŽé˘ć°ăăŠăŽăăăŤä˝żç¨ă§ăăăăç°ĄĺăŤĺ¤ćă§ăăăŠă¤ăăŠăŞăŽä˝ćč
ăŻăĺŽčŁ
ăĺ°ăĺ¤ć´ăăŚăăŚăźăśăźăĺŁăăŞăă¨ăă確俥ăĺžăăăžăă
ă¨ăŻč¨ăăăŽăŽăç§ăŻFuchsiaăŞăăŹăźăăŁăłă°ăˇăšăă ă§ăŽä˝ćĽăĺŤăăčŞĺăŽăăă¸ă§ăŻăă§ăŞăżăźăłăă¸ăˇă§ăłimpl Trait
ĺš
ĺşă使ç¨ăăŚăăžăăăăăă§ăŻăčŞĺăăŹă¤ăăŞăźăŻăćŁăăăăăŠăŤăă§ăăă¨ćăăžăă ĺŽéăŤăŻăăŞăźăŻăĺé¤ăăçľćăćťăŁăŚ+ Send
ăĺşćŹçăŤăăšăŚăŽimpl Trait
čż˝ĺ ăăĺż
čŚăăăăžăăăăăžă§ăŤä˝ćăăé˘ć°ă使ç¨ăăžăă č˛ ăŽĺ˘çďź + !Send
ĺż
čŚďźăŻç§ăŤă¨ăŁăŚčĺłćˇąăă˘ă¤ăă˘ă§ăăăăťă¨ăăŠăăšăŚăŽĺăé˘ć°ă§+ !Unpin
ăč¨čż°ăăžăă ć示ć§ăŻăăŚăźăśăźăŽćąşĺŽăéçĽăăăăăłăźăăăăç解ăăăăăăăăăĺ ´ĺăŤĺ˝šçŤăĄăžăă ăăŽĺ ´ĺăăŠăĄăăăăŞăă¨ćăăžăă
Send
ă¨Sync
ăŻăăŚăźăśăźăăăă°ăŠă ăăăăłăłăăăšăăă§ăă Send
ă¨!Send
严ćšăŽăżă¤ăă使ç¨ăăă˘ăăŞăąăźăˇă§ăłăžăăŻăŠă¤ăăŠăŞăä˝ćăăăă¨ăŻé常ăŤăžăă§ăă ďźçšăŤăăăŤăăšăŹăăă§ăăăăŠăăăŤé˘äżăŞăăä¸ĺ¤ŽăŽă¨ă°ăźăăĽăźăżă§ĺŽčĄăăăéĺćăłăźăăä˝ćăăĺ ´ĺďźă ăšăŹăăăťăźăă§ăăăăŠăăăŽé¸ćăŻăă˘ăăŞăąăźăˇă§ăłăä˝ćăăă¨ăăŤćĺăŤčĄăăŞăăă°ăŞăăŞăé¸ćăŽ1ă¤ă§ăăăăă䝼éăăšăŹăăăťăźăă§ăăă¨é¸ćăăăă¨ăŻăăăšăŚăŽăżă¤ăăSend
ăŞăăă°ăŞăăŞăăă¨ăćĺłăăžăă ăŠă¤ăăŠăŞăŽĺ ´ĺăăťă¨ăăŠăŽĺ ´ĺă Send
ăżă¤ăă使ç¨ăăžăăăăăŻăé常ăăŠă¤ăăŠăŞă使ç¨ăăŞăă¨ăăăă¨ăŻăăšăŹăăăłăłăăăšăĺ
ă§ä˝żç¨ăăă¨ăăŠă¤ăăŠăŞă使ç¨ă§ăăŞăăŞăďźăžăăŻĺ°ç¨ăšăŹăăăä˝ćăăĺż
čŚăăăďźăă¨ăćĺłăăăăă§ăă 獜ĺăŽăŞăparking_lot::Mutex
ăŻăćć°ăŽCPUă§ä˝żç¨ăăĺ ´ĺăŽRefCell
ă¨ăťăźĺăăăăŠăźăăłăšăŤăŞăăăăăŚăźăśăźă!Send
使ç¨ăŤçšĺăăăŠă¤ăăŠăŞćŠč˝ăŤĺăăăăĺćŠăŻăăăžăă-ăąăźăšă ăăăăŽççąăăăé˘ć°ăˇă°ăăăŁăŹăăŤă§Send
!Send
ăżă¤ăă¨Send
ă§ăăŁăimpl Trait
ăżă¤ăăŤčޤăŁăŚ!Send
ăżă¤ăăĺ°ĺ
Ľăăžăăă ăăŽé¸ćăŤăŻčŞăżăăăă¨ć確ăăŽăłăšăăäź´ăăă¨ăŻäşĺŽă§ăăăäşşé塼ĺŚçăăăłä˝żăăăăăŽĺŠçšă¨ăŽăăŹăźăăŞăăŤăŻĺĺăŞäžĄĺ¤ăăăă¨ćăăžăă
impl Trait
ăăă§č¨ăăă¨ăŻăăžăăăăžăăăăĺźć°ăŽä˝ç˝Žimpl Trait
ăŤĺ°éăăăăłăŤăé˘ć°ăˇă°ăăăŁăŽčŞăżăăăă¨ĺ
¨ä˝çăŞĺżŤéŠăă大ĺš
ăŤĺä¸ăăăă¨ăăăăăžăăă 確ăăŤăäťćĽăŽRustă§ăŻä¸ĺŻč˝ăŞć°ăăćŠč˝ăŻčż˝ĺ ăăăŚăăžăăăăč¤éăŞé˘ć°ăˇă°ăăăŁăŽçć´ťăŽčłŞă大ĺš
ăŤĺä¸ăăćŚĺżľçăŤăŻćťăä˝ç˝Žimpl Trait
ă¨ăăžăăă˘ăŤăŞăŁăŚăăžăăăăăŚăăăŻOOPăăă°ăŠăăźăŽĺš¸ăăŞRustaceansă¸ăŽç§ťčĄă厚ćăŤăăžăă çžĺ¨ăĺ˘çăćäžăăăăă ăăŤĺĺäťăă¸ă§ăăŞăăŻĺăĺ°ĺ
Ľăăĺż
čŚăăăăă¨ăŤă¤ăăŚăŻăĺ¤ăăŽĺéˇć§ăăăăžăďźăă¨ăă°ă fn foo<F>(x: F) where F: FnOnce()
F
ă¨fn foo(x: impl FnOnce())
ďźă ăăŽĺ¤ć´ăŤăăăăăŽĺéĄă解湺ăăăčŞăżĺăă¨ć¸ăčžźăżă厚ćăŞé˘ć°ăˇă°ăăăŁăä˝ćăăăIMOăŻ-> impl Trait
ă¨čŞçśăŤčŞżĺăăŚăăăăăŤćăăăăžăă
TL; DRďźééăăŞăăăŹăźăăŞăăäź´ăăžăăăç§ăăĄăŽĺ˝ĺăŽćąşĺŽăŻćŁăăăăŽă ăŁăă¨ćăăžăă
RustăćéŤăŽč¨čŞă§ăăăă¨ă確čŞăăăăăŤăĺ¤ăăŽćéă¨ĺ´ĺă貝ăăăŚăçăăăçç´ăŤçşč¨ăăŚăăăăă¨ăŤćŹĺ˝ăŤćčŹăăŚăăžăă
@Centril
ĺźć°ăŽä˝ç˝ŽăŤăăimplTraităŤé˘ăăŚăŻăfalseă§ăăă-> impl TraităŻăŠăĄăăĺŽĺĺă§ăăăăăăăă§ăŻăăăžăăă
ăŻăăăăăŻç§ăćĺłăăăă¨ă§ăă
@aturon
...ăŽăăăŞăăŹăźăşăŻčŞ ĺŽăŞč°čŤăćăŞă
ăăă§ăăă芍ăłăăžăă ç§ăŻčŞĺăŽä¸ťĺźľăäťăŽĺ ´ćă§ăăčŻăăăă¨äżĄăăŚăăžăă
ăăă§ăé˘ć°ăŽĺŽčŁ ăŽčŠłç´°ďźĺăăŠăĄăźăżăźăŽĺŽŁč¨ćšćłďźăă¤ăłăżăźăă§ă¤ăšăŽä¸é¨ăŤăŞăăžăăăăăŻăĺăč¨čż°ă§ăăŞăăăă§ăă
ăăăä˝ăćĺłăăăŽăăăăăžăăă ćĄĺ¤§ă§ăăžăăďź
ĺźć°ăŽä˝ç˝Žă§impl Trait
ăăľăăźăăăăŚăăăăăăăŽé˘ć°ăŻćŹĄăŽ2ă¤ăŽćšćłă§č¨čż°ă§ăăžăă
fn f(t: impl Trait)
fn f<T: Trait>(t: T)
ăăŠăźă ăŽé¸ćăŤăăăAPIăłăłăˇăĽăźăăźăçšĺŽăŽă¤ăłăšăżăłăšĺăŽĺĺăć¸ăçăăăă¨ăă§ăăăăŠăăăćąşăžăăžăďźăă¨ăă°ăăăŽă˘ăăŹăšăĺĺžăăăăďźă impl Trait
ăăŞă˘ăłăă§ăŻăăăă§ăăžăăăăžăă <T>
ć§ćă使ç¨ăăăăăŤç˝˛ĺăć¸ăç´ăăŞăă¨ăăăă常ăŤĺéżă§ăăă¨ăŻéăăžăăă ăăăŤă <T>
ć§ćă¸ăŽç§ťčĄăŻăé大ăŞĺ¤ć´ă§ăă
ăăăŞăäźźéĄçľľăŽĺąéşăĺăăŚăăăăŽĺćŠăŻăćăăăă¨ăĺŚăśăă¨ăăăăŚä˝żăăă¨ăăăç°Ąĺă§ăăă¨ăăăă¨ă§ăă ăă ăă2ă¤ăŽăŠăĄăăé¸ćăăăăŻăĺăăŠăĄăźăżăźăŽé ĺşă¨ĺć§ăŤăé˘ć°ăŽă¤ăłăżăźăă§ă¤ăšăŽä¸ťčŚé¨ĺă§ăăăăăăăăăéŠĺăŤĺŻžĺŚăăăŚăăă¨ăŻćăăžăăăĺŽéăŤăŻă使ăăăăă使ăăăăăŤç°čŤăŻăăăžăăăăă忍éŠăŞé˘ć°ăˇă°ăăăŁăĺžăăăžăă
ĺŚçżĺŻč˝ć§/äşşé塼ĺŚăŤĺćŠäťăăăăäťăŽăĺç´ă ăéĺŽç->č¤éă ăä¸čŹçăŞăĺ¤ć´ăŽăăăăŤăăăžăŁăăăăŽăăăŤă¤ăłăżăźăă§ăźăšăĺŁăĺ¤ć´ăĺŤăžăăăăŠăăăŻăăăăžăăă ĺç´ăŞćšćłăŽč¤éăŞĺçăŽĺä˝ăŻĺăăăăŤĺä˝ăăă¤ăłăżăźăă§ă¤ăšăžăăŻĺä˝ăăă§ăŤĺ¤ć´ăăŚăăĺ ´ĺăŤăŽăżĺăćżăăĺż
čŚăăăăžăďźăă¨ăă°ăç术ăŽççĽăäşşé塼ĺŚăŽä¸č´ă -> impl Trait
ďźăăžăăŻĺ¤ć´ăŻĺăăăăŤä¸čŹçă§ăăăćŽéçăŤéŠç¨ăăăžăďźäžďźă˘ă¸ăĽăźăŤ/ăăšă帯ĺĺ
ăŠă¤ăăżă¤ă ă dyn Trait
ďźă
ĺ
ˇä˝çăŤăŻăĺłć¸é¤¨ă§ăăŽĺéĄăçşçăĺ§ăăăŽă§ăŻăŞăăă¨ĺżé
ăăŚăăžăăă誰ăăCopy
/ Clone
ăĺ°ĺşăăăă¨ăĺżăăŞăă§ăă ăăăăŽăăăŤăŞăăžăăăaďźăăăŻé大ăŞĺ¤ĺă§ăăăbďźçšăŤăăăćŠč˝ăč¨č¨ăăăçŽçă§ăăăăăćťăăăăŽçˇĺźľă常ăŤăăăžăďź
@cramertjé˘ć°ăˇă°ăăăŁăŽĺéˇć§ăŤé˘ăăéăăäťăŽćšćłă§ăăăĺăé¤ăăă¨ăă§ăăžăăďź ăăłăĺ ăŽĺŻżĺ˝ăŻăĺžćšĺç §ăŞăă§éăăăă¨ăă§ăăžăăă ăăăăăă帯ĺĺ ăżă¤ăăŽăăŠăĄăźăżăźăă¨éĺžłçăŤĺçăŽăă¨ăăŞăă¨ăăăŚčĄăăă¨ăă§ăăžăă č¨ăćăăă°ăăĺ¤ć´ăŻĺăăăăŤä¸čŹçă§ăăăćŽéçăŤéŠç¨ăăăăă¨ăćĺłăăŚăăžăăă
@rpjohnst
ăăăŤă
<T>
ć§ćă¸ăŽç§ťčĄăŻăé大ăŞĺ¤ć´ă§ăă
ĺż
ăăăăăă§ăŻăăăžăăăă¨https://github.com/rust-lang/rfcs/pull/2176ăăŞăăŻăăŠăĄăźăżăŽä˝ĺăŞăżă¤ăăčż˝ĺ ăăăă¨ăă§ăăžăT: Trait
ăăŞăăă§ç ´ćăŤč¨ĺăăăŞăéăçľäşă¨turbofishăŤăžă ďźĺăă ăăăżăźăăăŁăăˇăĽăŽç ´ć䝼ĺ¤ăŽć掾ďźă
impl TraităăŞă˘ăłăă§ăŻăăăă§ăăžăăăăžăă
<T>
ć§ćă使ç¨ăăăăăŤç˝˛ĺăć¸ăç´ăăŞăă¨ăăăă常ăŤĺéżă§ăăă¨ăŻéăăžăăă ăăăŤă<T>
ć§ćă¸ăŽç§ťčĄăŻăé大ăŞĺ¤ć´ă§ăă
ăžăă <T>
ć§ćăăăŽç§ťčĄăŻé大ăŞĺ¤ć´ă§ăăă¨ćăăžăďźĺźăłĺşăĺ
ăăżăźăăăŁăăˇăĽă使ç¨ăăŚT
ăŽĺ¤ăć示çăŤćĺŽă§ăăŞăăŞăŁăăăďźă
ć´ć°ďźé˘ć°ăimpl Traită使ç¨ăăŚăăĺ ´ĺăçžĺ¨ăăżăźăăăŁăăˇăĽăŽä˝żç¨ăŻăžăŁăă訹ĺŻăăăŚăăŞăăă¨ăŤćł¨ćăăŚăă ăăăé常ăŽă¸ă§ăăŞăăŻăăŠăĄăźăżăźăăăĺ ´ĺă§ăĺć§ă§ăă
@nikomatsakisĺ¤ă署ĺăŤć示çăŞĺăăŠăĄăźăżăźă¨ćéťçăŞĺăăŠăĄăźăżăźă桡ĺ¨ăăŚăăĺ ´ĺăć示çăŞć§ćă¸ăŽç§ťčĄăé大ăŞĺ¤ć´ăŤăŞăĺŻč˝ć§ăăăăžăă n
ĺăăŠăĄăźăżăźăćäžăăäşşăŻă n + 1
ăćäžăăĺż
čŚăăăăžăă䝣ăăăŤ@ CentrilăŽRFCă解湺ăçŽçă¨ăăăąăźăšăŽ1ă¤ă§ăăă
ć´ć°ďźé˘ć°ăimpl Traită使ç¨ăăŚăăĺ ´ĺăçžĺ¨ăăżăźăăăŁăăˇăĽăŽä˝żç¨ăŻăžăŁăă訹ĺŻăăăŚăăŞăăă¨ăŤćł¨ćăăŚăă ăăăé常ăŽă¸ă§ăăŞăăŻăăŠăĄăźăżăźăăăĺ ´ĺă§ăĺć§ă§ăă
ăăăŤăăăćčĄçăŤăŻăăŹăźăŻăąăźăšăŽć°ăć¸ăăžăăăä¸ćšă§ăçšĺŽăŽă¤ăłăšăżăłăšĺăŤĺĺăäťăăăă¨ăă§ăăŞăăąăźăšăŽć°ăĺ˘ăăžăă :(
@nikomatsakis
ăăŽć¸ĺżľăŤçćŻăŤĺăçľăă§ăăă ăăăăă¨ăăăăăžăă
čŞĺăăŹă¤ăăŞăźăŻă_ćŁăă_解湺çă§ăăă¨č¨ăăŽăŻăžă čşčşăăŚăăžăăăäşĺžăžă§ä˝ăćĺăăćŹĺ˝ăŤçĽăăă¨ăŻă§ăăŞăăă¨ăŤĺćăăžăă
ç§ăŻä¸ťăŤĺ
çŠăŽăŚăźăšăąăźăšăć¤č¨ăăžăăăăăăă ăă§ăŻăăăžăăă ăăźăŤăŤăżă¤ăăăSend / SyncăăŞăźăŻăăŞăéăăăăžăăžăŞăłăłăăăšăă§impl Trait
ă使ç¨ăăăŽăŻčŻă芹ă§ăŻăăăžăăă ăăăčăăă¨ăčż˝ĺ ăŽčŞĺçšć§ăčăăă¨ăç§ăŽććĄăŻĺŽéăŤăŻĺŽčĄĺŻč˝ă§ăŻăăăžăăă
Sync
ă¨Send
ăé¸ăłăăăŞăăŁăăŽă§ăăăăăćłĺŽăăžăăăăăăŻĺ°ăćŁćçă§ăăă_one_ăŽăŚăźăšăąăźăšăŤăŽăżćéŠă ăăă§ăă ăă ăăăăšăŚăŽčŞĺçšć§ăćłĺŽăăă¨ăăé¸ćč˘ăéŠĺă§ăŻăăăžăăă ăăšăŚăŽăżă¤ăăŽ+ !Unpin + !...
ăŻăĺŽčĄĺŻč˝ăŞč§ŁćąşçăŽăăăŤăŻćăăžăăă
ă¨ăă§ăŻăăˇăšăă ăäťăŽă¨ăăăăăăŞăă˘ă¤ăă˘ăćăă¤ăăăăŤăăăăŤ5ĺš´éăŽč¨čŞăăśă¤ăłăăăă°ăăăŁă¨čŻăăăŽăćăă¤ăăă¨ăă§ăăăăăăăžăăă ăăăăäťăŽă¨ăăăăăăŚRustăŤă¨ăŁăŚăŻă100ďź ăčŞĺăăŽčŞĺçšć§ăćă¤ăă¨ăćĺăŽéăŽăăă§ăă
@lfairy
ĺ¤ă署ĺăŤć示çăŞĺăăŠăĄăźăżăźă¨ćéťçăŞĺăăŠăĄăźăżăźă桡ĺ¨ăăŚăăĺ ´ĺăć示çăŞć§ćă¸ăŽç§ťčĄăé大ăŞĺ¤ć´ăŤăŞăĺŻč˝ć§ăăăăžăănĺăŽĺăăŠăĄăźăżăźăćäžăăäşş
n + 1
䝣ăăăŤ
çžĺ¨ăăăăŻč¨ąĺŻăăăŚăăžăăă impl Trait
ă使ç¨ăăĺ ´ĺăăăŠăĄăźăżăźăŤĺŻžăăŚăżăźăăăŁăăˇăĽăĺĺžăăăă¨ăŻăăăžăăďźĺčż°ăŽă¨ăăďźă ăă ăăăăăŻéˇćçăŞč§Łćąşçă¨ăăŚćĺłăăăăăŽă§ăŻăŞăă丸ăżă帯ăłăč¨č¨ăćăäťăăžă§ăŽé˛ăćšăŤé˘ăăćčŚăŽä¸ä¸č´ăĺéżăăăăăŽăăäżĺŽçăŞćé ă§ăă ďźăăăŚă @ rpjohnstăććăăăăăŤăăăčŞä˝ăŤćŹ çšăăăăžăăďź
ç§ăčŚăăăăśă¤ăłăŻăďźaďź @centrilăŽRFCăŞăŠăĺăĺ
Ľăăăă¨ăăăăłďźbďźć示çăŞăăŠăĄăźăżăźăŤăżăźăăăŁăăˇăĽă使ç¨ă§ăăăă¨ă示ăăă¨ă§ăďźăă ăă impl Trait
ăżă¤ăăŻä˝żç¨ă§ăăžăăďźă IMPL形質ăŤć示çăŞăăŠăĄăźăżăăăŽç§ťčĄăćĺšăŤçŠčŞăăăăăăăăŞăĺ ´ĺăŻăćă
ăćăŁăŚăăăŽă§ăăăăăćă
ăŻăé¨ĺçăŤăăăăăăžăăă§ăăă
@lfairy
ăăăŻă @ CentrilăŽRFCă解湺ăçŽçă¨ăăăąăźăšăŽ1ă¤ă§ăăă
_ [éĺŚăŻă¤ăş] _ăĄăŞăżăŤăé¨ĺçăŞăżăźăăăŁăăˇăĽă<T: Trait>
ă¨impl Trait
éăŽäźćŠă硊ĺă§ăăăă¨ăŤć°äťăăăŽăŻăĺŽéăŤăŻimpl Trait
;ďźRFCăŽçŽć¨ă§ăŻăăăžăă
ăăžăăăă°ăć¨čŤăăăăŠăŤăăĺĺäťăăăŠăĄăźăżăźăŞăŠăŤă¤ăăŚăŽäżĄé źăĺžăăăă°ăé¨ĺçăŞăżăźăăăŁăăˇăĽăEventuallyâ˘ă使ç¨ă§ăăăăăŤăŞăăžăă
ăăă§ćçľăłăĄăłăćéăçľäşăăžăăă
ăăă1.26ă§ĺşčˇăăăŚăăĺ ´ĺă httpsďź//github.com/rust-lang/rust/issues/49373ăŻç§ăŤă¨ăŁăŚé常ăŤéčŚă§ăăăăăŤćăăăžăă Future
ă¨Iterator
ă丝ăŞç¨éăŽ2ă¤ă§ăă -ăąăźăšă¨ăăăăŻä¸Ąćšă¨ăăé˘éŁăăăżă¤ăăçĽăăă¨ăŤĺ¤§ăăäžĺăăŚăăžăă
課éĄăăŠăăŤăźă§ăŻă¤ăăŻć¤ç´˘ăčĄăăžăăăďź47715ăŻăžă 俎ćŁăĺż čŚăŞICEă§ăă ĺŽĺŽăăĺăŤăăăĺ Ľćă§ăăžăăďź
äťćĽç§ăimplTraită§ééăăä˝ăďź
https://play.rust-lang.org/?gist=69bd9ca4d41105f655db5f01ff444496&version=stable
impl Trait
ăŻunimplemented!()
ă¨äşćć§ăăŞăăăă§ă-ăăăŻć˘çĽăŽĺéĄă§ăăďź
ăŻăăďź36375ă¨ďź44923ăĺç §ăăŚăă ăă
RFC 1951ăŽäťŽĺŽ2ăăéĺćăăăăŻă§ăŽimpl Trait
č¨çťăăă使ç¨ăŽăăă¤ăăŤĺăăŚăăăă¨ăŤć°ăĽăăžăăă ĺ
ˇä˝çăŤăŻăä¸čŹçăŞAsRef
ăžăăŻInto
ăăŠăĄăźăżăźă使ç¨ăăŚăăäşşé塼ĺŚçăŞAPIă使ç¨ăăăăăććăăĺăŤĺ¤ćăăŚăăasync
ăăăăŻăčżăĺ ´ĺă§ăă impl Trait
ăżă¤ăăŻăăăŽăăŠăĄăźăżăźăŽäťťćăŽăŠă¤ăăżă¤ă ăŤăă¤ăłăăăăžăăäžďź
impl HttpClient {
fn get(&mut self, url: impl Into<Url>) -> impl Future<Output = Response> + '_ {
let url = url.into();
async {
// perform the get
}
}
}
fn foo(client: &mut HttpClient) -> impl Future<Output = Response> + '_ {
let url = Url::parse("http://foo.example.com").unwrap();
client.get(&url)
}
ăăă使ç¨ăăă¨ă error[E0597]: `url` does not live long enough
get
ăŤčżăăăimpl Future
ä¸ćĺç
§ăŽćĺšćéăĺŤăžăăăăă error[E0597]: `url` does not live long enough
ăĺžăăăžăă ăăŽäžăŻăURLăĺ¤ă§get
ăŤć¸Ąăăă¨ăă§ăăă¨ăăçšă§ĺ°ă塼复ăăăŚăăžăăăĺŽéăŽăłăźăă§ăĺć§ăŽăąăźăšăçşçăăăă¨ăŻăťăźééăăăăžăăă
ç§ăçĽăéăăăăăŤĺŻžăăäşćłăăă俎ćŁăŻć˝čąĄĺă§ăăăĺ ˇä˝çăŤăŻ
impl HttpClient {
abstract type Get<'a>: impl Future<Output = Response> + 'a;
fn get(&mut self, url: impl Into<Url>) -> Self::Get<'_> {
let url = url.into();
async {
// perform the get
}
}
}
éćĽĺą¤ăčż˝ĺ ăăăă¨ăŤăăăć˝čąĄĺăŤĺż čŚăŞă¸ă§ăăŞăăŻĺă¨ĺçśćéăŽăăŠăĄăźăżăźăć示çăŤć¸Ąăĺż čŚăăăăžăă
ăăăć¸ăăăăŽăăŁă¨ç°Ąć˝ăŞćšćłăăăăŽă§ăŻăŞăăă¨ćăăžăăăăăă¨ăăťă¨ăăŠăăšăŚăŽé˘ć°ăŤć˝čąĄĺă使ç¨ăăă裸ăŽimpl Trait
ćťăĺăŤăŞăăă¨ăŻăăăžăăăďź
@ Nemo157ăŻăă httpsďź//github.com/rust-lang/rust/issues/42940ăĺç §ăăŚ
ă ăăăç§ăŻăăŽĺéĄăŤăłăĄăłăă@cramertjç解ăăŚăăă°ăăăŞăăŻăŽĺŽçžŠăŤă¨ăŠăźăŤăŞăă ăăHttpClient::get
ăŽăăăŞăăŽ`get` returns an `impl Future` type which is bounded to live for `'_`, but this type could potentially contain data with a shorter lifetime inside the type of `url`
ă ďźRFCăŻimpl Trait
ă_all_ă¸ă§ăăŞăăŻĺăăŠăĄăźăżăźăăăŁăăăŁăăăă¨ăć示çăŤćĺŽăăŚăăăăăć示çăŤĺŽŁč¨ăăăăŠă¤ăăżă¤ă ăăăçăăŠă¤ăăżă¤ă ăĺŤăĺŻč˝ć§ăŽăăĺăăăŁăăăŁă§ăăăŽăŻăă°ă§ăďźă
ăăŽăă¨ăăăăăŁăăăŁăăăĺăăŠăĄăźăżăć示çăŤĺŽŁč¨ă§ăăăăăŤăăăăăŤăĺçŽä¸ăŽć˝čąĄĺă厣č¨ăăăă¨ăĺŻä¸ăŽäżŽćŁă§ăăăăăŤčŚăăžăă
ĺŽéăăăăŻé大ăŞĺ¤ĺăŽăăă§ăă ăăăăŁăŚăăăŽĺ ´ĺăŽă¨ăŠăźăčż˝ĺ ăăăĺ ´ĺăŻăăăăŤčż˝ĺ ăăăă¨ăăĺ§ăăăžăă
硨éďźăăăŚăłăĄăłăăčŞăżç´ăă¨ăăăăč¨ăŁăŚăăăă¨ă§ăŻăŞăă¨ćăăŽă§ăć˝čąĄĺă使ç¨ăăăŤăăăĺéżăăć˝ĺ¨çăŞćšćłăăăăăŠăăăŤă¤ăăŚăŻăžă 桡䚹ăăŚăăžăă
@ Nemo157ăŻăăďź42940ă俎ćŁăăă¨ă Url
ĺçśćéăŤé˘äżăŞăăăŞăżăźăłăżă¤ăăčŞĺˇąăŽĺç¨ă¨ĺăćéĺçśăăăăăŤćĺŽă§ăăăăăĺçśćéăŽĺéĄă俎ćŁăăăžăă ăăăŻééăăŞăç§ăăĄăčĄăăăĺ¤ć´ă§ăăăăăăčĄăăŤăŻä¸ä˝äşćć§ăăăă¨ćăăžăăăŞăżăźăłăżă¤ăăŽćĺšćéăçăăăăă¨ăŻă§ăăăăŞăżăźăłăżă¤ăăŽä˝żç¨ćšćłăĺśéăăăăăŚăăžăă
ăă¨ăă°ăăăăŠăĄăźăżIter
ăŻĺĺăŤéˇăĺçśăăŞăĺŻč˝ć§ăăăăžăăă¨ăă揥ăŽă¨ăŠăźďź
fn foo<'a, Iter>(_: &'a mut u32, iter: Iter) -> impl Iterator<Item = u32> + 'a
where Iter: Iterator<Item = u32>
{
iter
}
é˘ć°ăŽă¸ă§ăăŞăăŻăŤIter
ăĺŤăăă ăă§ăŻăăăăreturnĺăŤĺŤăăăŤăŻä¸ĺĺă§ăăăçžĺ¨ăé˘ć°ăŽĺźăłĺşăĺ
ăŻăăă誤ăŁăŚćłĺŽăăŚăăžăă ăăăŻééăăŞăăă°ă§ăăă俎ćŁăăĺż
čŚăăăăžăăăéćšĺăŤäżŽćŁă§ăăă¨ćăăžăăäşćć§ăăăăĺŽĺŽĺă匨ăăăă¨ăŻăăăžăăă
ďź46541ăĺŽäşăăăăă§ăă 誰ăăOPăć´ć°ă§ăăžăăďź
ć§ćabstract type Foo = ...;
ătype Foo = impl ...;
ăăăé¸ćăăăççąăŻăăăžăăďź ć§ćăŽä¸č˛Ťć§ăŽăăăŤĺžč
ăŽćšăăŻăăăŤĺĽ˝ăă§ăăă°ăăĺăŤăăăŤă¤ăăŚăŽč°čŤăćăĺşăăžăăăăăăăčŚă¤ăăăă¨ăă§ăăŞăăăă§ăă
ç§ăŻtype Foo = impl ...;
ăžăăŻtype Foo: ...;
ăŤĺăŁăŚăăžăăă abstract
ăŻä¸čŚăŞĺĽĺŚăŞăăźăŤăŽăăă§ăă
ç§ăćŁăăćăĺşăă¨ă丝ăŞć¸ĺżľăŽ1ă¤ăŻăäşşă
ătype X = Y
ăăăšăăŽç˝ŽćăŽăăăŤč§Łéăăăă¨ăĺŚăă ăă¨X
ă芲ĺ˝ăăĺ ´ĺăŻY
ăŤç˝ŽăćăăŚăă ăăăďźă ăăăŻtype X = impl Y
ă§ăŻćŠč˝ăăžăăă
type
ăŻlet
ăăăŤćŠč˝ăăă¨ăăç´ćăăăăŽă§ăç§ăŻtype X = impl Y
ă弽ăżăžăă...
@alexregăŽăăăăŻăŤé˘ăăč°čŤăăăăăăăăžăRFC 2071ă§ă TL; DRďź type Foo = impl Trait;
ăŻă impl Trait
ăăăăć示çăŞă形ĺźăŤăăˇăĽăŹăźăăćŠč˝ăĺŁăăĺ°ă賢ăć§ć罎ćă¨ăăŚćŠč˝ăăăżă¤ăă¨ă¤ăŞă˘ăšăŤé˘ăăäşşă
ăŽç´ćăĺŁăăžăă
ç§ăŻFoo = implă¨ĺ ĽĺăăăŽă弽ăă§ă...; ăžăăŻFooă¨ĺ Ľĺăăžăďź...;ăabstractăŻä¸čŚăŞĺĽĺŚăŞăăźăŤăŽăăă§ă
ç§ăŽexists type Foo: Trait;
ăăŁăłăăŤĺĺ ăăĺż
čŚăăăăžăďźwinkďź
@cramertjăăźăă ç§ăŻăăŽăăă¤ăăŤă¤ăăŚčŞĺčŞčşŤăăŞăăŹăăˇăĽăăă°ăăă§ăăăăăŚç§ăćŁç´ă§ăăăŞăă°ăç§ăŻ@withoutboatsăŽć¨čŤăç解ăăŚăăă¨ăŻč¨ăăžăăă ăăăŻç§ăŤă¨ăŁăŚćăç´ćçă§ăăăăăŤćăăăžăďźĺäžăŻăăăžăăďźďźăăăŚç§ăĺžăăăŞăčąçłăŤă¤ăăŚăŽăăăă ç§ăŽç´ćăŻ@lnicolaăŽăăăŤćŠč˝ăăă¨ćăăžăă ăžăăăăŽć§ćăŻhttps://github.com/rust-lang/rfcs/pull/2071#issuecomment -319012123ăŽăăăŞăă¨ăčĄăăŽăŤćéŠă ă¨ćă
exists type Foo: Trait;
ăŻĺ°ăćšĺăăăŚăăžăăă exists
ăăźăŻăźăăŻĺé¤ăăžăă type Foo: Trait;
ăŻćĺĽăč¨ăăťăŠç§ăćŠăžăăžăăă đ abstract
@eddybăč¨ăăăăŤăăĄăăăŠä˝ĺ/ăŽĺ¤ăăč
ă§ăă
@alexreg
ăăăŻçžĺ¨ăŽć§ćă§ăĺŽčĄă§ăăžăăďź
ăŻăăăăăăăăŻăŻăăăŤĺäťă§ăă ăăăă = impl Trait
ć§ćďź abstract
ăăźăŻăźăăćłă¨ăăŚďźă弽ă丝ăŞççąă§ăăă
type Foo = (impl Bar, impl Baz);
type IterDisplay = impl Iterator<Item=impl Display>;
// can be written like this:
exists type Foo1: Bar;
exists type Foo2: Baz;
exists type Foo: (Foo1, Foo2);
exists type IterDisplayItem: Display;
exists type IterDisplay: Iterator<Item=IterDisplayItem>;
硨éďźä¸č¨ăŽexists type Foo: (Foo1, Foo2);
ăŻtype Foo = (Foo1, Foo2);
ăžăă 桡䚹ăăăŚçłă訳ăăăžăăă
@cramertjć§ćăŻexists
ăŻéŠĺăŞăăźăŻăźăă§ăăĺż
čŚăăăăžăăďź
@cramertjăăă§ăăăç§ăŻăăŞăăăăŽăăăŞăă¨ăăăŞăăă°ăŞăăŞăă¨ćăŁăŚăăžăă... = impl Trait
ă弽ăćŁĺ˝ăŞççąă ă¨ćăăžăďź ćŁç´ăŞă¨ăăăďźĺç´ăŞĺăŽă¨ă¤ăŞă˘ăšă¨ćŻčźăăŚďźăăă§ăŽĺŽĺĺăŽç˝ŽćăŤă¤ăăŚăŽç´ćăĺĺăŤĺŁăăŚăăă¨äşşă
ăčăăăŞăăăŞă揥ăŽĺŚĽĺăăăŞăăŽă§ăăďź
exists type Foo = (impl Bar, impl Baz);
ďźćŁç´ăŞă¨ăăăăăšăŚăŤĺä¸ăŽtype
ăăźăŻăźăă使ç¨ăăă¨ăăä¸č˛Ťć§ăćăăăăă ăă§ăăďź
ç§ăŻčŚă¤ăăžăďź
exists type Foo: (Foo1, Foo2);
é常ăŤĺĽĺŚă§ăă 使ç¨ăăŚFoo: (Foo1, Foo2)
RHSăăă¤ăłăăăăŚăăŞăă¨ăăăŻăăŠăŽăăăŤă¨ä¸č´ăăŚăăŞăTy: Bound
č¨čŞăŽäťăŽĺ ´ćă§ä˝żç¨ăăăŚăăžăă
揥ăŽăăŠăźă ăŻç§ăŤăŻĺéĄăŞăăăă§ăă
exists type Foo: Bar + Baz; // <=> "There exists a type Foo which satisfies Bar and Baz."
// Reads super well!
type Foo = impl Bar + Baz;
type Bar = (impl Foo, impl Bar);
ăžăăăăă§ăŻabstract
ăĺčŞă¨ăăŚä˝żç¨ăăŞăăă¨ă弽ăżăžăă
exists type Foo: (Foo1, Foo2);
ă¨ăŚăĺĽĺŚă ă¨ćăăžă
ăăăŻç˘şăăŤç§ăŤăŻééăăŽăăăŤčŚăăžăăăăăŚç§ăŻăăătype Foo = (Foo1, Foo2);
ă¨č¨ăăšăă ă¨ćăăžăă
ăăă§abstract type
ă¨exists type
ăă¤ăŻăˇă§ăăăăŚăăĺ ´ĺăŻăĺč
ă確ĺŽăŤăľăăźăăăžăă 丝ăŞççąăŻăăć˝čąĄăă形厚čŠă¨ăăŚćŠč˝ăăăăă§ăă äźčŠąă§ăŻç°ĄĺăŤăć˝čąĄĺăă¨ĺźăšăžăăăăĺĺ¨ĺăă¨č¨ăŁăŚăä¸ćč°ă§ăă
ăžăă : (Foo, Bar)
ă = Foo + Bar
ă = impl Foo + Bar
ăžăăŻ= (impl Foo, impl Bar
ăăă: Foo + Bar
ćšă弽ăă§ăă +
ăŽä˝żç¨ćłăŻăäťăŽăăšăŚăŽĺ ´ćă§ăăžăćŠč˝ăăžăă =
ăăŞăă¨ăăăă¨ăŻăĺŽĺ
¨ăŞĺăć¸ăĺşăăă¨ăă§ăăŞăăă¨ăćĺłăăžăă ăăă§ăŻĺă¨ă¤ăŞă˘ăšăä˝ćăăŚăăžăăăçšĺŽăŽĺ˘çăăăăă¨ăäżč¨źăăăŚăăăăŽăŽĺââĺăä˝ćăăŚăăžăăăć示çăŤĺĺăäťăăăă¨ăŻă§ăăžăăă
https://github.com/rust-lang/rfcs/pull/2071#issuecomment-318852774ăŽć§ćććĄăć°ăŤĺ ĽăŁăŚăăžăă
type ExistentialFoo: Bar;
type Bar: Baz + Bax;
ăăăŻăăăŽăšăŹăăă§čż°ăšăăăŚăăăăăŤăĺ°ăéăăĺ°ăŞăăăŚăăăžăć確ă§ăŻăăăžăăăă
ç§ăŻ(impl Foo, impl Bar)
ăăăŞăćšăŽä˝äşşăă¨ăŻé常ăŤç°ăŞăŁăŚč§ŁéăăŚăăăŤéăăăăžăă...ç§ăŤă¨ăŁăŚăăăăŻĺăăăă¤ăăŽĺŽĺĺăŽ2ăżăăŤă§ăăă impl Foo + Bar
ă¨ăŻĺŽĺ
¨ăŤç°ăŞăăă¨ăćĺłăăžăă
@alexregăăă@cramertjăŽćĺłă§ăăŁă:
ć§ćă§ăŻé常ăŤĺĽĺŚă ă¨ćăăžăă
exists type Foo: (Foo1, Foo2);
ăăăä˝ăăăŚăăăŽăăŤă¤ăăŚăŻăžă é常ăŤä¸ć確ăŞăăă§ă-ĺ˘çăŻé常ăăŠăŽăăăŞĺ ´ĺă§ăĺŻč˝ăŞăżă¤ăăŽăżăăŤăćĺŽăăă Foo: Foo1 + Foo2
ć§ćăŽćĺłă¨ç°ĄĺăŤćˇˇĺăăăĺŻč˝ć§ăăăăžăă
= (impl Foo, impl Bar)
ăŻčĺłćˇąăă˘ă¤ăă˘ă§ăăăăčŞä˝ăçĽăăăŚăăŞăăżă¤ăă§ĺŽĺçăŞăżăăŤăä˝ćă§ăăăăăŤăăăă¨ăŻčĺłćˇąăăă¨ă§ăă ăă ăăăăăăăľăăźăăăĺż
čŚăŻăŞăă¨ćăăžăăăăăŻăimpl Foo
ă¨impl Bar
2ă¤ăŽĺŽĺĺăĺ°ĺ
Ľăă揥ăŤăżăăŤăŽ3çŞçŽăŽĺă¨ă¤ăŞă˘ăšăĺ°ĺ
Ľă§ăăăăă§ăă
@daborossăăă¨ăăăŞăăŻăĺĺ¨ăăăżă¤ăăă§ăŻăŞăă ăĺĺ¨ăăăżă¤ăăăä˝ăŁăŚăăžăă ăăăŻĺçčŤă§ĺźă°ăăŚăăăăŽă§ăă ăăăă ăăżă¤ăFooăĺĺ¨ăă...ăă¨ăăč¨ăĺăăŻăăĄăłăżăŤă˘ăăŤă¨ĺçčŤăŽä¸ĄćšăŽčŚłçšăăăăžăćŠč˝
impl Foo
ă¨impl Bar
2ă¤ăŽĺŽĺĺăĺ°ĺ Ľăă揥ăŤăżăăŤăŽ3çŞçŽăŽĺă¨ă¤ăŞă˘ăšăĺ°ĺ Ľă§ăăăăăăăăăăľăăźăăăĺż čŚăŻăŞăă¨ćăăžăă
ăăăŻäşşé塼ĺŚçă§ăŻăŞăăăă§ă...ä¸ćçăŞăăŽăŻăăăťăŠç´ ć´ăăăă¤ă˘ă§ăŻăăăžăăă
@alexregćł¨ďź impl Bar + Baz;
ă(impl Foo, impl Bar)
ă¨ĺăă§ăăă¨č¨ăă¤ăăăŻăăăžăăimpl Bar + Baz;
ăăĺžč
ăŻćăăăŤ2ăżăăŤă§ăă
@daboross
ăăă@cramertjăŽćĺłă§ăăŁă
exists type Foo: (Foo1, Foo2);
ăăăä˝ăăăŚăăăŽăăŤă¤ăăŚăŻăžă é常ăŤä¸ć確ăŞăăă§ă-ĺ˘çăŻé常ăăŠăŽăăăŞĺ ´ĺă§ăĺŻč˝ăŞăżă¤ăăŽăżăăŤăćĺŽăăăFooďźFoo1 + Foo2ć§ćăŽćĺłă¨ç°ĄĺăŤćˇˇĺăăăĺŻč˝ć§ăăăăžăă
ĺ°ăä¸ć確ăăăăăžăăăďź (impl Foo, impl Bar)
ăťăŠć確ă§ăŻăŞăăăăăŤç´ćçăŤç解ă§ăăžăďźăĺäşşçăŤăŻFoo1 + Foo2
ă¨ćˇˇĺăăăă¨ăŻăŞăă¨ćăăžăă
=ďźimpl Fooăimpl BarďźăŻčĺłćˇąăă˘ă¤ăă˘ă§ă-ăăčŞä˝ăçĽăăăŚăăŞăăżă¤ăă§ĺŽĺçăŞăżăăŤăä˝ćă§ăăăăăŤăăăă¨ăŻčĺłćˇąăă§ăăăă ăă ăăăăăăăľăăźăăăĺż čŚăŻăŞăă¨ćăăžăăăăăŻăimplFooă¨implBarăŽ2ă¤ăŽĺŽĺĺăĺ°ĺ Ľăă揥ăŤăżăăŤăŽ3çŞçŽăŽĺă¨ă¤ăŞă˘ăšăĺ°ĺ Ľă§ăăăăă§ăă
ăăăăăăŻĺćăŽććĄă§ăăăăăăŚç§ăŻăžă ăăăă¨ăŚă弽ăă§ăă ăăăŻăçžĺ¨ăŽć§ćă使ç¨ăăŚă¨ăŤăăĺŽčĄă§ăăăă¨ăŤćł¨ćăăŚăă ăăăăă ăă3čĄăŽăłăźăăĺż
čŚă§ăăăäşşé塼ĺŚçă§ăŻăăăžăăă ăžăă ... = (impl Foo, impl Bar)
ăăăŞć§ćăăŚăźăśăźăŤă¨ăŁăŚćăć確ă§ăăă¨ä¸ťĺźľăăŚăăžăăăăăă§çŤśĺăăăăă¨ăŻăăăŁăŚăăžăă
@CentrilćĺăŻăăăŻćăăžăăă§ăăăăĺ°ăćć§ă§ăăăă
ăăŁă¨ă httpsďź //github.com/rust-lang/rust/issues/34511#issuecomment-386763340ă¸ăŽç§ăŽçˇ¨éăĺç
§ăăŚexists type Foo: (Foo1, Foo2);
ăŻtype Foo = (Foo1, Foo2);
ăžăă
@cramertjăăăăăăŻäťăăçăŤăăŞăŁăŚăăžăă ă¨ăŤăăă揥ăŽăă¨ăă§ăăăă¨ăćăäşşé塼ĺŚçă ă¨ćăăžăăăďź äťăŽăšăŹăăăé˛čŚ§ăăŚăăŚăăç§ăŻăăăŤĺŻžăăčŻăč°čŤăčŚăŚăăžăăă
type A = impl Foo;
type B = (impl Foo, impl Bar, String);
@alexregăŻăăç§ăŻăăăćăäşşé塼ĺŚçăŞć§ćă§ăăă¨ćăăžăă
RFC https://github.com/rust-lang/rfcs/pull/2289ă使ç¨ăăŚăăăăŻ@cramertjăŽăšăăăăăć¸ăç´ăćšćłă§ăă
type Foo = (impl Bar, impl Baz);
type IterDisplay = impl Iterator<Item: Display>;
// alternatively:
exists type IterDisplay: Iterator<Item: Display>;
type IterDisplay: Iterator<Item: Display>;
ăă ăăĺă¨ă¤ăŞă˘ăšăŽĺ ´ĺă exists
ăĺ°ĺ
ĽăăŞăă¨ăč¨čŞăŽć§ćăä¸ĺż
čŚăŤč¤éăŤăăăă¨ăŞăă襨çžĺăçśćăăăŽăŤĺ˝šçŤă¤ă¨ćăăžăă ăăăăŁăŚăč¤éăăŽäşçŽăŽPOVăăă impl Iterator
ăŻexists
ăăăĺŞăăŚăăăăăŤčŚăăžăă ăă ăăćĺžăŽé¸ćč˘ăŻĺŽéăŤăŻć°ăăć§ćăĺ°ĺ
ĽăăŚăăăăć確ă§ăăăŞăăćçă§ăăăăžăă
čŚç´ăăă¨ă揥ăŽä¸ĄćšăŽĺ˝˘ĺźă訹ĺŻăăĺż
čŚăăăă¨ćăăžăďź impl Trait
ă¨ăăă§ăŤćăŁăŚăăé˘éŁăăĺăŽć§ćăŽĺ˘çăŽä¸Ąćšă§ćŠč˝ăăăăďźă
type Foo = (impl Bar, impl Baz);
type IterDisplay: Iterator<Item: Display>;
硨éďźăŠăŽć§ćă使ç¨ăăĺż
čŚăăăăžăăďź IMOăclippyăŻăćăäşşé塼ĺŚçă§ç´ćĽçă§ăăăăă使ç¨ĺŻč˝ăŞĺ ´ĺăŻType: Bound
ć§ćăć確ăŤĺŞĺ
ăăĺż
čŚăăăăžăă
ç§ăŻtype Foo = impl Trait
ăăŞă˘ăłăăăătype Foo: Trait
ăăŞă˘ăłăăŽćšăăŻăăăŤĺĽ˝ăă§ăă ăăăŻăé˘éŁăăĺć§ćă¨ä¸č´ăăžăăăăăŻăăăăĺŤăă˘ă¸ăĽăźăŤăŽăĺşĺĺăă§ăăăăăăéŠĺă§ăă
impl Trait
ć§ćăŻăĺ
Ľĺăżă¤ăă¨ĺşĺăżă¤ăăŽä¸Ąćšă§ăă§ăŤä˝żç¨ăăăŚăăžăăă¤ăžăăăăŞă˘ăźăăŁăăŻă˘ă¸ăĽăźăŤăŽĺ°čąĄăä¸ăăăŞăšăŻăăăăžăă :(
impl Trait
ăĺşĺĺăŤăŽăżä˝żç¨ăăăĺ ´ĺăé˘éŁăăĺăŽć§ćăçšć§ďźMLăˇă°ăăăŁăŤĺ¤§ăžăăŤĺŻžĺżăăďźăŤéŠăăŚăăă¨ăăççąă§type Foo = impl Trait
ăăŞă˘ăłăă弽ăăăăăăžăăăă type Foo = ..
ć§ćăŻăĺ
ˇčąĄă˘ă¸ăĽăźăŤç¨ă§ăă
@rpjohnst
ç§ăŻ
type Foo = impl Trait
ăăŞă˘ăłăăăătype Foo: Trait
ăăŞă˘ăłăăŽćšăăŻăăăŤĺĽ˝ăă§ăă
ç§ăŻĺćăăžăăăăăŻĺŻč˝ăŞéă使ç¨ăăăăšăă§ăă ăăăăăă¤ăłăăăăć§ćăç´ćĽä˝żç¨ă§ăăŞă(impl T, impl U)
ĺ ´ĺăŻăŠăă§ăăăăă ä¸ćçăŞĺă¨ă¤ăŞă˘ăšăĺ°ĺ
Ľăăă¨ăčŞăżăăăăćăŞăăăăăăŤćăăăžăă
裸ăŽtype Name: Bound
使ç¨ăăă¨ă impl
ăăăăŻĺ
ă§ä˝żç¨ăăă¨ćˇˇäšąăăăăă§ăă
impl Iterator for Foo {
type Item: Display;
fn next(&mut self) -> Option<Self::Item> { Some(5) }
}
ăăŽć§ćă¨ăăźăŻăźăăăŹăăŁăăŻăšăŽçžĺ¨ăŽďźďźďźăăŠăłăŽä¸Ąćšă§ă impl
ăăăăŻă§ä˝żç¨ăăăä¸ćçăŞăżă¤ăă¨ă¤ăŞă˘ăšăĺ°ĺ
ĽăăăłăšăăăŻăăăŤĺ¤§ăăăăăăăŽăżă¤ăă¨ă¤ăŞă˘ăšăă˘ă¸ăĽăźăŤăŹăăŤă§ă¨ăŻăšăăźăăăĺż
čŚăăăăžăďźćĺłçăŤćĺłăŽăăĺĺăäťăăăăŚăăžă...ďźăăăŻăăăŠă¤ăăźăă˘ă¸ăĽăźăŤĺ
ăŽçšć§ĺŽčŁ
ăĺŽçžŠăăćŻčźçä¸čŹçăŞăăżăźăłďźĺ°ăŞăă¨ăç§ăŤă¨ăŁăŚăŻďźăăăăăŻăăžăă
pub abstract type First: Display;
pub abstract type Second: Debug;
impl Iterator for Foo {
type Item = (First, Second);
fn next(&mut self) -> Option<Self::Item> { Some((5, 6)) }
}
vs
impl Iterator for Foo {
type Item = (impl Display, impl Debug);
fn next(&mut self) -> Option<Self::Item> { Some((5, 6)) }
}
@ Nemo157严ćšă訹ĺŻăăŞăăŽăŻăŞăă§ăăďź
pub type First: Display;
pub type Second: Debug;
impl Iterator for Foo {
type Item = (First, Second);
fn next(&mut self) -> Option<Self::Item> { Some((5, 6)) }
}
ă¨ďź
impl Iterator for Foo {
type Item = (impl Display, impl Debug);
fn next(&mut self) -> Option<Self::Item> { Some((5, 6)) }
}
ďź
ĺăćŠč˝ăŤ2ă¤ăŽć§ćăĺż
čŚăŞççąăăăăăžăăă type Name = impl Bound;
ć§ćă ăă使ç¨ăăŚă2ă¤ăŽé¨ĺăŽĺĺăć示çăŤćĺŽăăăă¨ăĺŻč˝ă§ăă
pub type First = impl Display;
pub type Second = impl Debug;
impl Iterator for Foo {
type Item = (First, Second);
fn next(&mut self) -> Option<Self::Item> { Some((5, 6)) }
}
@ Nemo157ç§ăŻă2ă¤ăŽç°ăŞăć§ćă§ăăĺż
čŚăŻăŞăďźăăăŚăăăăšăă§ăŻăŞăďźtype
ďźăăŹăăŁăăŻăšăăźăŻăźăăŞăďźăŻăžăŁăă桡䚹ăăžăăăăč¨ăăŞăăă°ăŞăăžăăă
@rpjohnstĺ¤ĺ˝˘ă˘ă¸ăĽăźăŤă¨ăŻä¸ä˝ä˝ă§ăăďź :-)ă¨ăŤăăăĺăŤçšć§ăŽĺ˘çăč¨ĺŽăăŚăăé˘éŁăăĺĺŽçžŠăŽĺžăŤć§ćăă˘ăăŤĺăăĺż čŚăăăççąăăăăăžăăă ăăăŻĺ˘çă¨ăŻä˝ăŽé˘äżăăăăžăăă
@alexregăăŞă˘ăźăăŁăăŻă˘ă¸ăĽăźăŤăŻă fn foo(x: impl Trait)
ă¨ĺăăăăŤăĺăăŠăĄăźăżăźăćă¤ă˘ă¸ăĽăźăŤă§ăă ăăăŻĺĺ¨ăăăăŽă§ăŻăŞăăŽă§ăäşşă
ăŤăăăĺĺ¨ăăă¨ćăăăăăŞăăŽă§ăă
abstract type
ďźçˇ¨éďźăăźăŻăźăăŽä˝żç¨ăććĄăăăŽă§ăŻăŞăăćŠč˝ăŤĺĺăäťăăďźăŻăĺ˘çă¨é˘äżăăăăžăă ăżă¤ăăŤă¤ăăŚçĽăŁăŚăăăŽăŻĺ˘çă ăă§ăă ăăăă¨é˘éŁăăăżă¤ăăŽĺŻä¸ăŽéăăŻăé常ăŻĺĺăäťăăăăŞăăăăć¨ć¸Źăăăăă¨ă§ăă
@ Nemo157 Foo: Bar
ć§ćăŻăäťăŽăłăłăăăšăďźé˘éŁăăĺăăăăłĺăăŠăĄăźăżăźăŽĺ˘çďźă§ăă§ăŤăăçĽăăăŚăăăä¸ćçăŞăăŽăĺ°ĺ
ĽăăăŤä˝żç¨ă§ăăĺ ´ĺăŻăăăäşşé塼ĺŚçă§ďźIMOďźć確ă§ăă
ć¸ăčžźăżďź
type IterDisplay: Iterator<Item: Display>;
ăŻăăăŤç´ćĽçăŞwrtăŽăăă§ăă ç§ăč¨ăăăăă¨ă¨ćŻčźăăŚ
type IterDisplay = impl Iterator<Item = impl Display>;
ăăăŻăç§ăăĄăăă§ăŤćăŁăŚăăć§ćăä¸č˛ŤăăŚéŠç¨ăăŚăăă ăă ă¨ćăăžăă ă§ăăăăăăăŻćŹĺ˝ăŤć°ăăăăŽă§ăŻăăăžăăă
EDIT2ďźćĺăŽć§ćăŻărustdocă§ăŹăłăăŞăłă°ăăăćšćłă§ăăăăžăă
é˘éŁăăăżă¤ăăŤä˝ăăĺż čŚă¨ăăçšć§ăăăimplăŤç§ťčĄăăăă¨ăé常ăŤç°ĄĺăŤăŞăăžăă
trait Foo {
type Bar: Baz;
// stuff...
}
struct Quux;
impl Foo for Quux {
type Bar: Baz; // Oh look! Same as in the trait; I had to do nothing!
// stuff...
}
impl Bar
ć§ćăŻăä¸ćçăŞăăŽăĺ°ĺ
Ľăăĺż
čŚăăăĺ ´ĺăŤéŠăăŚăăăăăŤčŚăăžăăăć§ćĺ
¨ä˝ăŤä¸č˛ŤăăŚéŠç¨ăăăŚăăžăă
严ćšăŽć§ćă使ç¨ă§ăăăă¨impl Trait
ăĺźć°ăŽä˝ç˝Žă§T: Trait
ă使ç¨ă§ăăăă¨ă¨ăăăťăŠéăăŻăăăžăăă
硨é1ďźĺŽéăć§ćă1ă¤ăăăŞăĺ ´ĺăŻçšćŽăŞĺ¤§ćĺĺ°ćĺăŤăŞăăăăŽéă§ăŻăăăžăăă
@rpjohnstĺ˘çă¨ăŻć確ăŤé˘äżăăŞăă¨č¨ăŁăăŻăă§ăăăç§ăŻéăăăăŤé źăżăžăă
ă¨ăŤăăăç§ăŻtype Foo: Bar;
ć§ćăŤĺ寞ăăŚăăžăăăăĺżľăŽăăă abstract
ăăźăŻăźăăĺé¤ăăžăăăă type
čŞä˝ăŻăăŠăŽăăăŞçśćłă§ăé常ăŤć確ă§ăă
ĺäşşçăŤăŻă =
ă¨impl
ăŻăć¨čŤăčĄăăăŚăăăă¨ăčŚčŚçăŤç¤şăčŻăăăłăă ă¨ćăăžăă ăžăă大ăăŞăăĄă¤ăŤăăšăăăłă°ăăă¨ăăŤăăăăăŽĺ ´ćăç°ĄĺăŤčŚă¤ăăăă¨ăă§ăăžăă
ăžăă type Iter: Iterator<Item = Foo>
襨示ăăăŚăăă¨äťŽĺŽăăă¨ăä˝ă辡ăăŁăŚăăăŽăăçĽăĺăŤă Foo
ăčŚă¤ăăŚăăăăăżă¤ăăçšć§ăăĺ¤ćăăĺż
čŚăăăăžăă
ăăăŚćĺžăŤăć¨čŤăă¤ăłăăŽčŚčŚçăŞćăăăăŻăć¨čŤă¨ăŠăźăŽăăăă°ă¨ć¨čŤă¨ăŠăźăĄăăťăźă¸ăŽč§ŁéăŤă彚çŤă¤ă¨ćăăžăă
ăăăăŁăŚă =
/ impl
ăăŞă˘ăłăăŻăăăĺ°ăăăźăăźăŤăăă解湺ăăă¨ćăăžăă
@phaylon
ăžăăăżă¤ă
Iter: Iterator<Item = Foo>
襨示ăăăŚăăă¨äťŽĺŽăăă¨ăä˝ă辡ăăŁăŚăăăŽăăçĽăĺăŤăFoo
ăčŚă¤ăăŚăăăăăżă¤ăăçšć§ăăĺ¤ćăăĺż čŚăăăăžăă
ăăăŻăăăăžăăă Item = Foo
dyn Foo
ăĺŽĺŽăăŚăăďźăăăŚčŁ¸ăŽçšć§ă掾éçăŤĺťć˘ăăăŚăă...ďźăă¨ăčăăă¨ă Item = Foo
ăŻĺ¸¸ăŤăżă¤ăă§ăăĺż
čŚăăăăžăăďź
@Centril
ăăăŻăăăăžăăă Item = FooăŻădyn FooăĺŽĺŽăăŚăăďźăăăŚă裸ăŽçšć§ă掾éçăŤĺťć˘ăăăŚăă...ďźăă¨ăčăăă¨ă常ăŤăżă¤ăă§ăăĺż čŚăăăăžăăďź
ăăăăăăććĄăăăimpl
ĺ°ăŞăăăŞă˘ăłăă§ăŻăăăăŻăă¤ăłăăăăć¨čŤĺăăžăăŻĺ
ˇčąĄĺă§ăăĺŻč˝ć§ăăăăžăă äžďź Iterator<Item = String>
vs Iterator<Item = Display>
ă ć¨čŤă辡ăăŁăŚăăăăŠăăăçĽăăŤăŻăçšć§ăçĽăĺż
čŚăăăăžăă
硨éďźăăă :
使ç¨ăăŚăăăă¨ăŤć°ăĽăăŞăăŁăă ăĄăăŁă¨čŚéăăăăă¨ăăćĺłă§ă:)ăăăăăăŞăăŻăăăăç°ăŞăŁăŚăăă¨ăăăă¨ăŻćŁăăă§ăă
硨é2ďźăăŽĺéĄăŻé˘éŁăăĺăŽĺ¤ă§ăĺ˝ăŚăŻăžăă¨ćăăžăă type Foo: (Bar, Baz)
ăčăăă¨ăć¨čŤăăŠăă§çşçăăăăçĽăăŤăŻăBară¨BazăçĽăĺż
čŚăăăăžăă
@Centril
硨é1ďźĺŽéăć§ćă1ă¤ăăăŞăĺ ´ĺăŻçšćŽăŞĺ¤§ćĺĺ°ćĺăŤăŞăăăăŽéă§ăŻăăăžăăă
çžĺ¨ă_existential_ĺă厣č¨ăăćšćłăŻ-> impl Trait
1ă¤ă ăă§ăă _universal_ĺă厣č¨ăăćšćłăŻ2ă¤ăăăžăďźĺźć°ăŞăšăăŽT: Trait
ă¨: impl Trait
ďźă
ăŚăăăźăľăŤăżă¤ăăĺăĺ
ĽăăăăŞă˘ăźăăŁăăŻă˘ă¸ăĽăźăŤăăăĺ ´ĺăăăŽĺ¨ăăŤăăă¤ăăŽč°čŤăčŚăăăžăăăă˘ă¸ăĽăźăŤă¨ăăŹă¤ăĺŽçžŠăŽä¸Ąćšă§ăŽçžĺ¨ăŽtype Name = Type;
使ç¨ăŻăĺşĺăżă¤ăăăŠăĄăźăżăźă¨ăăŚăŽăăŽă§ăăăĺĺ¨ăăĺż
čŚăăăăžăăżă¤ăă
@phaylon
ăăăăăăććĄăăă
impl
ĺ°ăŞăăăŞă˘ăłăă§ăŻăăăăŻăă¤ăłăăăăć¨čŤĺăăžăăŻĺ ˇčąĄĺă§ăăĺŻč˝ć§ăăăăžăă äžďźIterator<Item = String>
vsIterator<Item = Display>
ă ć¨čŤă辡ăăŁăŚăăăăŠăăăçĽăăŤăŻăçšć§ăçĽăĺż čŚăăăăžăă
impl
ĺ°ăŞăăăŞă˘ăłăăŻăăăšăŚăŽĺ ´ĺăŤĺŽĺĺăŤ: Bound
ăăŚăăă¨ćăăžăăăăăăŁăŚăăăŹă¤ăĺ˘çă¨ăăŚIterator<Item = String>
ăžăăŻIterator<Item: Display>
ă使ç¨ă§ăăžăăă Iterator<Item = Display>
ăŻçĄĺšăŞĺŽŁč¨ăŤăŞăăžăă
@ Nemo157
ăăŞăăŻé˘éŁăăć´ťĺăąăźăšăŤé˘ăăŚćŁăăă§ăăç§ăŽćŞăă¨ăăă§ăă ăăăďźç§ăŽçˇ¨éă§čż°ăšăăăăŤďź type Foo: (A, B)
ăžă ĺéĄăăăă¨ćăăžăă A
ăžăăŻB
ăăăăăăżă¤ăăžăăŻçšć§ă§ăăĺŻč˝ć§ăăăăăă
ăăă=
ă使ăčŻăççąă ă¨ćăăžăă :
ăŻăăăă¤ăăŽăă¨ăć¨ć¸ŹăăăŚăăăă¨ă示ăăŚăăă ăă§ăăŠăă示ăăŚăăăŽăăŻăăăăžăăă type Foo = (A, impl B)
ăŻç§ăŤăŻăăŁă¨ć確ăŤćăăžăă
ăžăă impl
ăăă¨ăçšć§ă¨ăŻä˝ăăćäžăăĺż
čŚăăŞăăăŽăŤă¤ăăŚăŽčż˝ĺ ăŽăłăłăăăšăă¨ăăŚăăłăźăăšăăăăăčŞăă§ćäžăăćšăç°Ąĺă ă¨ćăăžăă
硨éďźăăă¤ăăŽăŻăŹă¸ăăďźç§ăŽč°čŤăŻĺşćŹçăŤăăăŽ@alexregă¨ĺăă§ăăç§ăŻimpl
ă弽ăžăăă¨ćăççąăćĄĺźľăăăăŁăă ăă§ăă
çžĺ¨ăĺĺ¨ĺă厣č¨ăăćšćłăŻ
-> impl Trait
1ă¤ă ăă§ăă ăŚăăăźăľăŤĺă厣č¨ăăćšćłăŻ2ă¤ăăăžăďźĺźć°ăŞăšăăŽT: Trait
ă¨: impl Trait
ďźă
ăăăç§ăč¨ăŁăŚăăăă¨ă§ăďźPIăŞăĺ
¨ç§°č¨ĺˇăŤăŻ2ă¤ăŽćšćłăăăăŽăŤăäťăŽĺ ´ćăŤăŻ1ă¤ăăĺĺ¨ăăŞăďź dyn Trait
çĄčŚăăďźĺż
čŚăăăăŽă§ăăďź
ăŚăźăśăźăč¨čŞăŽăăžăăžăŞé¨ĺăĺŚçżăăŚtype Foo: Bound;
ă¨type Foo = impl Bound;
ăć¸ăăŤčĄăăă¨ăĺć§ăŤăăăăă§ăăăăăšăŚăŽĺ ´ĺă§1ă¤ăŽć§ćăćăăăŤĺŞăăŚăăă¨ăŻč¨ăăžăăă ăăć§ćăăăă¤ăăŽäşćăŤăĺĽăŽć§ćăĺĽăŽäşćăŤéŠăăŚăăăă¨ăŻç§ăŤăŻćăăă§ăă
@phaylon
ăăă=ă¨ä¸çˇăŤčĄăčŻăççąă ă¨ćăăžăă ďźăŻăăăă¤ăăŽăă¨ăć¨ć¸ŹăăăŚăăăă¨ă示ăă ăă§ăăŠăă示ăăŚăăăŽăăŻăăăăžăăă ăżă¤ăFoo =ďźAăimpl BďźăŻç§ăŤăŻăăć確ăŤćăăžăă
ăŻăăăăăŻăăăăĺĽăŽćŁĺ˝ăŞççąă§ăă ĺŽçžŠăăĺŽçžŠă¸ă¨ă¸ăŁăłăăăŚăĺĺ¨č¨ĺˇă§ä˝ăĺŽéĺăăăŚăăăăç解ăăăŤăŻăĺŽéăŤč§Łĺăăĺż čŚăăăăžăă
ăă1ă¤ăŽăă¨ăŻăăăŽć§ćăŽä¸ă§ăé˘éŁäťăăăăĺăă¤ăłăăŁăłă°ĺ
ă§:
訹ĺŻăăăă¨ăăă§ăăă§ăăăăă ăăŽććĄăăăć§ćă§ăŻäťăŽćšćłă§ĺŽĺĺăć§ć/çľĺă§ăăŞăăă¨ăčăăă¨ăç§ăŤăŻĺ°ăĺĽĺŚăŞçšćŽăŞăąăźăšăŽăăăŤćăăžăă ăăŽć§ćă使ç¨ăăćăä¸č˛Ťăăă˘ăăăźăăŻă揥ăŽăăăŤăŞăă¨ćăăžăă
type A: Foo;
type B: Bar;
type C: Baz;
type D: Iterator<Item = C>;
type E = (A, Vec<B>, D);
ç§ďźăăăłăăăŤăăäťăŽäşşďźă弽ăć§ćă使ç¨ăăă¨ăăăăăăšăŚ1čĄă§č¨čż°ă§ăăăăăŤăĺŽéĺăăŠăă§čĄăăăŚăăăŽăăăăăŤăăăăžăă
type E = (impl Foo, Vec<impl Bar>, impl Iterator<Item = impl Baz>);
ä¸č¨ă¨ăŻé˘äżăăăžăăďźćŻćŠlet x: impl Trait
ăĺŽčŁ
ăăăăăŤăă¤ăăŹă¤ăăžăăďź ç§ăŻăă°ăăăŽéăăŽćŠč˝ăčŚéăăŚăăžăăă
@alexreg
ăă1ă¤ăŽăă¨ăŻăăăŽć§ćăŽä¸ă§ăé˘éŁäťăăăăĺăă¤ăłăăŁăłă°ĺ ă§
:
訹ĺŻăăăă¨ăăă§ăăă§ăăăăă
ăŻăăăŠăăăŚă§ăăă ăăăŻărust-lang / rfcsďź2289 + type Foo: Bound
čŞçśăŞĺšćă§ăă
揥ăŽăă¨ăă§ăăžăă
type E = (impl Foo, Vec<impl Bar>, impl Iterator<Item: Baz>);
@ Centril2ă¤ăŽäťŁćżć§ćă訹ĺŻăăăŽăŻćŞăčăă ă¨ćăăžăă ăćąşăăăăŞăăŁăăŽă§ă严ćšăăľăăźăăăăçĺ瞤ăŽăăăŞăŤăăăăăžăă ăăăăçľăżĺăăăŚä¸č´ăăăăłăźăăčŚăăŽăŻćŹĺ˝ăŤçŽéăă§ăďź
@Centrilç§ăŻăăŞăăŽRFCăŤă¤ăăŚ@nikomatsakisă¨impl Iterator<Item = impl Baz>
ă¨ć¸ăăăă§ăă ç´ ć´ăăăăćç˝ă§ăă
@alexregăăăŻĺ Źĺšłă§ăă
ăăăăďźćŽĺżľăŞăăďźćŽĺżľăŞăăďźPOVăŤăăŁăŚç°ăŞăăžăăďźăĺźć°ăŽä˝ç˝ŽăŤimpl Trait
ăćĺŽăăŚă Foo: Bar
ă¨impl Bar
严ćšăćă¤ă2ă¤ăŽäťŁćżć§ćă訹ĺŻăăăăăă§ăŤéĺ§ăăŚăăžăă
ĺ
¨ç§°č¨ĺˇç¨ă§ăăă impl Trait
襨č¨ăŻăäşéć§ăŽăŠăĄăĺ´ăŤăăăăĺŽéăŤăŻć°ăŤăăžăăă çľĺąăŽă¨ăăă any Trait
ă¨some Trait
ăŻä˝żç¨ăăžăă
ăă§ăŤăćąşăăăăŞăăŁăăăäşĺ ć§ăŽĺ´é˘ăŻć§ćçăŤéčŚă§ăŻăŞăăă¨ăăé¸ćăăăăă¨ăčăăă¨ăăŚăźăśăźăĺžăăăŞăăăăŤăćąşăăăăŞăăăăŠăăŤă§ăéŠç¨ăăăă¨ăŻä¸č˛ŤăăŚăăăăă§ăă ăă§ăăăăăăŤăăć¸ăăăăăăăŤć¸ăăŚăżăžăăăďźă ;ďź
PSďź
ĺă impl Iterator<Item = impl Baz>
whereĺĽăŽĺ˘çă¨ăăŚăŻćŠč˝ăăžăăă ăăăăŁăŚă Iter: Iterator<Item = impl Baz>
ăăăŤćˇˇĺăăĺż
čŚăăăăžăă ĺä¸ăŤćŠč˝ăăăŤăŻă Iter = impl Iterator<Item = impl Baz>
ă訹ĺŻăăĺż
čŚăăăăžăďźĺ¤ĺăăăăšăă§ăăďźďźă
使ç¨ăăŚ: Bound
䝣ăăăŽă§ă= impl Bound
ăăžăăć示çă§ăăă ăçă^ă -
X = Ty
ă¨X: Ty
ééăŽéăăŤăăăć§ćăčŞăżăăăăŞăă¨ćăăžăă
ç§čŞčşŤăŽă˘ăăă¤ăšăçĄčŚăăŚăRFCă§ăăŽäźčŠąăçśăăžăăă;ďź
ăăăăďźćŽĺżľăŞăăďźćŽĺżľăŞăăďźPOVăŤăăŁăŚç°ăŞăăžăăďźăĺźć°ăŽä˝ç˝ŽăŤimpl Traită使ç¨ăăŚă2ă¤ăŽäťŁćżć§ćă訹ĺŻăăăăă¨ăăă§ăŤéĺ§ăăŚăăăăăFooďźBară¨implBarăŽä¸Ąćšăĺăăă¨ăćĺłăăăăăŤćŠč˝ăăžăă
ç§ăăĄăŻăăăăžăăăă寞称ć§/ä¸č˛Ťć§ăŽčŚłçšăăé¸ćăčĄăăăă¨ćăăžăă ä¸čŹçăŤĺäťăăăăĺźć°ăŻăćŽéçăŤĺäťăăăăďź impl Trait
ďźĺźć°ăăăĺłĺŻăŤĺźˇĺă§ăă ăăăăăŞăżăźăłä˝ç˝ŽăŤimpl Trait
ăĺ°ĺ
ĽăăŚăăăŽă§ăĺźć°ä˝ç˝ŽăŤĺ°ĺ
ĽăăăŽăŻçăŤăăŞăŁăŚăăžăă
ăă§ăŤăćąşăăăăŞăăŁăăăäşĺ ć§ăŽĺ´é˘ăŻć§ćçăŤéčŚă§ăŻăŞăăă¨ăăé¸ćăăăăă¨ăčăăă¨ăăŚăźăśăźăĺžăăăŞăăăăŤăćąşăăăăŞăăăăŠăăŤă§ăéŠç¨ăăăă¨ăŻä¸č˛ŤăăŚăăăăă§ăă ăă§ăăăăăăŤăăć¸ăăăăăăăŤć¸ăăŚăżăžăăăďźă ;ďź
č ăä¸ăăŚăăăšăŚăĺŽčŁ ăăăăă¨č¨ăăšăćçšăăŠăăăŻăăăăžăăă ăăă§ăŻăĺŠçăŤé˘ăăŚć確ăŞč°čŤăŻăăăžăăă
PSďź
ĺă
impl Iterator<Item = impl Baz>
whereĺĽăŽĺ˘çă¨ăăŚăŻćŠč˝ăăžăăă ăăăăŁăŚăIter: Iterator<Item = impl Baz>
ăăăŤćˇˇĺăăĺż čŚăăăăžăă ĺä¸ăŤćŠč˝ăăăŤăŻăIter = impl Iterator<Item = impl Baz>
ă訹ĺŻăăĺż čŚăăăăžăďźĺ¤ĺăăăăšăă§ăăďźďźă
where Iter: Iterator<Item = T>, T: Baz
ďźäťăŽăăăŤďźăăľăăźăăăăăďźăăŞăăććĄăăăăăŤďź Iter = impl Iterator<Item = impl Baz>
ĺŽĺ
¨ăŤăľăăźăăăăăŽăŠăĄăăă ă¨ćăăžăă ä¸éĺ獯ăŞĺŽśă ăă訹ĺŻăăăă¨ăŻăăĄăăŁă¨ăăĺăçˇ ăžăăŽăăă§ăă
= impl
䝣ăăăŤ: Bound
ă使ç¨ăăăă¨ăć示çă§ăçă^ă-
X = Ty
ă¨X: Ty
ééăŽéăăŤăăăć§ćăčŞăżăăăăŞăă¨ćăăžăă
čŞăżăăăă§ăăăĺŽĺçăŞăżă¤ăă使ç¨ăăăŚăăăă¨ăŻăăăăťăŠć確/ć示çă§ăŻăŞăă¨ćăăžăă ăăŽć§ćăŽĺśéăŤăăăĺŽçžŠăč¤ć°ăŽčĄăŤĺĺ˛ăăĺż čŚăăăĺ ´ĺăăăăŻăăăŤćŞĺăăžăă
ç§čŞčşŤăŽă˘ăăă¤ăšăçĄčŚăăŚăRFCă§ăăŽäźčŠąăçśăăžăăă;ďź
ĺž ăŁăŚăăăŞăăŻăăŞăăŽRFCăćĺłăăžăăďź ç§ăŽçĽăéăăăăăŻăăă¨ăăăŽä¸ĄćšăŤé˘éŁăăŚăăă¨ćăăžăă :-)
ĺž ăŁăŚăăăŞăăŻăăŞăăŽRFCăćĺłăăžăăďź ç§ăŽçĽăéăăăăăŻăăă¨ăăăŽä¸ĄćšăŤé˘éŁăăŚăăă¨ćăăžăă :-)
ăăăŁă; ăăă§ăŻăăă§çśăăžăăăă
ç§ăăĄăŻăăăăžăăăă寞称ć§/ä¸č˛Ťć§ăŽčŚłçšăăé¸ćăčĄăăăă¨ćăăžăă ä¸čŹçăŤĺäťăăăăĺźć°ăŻăćŽéçăŤĺäťăăăăďź
impl Trait
ďźĺźć°ăăăĺłĺŻăŤĺźˇĺă§ăă ăăăăăŞăżăźăłä˝ç˝ŽăŤimpl Trait
ăĺ°ĺ ĽăăŚăăăŽă§ăĺźć°ä˝ç˝ŽăŤĺ°ĺ ĽăăăŽăŻçăŤăăŞăŁăŚăăžăă
ç§ăŽčŚçšăŻăä¸č˛Ťć§ă¨ĺŻžç§°ć§ăŤă¤ăăŚă§ăă = P
ĺĺ¨č¨ĺˇă¨ĺ
¨ç§°č¨ĺˇăŽä¸ĄćšăŤimpl Trait
ăć¸ăăă¨ă訹ĺŻăăăŚăăĺ ´ĺăç§ăŤăŻăĺ
¨ç§°č¨ĺˇă¨ĺ
¨ç§°č¨ĺˇăŽä¸ĄćšăŤType: Trait
ă使ç¨ăăăă¨ă訹ĺŻăăăăšăă§ăăăă¨ăŻçăŤăăŞăŁăŚăăžăă
襨çžĺăŤé˘ăăŚăŻăăăŞăăč¨ăăăăŤĺč ăŻĺžč ăăă埡ĺă§ăăăĺż ăăăăăă§ăăĺż čŚăŻăăăžăăă ç§ăăĄă彟ăăAFAIKăŤăăăăă°ă彟ăăŻĺăăăăŤĺźˇĺăăăăăžăăďźç§ăŻçľśĺŻžăŤăăăăšăă ă¨č¨ăŁăŚăăăăă§ăŻăăăžăă..ďźă
fn foo(bar: impl Trait, baz: typeof bar) { // eww... but possible!
...
}
č ăä¸ăăŚăăăšăŚăĺŽčŁ ăăăăă¨č¨ăăšăćçšăăŠăăăŻăăăăžăăă ăăă§ăŻăĺŠçăŤé˘ăăŚć確ăŞč°čŤăŻăăăžăăă
ç§ăŽä¸ťĺźľăŻă ăăăŽć§ćăŻäťăŽĺ ´ćă§ă使ç¨ă§ăăăăŽćĺłăŻăăă§ăŻć確ă§ăăăăăŽĺ ´ćă§ć¸ăăă¨ăŻă§ăăžăăăă¨ăăéŠăăšăăŚăźăśăźăŻă2ă¤ăŽćšćłďźăŠăĄăăă¨ăŤăăć ŁăăŚăăĺż čŚăăăăžăďźăăăăłăšăăăăăă¨ăăăă¨ă§ăă ďźă https://github.com/rust-lang/rfcs/pull/2300 ďźăăźă¸ć¸ăżďźă https ďź//github.com/rust-lang/rfcs/pull/2302 ďźPFCPďźă httpsă§ăĺć§ăŽăă¨ăčĄăăžăăă ďź//github.com/rust-lang/rfcs/pull/2175 ďźăăźă¸ďźäťĽĺăŻĺĽăŽćšćłă§ć¸ăčžźăăă¨ăă§ăăă¨ăăŚăăä¸č˛Ťć§ăŽăă犴ăĺăăžăă
čŞăżăăăă§ăăăĺŽĺçăŞăżă¤ăă使ç¨ăăăŚăăăă¨ăŻăăăăťăŠć確/ć示çă§ăŻăŞăă¨ćăăžăă
ç§ăŽčŚč§Łă§ăŻăĺ¤čŞĺŻč˝ă§ĺĺă§ăă Rustăăä˝ăăăć示çăă§ăăă¨ăŻćăăăé庌ăŤĺéˇă§ăăďźä˝żç¨ăăăăă¨ć§ćăĺ¤ăăăă¨ćăăžăďźăă¨ăă使ç¨ăćăă¨ăŠăžăăăăă¨ă§ăłăšăăăăăăžăă
ďźä˝ăăé ťçšăŤä˝żç¨ăăăĺ ´ĺăŻăç°Ąć˝ăŞć§ćă使ç¨ăăŚăă ăă... .unwrap()
ăŤĺŻžăăčłčłă¨ăăŚ?
ă.unwrap()
ďźă
ăăŽć§ćăŽĺśéăŤăăăĺŽçžŠăč¤ć°ăŽčĄăŤĺĺ˛ăăĺż čŚăăăĺ ´ĺăăăăŻăăăŤćŞĺăăžăă
ăăăŻăăăăžăăă Assoc = impl Trait
ăŻăĺč
ăŽćšăéˇăă¨ăăççąă ăă§ă Assoc: Trait
ăăăăăăŤĺ¤ăăŽčĄĺĺ˛ăĺźă辡ăăăŻăă ă¨ç§ăŤăŻćăăžăă
where Iter: Iterator<Item = T>, T: Baz
ďźäťăŽăăăŤďźăăľăăźăăăăăďźăăŞăăććĄăăăăăŤďźIter = impl Iterator<Item = impl Baz>
ĺŽĺ ¨ăŤăľăăźăăăăăŽăŠăĄăăă ă¨ćăăžăă
ä¸éĺ獯ăŞĺŽśă ăă訹ĺŻăăăă¨ăŻăăĄăăŁă¨ăăĺăçˇ ăžăăŽăăă§ăă
ăžăăŤďź ăä¸éĺ獯ăŞĺŽś/čŚĺŽăŤčĄăăă where Iter: Iterator<Item: Baz>
ăĺŽčŁ
ăăžăăă;ďź
@CentrilăăŚăăăŞăăŻä¸ťăŤĺŻžç§°ć§/ä¸č˛Ťć§ăŽč°čŤă§ç§ăŤĺăĄăžăăă đ严ćšăŽăăŠăźă ăćă¤ăă¨ăŽäşşé塼ĺŚă彚çŤăĄăžăă ăă ăăăăăŚăăăŽćŠč˝ăŤăŻéăăŞăłăăŁăłă°ăĺż é ăŤăŞăăžăă
ććĽç§ăŽĺŽĺ ¨ăŞčżäżĄă§ăăă硨éăăžăă
@CentrilăććăăŚăăăăăŤă : Trait
ďźăă¤ăłăăăăďźć§ćă使ç¨ăăăŚăăăźăľăŤĺăŻăă§ăŤăľăăźăăăăŚăăžăă äžăă°
fn foo<T: Trait>(x: T) { ... }
ăéŠĺăŞăăžăăŻăć´çˇ´ăăăăăŚăăăźăľăŤăżă¤ăă¨ä¸çˇăŤăäžăă°
fn foo(x: impl Trait) { ... }
ăăĄăăăĺč ăŻĺžč ăăă埡ĺă§ăăăĺż čŚăŞăŽăăăšăŚă§ăăĺ ´ĺăĺžč ăŻăăć確ăŤăŞăăžăďźăăăŚăăăăăăčŞăżăăăăŞăăžăďźă ĺŽéăĺŻč˝ă§ăăă°ăĺžč ăŽĺ˝˘ĺźăĺŞĺ ăăăłăłăă¤ăŠăźăťăŞăłăăç¨ćăăĺż čŚăăăă¨ĺźˇă俥ăăŚăăžăă
ăăă§ăé˘ć°ăŽćťăä˝ç˝ŽăŤăimpl Trait
ăć˘ăŤăăăžăăăăăŻăĺŽĺĺă襨ăăžăă é˘éŁăăăżă¤ăăŽçšć§ăŻĺ˝˘ĺźä¸ĺĺ¨ăăăă§ăŤ: Trait
ć§ćă使ç¨ăăŚăăžăă
ăăăŻăç§ăçžĺ¨RustăŤćŽéçăŞăżă¤ăăŽéŠĺăŞĺ˝˘ĺźă¨ăă¤ăłăăăă形ĺźăŽä¸Ąćšăĺĺ¨ăăăă¨ăăăăłĺć§ăŤĺŽĺçăŞăżă¤ăăŽéŠĺăŞĺ˝˘ĺźă¨ăă¤ăłăăăă形ĺźăĺĺ¨ăăăă¨ăčăăă¨ďźĺžč ăŻçžĺ¨ăŽçšć§ĺ ă§ăŽăżďźăç§ăăĄăŻĺźˇăăăšăă ă¨äżĄăăŚăăžăĺĺ¨ĺăŽéŠĺăŞĺ˝˘ĺźă¨ăă¤ăłăăăă形ĺźăŽä¸ĄćšăŽăľăăźăăçšć§ăŽĺ¤ĺ´ăŤćĄĺźľăăžăă ă¤ăžăăä¸čŹçăŤăăăăłé˘éŁăăăżă¤ăăŽä¸Ąćšă§ă䝼ä¸ăăľăăźăăăĺż čŚăăă
type A: Iterator<Item: Foo + Bar>;
type B = (impl Baz, impl Debug, String);
2çŞçŽăŤăăăŽăłăĄăłăă§ććĄăăăŚăăăłăłăă¤ăŠăŽăŞăłăăŁăłă°ĺä˝ă示ăăŚăăžăăăăăŤăăăĺŽéăŽä¸čŹçăŞĺĺ¨ĺăŽčĄ¨çžăŽă°ăă¤ăăĺ¤§ĺš ăŤć¸ĺ°ăăăŻăă§ăă
1ă¤ăŽăăźăŻăźăăŽä¸ă§ćŽéçă§ĺĺ¨ăăĺŽéĺă桡ĺăăăă¨ăŻééăă§ăăăä¸č˛Ťć§ăŽč°čŤăŻç§ăŤăŻăăžăăăăŞăă¨äťă§ă俥ăăŚăăžăă ĺä¸ăŽăăźăŻăźăăé˘ć°ăˇă°ăăăŁă§ćŠč˝ăăĺŻä¸ăŽççąăŻăăłăłăăăšăăŤăăŁăŚăĺä˝ç˝Žă§1ă¤ăŽĺ˝˘ĺźăŽć°éĺăŽăżă使ç¨ăăăăăŤĺż çśçăŤĺśç´ăăăăăă§ăă ăăŞăăĺăĺśç´ăćăŁăŚăăŞăăăŽă§ăăă¨ç§ăčŚăăă¨ăă§ăăć˝ĺ¨çăŞç çłăăăăžă
struct Foo {
pub foo: impl Display,
}
ăăăŻăĺŽĺçăžăăŻĺ
¨ç§°č¨ĺˇăŽççĽĺ˝˘ă§ăăďź é˘ć°ăˇă°ăăăŁă§impl Trait
ă使ç¨ăăăă¨ăăĺžăăăç´ćăăăăŠăŽăăăŤćąşĺŽă§ăăăăăăăžăăă ĺŽéăŤä¸Ąćšă¨ăăŚä˝żç¨ăăăă¨ăăă¨ăăăŽä˝ç˝Žă§ăŽĺżĺĺ
¨ç§°č¨ĺˇăŻĺ˝šăŤçŤăăŞăăă¨ăăăăŤăăăăžăăăăăăŁăŚăĺĺ¨č¨ĺˇă§ăăĺż
čŚăăăăžăăăé˘ć°ăŽĺźć°ăŽimpl Trait
ă¨ççžăăapperasă§ăă
ăăăăŻ2ă¤ăŽć šćŹçăŤç°ăŞăćä˝ă§ăăăŠăĄăăçšć§ĺ˘çă使ç¨ăăžăăăĺŽĺĺă厣č¨ăă2ă¤ăŽćšćłăăăă¨ăć°čŚĺĺ
Ľč
ăŽćˇˇäšąăć¸ăççąăŻăăăăžăăă type Name: Trait
ă使ăăă¨ăăăă¨ăĺŽéăŤĺĺżč
ăčĄăĺŻč˝ć§ăéŤăĺ ´ĺăăăăŻlintăäťăăŚč§Łćąşă§ăăžăă
type Foo: Display;
^^^^^^^^^^^^^^^^^^
note: were you attempting to create an existential type?
note: suggested replacement `type Foo = impl Display`
ăăăŚăç§ăŻăăŞăăŽč°čŤăŽĺĽăŽĺŽĺźĺăćăă¤ăăăŽă§ăç§ăŻăŻăăăŤĺăĺ ĽăăăăăŞăăžăăĺŽéăŽăłăłăăĽăźăżăźăŤĺ°éăăăžă§ăRFCăčŞăżç´ăăŚć稿ăăĺż čŚăăăăžăă
ç§ăŻăžă RFCăŤă¤ăăŚăłăĄăłăăăăŽăŤĺĺăŞRustăŽçľé¨ăăŞăăăăŤćăăžăă ăă ăă Drops of DiamondăˇăŁăźăăŁăłă°ĺŽčŁ ăŽä¸é¨ă¨ăăŚEthereumăŽăˇăŁăźăăŁăłă°ăăăăłăŤăć§çŻăăăăăŤRustlibp2pă¨ä¸çˇăŤä˝żç¨ăăăăăŤăăăŽćŠč˝ăĺ¤éăŽĺŽĺŽăăRustăŤăăźă¸ăăăăŽăčŚăăă¨ăŤčĺłăăăăžăă ç§ăŻăăŽĺéĄăčłźčŞăăžăăăăăăšăŚăŽăłăĄăłăăŤčż˝ăă¤ăćéăăăăžăăďź ăłăĄăłăăăăŁă¨čŞăăă¨ăŞăăăăŽĺéĄăŽćć°ć ĺ ąăĺ ĽćăăăŤăŻăŠăăăă°ăăă§ăăďź
ç§ăŻăžă RFCăŤă¤ăăŚăłăĄăłăăăăŽăŤĺĺăŞRustăŽçľé¨ăăŞăăăăŤćăăžăă ăă ăă Drops of DiamondăˇăŁăźăăŁăłă°ĺŽčŁ ăŽä¸é¨ă¨ăăŚEthereumăŽăˇăŁăźăăŁăłă°ăăăăłăŤăć§çŻăăăăăŤRustlibp2pă¨ä¸çˇăŤä˝żç¨ăăăăăŤăăăŽćŠč˝ăĺ¤éăŽĺŽĺŽăăRustăŤăăźă¸ăăăăŽăčŚăăă¨ăŤčĺłăăăăžăă ç§ăŻăăŽĺéĄăčłźčŞăăžăăăăăăšăŚăŽăłăĄăłăăŤčż˝ăă¤ăćéăăăăžăăďź ăłăĄăłăăăăŁă¨čŞăăă¨ăŞăăăăŽĺéĄăŽćć°ć ĺ ąăĺ ĽćăăăŤăŻăŠăăăă°ăăă§ăăďź çžćçšă§ăŻăĺéĄăăľăăšăŻăŠă¤ăăăăŤăćă ăă§ăăŻă¤ăłăăăă¨ă§ăăăĺŽčĄăăĺż čŚăăăăăă§ăă ăăăŤé˘ăăăă¤ăŹăăŤăŞăăĽăźăšăĺ ĽćăăăăăŤăç§ăéťĺăĄăźăŤă§čłźčŞă§ăăă°ăăăŽă§ăăă
1ă¤ăŽăăźăŻăźăăŽä¸ă§ćŽéçăăăłĺĺ¨č¨ĺˇă桡ĺăăăă¨ăŻééăă§ăăăä¸č˛Ťć§ăŽč°čŤăŻç§ăŤăŻćŠč˝ăăŞăă¨ç§ăŻäťă§ă俥ăăŚăăžăă
ä¸čŹçăŞĺĺă¨ăăŚăăăŽćŠč˝ă¨ăŻé˘äżăŞăăăăŽä¸éŁăŽć¨čŤăŤăŻĺéĄăăăă¨ćăăžăă
ç§ăăĄăŻăč¨čŞăĺĽăŽć´ĺ˛ăŽĺąéăŽä¸ăŤăăăă¨ăćăă§ăăćšćłă§ăŻăŞăimpl Trait
ăŻĺŽĺŽăăŚăăăăăăăăćăžăŞăĺ ´ĺăăăăžăă XăYăZăééăă ă¨ćăŁăŚăăŚăďźĺäşşçăŤăŻRustăŽăăśă¤ăłăŽééăă ă¨ćăăăŽăŻăăăăčŚă¤ăăăžăăăăĺăĺ
ĽăăŚćłĺŽăăŚăăžă...ďźăç§ăăĄăŻäťă彟ăă¨ä¸çˇăŤćŽăăĺż
čŚăăăăžăăć°ăăćŠč˝ăĺćă¨ăăŚăăăšăŚăăŠăŽăăăŤçľăżĺăăăăă¨ăă§ăăăăŤă¤ăăŚďźä¸č˛Ťć§ăäżă¤ďźă
č°čŤăŽä¸ă§ăRFCăŽăłăźăăšĺ ¨ä˝ă¨ăăŽăžăžăŽč¨čŞăŻăĺ Źçă§ăŻăŞăă埡ĺăŞč°čŤă§ăăăăŽăăăŤĺăĺăăăăšăă ă¨ćăăžăă
ăăŞăăŻăăă丝埾ăăăă¨ăă§ăăžăďźăăăç§ăŻăăăăžăăďźďź
struct Foo {
pub foo: impl Display,
}
ćĺłçăŤăŻćŹĄăŽăăŽă¨ĺçă§ăă
struct Foo<T: Display> {
pub foo: T,
}
é˘ć°ăŽĺźć°ăŽć¨čŤăŽä¸ă§ă
ĺşćŹçăŤă impl Trait
ăčăăă¨ă ăăăăŻreturn-typeăŽăăăŞăăŽă§ăăăăăă¨ăĺźć°ăŽăăăŞăăŽă§ăăďźăă¨čăăĺż
čŚăăă
type Name: Trait
ă使ăăă¨ăăăă¨ăĺŽéăŤĺĺżč ăčĄăĺŻč˝ć§ăéŤăĺ ´ĺăăăăŻlintăäťăăŚč§Łćąşă§ăăžăă
ç§ă糸ăăăĺşăăžăăăĺ寞ćšĺă§ăă 揥ăŽćšćłăŻć Łç¨çă§ăăĺż čŚăăăă¨ćăăžăă
// GOOD:
type Foo: Iterator<Item: Display>;
type Bar = (impl Display, impl Debug);
// BAD
type Foo = impl Iterator<Item = impl Display>;
type Bar0: Display;
type Bar1: Debug;
type Bar = (Bar0, Bar1);
ăăăăžăăăRFC2071ă示ĺăăŚăăă¨ç§ă俥ăăŚăă䝣ćżăŽĺŽĺźĺăŻăăăŽĺéĄă§č°čŤăăăŚăăĺŻč˝ć§ăăăăžăăăć示çăŤăŻčż°ăšăăăŚăăžăăă
ĺĺ¨č¨ĺˇĺă厣č¨ăăćšćłăŻ_1ă¤_ăăăăăžăăďź existential type Name: Bound;
ďźRFCă§ćĺŽăăăŚăăăăă existential
ă使ç¨ăăžăăăăŽĺŽĺźĺă§ăăźăŻăźăăĺé¤ăăăă¨ăŤĺŽĺ
¨ăŤĺ寞ăăŚăăăăă§ăŻăăăžăăďźă
ăăăŤăçžĺ¨ăŽăšăłăźăă§ĺĺăŽăŞăĺĺ¨č¨ĺˇĺăćéťçăŤĺŽŁč¨ăăăăăŽç çłăăăăžăďź impl Bound
ďźĺ˝é˘ăŻé˘ć°ăŽĺźć°ăŽĺ
¨ç§°č¨ĺˇăçĄčŚăăžăďźă
ăăăăŁăŚăçžĺ¨ăŽăŞăżăźăłăżă¤ăăŽä˝żç¨ćłăŻăĺç´ăŞčąçłă§ăă
fn foo() -> impl Iterator<Item = impl Display> { ... }
existential type _0: Display;
existential type _1: Iterator<Item = _0>;
fn foo() -> _1 { ... }
const
ă static
ă let
ćĄĺźľăăăă¨ăĺć§ăŤç°Ąĺă§ăă
RFCăŤč¨čźăăăŚăăŞăćĄĺźľćŠč˝ăŽ1ă¤ăŻăăăŽç çłătype Alias = Concrete;
ć§ćă§ăľăăźăăăăă¨ă§ăă
type Foo = impl Iterator<Item = impl Display>;
ăăăŻĺŽéăŤăŻç çłă§ă
existential type _0: Display;
existential type _1: Iterator<Item = _0>;
type Foo = _1;
揥ăŤăĺă¨ă¤ăŞă˘ăšăŽééçăŞć§čłŞăŤäžĺăăŚăçžĺ¨ăŽă˘ă¸ăĽăźăŤăFoo
ă調ăšăăăăĺĺ¨ăăĺăĺç
§ăăŚăăăă¨ă確čŞă§ăăăăăŤăăžăă
ĺŽéăĺŻč˝ă§ăăă°ăĺžč ăŽĺ˝˘ĺźăĺŞĺ ăăăłăłăă¤ăŠăźăťăŞăłăăç¨ćăăĺż čŚăăăă¨ĺźˇă俥ăăŚăăžăă
ç§ăŻ@alexregăŽăłăĄăłăă¨ăťăźä¸č´ăăŚăimpl Trait
ăćŠč˝ăăŞăăăăăŠă¤ăăŠăŞăŽĺ¤ć´ăĺŁăsemveră弨ĺąăăăŞăšăŻăăăăăă arg: impl Trait
ăŤĺăăŚăŞăłăăăăă¨ăŤă¤ăăŚć¸ĺżľăăăăžăăăżăźăăăŁăăˇăĽă使ç¨ăăžăďźçžĺ¨ăăăžăćŠč˝ăăăăŤăŻé¨ĺçăŞăżăźăăăŁăăˇăĽăĺż
čŚă§ăďźă ăăăăŁăŚăăŻăŞăăăŽăŞăłăăŁăłă°ăŻăăżă¤ăă¨ă¤ăŞă˘ăšăŽĺ ´ĺďźĺéĄăĺźă辡ăăăżăźăăăŁăăˇăĽăăŞăĺ ´ĺďźăăăç°Ąĺă§ăŻăăăžăăă
ç§ăŻ@alexregăŽăłăĄăłăă¨ăťăźä¸č´ăăŚăăŞăłăăăăă¨ăŤă¤ăăŚăăăă¤ăăŽć¸ĺżľăăăăžăăăăăŻä¸ťăŤăimpl Traităturbofishă§ćŠč˝ăăŞăăăăăŠă¤ăăŠăŞă§semverăĺŁăĺ¤ć´ă弨ĺąăăăŞăšăŻăăăăăă§ăďźçžĺ¨ăăăžăćŠč˝ăăăăŤăŻăé¨ĺçăŞăżăźăăăŁăăˇăĽăĺż čŚă§ăďźă ăăăăŁăŚăăŻăŞăăăŽăŞăłăăŁăłă°ăŻăăżă¤ăă¨ă¤ăŞă˘ăšăŽĺ ´ĺďźĺéĄăĺźă辡ăăăżăźăăăŁăăˇăĽăăŞăĺ ´ĺďźăăăç°Ąĺă§ăŻăăăžăăă
@CentrilăŻăăăIRCă§ĺăä¸ăăă°ăăă§ăăăä¸ä˝äşćć§ďźĺŁăăăăďźăŤé˘ăăŚăŻĺ ŹćŁăŞçšă§ăăăă¨ăŤĺćăăžăă é¨ĺçăŞăżăźăăăŁăăˇăĽăçé¸ăăĺ ´ĺăăłăłăă¤ăŠăźăŽăŞăłăăčż˝ĺ ăăĺż čŚăăăă¨ćăăžăăăăăăžă§ăŻčż˝ĺ ăăŞăă§ăă ăăă
ă ăă...ç§ăăĄăŻäťăĺĺäťăĺĺ¨ĺăŽć§ćăŤă¤ăăŚăăŞăĺ¤ăăŽč°čŤăăăžăăă çľčŤăĺşăăŚRFC / PRăŽć稿ăŤć¸ăčžźăă§ă誰ăăĺŽéăŽĺŽčŁ ăŤĺăââćăăăă¨ăă§ăăăăăŤăăžăăăďź :-)
ĺäşşçăŤăŻăĺĺ¨ăŤĺĺăäťăăăăăŠăă§ăimpl Trait
使ç¨ăăŞăăăăŤăăŞăłăďźăăĺ ´ĺďźă使ç¨ăăăă¨ćăăžăă
@rpjohnstĺĺäťăăŽĺĺ¨ăŤé˘ăăŚăç§ă¨@CentrilăŤç˘şăăŤĺćăăžă...é˘ć°ăŽĺźć°ă§ăăăăăé˘ăăăă¨ăŤé˘ăăŚăŻăăăăŻĺŻč˝ć§ă§ăăăăăăăĺĽăŽĺ ´ćă§ăŽč°čŤă§ăă ăăŽćčă§ĺç´ăă弽ăăä¸čŹć§ă弽ăăăŤăăŁăŚç°ăŞăăžăă
ĺźć°ăŽä˝ç˝ŽăŤăăimpl Trait
ăŽRFCăŻćć°ă§ăăďź ăăăăăŞăăăăŽăťăăłăăŁăŻăšăŻ_universal_ă§ăăă¨č¨ăŁăŚăĺŽĺ
¨ă§ăăďź ăăăăăŞăďźç§ăŻćłŁăăăă§ăă 桹ăă
@phaazon ďź impl Trait
Rust 1.26ăŞăŞăźăšăăźăďź
ăăăŤăăăżă¤ăçčŤĺŽśă¸ăŽčŁčśłďźăăăŻĺŽĺçă§ăŻăŞăăäžçśă¨ăăŚćŽéçă§ăă č¨ăćăăă¨ăimpl TraităŻĺ Ľĺä˝ç˝Žă§ăŻćŽéçă§ăăăĺşĺä˝ç˝Žă§ăŻĺĺ¨ăăžăă
ăăăŤă¤ăăŚăŽç§ăŽčăă襨çžăăăăă ăăŤďź
impl Trait
ăŻăăĺźăłĺşăĺ
ăé¸ćăăăżă¤ăăă¨ç°ĄĺăŤĺç
§ă§ăăžăăăăăŻăçžĺ¨ăŽă¨ăăăăăăĺŻč˝ăŤăăĺŻä¸ăŽč¨čŞć§é ă ăăă§ăă ĺźăłĺşăĺ
ăŤăăăżă¤ăăŽé¸ćăŻăăăă¤ăăŽć§ćăäťăăŚăă§ăŤĺŠç¨ĺŻč˝ă§ăăč°čŤăŽçŤĺ ´ăŤăăimpl Trait
çžĺ¨ăŽćąşĺŽăŻćŽĺżľă ă¨ćăăžăă ďźćłŁăďź
ç§ăŻćŹĺ˝ăŤăč°čŤăŽä˝ç˝ŽăŽçžĺ¨ăŽćąşĺŽăŤăăăćéťăŽçšć§ăŻćŽĺżľă ă¨ćăăžăă đ˘
ç§ăŻăăăŤĺ°ăćŠăžăăăŚăăžăăăäťăŻlet x: impl Trait
ĺŽčŁ
ăŤćéă貝ăăăăťăăăăă¨ćăăžăă
ĺ ąĺ¤ăŽĺĺ¨ăŻç§ăăĄăŤăŠăłăŻné˘ć°ă¸ăŽćăéăă§ăăă
ăă§ăŤć§ćďź fn foo(f: impl for<T: Trait> Fn(T))
ďźďźĺĽĺăăżă¤ăHRTBăďźăăăăžăăăăžă ĺŽčŁ
ăăăŚăăžăăă fn foo(f: impl Fn(impl Trait))
ăŻăăăăšăăăăimpl Trait
ăŻč¨ąĺŻăăăŚăăžăăăă¨ăăă¨ăŠăźăçćăăžăăăżă¤ăHRTBăĺĺžăăă¨ăăŤăä¸ä˝ăăźă¸ă§ăłăćĺłăăăăăŤăăăă¨ćăăžăă
ăăăŻă Fn(&'_ T)
for<'a> Fn(&'a T)
ćĺłăăăŽă¨äźźăŚăăăŽă§ăçŠč°ăé¸ăă¨ăŻćăăŞăă
çžĺ¨ăŽăăŠăăăčŚăă¨ăĺźć°ăŽä˝ç˝ŽăŤăăimpl Trait
ăŻ_universal_ă§ăăă impl for<_> Trait
ăŻăăă_existential_ăŤĺ¤ăăă¨č¨ăŁăŚăăžăăďźďź ăăăŻăŠăăťăŠăŻăŹă¤ă¸ăźă§ăăďź
_ăŚăăăźăľăŤ_ăć§çŻăăăăăŤ_ăăăŤĺĽăŽćšćł_ăĺ°ĺ Ľăăĺż čŚăăăă¨čăăăŽăŻăŞăă§ăăďź ă¤ăžăďź
fn foo(x: impl MyTrait)
ĺżĺĺĺ¤ć°ăŻĺăŤ1ĺăă襨示ăăăŞăăăăčĺłćˇąă
fn foo(x: impl Trait) -> impl Trait
ćăăăŤĺä˝ăăžăăă ç§ăăĄăŻäşşă
ăŤăĺăŤăăăĺŚăłăăăăăŠăă§ă使ç¨ăăăŽă§ăŻăŞăăăăä¸čŹçăŞă¤ăăŁăŞă ăăăăĺśéäťĺ 䞥ĺ¤ăŽăŞăćŠč˝ăčż˝ĺ ăă-RFCă§čŞăă ĺŚçżăŽäťŽĺŽăŻăć°ĺč
ăŽäťŁăăăŤç§ăăĄăčăăĺĽĺŚăŞč°čŤă§ă-彟ăăŻăžă çŠäşăĺŚăśĺż
čŚăăăăŽă§ăăŞăć§ćăăăŞăćć§ăŤăăăŽă§ăăďźăăă§ĺŚçżć˛çˇăä¸ăăăăăŤăżăăŞďź äşşă
ăćŽéç寞ĺŽĺçďźăăăŚ1ă¤ăŤăŞăă¨ăĺĺăŻćŁăăč¨čă§é常ăŤĺç´ă§ăďźăŤć
Łăăă¨ăăäşşă
ăŻç§ăăĄă严ćšă¨where
ă襨çžăăăăăŤĺăăăźăŻăźă/ăăżăźăłăćăŁăŚăăççąăčăĺ§ăăžăăăăłă¤ăłăăŹăźăšăăłăăŹăźăăăŠăĄăźăżă
ăăăç§ăŻăăăŽăăšăŚăăă§ăŤĺăĺ Ľăăăăă¨ćăăžăăăăăŚç§ăŻä˝ăŽăăăŤćéł´ăŁăŚăăžăă ćŹĺ˝ăŤćŽĺżľă ă¨ćăăžăă RFCăŽćąşĺŽăŤĺ¤ąćăăăŽăŻç§ă ăă§ăŻăŞăă¨ç˘şäżĄăăŚăăžăă
ďźćŠč˝ăĺŽĺŽăăĺžăŤăăăč°čŤăăăăŤçśăăŚĺ¤ăăŽăă¤ăłăăŻăăăăăăăžăăăăăĺç
§ăăŚăă ăăç§ăŻĺćăă誏ĺžĺăŽĺźć°ďźăŽăăăŽďźççąăŽăăăŤimpl Trait
ĺźć°ăŽä˝ç˝ŽăŤăăăăăăăăŞăăŽăťăăłăăŁăŻăšăćă¤ăă¨ă賢ćă§ăăăă¨ăăłăăźăŹăłăTlăŽăDRăăăăăŻăŞăĺăççąă fn foo(arg: Box<Trait>)
ă¨ăťăźĺăăăăŤĺä˝ăăžăfn foo<T: Trait>(arg: Box<T>)
ăŤăăăăăăă dyn Trait
ĺŽĺă§ăăăäťă§ç˝Žăćăădyn
impl
ăďź
çžĺ¨ăŽăăŠăăăčŚăă¨ăĺźć°ăŽä˝ç˝ŽăŤăă
impl Trait
ăŻćŽéçă§ăăăimpl for<_> Trait
ăŻăăăĺŽĺ丝瞊ăŤĺ¤ăăă¨č¨ăŁăŚăăžăăďźďź
ăăăăăŠăĄăăćŽéçă§ăă ä¸ä˝ăŽç¨éăŻćŹĄăŽăăăŤăŞăăžăă
fn foo<F: for<G: Fn(X) -> Y> Fn(G) -> Z>(f: F) {...}
ăăăŻăčż˝ĺ ăăăă¨ĺćăŤďźă¤ăžăă impl Trait
ĺ¤ć´ăĺ ăăăŤďźćŹĄăŽăăăŤč¨čż°ă§ăăžăă
fn foo(f: impl for<G: Fn(X) -> Y> Fn(G) -> Z) {...}
ăăăŻćŽéçăŞimpl Trait
ă§ăăă Trait
ăHRTBďź impl for<'a> Fn(&'a T)
ă¨ĺć§ďźă§ăăă¨ăăă ăă§ăă
ç§ăăĄăŻďźç§ăŻăăă§ăćĺž
ăăŚăăďźăă¨ăćąşĺŽăăĺ ´ĺăŻimpl Trait
ăŽĺ
é¨ă§Fn(...)
ĺźć°ăćŽéçă§ăăăăăŞăăŻĺăĺšćăéćăăăăăŤăăăăć¸ăăă¨ăă§ăăžăďź
fn foo(f: impl Fn(impl Fn(X) -> Y) -> Z) {...}
ăăăăä¸ä˝ăăŽćĺłă ă¨ćăăžăăăăăăă§ăŞăĺ ´ĺăŻăçĽăăăă ăăă
ăăăŤčĺłćˇąăăŽćąşĺŽăăăŞăăĄăăăŽďźăäťăŽăŻăăźă¸ăŁăĺăăăă¤ăăŽăŻăăźă¸ăŁăčżăăă¨ăăćĺłă¨ćăăăďźăă¨ăă§ăăĺŽĺăŽä˝ç˝ŽăŤĺăĺŚçăéŠç¨ăăăă¨ăčăăăăžăă
fn foo() -> impl for<G: Fn(X) -> Y> Fn(G) -> Z {...}
ăăŽăăăŤć¸ăăăďź
fn foo() -> impl Fn(impl Fn(X) -> Y) -> Z {...}
ăăăŻăăŚăăăźăľăŤimpl Trait
ăĺŤăĺŽĺçăŞimpl Trait
impl Trait
ďźĺ˛ăżé˘ć°ă§ăŻăŞăăĺŽĺçăŞ
@eddybä¸č˛Ťć§ăäżăĄăĺĺżč
ă桡䚹ăăăŞăăăăŤăä¸čŹăŤĺŽĺçăăăłĺ
¨ç§°
ĺĺ¨č¨ĺˇăŽăăźăŻăźăăŻăĺĺ¨ĺăŤăĺĺŠç¨ă§ăăăŽă§ăŻăŞăă§ăăăăă
ĺŽĺçďźăăăłćŽéçďźć°éĺăŤimpl
ă使ç¨ăăŚăăăŽăŤăĺŽĺçĺăŤăŻexistential
ă使ç¨ăăŚăăăŽăŻăŞăă§ăăďź
ç§ăŻ3ă¤ăŽăă¤ăłăăčż°ăšăăă¨ćăăžăďź
impl Trait
ăĺŽĺçă§ăăăćŽéçă§ăăăăč°čŤăăăĄăŞăăăŻăăžăăăăžăăă ăăăŤăăăăă°ăŠăăźăŽăťă¨ăăŠăŻăăăăăĺçčŤăŽăăłăăăăŻăĺĺăŤčŞăă§ăăžăăă§ăăă ĺéĄăŻăäşşă
ăăăăć°ăŤĺ
ĽăŁăŚăăăŽăăăăă¨ă桡䚹ăăŚăăăŽăă¨ăăăă¨ă§ăă ăăŽčłŞĺăŤçăăăăăŤăăăŽăšăŹăăă reddităăžăăŻăăŠăźăŠă ăŽä¸Ąćšă§ăä˝ăăăŽĺ˝˘ăŽăăŁăźăăăăŻăčŚăăă¨ăă§ăăžăă ăăăŤčŞŹćăĺż
čŚăŞĺ ´ĺăŻăç´ćçăžăăŻéŠăăšăćŠč˝ăŽăŞăăăšăăŤĺ¤ąćăăžăă ăăăăŁăŚăäťăŽćŠč˝ăăăĺ¤ăăŽčłŞĺăăăăăŠăăăăăăŚĺ˝źăăăŠăăťăŠĺ¤ăăŽäşşă
ă¨ăŠăăťăŠćˇˇäšąăăŚăăăă調ăšăĺż
čŚăăăăžăă ăăŽăăŁăźăăăăŻăĺŽĺŽĺĺžăŤĺąăăŽăŻç˘şăăŤć˛ăăăă¨ă§ăăăăăŽçžčąĄăŤă¤ăăŚä˝ăăčĄăĺż
čŚăăăăžăăăăăăŻĺĽăŽč°čŤăŽăăă§ăăăăŽăăŁăźăăăăŻăĺŽĺŽĺĺžăŤĺ°çăăăŽăŻćŹĺ˝ăŤć˛ăăăă¨ă§ăăăăăŽçžčąĄăŤă¤ăăŚä˝ăăăăĺż čŚăăăăžă
ăăăă˘ă¤ăă˘ă§ăăéăăĺźć°ăŽä˝ç˝Žă§impl Trait
ăŤĺ寞ăăăăžăăă ăăŽăăăŞăăŁăźăăăăŻăŻ_ć°ăăăăŽă§ăŻăăăžăă_ăé˘éŁăăRFCăšăŹăăă§ăé常ăŤč°čŤăăăžăăă ĺçčŤăŽčŚłçšăăăŽćŽéç/ĺĺ¨ĺăŤă¤ăăŚă ăă§ăŞăăăăăć°ăăăŚăźăśăźăŤă¨ăŁăŚăŠăŽăăăŤćˇˇäšąăăăăŤă¤ăăŚăĺ¤ăăŽč°čŤăăăăžăăă
確ăăŤăĺŽéăŽć°čŚăŚăźăśăźăŽčŚçšăŻĺžăăăžăăă§ăăăăăăăŻăŠăăăă¨ăăŞăĺşăŚăăăăă§ăŻăăăžăăă
@Boscop any
ă¨some
ăŻăăăŽäťäşăăăăăăŽăăźăŻăźăăŽăă˘ă¨ăăŚććĄăăăžăăăăĺ寞ăŤćąşĺŽăăăžăăďźçčŤçć šć ăăŠăăăŤć¸ăçăăăăăăŠăăăŻăăăăžăăăďźă
確ăăŤăăăłăŤä¸ć Łăă§ăżă¤ăçčŤĺŽśă§ăŻăŞăäşşă ăăăăŁăźăăăăŻăĺžăăă¨ăă§ăăžăăă§ăă
ăăăŚăĺ ĺŤăŽăăăŽĺźć°ăŻăăăăć°čŚĺĺ ĽăŽăăăŤăăă厚ćăŤăăăă¨ă常ăŤă§ăăă ăăă§ăăăç§ăăĄăäťăć°ĺč ăăăŽĺŽéăŽăăŁăźăăăăŻăé˘éŁć§ăŽăă税éĄăŽăăŁăźăăăăŻă§ăŻăŞăă§ăăăăďź
誰ăăćéăăăă¨ăăăăăăŠăźăŠă ăäťăŽĺ ´ćă§ăĺ ĺŤăŽĺĺžă§äşşă ăăŠăŽăăăŤćˇˇäšąăăŚăăăă調ćťăăăă¨ăă§ăăă¨ćăăžăďźç§ăŻçľąč¨ăăăžăĺžćă§ăŻăăăžăăă§ăăăă誰ăăă§ăăă¨ç˘şäżĄăăŚăăžăăăŠă¤ăłăäşć¸ŹăăăĺŞăăăăŽăčăĺşăďźă
ăăăŚăă¤ăłăŻăŤăźă¸ă§ăłăŽč°čŤăŻĺ¸¸ăŤăăăăć°ĺč ăŤă¨ăŁăŚăăç°ĄĺăŤăŞăă ăăă¨ăăăăŽă§ăăă ăăă§ăăăç§ăăĄăäťăć°ĺč ăăăŽĺŽéăŽăăŁăźăăăăŻăćăŁăŚăăăŞăăăăăŻć°ĺč ăăăăăŠăŽăăăŤç解ăăšăăăč°čŤăăăŽă§ăŻăŞăăé常ăŤé˘éŁć§ăŽăă税éĄăŽăăŁăźăăăăŻă§ăŻăŞăă§ăăăăďź
ăŻăďź ă¤ăžăă辡ăăŁăăă¨ăčŻăčăă ăŁăăŽăćŞăčăă ăŁăăŽăăŤă¤ăăŚč°čŤăăŚăăăŽă§ăŻăăăžăăă RFCăšăŹăăăăăăŤă¤ăăŚăăŁăźăăăăŻăĺăĺăŁăăă¨ăććăăă ăă§ăă¨ăŤăăćąşĺŽăăăžăăă
ăăŞăăč¨ăŁăăăăŤăăăŁăźăăăăŻăŤé˘ăăăĄăżăăŁăšăŤăăˇă§ăłăăŠăăĺĽăŽĺ ´ćă§čĄăćšăăăăăčŻăă§ăăăăăăăăăŠăăŤăăăăŻăăăăžăăă
ăăăăĺŽĺĺă¨ăŚăăăźăľăŤĺăćĺŽăăăăăŤăăăŤ2ă¤ăŽăăźăŻăźăăčż˝ĺ ăăŚăă桡䚹ăŻćšĺăăăžăăăäşć ăŻăăăŤćŞĺăăă ăă§ăă
ćŞăďź ăŠăă§ăăďź ç§ăŻćć§ă/桡䚹ăăăč¨ćśăăăă¨ă弽ăżăžăă
ăŻăďź ă¤ăžăă辡ăăŁăăă¨ăčŻăčăă ăŁăăŽăćŞăčăă ăŁăăŽăăŤă¤ăăŚč°čŤăăŚăăăŽă§ăŻăăăžăăă RFCăšăŹăăăăăăŤă¤ăăŚăăŁăźăăăăŻăĺăĺăŁăăă¨ăććăăă ăă§ăă¨ăŤăăćąşĺŽăăăžăăă
ăăĄăăă ăăăăăŠăĄăăŽä¸ťĺźľăăĺ é¨ă§ä˝ă辡ăăŁăŚăăăŽăă桹ăç解ăă彟ăăćĺąăăŚăăŞăă°ăŤăźăďźć°ĺč ďźăŤă¤ăăŚć¨ć¸Źăăĺ°ćĽăŤă¤ăăŚć¨ć¸Źăăăĺ¤ăăŚĺˇă¤ăăçľé¨čąĺŻăŞăăă°ăŠăăźă§ăăă äşĺŽăŽčŚłçšăăăŻăĺŽéăŤä˝ă辡ăăŁăŚăăăă¨ăăçšă§ăŻăăľă¤ăłăăćŻăăăăăŻăăăŤĺŞăăŚăăăăă§ăŻăăăžăăă ăăăŻăĺ°é厜ăŽä¸ĺĺăŞçľé¨ăŤé˘ăăăăŽă§ăŻăŞăăćććąşĺŽăŽĺşç¤ă¨ăŞăéŠĺăŞăăźăżăăŞăăă¨ăŤé˘ăăăăŽă§ăă
äťă§ăŻăăăĺ°ĺ ĽăăăĺŽéăŽăăźăăăźăżăăžăăŻ0ăă10ăŽăšăąăźăŤă§ăŠăă ăăŽäşşă桡䚹ăăăă¨ăăĺĺ°ă§ĺĺžă§ăăéăăŽăăźăăăźăżăĺĺžăăćšćłăăăăžăă
ăăŞăăč¨ăŁăăăăŤăăăŁăźăăăăŻăŤé˘ăăăĄăżăăŁăšăŤăăˇă§ăłăăŠăăĺĽăŽĺ ´ćă§čĄăćšăăăăăčŻăă§ăăă
ăă¨ăă°ăăăă§ăç§ăŻăă§ăŤăăŽăăăŞč°čŤăéĺ§ăăŚăăăăă¨ăĺ°ăăŞăăŽă§ăăŁăŚăăĺŽčĄă§ăăĺŽéăŽćé ăăăă¤ăăăăžăďź https ďź
ćŞăďź ăŠăă§ăăďź
ăŞăăŞăă impl Trait
ăéć¨ĺĽ¨ăŤăŞăăŞăéăă3ă¤ăăšăŚăćăŁăŚăăăŽă§ă桡䚹ăŤĺ ăăŚčŚăăŚăăĺż
čŚăăăăžăă impl Trait
ăăŞăăŞăă¨ăçśćłăŻç°ăŞăă2ă¤ăŽă˘ăăăźăăŽéˇćă¨çćăéăăŞăăžăă
callee-pickingăŽăăăŤimpl Trait
ă§ĺĺă§ăă ĺźć°ăŽä˝ç˝Žă§ä˝żç¨ăăăă¨ăăă¨ă桡䚹ăçăăžăă HRTBăŻăăŽćˇˇäšąăĺăé¤ăă§ăăăă
@vorner䝼ĺăç§ăŻRustăŽĺĺżč
ă使ăŁăŚĺŽéăŽA / BăăšăăčĄăăRustăŤç˛žéăăŚăăäşşă¨ăăŚć¨ć¸ŹăăăŽăŻéŁăăăăăĺŽéăŤä˝ăç°Ąĺă§çżĺžăéŁăăăă確čŞăăĺż
čŚăăăă¨ä¸ťĺźľăăžăăă
FWIWăç§ăRustďźC ++ăDăJavaăŞăŠăăćĽăŚăăďźăĺŚăă§ăăă¨ăăĺ
¨ç§°č¨ĺˇĺă¸ă§ăăŞăăŻďźć§ćăĺŤăďźăŻç解ăăăăăŁăďźă¸ă§ăăŞăăŻăŽĺŻżĺ˝ăŻĺ°ăéŁăăăŁăďźăă¨ăčŚăăŚăăžăă
argăżă¤ăăŽimpl Trait
ăŻăĺĺżč
ăăăŽĺ¤ăăŽćˇˇäšąă¨ăăăŽăăăŞĺ¤ăăŽčłŞĺăŤă¤ăŞăăă¨ăžăă
ĺ¤ć´ăŤăăŁăŚRustăçżĺžăăăăăă訟ć ăăŞăĺ ´ĺăŻăăăŽăăăŞĺ¤ć´ăčĄăăŽăć§ăă䝣ăăăŤăä¸č˛Ťć§ăŤăăŁăŚĺ°ăŞăă¨ăčŚăăăăăŞăăăăRustăăăä¸č˛Ťć§ăŽăăăăŽăŤăă/çśćăăĺ¤ć´ăčĄăĺż
čŚăăăăžăă ăăłăĺĺżč
ăŻă¨ăŤăăćŹăć°ĺčŞăžăŞăăă°ăŞăăŞăăŽă§ăargsăŤimpl Trait
ăĺ°ĺ
ĽăăŚăćŹăŽă¸ă§ăăŞăăŻăĺžă§ăžă§ĺťśćă§ăăăăăŤăăŚăăĺŽéăŤăŻč¤éăăĺăé¤ăăă¨ăŻă§ăăžăăă
@eddybă¨ăăă§ă impl
ăŤĺ ăăŚăĺăŤĺĽăŽexistential
ăăźăŻăźăăĺż
čŚăŞăŽăŻăŞăă§ăăďź ďźä¸ĄćšăŤsome
ă使ç¨ăăăăŽă§ăăăďź
FWIWăç§ăRustďźC ++ăDăJavaăŞăŠăăćĽăŚăăďźăĺŚăă§ăăă¨ăăĺ ¨ç§°č¨ĺˇĺă¸ă§ăăŞăăŻďźć§ćăĺŤăďźăŻç解ăăăăăŁăďźă¸ă§ăăŞăăŻăŽĺŻżĺ˝ăŻĺ°ăéŁăăăŁăďźăă¨ăčŚăăŚăăžăă
ç§čŞčşŤăĺéĄăŞăă¨ćăăžăă ç§ăŽçžĺ¨ăŽäźç¤žă§ăŻăRustăŻăŠăšăçăăŚăăžăăäťăŽă¨ăăăéąăŤ1ĺäźĺăćăĄăĺŽčˇľçăŞĺŽčŁ ăćăăăă¨ăăŚăăžăă äşşă ăŻăăăŠăłăŽăăă°ăŠăăźă§ăăă丝ăŤJavaă¨ScalaăŽăăăŻă°ăŠăŚăłăăăćĽăŚăăžăă ăăă¤ăăŽé厳ăăăăžăăăăĺźć°ăŽä˝ç˝ŽăŤăăă¸ă§ăăŞăăŻăšďźĺ°ăŞăă¨ăăăăăčŞă-ĺŽéăŤăăăăć¸ăăă¨ăŤăŻĺ°ă注ćăĺż čŚă§ăďźăŻĺéĄă§ăŻăăăžăăă§ăăă ă¸ă§ăăŞăăŻăšăăŞăżăźăłä˝ç˝ŽăŤăăăă¨ďźăă¨ăă°ăĺźăłĺşăĺ ăé˘ć°ăčżăăăŽăé¸ćăăăă¨ďźăŤă¤ăăŚăŻĺ°ăéŠăăžăăăçšăŤăăăăŻăă°ăă°ççĽă§ăăă¨ăăăă¨ă§ăăă誏ćăŻăŻăŞăăŻăăăžă§ăŤ2ĺăťăŠăăăăžăăă ăăăăĺźć°ăŽä˝ç˝ŽăŤimpl Traităĺĺ¨ăăăă¨ăŤă¤ăăŚăč¨ĺăăăă¨ăćăăŚăăžăăăŞăăŞăăăŞăăăăĺĺ¨ăăăŽăă¨ăă質ĺăŤçăăĺż čŚăăăăăă§ăăăăăŚăăăăŤĺŻžăăćŹĺ˝ăŽçăăŻăăăžăăă ăăăŻăăć°ă辡ăăăăăŽăŤčŻăăăăžăăăăăăŚăăăć°ăćă¤ăă¨ăŻĺŚçżăăăťăšăŤă¨ăŁăŚéčŚă§ăă
ăăă§ăĺéĄăŻăăłăăĽăăăŁăŻč°čŤăčŁäťăăăăăŤăăă¤ăăŽăăźăżă§č°čŤăĺéăăăŽăŤĺĺăŞĺŁ°ăćăŁăŚăăăă¨ăăăă¨ă§ăă
@eddybă¨ăăă§ăăŞăimplăŤĺ ăăŚăĺăŤĺĽăŽĺŽĺçăŞăăźăŻăźăăĺż čŚăŞăŽă§ăăďź ďźä¸ĄćšăŤä˝żç¨ăăăăŽă§ăăăďź
forall
âŚ/ meăăăŁăăă¨ĺżăłĺŻăŁăŚăżăžăăă
ćă
ăŻćăŁăŚăă@phaazon forall
ďźăăŞăăĄ"ăŚăăăźăľăŤ"ďźă¨ăăăăăŽfor
ăäžăă°HRTBä¸ďź for<'a> Trait<'a>
ďźă
@eddybăăăăăăăăăă¨ăă°Haskellăforall
ă§čĄăăăăŤăăăăĺŽĺçăŤă使ç¨ăăžăă
č°čŤĺ ¨ä˝ăé常ăŤćčŚăĺăăăŚăăăč°čŤăŽă˘ă¤ăă˘ăĺŽĺŽăăŚčŚăăŚăăăă¨ăŤĺ°ăéŠăăŚăăžăă ĺžă§ĺĽăŽRFCăăăăˇăĽăăŚăăăăĺ ăŤćťăćšćłăăăăă¨ăéĄăŁăŚăăžăďźăăăăăăă桡䚹ăŽăăšăŚăćŹĺ˝ăŤćŹĺ˝ăŤĺĽ˝ăă§ăŻăŞăăŽă§ăç§ăŻĺŽĺ ¨ăŤăăăć¸ăă¤ăăă§ăďźă
ăăăăăăžăăă ăăăăč°čŤăŽä˝ç˝ŽăŤç˝Žăăă¨ăŽćĺłăŻä˝ă§ăăďź RustăŻăăžăć¸ăăžăăăă -> impl Trait
ăă§ăăăŽăćŹĺ˝ăŤĺĽ˝ă
ç§ăŽç解ă§ăŻăăăăŻä¸ťăŤä¸č˛Ťć§ăŽăăă§ăăă fnăˇă°ăăăŁăŽĺźć°ăŽä˝ç˝ŽăŤăżă¤ăimpl Trait
ăč¨čż°ă§ăăĺ ´ĺăäťăŽĺ ´ćăŤč¨čż°ă§ăăŞăăŽăŻăŞăă§ăăďź
ăăăŻč¨ăŁăŚăăç§ăŻĺäşşçăŤăŻăăżă¤ăăăŠăĄăźăżă使ç¨ăăă ăăă¨äşşă ăŤäźăăăăŁăăŽă§ă...
ăŻăăăăăŻä¸č˛Ťć§ăŽăăă§ăă ăăăăĺăăŠăĄăźăżăźăé常ăŤä˝żăăăăĺ ´ĺăăăăĺĺăŞĺźć°ă§ăăăăŠăăăŻăăăăžăăă ăžăăĺéĄăçşçăăžăă
ăžăăĺéĄăçşçăăžăă
impl Trait
ă§ăăă¤ăăŽăă¨ă襨çžă§ăăŞăăă¨ăčăăă¨ăĺźć°ăŽ1ă¤ă¨ăăŚimpl Trait
ă§é˘ć°ă使ç¨ăăă¨ăăżăźăăăŁăăˇăĽăĺŽčĄă§ăăŞăăăăăăŽă˘ăăŹăšăĺĺžă§ăăžăăďźăăă¤ăĺżăăžăăăďźäťăŽä¸ĺŠăŞçšăŻďźďźăă¨ăŤăăăăăă使ç¨ăăĺż
čŚăăăăŽă§ăĺăăŠăĄăźăżăźăŤĺŻžăăŚăŞăłăăăăă¨ăŻăťă¨ăăŠćĺłăăŞăă¨ćăăžăă
ăăăăŁăŚăăăŞăăŻăăŽă˘ăăŹăšăĺăăă¨ăă§ăăžăă
署ĺăăć¨ć¸Źăăăă¨ă§ĺŻč˝ă§ăă
ăăăăč°čŤăŽä˝ç˝ŽăŤç˝Žăăă¨ăŽćĺłăŻä˝ă§ăăďź
çšć§ăăŚăłăă使ç¨ăăăŽă¨ăžăŁăăĺăă§ăăăăăä˝ăăăăžăăă
fn foo(x: impl Debug)
ă¨ăžăŁăăĺăăăŽă§ă
fn foo<A>(x: A) where A: Debug
fn foo<A: Debug>(x: A)
ăžăăăăăčć ŽăăŚăă ăăďź
fn foo<A>(x: A) -> A where A: Debug
ĺźć°ăŽä˝ç˝ŽăŤăăimpl Trait
ăŻăĺżĺĺăăăŚăăăăăăăăčĄăăă¨ăŻă§ăăžăăă ăăŽăăăŞçśćłăŤĺŻžĺŚăăăăăŤĺż
čŚăŞăăŽăŻăăšăŚăă§ăŤćăŁăŚăăăăăăăăŻăăŞă彚ăŤçŤăăŞăćŠč˝ă§ăă ăťă¨ăăŠăŽäşşăĺĺ¤ć°/ăăłăăŹăźăăăŠăĄăźăżăçĽăŁăŚăăăRustăŻăăŽimpl Trait
ć§ćă使ç¨ăăĺä¸ăŽč¨čŞă§ăăăăăäşşă
ăŻăăŽć°ćŠč˝ăç°ĄĺăŤĺŚăśăă¨ăŻă§ăăžăăă ăăŽăăăĺ¤ăăŽäşşăăć°ăăĺż
čŚăŞăťăăłăăŁăŻăšďźă¤ăžăăĺźăłĺşăĺ
ăé¸ćăăăżă¤ăďźăĺ°ĺ
Ľăăăăăćťăĺ¤/ letăă¤ăłăăŁăłă°ăŤă¨ăŠăžăĺż
čŚăăăă¨ä¸ćşăćźăăăŚăăžăă
ç°ĄĺăŤč¨ăă¨ă @ iopq ďźăăăŻĺż čŚăăăžăăă ăé常ăŤçšćŽăŞç¨éăă¤ăžăĺżĺĺĺ¤ć°ăŤĺŻžĺżăăŚăăăăăĺŽéăŤăŻčŞ°ăĺż čŚă¨ăăŞăĺĽăŽć§ćçłčĄŁć§ćăčż˝ĺ ăăžăăăă䝼ĺ¤ăŽćĺł
ăžăăç§ăč¨ăĺżăăăă¨ăăăăžăăăăăŻăé˘ć°ăăŠăŽăăăŤăăŠăĄăźăżăźĺ/ĺ形ĺăăăŚăăăă確čŞăăăŽăé常ăŤéŁăăăăžăă
@Verneré¨ĺçăŞăżăźăăăŁăăˇăĽă§ăŻăĺç´ăăčŞăżăăăăć確ăăŽăăăŤăăăăŤĺŻžăăŚăŞăłăăăăă¨ăŻé常ăŤçăŤăăŞăŁăŚăăžăă ă¨ăŻăăăç§ăŻĺŽéăŤăŻargăŽä˝ç˝ŽăŤăăćŠč˝ăćĺăăćăŁăŚăăăăă§ăŻăăăžăăă
-> impl Trait
ă§ĺźăłĺşăĺ
ăăżă¤ăăé¸ćăă x: impl Trait
ă§ĺźăłĺşăĺ
ăăżă¤ăăé¸ćăăĺ ´ĺăăŠăŽăăăŤä¸č˛Ťć§ăăăăžăăďź
ç§ăŻăăăćŠč˝ăăäťăŽćšćłăăŞăăă¨ăç解ăăŚăăžăăăăăăŻăä¸č˛Ťć§ăăăăăăăŤăŻčŚăăžăăăăăăŻä¸č˛Ťć§ăŽĺ寞ăŽăăă§ă
ç§ăŻăăăăä¸č˛Ťć§ăé¤ăăŚăăšăŚă§ăăăäşşă ă桡䚹ăăć°ĺč ă ăă§ăŞăăéŤĺşŚăŞç硴ăăăăłç č ăŤăŞăăă¨ăŤăćŹĺ˝ăŤĺćăăžăă
ăăŽăšăŹăăă§ĺ訴č¨ăăăŚăă質ĺă解湺ăăăăăŤă2ă¤ăŽRFCăăăă2嚴䝼ä¸ĺăăĺč¨600čżăăŽăłăĄăłăăĺăĺăăžăăă
impl Trait
"ďźimpl Trait
ć§ćă¨ăăŠăĄăźăżăźăŽăšăłăźăăĺŽćăăăĺźć°ăŤĺąéăă"ďźďźăăăăŽč°čŤăčŞăă¨ăç§ăćĺăŻ2ă¤ăŽăăźăŻăźăăŽă˘ăăăźăă埡ăćŻćăăŚăăăă¨ăăăăăžăăäťă§ăŻă1ă¤ăŽăăźăŻăźăă使ç¨ăăăă¨ăćŁăăă˘ăăăźăă ă¨ćăăžăăďź
2ĺš´ă¨ć°çžăŽăłăĄăłăăŽĺžăćąşĺŽăä¸ăăăćŠč˝ăŻĺŽĺŽăăžăăă ăăăŻăăŽćŠč˝ăŽčż˝čˇĄăŽĺéĄă§ăăă impl Trait
ăŽăžă ä¸ĺŽĺŽăŞăŚăźăšăąăźăšă追补ăăăăăŤéăăăŚăăžăă impl Trait
ăŽč§Łćąşć¸ăżăŽĺ´é˘ăĺ訴č¨ăăăă¨ăŻăăăŽčż˝čˇĄăŽĺéĄăŽăăăăŻăăĺ¤ăăŚăăžăă ăăăŤă¤ăăŚĺźăçśă芹ăĺăăă¨ăćčżăăžăăă課éĄčż˝čˇĄăˇăšăă ă§ăŻä˝żç¨ăăŞăă§ăă ăăă
impl Trait
ăçšć§ăŽfnsăŽĺźć°ăŽä˝ç˝Žă§ăľăăźăăĺžăŚăăŞăĺ ´ĺăăŠăŽăăăŤĺŽĺŽăăžăăăďź
@alexregăľăăźăăăăŚăăžă...ďź https://play.rust-lang.org/?gist=47b1c3a3bf61f33d4acb3634e5a68388&version=stable
@daboross揥ăŤăĺ ăŽć稿ăŽăă§ăăŻăăăŻăšă
ďźhttps://play.rust-lang.org/?gist=47b1c3a3bf61f33d4acb3634e5a68388&version=stableăçžĺ¨ćŠč˝ăăŚăăăă¨ăçşčŚăăă ăă§ăďź
https://play.rust-lang.org/?gist=c29e80715ac161c6dc95f96a7f91aa8c&version=stable&mode=debugăďźăžă ďźćŠč˝ăăŞăăŽăŻĺĽĺŚă ă¨ćăăžăăăăăŤăăăŽă¨ăŠăźăĄăăťăźă¸ă襨示ăăăžăă ăăŽăăăŤčăăăŽăŻç§ă ăă§ăăďź ăăŹă¤ăăŽăŞăżăźăłä˝ç˝ŽăŤimpl Trait
ăă§ăăŻăăăŻăšăčż˝ĺ ăăĺż
čŚăăăăăăăăžăăăăăăăŻăăăŹă¤ăé˘ć°ăŽĺźć°ä˝ç˝ŽăŤimpl Trait
ăŽăżă訹ĺŻăă existential type
使ç¨ă埡ĺśăăăă¨ăćčçăŤćąşĺŽăăăŽă§ăăăăăăŞăżăźăłăżă¤ăăŽ
@Ekleog
ăăŹă¤ăé˘ć°ăŽĺźć°ä˝ç˝Žă§implTraităŽăżă訹ĺŻăăćťăĺăŤĺŽĺĺăŽä˝żç¨ă埡ĺśăăăă¨ăŻăćčçăŞćąşĺŽă§ăăăďź
ăŻă-ăăŹă¤ăăŽĺĺ¨ĺă使ç¨ăăăăĺŽéçăŞçľé¨ăă§ăăăžă§ăăăŹă¤ăăŽăŞăżăźăłä˝ç˝Žimpl Trait
ăŻĺťśćăăăžăăă
@cramertjç§ăăĄăŻăžă ăăăĺŽčŁ ăăăŽăŤĺĺăŞĺŽčˇľçăŞçľé¨ăćăŁăŚăă掾éăŤăăăžăăďź
ćŠč˝ăčż˝ĺ ăăĺăŤăăăă¤ăăŽĺŽĺŽăăăŞăŞăźăšă§implTraită確čŞăăăă¨ćăăžăă
@ mark-imĺäşşçăŤăŻăăăŹă¤ăăĄă˝ăăăŽreturn-position impl Trait
ăŤă¤ăăŚăăŞă˘ăźăă§çŠč°ăé¸ăăŚăăăăŽăăăăăžăă...ä˝ăăčśłăăŞăăŽăăăăăžăăă
çŠč°ăé¸ăă¨ăŻćăăŞăă ćŠč˝ăŽčż˝ĺ ăéăăăăăăŤćăăžăă ăă°ăăăŽéăćčĄçč˛ ĺľăć˘ăăŚéä¸ăăćĺăŤçžĺ¨ăŽćŠč˝ăťăăăä˝é¨ăăŚăżăă¨ăăă§ăăăă
ăăă§ăăă ç§ăŻăăăć°ăăćŠč˝ăăăć˘ĺăŽćŠč˝ăŽćŹ ăăŚăăé¨ĺă ă¨ćăŁăŚăăă¨ćăăžăă
@alexregăŻćŁăăă¨ćăăžăăăăŹă¤ăăŽăĄă˝ăăă§ăĺŽĺçăŞimpl Trait
ă使ç¨ăăăŽăŻé常ăŤé
ĺçă§ăă ăăăŻĺŽéăŤăŻć°ăăćŠč˝ă§ăŻăăăžăăăăĺŽčŁ
ăăĺăŤĺŻžĺŚăăšăăă¨ăăăă¤ăăăă¨ćăăžăăďź
@phaazonăăăăăăăă§ă...ĺŽčŁ ăŽčŠłç´°ăăçžĺ¨ăă§ăŤăăăăŽă¨ăŠăŽç¨ĺşŚç°ăŞăăăŻăăăăžăăăă誰ăăăłăĄăłăăăĺŻč˝ć§ăăăăžăă let / constăă¤ăłăăŁăłă°ăŽĺŽĺĺăčŚăăăŽă§ăăăăăăčś ăăćŠč˝ă¨ăăŚééăăŞăĺăĺ Ľăăăă¨ăă§ăăăŽă§ăéĺ§ăăĺăŤăă1ăľă¤ăŻăŤăťăŠĺž ăĄăžăă
çšć§ăŽćŽéçăŞimplçšć§ăćăăăă¨ăă§ăăăăŠăăçĺăŤćăăžă...
ăăăăăăăç§ăŻăăŞăăŽä¸ťĺźľăç解ăăŚăăă¨ćăăžăă
@ mark-imăăăăă§ăăžăăăăă§ăŤĺŽĺŽăăŚăăžăă
ăăăăŻé˘ć°ĺ ăŤăăăžăăăăăŹă¤ă厣č¨ăŻăŠăă§ăăďź
@ mark-imăŻăăšăăăăă示ăăăăŤăimplsă¨trait厣č¨ăŽä¸Ąćšă§ĺŽĺŽăăŚăăžăă
abstract type
č˝ăĄçăă¨ăăăŤčż˝ăă¤ăăăăŤăăă éŁăłčžźăă§ăă ăăă ĺäşşçăŤăŻă @ CentrilăćčżććĄăăć§ćă¨ăăšăăăŠăŻăăŁăšăŤăăŞăĺĺ ăăŚăăžăă
// GOOD:
type Foo: Iterator<Item: Display>;
type Bar = (impl Display, impl Debug);
// BAD
type Foo = impl Iterator<Item = impl Display>;
type Bar0: Display;
type Bar1: Debug;
type Bar = (Bar0, Bar1);
ăăăŻç§ăŽăłăźăăŤéŠç¨ăăă揥ăŽăăăŤăŞăăžăă
// Concrete type with a generic body
struct Data<TBody> {
ts: Timestamp,
body: TBody,
}
// A name for an inferred iterator
type IterData = Data<impl Read>;
type Iter: Iterator<Item = IterData>;
// A function that gives us an iterator. Also takes some arbitrary range
fn iter(&self, range: impl RangeBounds<Timestamp>) -> Result<Iter, Error> { ... }
// A struct that holds on to that iterator
struct HoldsIter {
iter: Iter,
}
type Bar = (impl Display,);
ăčŻăăŽăŻç§ăŤăŻćĺłăăăăžăăăă type Bar = impl Display;
ăŻćŞăă§ăăăă
ăăžăăžăŞäťŁćżăŽĺŽĺĺć§ćďźăăšăŚrfc 2071ă¨ăŻç°ăŞăăžăăďźďźăćąşĺŽăăĺ ´ĺă httpsďź//users.rust-lang.org/ăŽăăŠăźăŠă ăšăŹăăăăăăčĄăăŽăŤéŠăăĺ ´ćă§ăăăăďź
ç§ăŻäťăăŽăăăŞăšăŹăăăéĺ§ăăăăăŽäťŁćżćĄăĺĺăŤç解ăăŚăăžăăăăĺŽĺçăŞăżă¤ăăŻăžă ĺŽčŁ ăăăŚăăŞăăŽă§ăăăŠăźăŠă ă§ăŽč°čŤă¨ăăŽĺžăŽć°ăăRFCăŻă追补ăŽĺéĄă§ăăăŤă¤ăăŚčŠąăăăăăăăăčŻăă¨ćăăžăă
type Foo = impl Trait
ä˝ăĺéĄăŤăŞăŁăŚăăžăăďź
@daborossăăăă䝣ăăăŤĺ é¨ăăŠăźăŠă ă ć§ćăĺŽćăăăăăăŤăRFCăä˝ćăăăă¨ăć¤č¨ăăŚăăžăă
@daborossăăŽăšăŹăăăŽć§ćăŤă¤ăăŚăŻăăă§ăŤĺĺăŞč°čŤăăăăžăă @CentrilăăăŽćçšă§RFCăä˝ćă§ăăă°ă
çšć§ăŽĺĺ¨ăŤă¤ăăŚč°čŤăăăăăŤăľăăšăŻăŠă¤ăă§ăăĺéĄăŻăăăžăăďź
ăăăăăŽć§ćăŤăăŻăé˘éŁăŽĺźć°ăŻăăăžăăďź
@tomakaćĺăŽăąăźăšă§ăŻă type Foo = (impl Display,)
ăĺŽéăŤä˝żç¨ă§ăăĺŻä¸ăŽć§ćă§ăă 䝼ä¸ăŽăăăŽç§ăŽĺĽ˝ăżtype Foo: Trait
䝼ä¸type Foo = impl Trait
ăĄăăăŠç§ăăĄăŻĺăăăăŤăç§ăăĄăŻĺĺăäťăăăă¨ăă§ăăžăăżă¤ăăçľĺăăŚăăă¨ăăäşĺŽăăćĽăŚăă<TFoo: Trait>
ăžăăŻwhere TFoo: Trait
ćă¤ăŽăŤĺŻžăă impl Trait
ăżă¤ăăŤĺĺăäťăăăă¨ăŻă§ăăžăăă
ć確ăŤăăăăăŤăç§ăŻtype Foo = impl Bar
ăćŞăă¨č¨ăŁăŚăăăŽă§ăŻăŞăă @ KodrAusăŽĺćŠăăăŁăŚăĺç´ăŞăąăźăšă§ăŻtype Foo: Bar
ćšă
ĺžč ăŻăFooĺăŻBarăćşăăăă¨čŞăżăĺč ăŻăFooĺăŻBarăćşăăĺă¨çăăăă¨čŞăżăžăăă ăăăăŁăŚăĺč ăŻăç§ăŽčŚč§Łă§ăŻăćĄĺźľçăŞčŚłçšăăăăç´ćĽçă§čŞçśă§ăďźăFooă§ă§ăăăă¨ăďźă ĺžč ăç解ăăăŤăŻăăżă¤ăăŽĺĺ¨č¨ĺˇăăă桹ăç解ăăĺż čŚăăăăžăă
type Foo: Bar
ăé常ăŤĺŞăăŚăăžăăăăăŻăăăŹă¤ăăŽé˘éŁăăĺăŽĺ˘çă¨ăăŚä˝żç¨ăăăć§ćă§ăăĺ ´ĺăăăŹă¤ăăŽĺŽŁč¨ăimplăŤăłăăźăăă ăă§ăç°ĄĺăŤćŠč˝ăăăăă§ăďźĺ
ŹéăăăăăšăŚăŽć
ĺ ą..ďźă
çšăŤăé˘éŁäťăăăăĺăŽĺ˘çăĺŤăžăăŚăăĺ ´ĺăăé˘éŁäťăăăăŚăăĺăĺ¤ć°ăăĺ ´ĺăŻăć§ćăç°Ąć˝ăŤăŞăăžăă ăăăŤăăăăă¤ăşăć¸ĺ°ăăčŞăżăăăăĺä¸ăăžăă
@KodrAus
ăăăăŽĺĺŽçžŠăŽčŞăżćšăŻćŹĄăŽă¨ăăă§ăă
type Foo: Trait
ăŻăă Foo
ăŻTrait
ĺŽčŁ
ăăăżă¤ăă§ăăăćĺłăăžătype Foo = impl Trait
ăŻăă Foo
ăŻă Trait
ĺŽčŁ
ăăăă税ăŽă¨ă¤ăŞă˘ăšă§ăăă¨ăăćĺłă§ăăç§ăŤăŻă Foo: Trait
ĺç´ăŤĺśç´ă厣č¨ăăFoo
ĺŽčŁ
Trait
ă ăăćĺłă§ă type Foo: Trait
ăŻä¸ĺŽĺ
¨Foo
ăŽĺŽéăŽĺŽçžŠăăăăžăăă
ä¸ćšă impl Trait
ăŻăăăăăŻĺä¸ăŽĺă§ăăăăłăłăă¤ăŠăźăŻăăŽĺĺăç解ăăžăăă¨ăăăă¨ăćă辡ăăăăžăă ăăăăŁăŚă type Foo = impl Trait
ăŻăďź Trait
ăĺŽčŁ
ăăďźĺ
ˇčąĄĺăăă§ăŤăăăă¨ăćĺłăăžăăăăŽăăĄăŽFoo
ăŻĺăŞăă¨ă¤ăŞă˘ăšă§ăă
type Foo = impl Trait
ăŻăćŁăăćĺłăăăć確ăŤäźăăŚăăă¨ćăăžăă Foo
ăŻă Trait
ĺŽčŁ
ăăăă税ăŽă¨ă¤ăŞă˘ăšă§ăă
@stjepang
type Foo: Trait
ăŻăăFooăŻTraităĺŽčŁ ăăăżă¤ăăăćĺłăăžă
[..]
ăăćĺłă§ătype Foo: Trait
ăŻä¸ĺŽĺ ¨ă ă¨ćăăŚăăžăă
ăăăŻç§ăăăăčŞăćšćłă§ăďźă˘ă¸ăĽăăăŹăźă¸ăłă°...ďźăăăăŚăăăŻćĄĺźľçăŤćŁăă解éă§ăă ăăăŻă Foo
ďźĺăćäžăăĺ°ďźă§ä˝ăă§ăăăăŤă¤ăăŚăăšăŚăčŞăŁăŚ
ä¸ćšă
impl Trait
ăŻăăăăăŻĺä¸ăŽĺă§ăăăăłăłăă¤ăŠăźăăŽăŁăăăĺăăăăă¨ăĺ辡ăăžăă ăăăăŁăŚătype Foo = impl Trait
ăŻăĺ ˇä˝çăŞĺďźTrait
ăĺŽčŁ ăăďźăăă§ăŤăăăă¨ăćĺłăăžăăăăŽăăĄăŽFoo
ăŻă¨ă¤ăŞă˘ăšă§ăăăăłăłăă¤ăŠăŻăăăĺŽéăŤăŠăŽĺă§ăăăăĺ¤ćăăžăă
ăăăŻăćĄĺźľăŽčŚłçšăăĺéˇăŞčĄ¨çžăŤé˘äżăăăăă芳細ă§ĺ ĺ çăŞč§Łéă§ăă ăăăăăăăŻĺ ĺ çăŞćĺłă§ăăĺŽĺ ¨ă§ăă
@Centril
čŞč ăçšăŤĺĺżč ăŽčŚłçšăăăŻăćĄĺźľć§ăŽćšăéčŚă ă¨ćăăžăă
ăăăŻăćĄĺźľăŽčŚłçšăăĺéˇăŞčĄ¨çžăŤé˘äżăăăăă芳細ă§ĺ ĺ çăŞč§Łéă§ăă
ĺ¤ĺťśă¨ĺ
ĺ
ăŽäşĺćłăŻčĺłćˇąăă§ă-ç§ăŻăăăžă§ăăŽăăăŤimpl Trait
čăăăă¨ăăăăžăăă
ăăă§ăăç§ăŻçľčŤăŤă¤ăăŚç°ăŞăăăăŤé źăżăžăă FWIWăç§ăŻHaskellă¨Scalaă§ĺĺ¨ĺăç解ăăăă¨ăă§ăăŞăăŁăăŽă§ăç§ăĺĺżč
ă¨ăăŚć°ăăžăă :) RustăŽimpl Trait
ăŻăĺćĽăăé常ăŤç´ćçăŤćăăăăžăăăăăăŻăăăăăĺă§ĺŽčĄă§ăăăă¨ă§ăŻăŞăăĺśéăăăă¨ă¤ăŞă˘ăšă¨čăăŚăăăăă§ăă ăăăăŁăŚă Foo
ăä˝ă§ăăăăçĽăăă¨ă¨ăăăă§ä˝ăă§ăăăăçĽăăă¨ăŽéă§ăç§ăŻĺč
ăé¸ăłăžăă
ă§ăăç§ăŽ2că ăă§ăă äťăŽäşşăŻimpl Trait
ç°ăŞăăĄăłăżăŤă˘ăăŤăćăŁăŚăăăăăăăžăăă
ç§ăŻăăŽăłăĄăłăăŤĺŽĺ
¨ăŤĺćăăžăďź type Foo: Trait
ăŻä¸ĺŽĺ
¨ă ă¨ćăăŚăăžăă ăžăă type Foo = impl Trait
ăŻăäťăŽĺ ´ćă§ăŽimpl Trait
使ç¨ăŤäźźăŚăăă¨ćăăžăăăăăŤăăăč¨čŞăŽä¸č˛Ťć§ă¨č¨ćśĺăéŤăžăăžăă
@joshtriplettä¸č˛Ťć§ăŽč°čŤăŽéĺ§ăŤă¤ăăŚăŻă httpsďź //github.com/rust-lang/rust/issues/34511#issuecomment-387238653ăĺç
§ăăŚtype Foo: Trait
ă訹ĺŻăăă¨ă httpsďź//github.com/rust-lang/rfcs/pull/2289ă¨çšăŤăăžăéŠĺătype Foo: Iterator<Item: Display>;
ăŻăçŠäşăăăĄăă¨ĺä¸ăŤăăžăă
@stjepang type Foo: Bar;
ăŽćĄĺźľçăŞčŚçšă§ăŻăĺçčŤăŤăăăĺĺ¨č¨ĺˇăç解ăăĺż
čŚăŻăăăžăăă ćŹĺ˝ăŤç解ăăĺż
čŚăăăăŽăŻă Foo
使ç¨ăăă¨ă Bar
ă§ćäžăăăăăšăŚăŽćä˝ăĺŽčĄă§ăăă¨ăăăă¨ă ăă§ăă Foo
ăŽčŚłçšăăăăă¨ăăăă ăă§ăčĺłćˇąăăă¨ă§ăă
@Centril
ç§ăŻăăŞăăăŠăăăćĽăŚăăăŽăăăăăŚType: Trait
ć§ćăă§ăăă ăĺ¤ăăŽĺ ´ćăŤăăăˇăĽăăăă¨ăŽé
ĺăç解ăăă¨äżĄăăŚăăžăă
:
ătype-implements-traitĺ˘çăŤä˝żç¨ăăă =
ăĺĺŽçžŠă¨type-equals-another-typeĺ˘çăŤä˝żç¨ăăăă¨ăă埡ăćĺłĺăăăăăžăă
ăăăŻăăŞăăŽRFCă§ăćăăă ă¨ćăăžăă ăă¨ăă°ă揥ăŽ2ă¤ăŽăżă¤ăăŽĺ˘çăčăăžăă
Foo: Iterator<Item: Bar>
Foo: Iterator<Item = impl Bar>
ćçľçăŤăăăăŽ2ă¤ăŽĺ˘çăŻĺăĺšćăćăĄăžăăăďźç§ăŻďźĺžŽĺŚăŤç°ăŞăăžăă ĺč
ăŻă Item
ăŻăăŹă¤ăBar
ĺŽčŁ
ăăĺż
čŚăăăăžăăă¨č¨ăăĺžč
ăŻă Item
ăŻBar
ĺŽčŁ
ăăăăăżă¤ăă¨çăăăŞăăă°ăŞăăŞăăă¨č¨ăăžăă
ĺĽăŽäžă使ç¨ăăŚăăăŽă˘ă¤ăă˘ă誏ćăăŚăżăžăăăă
trait Person {
type Name: Into<String>; // Just a type bound, not a definition!
// ...
}
struct Alice;
impl Person for Alice {
type Name = impl Into<String>; // A concrete type definition.
// ...
}
ă§ăŻă Person
ăĺŽčŁ
ăăĺŽĺĺăăŠăŽăăăŤĺŽçžŠăăĺż
čŚăăăăžăăďź
type Someone: Person
ăăăăŻăżă¤ăăăŚăłăăŽăăăŤčŚăăžăătype Someone = impl Person
ăăăăŻĺĺŽçžŠăŽăăăŤčŚăăžăă@stjepangĺĺ˘çăŽăăăŤčŚăăăă¨ăŻćŞăăă¨ă§ăŻăăăžăă:)揥ăŽăăăŤPerson for Alice
ĺŽčŁ
ă§ăăžăďź
struct Alice;
trait Person { type Name: Into<String>; ... }
impl Person for Alice { type Name: Into<String>; ... }
ăťăďź ăăŹă¤ăă¨implăŽä¸ĄćšăŽ{ .. }
ĺ
ăŽăăŽăŻĺăă§ăăă¤ăžăă Name
ăŤé˘ăăéăăăăŹă¤ăăăăăăšăăăăŽăžăžăłăăźă§ăăžăă
é˘éŁäťăăăăĺăŻĺăŹăăŤăŽé˘ć°ďźćĺăŽĺźć°ăŻSelf
ďźă§ăăăăăĺă¨ă¤ăŞă˘ăšăŻ0ă˘ăŞăăŁăŤé˘éŁäťăăăăĺă¨čŚăŞăăă¨ăă§ăăăăăĺĽĺŚăŞăă¨ăŻä˝ă辡ăăăžăăă
ćçľçăŤăăăăŽ2ă¤ăŽĺ˘çăŻĺăĺšćăćăĄăžăăăďźç§ăŻďźĺžŽĺŚăŤç°ăŞăăžăă ĺč ăŻăă˘ă¤ăă ăŻăăŹă¤ăăăźăĺŽčŁ ăăĺż čŚăăăăžăăă¨č¨ăăĺžč ăŻăă˘ă¤ăă ăŻăăźăĺŽčŁ ăăăăăżă¤ăă¨çăăăŞăăă°ăŞăăŞăăă¨č¨ăăžăă
ăă; ç§ăŻćĺăŽč¨ăĺăăăăç確ă§čŞçśă ă¨ćăăžăă :)
@CentrilHeh ă ăăăŻăć˝čąĄĺăĺ°ĺ
ĽăăăŤăŻtype Thing;
ă ăă§ĺĺă§ăăăă¨ăćĺłăăžăăďź
trait Neg { type Output; fn neg(self) -> Self::Output; }
impl Neg for MyType { type Output; fn neg(self) -> Self::Output { self } }
@kennytmćčĄçăŤăŻĺŻč˝ă ă¨ćăăžăă ăăăăćéťç/ć示çăŤă¤ăăŚăŽčăăŤĺżăăŚăăăăćăžăăăăŠăăăĺ°ăăăă¨ăă§ăăžăă ăăŽçšĺŽăŽăąăźăšă§ăŻă揥ăŽăăăŤć¸ăă ăă§ćčĄçăŤĺĺă ă¨ćăăžăă
trait Neg { type Output; fn neg(self) -> Self::Output; }
impl Neg for MyType { fn neg(self) -> Self::Output { self } }
ăăăŚăłăłăă¤ăŠăźăŻăăŞăăŽăăăŤtype Output: Sized;
ăć¨ć¸Źăăăă¨ăă§ăăžăďźăăăŻăăŞăăŤć
ĺ ąăä¸ăăŞăé常ăŤčĺłăŽăŞăĺ˘çă§ăďźă ăăăŻăăŁă¨čĺłćˇąăçŻĺ˛ăć¤č¨ăăăăăŽăăŽă§ăăăăăă°ăŠăăźăŽć ć°ăŽăăăŤăĺ
ˇä˝çăŞăżă¤ăăé常ăŤĺç´ăŞĺ ´ĺă§ăăä˝ă˘ăăŠăźăăłăšAPIăäżé˛ăăĺŻč˝ć§ăăăăăăćĺăŽććĄăŤăŻĺŤăžăăžăă:)ăŠăĄăătype Output;
ăŻăăăžăă
ăăăăăšăŚčŞăă ĺžăç§ăŻ@CentrilăŤăăŁă¨ĺćăăĺžĺăăăă¨ćăăžăă type Foo = impl Bar
ăčŚăă¨ăäťăŽă¨ă¤ăŞă˘ăšă¨ĺć§ăŤă Foo
ăŻçšĺŽăŽăżă¤ăă§ăăă¨ćăĺžĺăăăăžăă ăăă§ăŻăăăžăăă ăăŽäžăčăăŚăżăžăăăă
type Displayable = impl Display;
fn foo() -> Displayable { "hi" }
fn bar() -> Displayable { 42 }
ç§čŚă§ăŻăDisplayableăŽĺŽŁč¨ă§=ăčŚăăŽăŻĺ°ăĺĽĺŚă§ăăăfooă¨barăŽćťăĺăçăăăăăžăăďźă¤ăžăăăăăŻäťăŽĺ ´ćă¨ăŻç°ăŞăăć¨ç§ťçă§ăŻăăăžăăďźă ĺéĄăŻăFooăçšĺŽăŽăżă¤ăăŽă¨ă¤ăŞă˘ăšă§ăŻăŞăăăăă¤ăăŽçšć§ăć示ăăŚăăăă¨ă§ăă č¨ăćăăă¨ă使ç¨ăăăăłăłăăăšăăŤé˘äżăŞăĺä¸ăŽăżă¤ăă§ăăăäžăŽăăăŤăăăŽăżă¤ăăŻç¨éăŤăăŁăŚç°ăŞăĺ ´ĺăăăăžăă
type Foo: Bar
ăŻăä¸ĺŽĺ
¨ăă ă¨ćăăäşşăăăžăă ç§ăŤă¨ăŁăŚăăăŻčŻăăă¨ă§ăă ăăćĺłă§Foo
ăŻä¸ĺŽĺ
¨ă§ăă ăăăä˝ă§ăăăăŻăăăăžăăăă Bar
ćşăăăă¨ăŻăăăŁăŚăăžăă
@ mark-im
ĺéĄăŻăFooăçšĺŽăŽăżă¤ăăŽă¨ă¤ăŞă˘ăšă§ăŻăŞăă¨ăăăă¨ă§ăă č¨ăćăăă¨ă使ç¨ăăăăłăłăăăšăăŤé˘äżăŞăĺä¸ăŽăżă¤ăă§ăăăäžăŽăăăŤăăăŽăżă¤ăăŻç¨éăŤăăŁăŚç°ăŞăĺ ´ĺăăăăžăă
ăăăźăăăăŻćŹĺ˝ăŤćŹĺ˝ă§ăăďź ăăăŻç˘şăăŤç§ăŤăŻé常ăŤćˇˇäšąăăă§ăăăă
Displayable
ăĺä¸ăŽĺ
ˇčąĄĺă§ăŻăŞăimpl Display
ççĽĺ˝˘ăŤăŞăççąăŻăăăžăăďź ăăŹă¤ăă¨ă¤ăŞă˘ăšďźčż˝čˇĄăŽĺéĄďźhttpsďź//github.com/rust-lang/rust/issues/41517ďźăĺć§ăŽćšćłă§ä˝żç¨ă§ăăăă¨ăčăăă¨ăăăŽăăăŞĺä˝ăŻăăăŤĺ˝šçŤăĄăžăăďź äžďź
trait Displayable = Display;
fn foo() -> impl Displayable { "hi" }
fn bar() -> impl Displayable { 42 }
@ mark-im
type Displayable = impl Display;
fn foo() -> Displayable { "hi" }
fn bar() -> Displayable { 42 }
ăăăŻćĺšăŞäžă§ăŻăăăžăăă RFC 2071ăŽĺŽĺĺăŤé˘ăăĺç §ăťăŻăˇă§ăłăăďź
existential type Foo = impl Debug;
Foo
ăŻăă˘ă¸ăĽăźăŤĺ ¨ä˝ăŽč¤ć°ăŽĺ ´ćă§i32
ă¨ăăŚä˝żç¨ă§ăăžăă ăă ăăFoo
ăi32
Foo
ă¨ăăŚä˝żç¨ăăĺé˘ć°ăŻăi32
ă§ăăĺż čŚăăăăăăŤăFoo
ĺĺĽăŤĺśç´ă課ăĺż čŚăăăăžăăĺĺŽĺĺ厣č¨ăŻăĺ°ăŞăă¨ă1ă¤ăŽé˘ć°ćŹä˝ăžăăŻconst / staticĺćĺĺăŤăăŁăŚĺśç´ăăăĺż čŚăăăăžăă ćŹä˝ăžăăŻĺćĺĺăŻăçšĺŽăŽĺŽĺĺăŤĺŽĺ ¨ăŤĺśç´ăăăăĺśç´ă課ăăŞăĺż čŚăăăăžăă
ç´ćĽč¨ĺăăăŚăăžăăăăRFCăŽćŽăăŽé¨ĺăćŠč˝ăăăăăŤĺż čŚăŞăŽăŻăĺŽĺĺăŽăšăłăźăĺ ăŽ2ă¤ăŽé˘ć°ăăăăŽĺŽĺĺăŽç°ăŞăĺ ˇčąĄĺăĺ¤ĺĽă§ăăŞăăă¨ă§ăă ăăăŻăä˝ăăăŽĺ˝˘ĺźăŽçŤśĺăăăżă¤ăă¨ăŠăźăŤăŞăăžăă
ç§ăŽăăăŞăăŽăä¸ăăă ăăăăŞăăŽäžăć¨ć¸Źexpected type `&'static str` but found type `i32`
ăŽăŞăżăźăłăŤbar
ă䝼ćĽfoo
ăă§ăŤăŽĺ
ˇä˝çăŞăżă¤ăăŤč¨ĺŽăăŚăăă§ăăăDisplayable
ăă&'static str
ă
硨éďźăăŞăăăăŽç´ćăăăăăŤćĽăŚăăŞăéă
type Displayable = impl Display;
fn foo() -> Displayable { "hi" }
fn bar() -> Displayable { 42 }
ă¨ĺçă§ă
fn foo() -> impl Display { "hi" }
fn bar() -> impl Display { 42 }
ç§ăŽćĺž ă§ăŻăŞă
existential type _0 = impl Display;
type Displayable = _0;
fn foo() -> Displayable { "hi" }
fn bar() -> Displayable { 42 }
ăăăăŽ2ă¤ăŽč§ŁéăŽăŠăĄăăćŁăăăăŻă @ Centrilăć¸ăčžźăă§ăăRFCăŤäžĺăăĺŻč˝ć§ăăăă¨
ĺéĄăŻăFooăçšĺŽăŽăżă¤ăăŽă¨ă¤ăŞă˘ăšă§ăŻăŞăă¨ăăăă¨ă§ăă
ăăăăŽ2ă¤ăŽč§ŁéăŽăŠăĄăăćŁăăăăŻă @ Centrilăć¸ăčžźăă§ăăRFCăŤäžĺăăĺŻč˝ć§ăăăă¨
type Displayable = impl Display;
ăĺĺ¨ăăççąăŻăăăăçšĺŽăŽăżă¤ăăŽă¨ă¤ăŞă˘ăšă§ăăăăă§ăă
https://github.com/rust-lang/rfcs/issues/1738ăĺç
§ăăŚ
@ Nemo157ăăŞăăŽćĺž ăŻćŁăăă§ăă :)
䝼ä¸ďź
type Foo = (impl Bar, impl Bar);
type Baz = impl Bar;
čąçłăăăžăďź
/* existential */ type _0: Bar;
/* existential */ type _1: Bar;
type Foo = (_0, _1);
/* existential */ type _2: Bar;
type Baz = _2;
ăăă§ă _0
ă _1
ăăăăł_2
ăŻăăšăŚĺçŽä¸ç°ăŞăăżă¤ăă§ăăăăă Id<_0, _1>
ă Id<_0, _2>
ă Id<_1, _2>
ďźăăăłĺŻžç§°ă¤ăłăšăżăłăšďźăŻăăšăŚçĄäşşă§ăăă Id
ăŻreflă§ĺŽçžŠăăăŚă
ĺ 貏äşé ďźç§ăŻďźĺăă§ďźRFCăčŞăă§ăăžăăďźăăăăăăä˝ă§ăăăăçĽăŁăŚăăžăďźăŽă§ăć§ćă§ăç´ćçăă¨ćăăăăŽăŤă¤ăăŚăłăĄăłăăăăă¨ăă§ăăžăă
type Foo: Trait
ć§ćăŽĺ ´ĺă揥ăŽăăăŞăă¨ăĺŻč˝ă§ăăă¨ĺŽĺ
¨ăŤćĺž
ăăžăă
trait Trait {
type Foo: Display;
type Foo: Debug;
}
where Foo: Display, Foo: Debug
ă¨ĺăćšćłă§çžĺ¨ĺŻč˝ă§ăă
ć§ćă訹ĺŻăăăŚăăŞăĺ ´ĺăŻăć§ćăŽĺéĄă ă¨ćăăžăă
ăăăRustăŽć§ćăĺ¤ăăă°ĺ¤ăăťăŠăăăăĺŚăśăŽăŻéŁăăăŞăă¨ćăăžăă 1ă¤ăŽć§ćăăçżĺžăăăăăĺ ´ĺă§ăă2ă¤ăŽć§ćăĺż čŚă§ăăéăăĺĺżč ăŻćçľçăŤä¸Ąćšăçżĺžăăĺż čŚăăăăć˘ĺăŽăăă¸ă§ăŻăăŤĺĺ ăăĺ ´ĺăŻăăăăăăăćŠăçżĺžăăĺż čŚăăăăžăă
@Ekleog
type Foo: Trait
ć§ćăŽĺ ´ĺă揥ăŽăăăŞăă¨ăĺŻč˝ă§ăăă¨ĺŽĺ ¨ăŤćĺž ăăžăă
ĺŻč˝ă§ăă ăăăăŽăăżă¤ăă¨ă¤ăŞă˘ăšăăŻăé˘éŁäťăăăăăżă¤ăă厣č¨ăăžăďźăżă¤ăă¨ă¤ăŞă˘ăšăŻă0-aryăżă¤ăăŹăăŤé˘ć°ă¨ăăŚč§Łéă§ăăžăăăé˘éŁäťăăăăăżă¤ăăŻ1+ -aryăżă¤ăăŹăăŤé˘ć°ă§ăďźă ăăĄăăă1ă¤ăŽăăŹă¤ăăŤĺăĺĺăŽč¤ć°ăŽăżă¤ăăé˘éŁäťăăăă¨ăŻă§ăăžăăăăăăŻăă˘ă¸ăĽăźăŤă§ĺăĺĺăŽ2ă¤ăŽăżă¤ăă¨ă¤ăŞă˘ăšăĺŽçžŠăăăă¨ăăăăăŞăăŽă§ăă impl
ă§ăŻă type Foo: Bar
ăĺĺ¨č¨ĺˇăŤĺŻžĺżăăžăă
ăăăRustăŽć§ćăĺ¤ăăă°ĺ¤ăăťăŠăăăăĺŚăśăŽăŻéŁăăăŞăă¨ćăăžăă
严ćšăŽć§ćăăă§ăŤä˝żç¨ăăăŚăăžăă type Foo: Bar;
ăŻăçšć§ăŤăăăŚăă§ăŤĺćłă§ăăă Foo: Bar
ă¨ăăŚăŽĺ
¨ç§°č¨ĺˇăŤă¤ăăŚăćĺšă§ăăăăă§ă Foo
ăŻĺĺ¤ć°ă§ăă impl Trait
ăŻăćťăä˝ç˝Žă§ăŽĺĺ¨č¨ĺˇă¨ĺźć°ä˝ç˝Žă§ăŽĺ
¨ç§°č¨ĺˇăŤä˝żç¨ăăăžăă č¨čŞăŽä¸ĄćšăŽăăŠă°ăŽä¸č˛Ťć§ăŽăŽăŁăăă訹ĺŻăăžăă ăžăăăăžăăžăŞăˇăăŞăŞăŤćéŠă§ăăăăă严ćšă使ç¨ăăă¨ă°ăăźăăŤăŤćéŠăŤăŞăăžăă
ăăăŤăĺĺżč
ătype Foo = (impl Bar, impl Baz);
ăĺż
čŚă¨ăăĺŻč˝ć§ăŻăťă¨ăăŠăăăžăăă ăťă¨ăăŠăŽç¨éăŻăăăătype Foo: Bar;
ă§ăă
RFC 2071ăŽĺ
ăŽăăŤăŞăŻă¨ăšăăŤăŻăăăŽč°čŤă§ĺŽĺ
¨ăŤĺ´ä¸ăăăăăăŤčŚăătypeof
ăăźăŻăźăăč¨čźăăăŚăăžăă çžĺ¨ććĄăăăŚăăć§ćăŻăăŞăćéťçă§ăăăăłăłăă¤ăŠăźă¨ăłăźăăčŞăżĺăäşşéăŽä¸Ąćšăĺ
ˇä˝çăŞĺăć¤ç´˘ăăŚăăăă¨ăăăăăžăă
ăăăć示çăŤăăăăŽă§ăăă ă ăă䝣ăăăŤ
type Foo = impl SomeTrait;
fn foo_func() -> Foo { ... }
ç§ăăĄăŻć¸ăă ăă
fn foo_func() -> impl SomeTrait { ... }
type Foo = return_type_of(foo_func);
ďźăă¤ăŻăˇă§ăăăăăreturn_type_ofăŽĺĺă§ďźăăžăăŻ
fn foo_func() -> impl SomeTrait as Foo { ... }
ăăăŻć°ăăăăźăŻăźăăăĺż čŚă¨ăăăimplTraitć§ćăçĽăŁăŚăăäşşăŞă誰ă§ăç°ĄĺăŤç解ă§ăăžăă ĺžč ăŽć§ćăŻç°Ąć˝ă§ăăăšăŚăŽć ĺ ąă1ăćăŤăăăžăă çšć§ăŽĺ ´ĺă揥ăŽăăăŤăŞăăžăă
trait Bar
{
type Assoc: SomeTrait;
fn func() -> Assoc;
}
impl Bar for SomeType
{
type Assoc = return_type_of(Self::func);
fn func() -> Assoc { ... }
}
ăăăăŻ
impl Bar for SomeType
{
fn func() -> impl SomeTrait as Self::Assoc { ... }
}
ăăăăă§ăŤč°čŤăăăŚĺ´ä¸ăăăĺ ´ĺăŻçłă訳ăăăžăăăăç§ăŻăăăčŚă¤ăăăă¨ăă§ăăžăăă§ăăă
@Centril
ĺŻč˝ă§ăă ăăăăŽăăżă¤ăă¨ă¤ăŞă˘ăšăăŻăé˘éŁäťăăăăăżă¤ăă厣č¨ăăžăďźăżă¤ăă¨ă¤ăŞă˘ăšăŻă0-aryăżă¤ăăŹăăŤé˘ć°ă¨ăăŚč§Łéă§ăăžăăăé˘éŁäťăăăăăżă¤ăăŻ1+ -aryăżă¤ăăŹăăŤé˘ć°ă§ăďźă ăăĄăăă1ă¤ăŽăăŹă¤ăăŤĺăĺĺăŽč¤ć°ăŽăżă¤ăăé˘éŁäťăăăă¨ăŻă§ăăžăăăăăăŻăă˘ă¸ăĽăźăŤă§ĺăĺĺăŽ2ă¤ăŽăżă¤ăă¨ă¤ăŞă˘ăšăĺŽçžŠăăăă¨ăăăăăŞăăŽă§ăă ćéťçăŤăFooďźBară¨ĺ Ľĺăăă¨ăĺĺ¨č¨ĺˇăŤă寞ĺżăăžăă
ďźçłă訳ăăăžăăăă impl Trait for Struct
ă§ăŻăŞătrait Trait
ďź
çłă訳ăăăžăăăăăăăăžăăă ç§ăč¨ăăă¨ăăŚăăăŽăŻăç§ăŤă¨ăŁăŚăŻćŹĄăŽăăăŞăłăźăă§ă
impl Trait for Struct {
type Type: Debug;
type Type: Display;
fn foo() -> Self::Type { 42 }
}
ďźăăŤăăźă¸ă§ăłăŽéăłĺ ´ăŞăłăŻďź
ăăăăăžăăăăŻăă ă¨ćăăŚăăžăă
ăăă ăă§2ă¤ăŽĺ˘çăĺ
ĽăăŚăăăŽă§ă Type
ă¨ĺăăăăŤă where Type: Debug, Type: Display
äťäşă
ăăă訹ĺŻăăăŞăĺ ´ĺďźăăăĄăăă1ă¤ăŽçšć§ăŤĺăĺĺăŽč¤ć°ăŽé˘éŁäťăăăăĺăĺŤăăăă¨ăŻă§ăăžăăăă§ç解ă§ăăăăă§ăăă impl Trait for Struct
䝣ăăăŤtrait Trait
ć¸ăă¨ăăŤă¨ăŠăźăçşçăăžăăimpl Trait for Struct
ăăăăžăăďźăăăăŻtype Type: Trait
ć§ćăŽĺéĄă ă¨ćăăžăă
揥ăŤă trait
厣č¨ĺ
ă§ăć§ćăŻăă§ăŤtype Type: Trait
ă§ăăăč¤ć°ăŽĺŽçžŠă訹ĺŻăăŚăăžăăă ă ăăĺ¤ĺăăŽăăźăăŻăăŁă¨ĺăŤăă§ăŤĺşčŞăăŚăăă¨ćăăžăâŚ
ăă ăă @ stjepangă¨@joshtriplettăä¸ă§ććăăăăăŤă type Type: Trait
ăŻä¸ĺŽĺ
¨ă ă¨ćăăžăă ăžăă trait
厣č¨ă§ăŻćĺłăăăăăăăăžăăăďźĺŽéăŤăŻä¸ĺŽĺ
¨ăŤăŞăăăăŤč¨č¨ăăăŚăăžăăăč¤ć°ăŽĺŽçžŠă訹ĺŻăăŞăăŽăŻĺĽĺŚă§ăďźă impl Trait
ăăăăŻă§ăŻćĺłăăăăžăăă ăăżă¤ăăŻç˘şĺŽăŤă§ăďźçžĺ¨ăŻtype Type = RealType
ăăč¨čż°ă§ăăžăăďź
impl Trait
ăŻăćťăä˝ç˝Žă§ăŽĺĺ¨č¨ĺˇă¨ĺźć°ä˝ç˝Žă§ăŽĺ ¨ç§°č¨ĺˇăŤä˝żç¨ăăăžăă
ăŻăăăăăć¸ăă¨ăăŤĺźć°ăŽä˝ç˝ŽăŤăăimpl Trait
ăŤă¤ăăŚăčăăĺŽĺŽĺăčĄăăăŚăăăă¨ăçĽăŁăŚăăă°ăĺźć°ăŽä˝ç˝ŽăŤăăimpl Trait
ăŤĺŻžăăŚĺăĺźć°ăăľăăźăăăăăŠăăçĺăŤćăăžăăă ăăăŻč¨ăŁăŚăăăăŽč°čŤăŤĺăłçŤăă¤ăăŞăăťăăăăă¨ćăăžă:)
č¨čŞăŽä¸ĄćšăŽăăŠă°ăŽä¸č˛Ťć§ăŽăŽăŁăăă訹ĺŻăăžăă ăžăăăăžăăžăŞăˇăăŞăŞăŤćéŠă§ăăăăă严ćšă使ç¨ăăă¨ă°ăăźăăŤăŤćéŠăŤăŞăăžăă
ăăă¨ăĺç´ăăĺŞĺ ăăŚćéŠă夹ăăă¨ăŻčŻăăă¨ă ă¨ćăăžăă ĺć§ăŤăCă¨MLăŻăťăźĺćăŤçăžăăžăăă CăŻĺç´ăăĺŞĺ ăăŚćéŠăŤĺ¤§ăăŞč˛ćŠăăăžăăăMLăŻćéŠăŤăŻăăăŤčżăăŁăăăăŻăăăŤč¤éă§ăăă ăăăăŽč¨čŞăŽć´žçčŞăć°ăăŚăăCéçşč ă¨MLéçşč ăŽć°ăŻĺăă§ăŻăŞăă¨ćăăžăă
impl Trait
ăăăł:
çžĺ¨ă impl Trait
ă¨:
ć§ćăŽĺ¨ăă§ăĺăćŠč˝ăťăăăŤĺŻžăăŚ2ă¤ăŽäťŁćżć§ćăŽä¸Ąćšăä˝ćăăĺžĺăăăăăăŤćăăžăă ăă ăăĺăćŠč˝ăŤĺŻžăăŚ2ă¤ăŽć§ćă使ç¨ăăă¨ăăŚăźăśăźă桡䚹ăăăă ăă§ăăăăăăăăŻčŻăăă¨ă§ăŻăŞăă¨ćăăžăăçšăŤăćŁç˘şăŞăťăăłăăŁăŻăšă常ăŤĺžŽĺŚăŤç°ăŞăĺ ´ĺăŻăŞăăăă§ăă
type Type: Trait
ăćĺăŽtype Type = impl Trait
ćĽăăŽăăă¤ăčŚăĺĺżč
ăćłĺăăŚăżăŚăă ăăă 彟ăăŻăăăăä˝ă辡ăăŁăŚăăăŽăăć¨ć¸Źăăăă¨ăă§ăăžăăăăWTFăŻăăă§ăăďź ç§ăŻRustăä˝ĺš´ă使ç¨ăăŚăăžăăăăžă čŚăăă¨ăŽăŞăć§ćăăăăžăăďźă ăăăŻĺ¤ăăĺ°ăŞăăC ++ăéĽăŁăç˝ ă§ăă
ç§ăčăăŚăăăŽăŻăĺşćŹçăŤăćŠč˝ăĺ¤ăăă°ĺ¤ăăťăŠăč¨čŞăĺŚăśăŽăéŁăăăŞăă¨ăăăă¨ă§ăă ăăăŚă type Type = impl Trait
type Type: Trait
ă使ç¨ăăăă¨ăŽĺ¤§ăăŞĺŠçšăŻăăăăžăăăăă¨ăă°ă6ćĺçŻç´ă§ăăžăăďź
ćă¤rustc
ĺşĺăčŚčޤătype Type: Trait
ă使ç¨ăăăăăŤăăăć¸ăăŚăăäşşă¨č¨ătype Type = impl Trait
ç§ăŤăŻăŻăăăŤçăŤăăŞăŁăŚăŻďźĺ°ăŞăă¨ăçŠäşăć¸ăăŚăĺä¸ăŽćšćłăăăăžăăăăăŻăăšăŚăŽäşşăŤă¨ăŁăŚçăŤăăŞăŁăŚăăďź impl Trait
ăŻăă§ăŤăŞăżăźăłăă¸ăˇă§ăłăŤĺĺ¨ăăăăŽă¨ăăŚć確ăŤčŞčăăăŚăăžăďźăăăšăŚăŽăŚăźăšăąăźăšăăŤăăźăăŚăăžăă ăăăŚăäşşă
ăç´ćçă ă¨ćăăăŽă使ăăă¨ăăă¨ďźç§ăŻăăăŤĺćăăžăăăăç§ăŤă¨ăŁăŚăŻ= impl Trait
ăŻçžĺ¨ăŽ= i32
ă¨ćŻčźăăŚăăç´ćçă§ăďźă彟ăăŻćŁăăăŞăă¤ăŹââăŻăăăăžăĺžćĽăŽćŁăăć¸ăćšă
RFC 2071ăŽĺ ăŽăăŤčŚćąăŻăăăŽč°čŤă§ĺŽĺ ¨ăŤĺ´ä¸ăăăăăăŤčŚăătypeofăăźăŻăźăăŤč¨ĺăăŚăăžăă çžĺ¨ććĄăăăŚăăć§ćăŻăăŞăćéťçă§ăăăăłăłăă¤ăŠăźă¨ăłăźăăčŞăżĺăäşşéăŽä¸Ąćšăĺ ˇä˝çăŞĺăć¤ç´˘ăăŚăăăă¨ăăăăăžăă
typeof
ăŻă1ă5ĺš´ĺăŤéăăĺéĄă§ç°ĄĺăŤčŞŹćăăăžăăďź https ďź
ĺĺżč
ă¨ăăŚč¨ăă°ă type Foo: Bar
ć§ćăăăăăŤăăă¨ćăăžăă ăăăŻé˘éŁăăĺăŽć§ćă§ăăăć§é ä˝ă§ăŻăŞăăçšć§ăŤăăă¨ćłĺŽăăăŚăăžăă impl Trait
ä¸ĺşŚčŚăăăăăăä˝ă§ăăăăç解ăăăă¨ăă§ăăžăăăăă§ăŞăăă°ăăăă調ăšăăă¨ăă§ăăžăă äťăŽć§ćă§ăăăčĄăăŽăŻéŁăăăĺŠçšăä˝ă§ăăăăŻăăăăžăăă
č¨čŞăăźă ăŽä¸é¨ăŽäşşă
ăŻăĺĺ¨ĺăŤĺĺăäťăăăăăŤimpl Trait
ă使ç¨ăăăă¨ăŤćŹĺ˝ăŤĺ寞ăăŚăăăăăŤćăăăăŽă§ă䝣ăăăŤäťăŽăăŽă使ç¨ăăăă¨čăăŚăăžăă ăăă§ăç§ăŤăŻăťă¨ăăŠćĺłăăăăžăăă
ă¨ăŤăăăăăŽéŚŹăŻćŽ´ăăăŚćťăă ă¨ćăăžăă ć§ćăŤă¤ăăŚăŻăăăăä˝çžăăŽăłăĄăłăăăăăăťăăŽä¸ćĄăăŽććĄăăăăăžăăďźç§ăŻäşć ăćŞĺăăăŚăăă ăă ă¨ćăăžăďźă ć§ćăăăšăŚăŽäşşă嚸ăăŤăăăăă§ăŻăŞăăă¨ăŻćăăă§ăăăăăăăăšăŚăŤčłćă¨ĺ寞ăŽč°čŤăăăăžăă ăăśăç§ăăĄăŻăă 1ă¤ăé¸ăă§ăăăŤĺşĺˇăăăšăă§ăă
ăăăźăăăăŻç§ăç解ăăăă¨ă§ăŻăžăŁăăăăăžăăă ç§ăăžăŁăăăŤăăŚăăăŚăăăă¨ă@ Nemo157 ďź
ăăŽĺ ´ĺăç§ăŻç˘şăăŤ=ć§ćă弽ăżăžăă
@Ekleog
ăăă
type Type: Trait
ć§ćăŽĺéĄă ă¨ćăăžăă
ăăăŻč¨ąĺŻăăăĺŻč˝where Type: Foo + Bar
䝣ăăăŤwhere Type: Foo, Type: Bar
where Type: Foo + Bar
ć¸ăăŽă§ăăăžăčŻăčăă§ăŻăŞăăăă§ăă ăžăăé˘éŁäťăăăăăżă¤ăăŽĺ ´ĺăŻäťŁăăăŤFoo + Bar
ăć¸ăčžźăăă¨ăććĄăăăăăŽĺ ´ĺăŽéŠĺăŞă¨ăŠăźăĄăăťăźă¸ăç°ĄĺăŤçşçăăăăă¨ăă§ăăžăă
type Foo = impl Bar;
ăŻă = impl Bar
ă襨示ăăă -> impl Bar
ă¨ăăŚä˝żç¨ăăăăăłăŤăăă罎ăćăăăă¨ăă§ăăă¨çľčŤäťăăă¨ăăăç解ăăăăăŽĺéĄăăăăžăă ăăăăăăăŻăăžăăăăžăăă @ mark-imăăăŽč§ŁéăčĄăăžăăăăăăăŻééăă§ăăĺŻč˝ć§ăăŻăăăŤéŤăăăă§ăă ăăăăŁăŚăç§ăŻtype Foo: Bar;
ăĺŚçżĺŻč˝ć§ăŽăăăŽăăčŻăé¸ćă§ăăă¨çľčŤäťăăžăă
ăă ăă @ stjepangă¨@joshtriplettă§ććăăăŚăăăăăŤăTypeďźTraită¨ĺ Ľĺăăă¨ä¸ĺŽĺ ¨ăŞćăăăăžăă
ćĄĺźľPOVăăăŻä¸ĺŽĺ
¨ă§ăŻăăăžăăă type Foo = impl Bar;
ăăĺĺžăăăŽă¨ăžăŁăăĺăéăŽć
ĺ ąătype Foo: Bar;
ăăĺĺžăăžăă ăăăăŁăŚă type Foo: Bar;
ă§ä˝ăă§ăăăă¨ăă茳çšăăăăă¨ăăăă§ĺŽäşă§ăă ĺŽéăĺžč
ăŻtype _0: Bar; type Foo = _0;
ă¨ăăŚčąçłăăăŚăăžăă
硨éďźç§ăćĺłăăăŽăŻăä¸é¨ăŽäşşăŤă¨ăŁăŚăŻä¸ĺŽĺ ¨ăŤćăăăăăăăžăăăăćčĄçăŞčŚłçšăăă§ăŻăŞăă¨ăăăă¨ă§ăăă
ăăăŻč¨ăŁăŚăăăăŽč°čŤăŤĺăłçŤăă¤ăăŞăăťăăăăă¨ćăăžă:)
čŻăčăă§ăă ćĺłăăă¨ăăăŤă§ăŻăŞăăč¨č¨ćăŤč¨čŞăăăŽăžăžčć Žăăĺż čŚăăăăžăă
ăăă¨ăĺç´ăăĺŞĺ ăăŚćéŠă夹ăăă¨ăŻčŻăăă¨ă ă¨ćăăžăă
ç°ĄĺăŤăăăăăŤă䝣ăăăŤtype Foo = impl Bar;
ĺé¤ăăžăă
CăŽćłĺŽăăăĺç´ăďźHaskell Coreăĺć§ăŽăăŽăŻăăžă ĺĽĺ
¨ă§ăăăŞăăăăăăăăĺç´ă§ăăăăăćłĺŽăăăďźăŻă襨çžĺşŚă¨ĺĽĺ
¨ć§ăŤé˘ăăŚăŻéŤéĄă§ăăăă¨ăŤćł¨ćăăŚăă ăăă CăŻč¨čŞăăśă¤ăłăŽç§ăŽĺăŽćă§ăŻăăăžăăă ăăăăé ăé˘ăăŚăăžăă
çžĺ¨ă
impl Trait
ă¨:
ć§ćăŽĺ¨ăă§ăĺăćŠč˝ăťăăăŤĺŻžăăŚ2ă¤ăŽäťŁćżć§ćăŽä¸Ąćšăä˝ćăăĺžĺăăăăăăŤćăăžăă ăă ăăĺăćŠč˝ăŤĺŻžăăŚ2ă¤ăŽć§ćă使ç¨ăăă¨ăăŚăźăśăźă桡䚹ăăăă ăă§ăăăăăăăăŻčŻăăă¨ă§ăŻăŞăă¨ćăăžăăçšăŤăćŁç˘şăŞăťăăłăăŁăŻăšă常ăŤĺžŽĺŚăŤç°ăŞăĺ ´ĺăŻăŞăăăă§ăă
ăă ăăăťăăłăăŁăŻăšăŻăžăŁăăç°ăŞăăžăăă ä¸ćšăäťćšăŤčąçłăăžăă
type Foo: Bar;
ăžăăŻtype Foo = impl Bar
ăŠăĄăăä¸ćšă ăăćŠč˝ăăŞăăăăŤć¸ăčžźăăă¨ăăăă¨ăŽćˇˇäšąăŻă严ćšăĺŽĺ
¨ăŤć確ăŤĺŽçžŠăăăăťăăłăăŁăŻăšăćăŁăŚăăŚăăăŚăźăśăźăŽéŞéăŤăŞăă ăă ă¨ćăăžăă ăŚăźăśăźătype Foo = impl Bar;
ăć¸ăčžźăăă¨ăăă¨ălintă辡ĺăă type Foo: Bar;
ăććĄăăžăă lintăŻăäťăŽć§ćăŤă¤ăăŚăŚăźăśăźăŤćăăŚăăžăă
ç§ăŤă¨ăŁăŚăč¨čŞăçľąä¸ăăăä¸č˛ŤăăŚăăăă¨ăéčŚă§ăă ăŠăăă§ä¸ĄćšăŽć§ćă使ç¨ăăăă¨ăŤăăĺ ´ĺăŻăăăŽćąşĺŽăä¸č˛ŤăăŚéŠç¨ăăĺż
čŚăăăăžăă
type Type: Trait
ăćĺăŽtype Type = impl Trait
ćĽăăŽăăă¤ăčŚăĺĺżč ăćłĺăăŚăżăŚăă ăăă
ăăŽçšĺŽăŽăąăźăšă§ăŻălintă辡ĺăăĺč
ăŽć§ćăć¨ĺĽ¨ăăžăă type Foo = (impl Bar, impl Baz);
ăŤé˘ăăŚăŻăĺĺżč
ăŻăăăăŤăă-> impl Trait
ăĺŚăśĺż
čŚăăăăŽă§ăăăăăćĺłăć¨ć¸Źă§ăăăŻăă§ăă
ăăăŻĺ¤ăăĺ°ăŞăăC ++ăéĽăŁăç˝ ă§ăă
C ++ăŽĺéĄăŻä¸ťăŤăăăăăăŞăĺ¤ăăCăŽćčˇçŠăăăăĺ¤ăăŽćŠč˝ăăăžăăŤăĺ¤ăăŽăăŠăă¤ă ăăľăăźăăăŚăăăă¨ă§ăă ăăăăŻĺĽĺăŽćŠč˝ă§ăŻăŞăăć§ćăç°ăŞăă ăă§ăă
ç§ăčăăŚăăăŽăŻăĺşćŹçăŤăćŠč˝ăĺ¤ăăă°ĺ¤ăăťăŠăč¨čŞăĺŚăśăŽăéŁăăăŞăă¨ăăăă¨ă§ăă
ć°ăăč¨čŞăĺŚăśăă¨ăŻă丝ăŤăăŽéčŚăŞĺłć¸é¤¨ăĺŚăśăă¨ă ă¨ćăăžăă ăăăŻăťă¨ăăŠăŽćéă貝ăăăăĺ ´ćă§ăă éŠĺăŞćŠč˝ăŤăăăăŠă¤ăăŠăŞăŽć§ćăăŻăăăŤĺŽšćăŤăŞăăăăĺ¤ăăŽĺ ´ĺăŤćŠč˝ăăăăăŤăŞăăžăă ç§ăŻăăăŞăăŤä˝ăŹăăŤă§čăăăăéč¤ăĺźă辡ăăč¨čŞăăăăĺŞăăć˝čąĄĺăä¸ăăč¨čŞă弽ăżăžăă ăăŽĺ ´ĺăăăć˝čąĄçăŞĺăčż˝ĺ ăăăăĺŽéăŤăŻćŠč˝ăăčż˝ĺ ăăăăăăă¨ăŻăŞăăäşşé塼ĺŚăĺä¸ăăăă ăă§ăă
ăăăŚă
type Type = impl Trait:
ătype Type: Trait
ă使ç¨ăăăă¨ăŽĺ¤§ăăŞĺŠçšăŻăăăăžăăăăă¨ăă°ă6ćĺçŻç´ă§ăăžăăďź
ăŻăă6ćĺăăäżĺăăăŚăăžăăă ăăăă type Foo: Iterator<Item: Iterator<Item: Display>>;
ăčć
Žăăă¨ă䝣ăăăŤćŹĄăŽăăăŤăŞăăžăă type Foo = impl Iterator<Item = impl Iterator<Item = impl Display>>;
ăăăŻăă¤ăşăăŻăăăŤĺ¤ăăŞăăžăă type Foo: Bar;
ăŻăĺžč
ăŤćŻăšăŚăăç´ćĽçă§ăăă誤解ďźĺ罎ć..ďźăŽĺžĺăĺ°ăŞăăé˘éŁăăăżă¤ăďźçšć§ăăăżă¤ăăăłăăźăă..ďźăŤĺŻžăăŚăăéŠĺăŤćŠč˝ăăžăă
ăăăŤă type Foo: Bar
ăŻčŞçśăŤtype Foo: Bar = ConcreteType;
ăŤćĄĺźľă§ăăžăăăăăŤăăăĺ
ˇčąĄĺăĺ
Źéăăăžăăă Bar
ćşăăăă¨ăäżč¨źăăăžăă type Foo = impl Trait;
ăăŽăăăŞăă¨ăŻă§ăăžăăă
rustcă
type Type: Trait
ă襨示ăăă¨ăăŤătype Type = impl Trait
ă使ç¨ăăăăăŤć¸ăăŚăăäşşăăç§ăŤăŻăŻăăăŤçăŤăăŞăŁăŚăăă¨ăăă¨ăŠăźăĺşĺăăăă¨ăŻăç§ăŤă¨ăŁăŚăŻăăăŤçăŤăăŞăŁăŚăăžăă彟ăăŻăăăć¸ăăăăŽĺžćĽăŽćŁăăćšćłăŤćŁăăăŞăă¤ăŹââăŻăăăăžăă
ç§ăŻçŠäşăć¸ăăăăŽ1ă¤ăŽĺžćĽăŽćšćłăăăăă¨ăććĄăăŚăăžăă type Foo: Bar;
ă
@lnicola
ĺĺżč ă¨ăăŚč¨ăă°ă
type Foo: Bar
ć§ćăăăăăŤăăă¨ćăăžăă ăăăŻé˘éŁăăĺăŽć§ćă§ăăăć§é ä˝ă§ăŻăŞăăçšć§ăŤăăă¨ćłĺŽăăăŚăăžăă
çš°ăčżăăžăăăĺă¨ă¤ăŞă˘ăšăŻĺŽéăŤăŻé˘éŁăăĺă¨čŚăŞăăă¨ăă§ăăžăă ăăŞăăŻč¨ăăă¨ăă§ăăă§ăăăďź
trait Foo { type Baz: Quux; }
// User of `Bar::Baz` can conclude `Quux` but nothing more!
impl Foo for Bar { type Baz: Quux; }
// User of `Wibble` can conclude `Quux` but nothing more!
type Wibble: Quux;
é˘éŁăăăżă¤ăă¨ăżă¤ăă¨ă¤ăŞă˘ăšă§ăžăŁăăĺăăăăŤćŠč˝ăăăă¨ăăăăăžăă
ăŻăă6ćĺăăäżĺăăăŚăăžăăă ăăăă
type Foo: Iterator<Item: Iterator<Item: Display>>;
ăć¤č¨ăăă¨ă䝣ăăăŤćŹĄăŽăăăŤăŞăăžăătype Foo = impl Iterator<Item = impl Iterator<Item = impl Display>>
; ăă¤ăşăĺ¤ăă§ăă
ăăăŻăĺĺäťăĺŽĺă厣č¨ăăăăăŽć§ćă¨ç´äş¤ăăŚăăăăă§ăă ç§ăććĄăăăăă¨ăčŚăăŚăă4ă¤ăŽć§ćăŻăăšăŚăăăă揥ăŽăăăŤč¨ąĺŻăăĺŻč˝ć§ăăăăžăă
type Foo: Iterator<Item: Iterator<Item: Display>>;
type Foo = impl Iterator<Item: Iterator<Item: Display>>;
existential type Foo: Iterator<Item: Iterator<Item: Display>>;
existential type Foo = impl Iterator<Item: Iterator<Item: Display>>;
Trait<AssociatedType = impl Bound>
ć§ćăŽäťŁăăăŤććĄăăăççĽĺ˝˘Trait<AssociatedType: Bound>
ă使ç¨ăăŚăĺŽĺĺďźĺĺäťăăžăăŻĺżĺďźăŽé˘éŁăăĺăŽĺżĺĺŽĺĺă厣č¨ă§ăăăă¨ăŻăçŹçŤăăćŠč˝ă§ăďźăă ăăĺŽĺĺćŠč˝ăŽăťăăĺ
¨ä˝ăŽä¸č˛Ťć§ăäżă¤ăăăŽćĄäťśďźă
@ Nemo157ăăăăŻç°ăŞăćŠč˝ă§ăă ăăăăä¸č˛Ťć§ăäżă¤ăăăŤăăăăăä¸çˇăŤć¤č¨ăăăŽăŻčŞçśăŞăă¨ă ă¨ćăăžăă
@Centril
çłă訳ăăăžăăăăééăŁăŚăăžăă ćĄĺźľPOVăăăŻä¸ĺŽĺ ¨ă§ăŻăăăžăăă
ććĄăăăć§ćăŤć ĺ ąăä¸čśłăăŚăăăă¨ă示ĺăăăă¨ăŻăăăžăăă ç§ăŻăăăä¸ĺŽĺ ¨ă ă¨
ăžăăăăŽăšăŹăăă§ăŻăäşşă
ăăăŽćŁç˘şăŞć§ćăŽéăă§č§ŁéăŽĺéĄă示ăăăă¨ăŤă注ćăăŚăă ăăă type Foo = impl Trait
ăŻă Foo
ăăĺĽăŽĺ
ˇä˝çăŞăżă¤ăăă¨ăăă¨ăă§ăăçšć§ăŽă¨ă¤ăŞă˘ăšă§ăŻăŞăăä˝ĺşŚä˝żç¨ăăŚăăçšĺŽăŽĺĺăŽăŞăĺ
ˇä˝çăŞăżă¤ăă§ăăăă¨ăć確ăŤăăŚăăăăăŤćăăžăăăŞăăăăă使ăăăłăŤă
ç§ăŻăăăŻĺ˝źăăçĽăŁăŚăăăăšăŚăŽăăŽĺăăă¨ăă§ăăăă¨ăäşşă
ăŤäźăăăŽăŤĺ˝šçŤăĄăžăă ă¨ćă-> impl Trait
ăăăăăăéŠç¨type Foo = impl Trait
; ä¸čŹĺăăăćŚĺżľimpl Trait
ăăăă严ćšăŽĺ ´ćă§ăăŤăăŁăłă°ăăăăŻă¨ăăŚä˝żç¨ăăăŚăăăă¨ăăăăăžăă type Foo: Trait
ăăăŞć§ćăŻăăăŽä¸čŹĺăăăăăŤăăŁăłă°ăăăăŻăé襨示ăŤăăžăă
@joshtriplett
ç§ăŻăăăä¸ĺŽĺ ¨ă ă¨ćăăŚăăăă¨ă示ĺăăŚăăžăăă ăăăŻç§ăŤă¨ăŁăŚăäťăŽäşşăŤă¨ăŁăŚăééăŁăŚăăăăăŤčŚăăžăă
大ä¸ĺ¤Ť; ăăă§ăŻincomplete
ăŻç°ăŞăç¨čŞă使ç¨ăăăă¨ăććĄăăžăăăăăŻăç§ăŤăŻć
ĺ ąăä¸čśłăăŚăăăă¨ă示ĺăăŚăăăăă§ăă
ăžăăăăŽăšăŹăăă§ăŻăäşşă ăăăŽćŁç˘şăŞć§ćăŽéăă§č§ŁéăŽĺéĄă示ăăăă¨ăŤă注ćăăŚăă ăăă
ç§ă茳ĺŻăăăŽăŻă type Foo = impl Bar;
ćĺłăŤă¤ăăŚăăšăŹăăă§čĄăăă解éăŽčޤăFoo
ăăžăăžăŞä˝żç¨ćłăăĺçŽä¸ĺăăżă¤ăă§ăŻăŞăăăăăç°ăŞăăżă¤ăă§ăăă¨č§Łéăăžăăă ă¤ăžăăćŁç˘şăŤăŻă ă使ç¨ăăăăłăŤç°ăŞăĺ
ˇčąĄĺăă¨ăăă¨ăă§ăăçšć§ăŽă¨ă¤ăŞă˘ăšăă§ăă
type Foo: Bar;
ăŻç´ăăăăă¨č¨ăäşşăăăžăăă type Foo: Bar;
ăŽĺĽăŽč§Łéăăćĺłăăćĺłă¨ä˝ăéăăŽăăăăăžăăă ĺĽăŽč§ŁéăŤă¤ăăŚčăăŚăżăăă¨ćăăžăă
@Centril
çš°ăčżăăžăăăĺă¨ă¤ăŞă˘ăšăŻĺŽéăŤăŻé˘éŁăăĺă¨čŚăŞăăă¨ăă§ăăžăă
ăăăăŻĺŻč˝ă§ăăăçžĺ¨ăé˘éŁäťăăăăŚăăăżă¤ăăŻçšć§ăŤé˘éŁăăŚăăžăă impl Trait
ăŻăŠăă§ăăăžăăŻăťă¨ăăŠćŠč˝ăăžăă impl Trait
ăä¸ç¨ŽăŽé˘éŁăżă¤ăă¨ăăŚć示ăăĺ ´ĺăŻă2ă¤ăŽćŚĺżľăĺćăŤĺ°ĺ
Ľăăĺż
čŚăăăăžăă ă¤ăžăă impl Trait
ăé˘ć°ăŽćťăĺă¨ăăŚčĄ¨ç¤şăăăăăä˝ă§ăăăăć¨ć¸ŹăžăăŻčŞăżĺăă¨ăĺă¨ă¤ăŞă˘ăšăŤimpl Trait
ăăă¨ăăŤăăăŽçĽčăĺĺŠç¨ă§ăăžăă
ăăăăçšć§ĺŽçžŠă§é˘éŁăăăżă¤ăă確čŞăăăă¨ă¨ćŻčźăăŚăă ăăă ăăŽĺ ´ĺăäťăŽć§é ä˝ăĺŽçžŠăžăăŻĺŽčŁ
ăăŞăăă°ăŞăăŞăăăŽă§ăăăă¨ăăăăăžăă ăăăăçšć§ăŽĺ¤ă§type Foo: Debug
ĺşăăăăĺ ´ĺăăăăä˝ă§ăăăăŻăăăăžăăă ăăăĺŽčŁ
ăăäşşăŻčŞ°ăăăŞăăŽă§ăăăăŻăă税ăŽĺćšĺŽŁč¨ă§ăăďź C ++ăŽĺ ´ĺăŽăăăŤăçśćżă¨é˘äżăăăăžăăďź äťăŽčŞ°ăăăżă¤ăăé¸ćăăMLă˘ă¸ăĽăźăŤăŽăăăŞăăŽă§ăăďź ăžăă䝼ĺăŤimpl Trait
ăčŚăăă¨ăăăă°ăăăăăŽéăŤăŞăłăŻăä˝ćăăăă¨ăŻă§ăăžăăă ç§ăăĄăŻăć¸ăčžźăżfn foo() -> impl ToString
ăăŞăfn foo(): ToString
ă
ăżă¤ăFoo = impl Bar; ăžăă= impl Bară襨示ăăă-> implBară¨ăăŚä˝żç¨ăăăăăłăŤç˝Žćă§ăăă¨çľčŤäťăăă¨ăăç解ăăăăăŽĺéĄăăăăžăă
ăăă§ĺăŤč¨ăăžăăăăăăăŻlet x = foo();
ăfoo()
䝣ăăăŤx
使ç¨ă§ăăăă¨ăćĺłăăă¨čăăăăăŞăăŽă§ăă ăăăăŤăăăăăăŻčŞ°ăăĺż
čŚăŞă¨ăăŤăăăŤčŞżăšăăă¨ăă§ăă芳細ă§ăăăćŚĺżľăć šćŹçăŤĺ¤ăăăă¨ăŻăăăžăăă
ă¤ăžăăăăăăŠăŽăăăŤćŠč˝ăăăďźĺŽçžŠăççžăăŚăăĺ ´ĺăŤä˝ă辡ăăăďźăćŁç˘şăŤăăăăŞăăŚăăăăăä˝ă§ăăăďź -> impl Trait
ăăăŞć¨ĺŽĺďźăç°ĄĺăŤç解ă§ăăžăă äťăŽć§ćă§ăŻăăăăä˝ă§ăăăăăç解ăăăŽăŻéŁăăă§ăă
@Centril
大ä¸ĺ¤Ť; ç§ăŤăŻăć ĺ ąăä¸čśłăăŚăăăă¨ă示ĺăăŚăăăăăăăă§ăŻä¸ĺŽĺ ¨ă¨ăŻç°ăŞăç¨čŞă使ç¨ăăăă¨ăććĄăăžăă
ăä¸ĺŽĺ ¨ăă¨ăŻăć ĺ ąăä¸čśłăăŚăăăă¨ăćĺłăăĺż čŚăŻăăăžăăăä˝ăăäťăŽä˝ăăćăŁăŚăăăŻăă§ăăăćăŁăŚăăŞăăăăŤčŚăăăă¨ăćĺłăăĺ ´ĺăăăăžăă
type Foo: Trait;
ăŻĺŽĺ
¨ăŞĺŽŁč¨ăŽăăăŤăŻčŚăăžăăă ä˝ăăčśłăăŞăăăă§ăă ăăăŚăăăăŻtype Foo = SomeType<X, Y, Z>;
ă¨ăŻä¸ĺš¸ăŤăç°ăŞăŁăŚăăăăă§ăă
ăăăăăç§ăăĄăŽăŻăłăŠă¤ăăźă ăă§ăŻă type Inferred: Trait
ă¨type Inferred = impl Trait
éăŽăăŽăłăłăťăłăľăšăŽăŁăăăĺŽéăŤĺăăăă¨ăă§ăăŞăă¨ăăçšăŤĺ°éăăŚăăžăă
ăăŽćŠč˝ăŽĺŽé¨çăŞĺŽčŁ ăäťťćăŽć§ćďźRFCă§ćĺŽăăăŚăăăăŽă§ăďźă¨çľăżĺăăăŚăăă大ăăŞăăă°ăŠă ă§čŠŚăăŚăżăŚăăłăłăăăšăăŤăŠăŽăăăŤéŠĺăăăă確čŞăă䞥ĺ¤ăăăă¨ćăăžăăďź
@lnicola
[..]
impl Trait
ăŻăŠăă§ăăăžăăŻăťă¨ăăŠćŠč˝ăăžă
ăăă¨ă Foo: Bound
ăăťă¨ăăŠăŠăă§ăćŠč˝ăăžă;ďź
ăăăăçšć§ăŽĺ¤ă§
type Foo: Debug
ĺşăăăăĺ ´ĺăăăăä˝ă§ăăăăŻăăăăžăăă
çšć§-> impl->ĺă¨ă¤ăŞă˘ăšă§ăŽä˝żç¨ăŽé˛ćŠăŻĺŚçżăŤĺ˝šçŤă¤ă¨ćăăžăă
ăăăŤăăFooăăăăă°ăĺŽčŁ
ăăăżă¤ăăăăăŽć¨čŤăŻĺŻč˝ć§ăéŤăă¨ćăăžă
çšć§ă¨ä¸čŹçăŞĺ˘çăătype Foo: Debug
ăčŚăă¨ăăăăćŁăăă§ăă
C ++ăŽĺ ´ĺăŽăăăŤăçśćżă¨é˘äżăăăăžăăďź
RustăŽçśćżăŽćŹ ĺŚăŻăăăăRustăŽé常ăŤĺşćŹçăŞăăŽă§ăăăăăăăă§čŞŹćăăŚăăćŠč˝ăĺŚçżăăă¨ăăăăăŻăăăŤćŠă掾éă§ĺŚçżăăĺż čŚăăăă¨ćăăžăă
äťăŽčŞ°ăăăżă¤ăăé¸ćăăMLă˘ă¸ăĽăźăŤăŽăăăŞăăŽă§ăăďź
ĺźăłĺşăĺ
ďźăŚăźăśăźďźăăżă¤ăăé¸ćăăarg: impl Bar
ăŤăăă type Foo = impl Bar;
ăŤĺŻžăăŚăăăŽć¨čŤăčĄăăă¨ăă§ăăžăă ç§ăŤăŻăăŚăźăśăźăăżă¤ăăé¸ćăăă¨ăăć¨čŤăŻă type Foo: Bar;
ĺŻč˝ć§ăä˝ăăăăŤćăăăžăă
ăăă§ĺăŤč¨ăăžăăăăăăăŻ
let x = foo();
ăfoo()
䝣ăăăŤx
使ç¨ă§ăăăă¨ăćĺłăăă¨čăăăăăŞăăŽă§ăă
č¨čŞăĺç
§ééć§ă§ăăĺ ´ĺăŻă foo()
䝣ăăăŤx
ă使ç¨ă§ăăžăă type Foo = impl Foo;
ăăˇăšăă ăŤčż˝ĺ ăăăžă§ăĺă¨ă¤ăŞă˘ăšăŻĺç
§ééć§ăăăăžăă éăŤăçľĺăă§ăŤăăăăŠăx = foo()
ĺŠç¨ă§ăăăăäťăŽă foo()
ă§ăŻă¨äş¤ćĺŻč˝ă§ăx
ă
@joshtriplett
ăä¸ĺŽĺ ¨ăă¨ăŻăć ĺ ąăä¸čśłăăŚăăăă¨ăćĺłăăĺż čŚăŻăăăžăăăä˝ăăäťăŽä˝ăăćăŁăŚăăăŻăă§ăăăćăŁăŚăăŞăăăăŤčŚăăăă¨ăćĺłăăĺ ´ĺăăăăžăă
ăăŁăăă ; ăăăăăăă§ăŻăŞăă¨ăăăă¨ăŻä˝ăćăŁăŚăăă¨ćăăăžăăďź
type Foo: Trait;
ăŻĺŽĺ ¨ăŞĺŽŁč¨ăŽăăăŤăŻčŚăăžăăă
ç§ăŤăŻĺŽĺ
¨ăŤčŚăăžăă Foo
ăTrait
ăćşăăăŚăăă¨ăăĺ¤ćăŽăăăŤčŚăăžăăăăăăŻăžăăŤćĺłăăăćĺłă§ăă
@CentrilăŤă¨ăŁăŚăăä˝ăăčśłăăŞăăă¨ăăăŽăŻăăăăă¨ă¤ăŞă˘ăšă§ăăĺŽéăŽăżă¤ăă§ăă ăăăŻäťĽĺăŽç§ăŽćˇˇäšąăŤĺ°ăé˘äżăăŚăăžăă ăăŽăăăŞĺăăŞăăăă§ăŻăŞăăăăŽĺăĺżĺă§ăăă¨ăăă ăă§ă... =ă使ç¨ăăă¨ăĺăăăă常ăŤĺăĺă§ăăăă¨ă垎ĺŚăŤćĺłăăăžăăăĺĺăäťăăăă¨ăŻă§ăăžăăă
ăăăăç§ăăĄăŻăăăăŽč°čŤăăă使ăćăăăŚăăă¨ćăăžăă 严ćšăŽć§ćăĺŽé¨çăŤĺŽčŁ ăăŚăä˝ăćăĺšćçăă確čŞăăăŽăŻç´ ć´ăăăăă¨ă§ăă
@ mark-im
@CentrilăŤă¨ăŁăŚăăä˝ăăčśłăăŞăăă¨ăăăŽăŻăăăăă¨ă¤ăŞă˘ăšă§ăăĺŽéăŽăżă¤ăă§ăă ăăăŻäťĽĺăŽç§ăŽćˇˇäšąăŤĺ°ăé˘äżăăŚăăžăă ăăŽăăăŞĺăăŞăăăă§ăŻăŞăăăăŽĺăĺżĺă§ăăă¨ăăă ăă§ă... =ă使ç¨ăăă¨ăĺăăăă常ăŤĺăĺă§ăăăă¨ă垎ĺŚăŤćĺłăăăžăăăĺĺăäťăăăă¨ăŻă§ăăžăăă
ăăăŻç§ăŤă¨ăŁăŚăăžăăŤăăŽăăăŤćăăžăă
2ă¤ăŽĺťśćăăăé çŽăŤăăăŤĺăçľăĺŻč˝ć§ăŤĺ ăăŚăç术ăŽă¨ăŞă¸ăŞăłăŤé˘ăăĺéĄăŻăăăžăăďź čŞĺă§ăăăăŠăăŠăăăăăăăŽăăăăăŞăďź
impl Trait
ä˝ăćĺłăăăŽăăŤă¤ăăŚăŻăăžă ĺ¤ăăŽćˇˇäšąăăăăăăăŻăžăŁăăćăăă§ăŻăăăžăăă impl Trait
ăŽćŁç˘şăŞăťăăłăăŁăŻăšăć確ăŤăăăăžă§ăĺťśćăăăă˘ă¤ăă ăŻééăăŞăĺž
ă¤ĺż
čŚăăăă¨ćăăžăďźăăăŻăžăăŞăçťĺ ´ăăăŻăă§ăďźă
@varkorăŠăŽăťăăłăăŁăŻăšăä¸ć確ă§ăăďź impl Trait
ăŽăťăăłăăŁăŻăšăŤă¤ăăŚăŻăRFC 1951䝼éĺ¤ć´ăăăŚăăăă2071ĺš´ăŤćĄĺźľăăăŚăăžăă
@alexregč¨çťăŻăăăžăăă§ăăăă大ăžăăŞćŚčŚăŻćŹĄăŽă¨ăăă§ăă解ćăčż˝ĺ ăăăăăĺŽĺçăŞimplĺ
ă§static
ă¨const
ăŽăżă¤ăăä¸ăăĺż
čŚăăăăžăăçšć§ăłăłăăăšăăŻăé˘ć°ăŽćťăăżă¤ăăŤĺŻžăăŚăăă§čĄăă ă ăăăăăăŞăăăăăăDefId
ă§ImplTraitContext::Existential
ăăŞăăćăă§ăăŞăăăăăŞăăˇă§ăłăŽimpl Trait
茪é˘ć°ăŽĺŽçžŠăăă¸ă§ăăŞăăŻăăăăŻă˘ăăăăžăă ăăăŻăăŞăăŤăžă¨ăăŞćšćłăä¸ăăăŻăă§ăă @ oli-obkăŽĺŽĺĺPRăŤĺşăĽăăŚăăă¨ăăăç°ĄĺăŞćéăĺžăăăĺŻč˝ć§ăăăăžăă
@cramertj ďźč¨čŞă§ăŽimpl Trait
ăŽăťăăłăăŁăŻăšăŻăé˘ć°ăˇă°ăăăŁă§ăŽä˝żç¨ăŤĺŽĺ
¨ăŤĺśéăăăŚăăăäťăŽä˝ç˝ŽăŤćĄĺźľăăăă¨ăćç˝ăŞćĺłăćă¤ă¨ăăăŽăŻçĺŽă§ăŻăăăžăăă äźčŠąăŽăťă¨ăăŠăčĄăăăŚăăăăăŤčŚăăăăăăŤă¤ăăŚăăĺ°ă芳ăă誏ćăăžăă
@varkor
č¨čŞă§ăŽimplTraităŽăťăăłăăŁăŻăšăŻăé˘ć°ăˇă°ăăăŁă§ăŽä˝żç¨ăŤĺŽĺ ¨ăŤĺśéăăăŚăăăäťăŽä˝ç˝ŽăŤćĄĺźľăăăă¨ăćç˝ăŞćĺłăćă¤ă¨ăăăŽăŻçĺŽă§ăŻăăăžăăă
ăăŽćĺłăŻRFC2071ă§ćĺŽăăăŚă
@cramertj ďźRFC 2071ăŽćĺłăŻăăăžăă§ăăăăĺĺ¨ăăăżă¤ăăă¨ăăăăŹăźăşăăăă§ćĺłăăăăŽăŽč¤ć°ăŽč§Łéă訹ĺŻăăžăă
TL; DR â impl Trait
ćŁç˘şăŞćĺłăč¨ĺŽăăăă¨ăăžăăăăăăŻăĺ°ăŞăă¨ăç´ćçăŤăŻä¸ć確ă ăŁă芳細ăć確ăŤăăă¨ćăăžăă ć°ăăăżă¤ăăŽă¨ă¤ăŞă˘ăšć§ćăŽććĄă¨ă¨ăăŤă
éĺťć°ćĽéă impl Trait
ăŽćŁç˘şăŞďźă¤ăžăă形ĺźçă§çčŤçăŞďźăťăăłăăŁăŻăšăŤă¤ăăŚăDiscordrust-langăăŁăăă§ĺ¤ăăŽč°čŤăčĄăăăŚăăžăăă ćŠč˝ăŤă¤ăăŚăŽĺ¤ăăŽčŠłç´°ă¨ăăăăä˝ă§ăăăăăăăŚä˝ă§ăŞăăăćŁç˘şăŤćăăăŤăăăă¨ăŻćçă ăŁăă¨ćăăžăă ăžăăăżă¤ăă¨ă¤ăŞă˘ăšăŤĺŻžăăŚăŠăŽć§ćă匼ĺ˝ă§ăăăăŤă¤ăăŚăćăăăŤăăžăă
ç§ăŻăăă¤ăăŽçľčŤăŽčŚç´ăĺ°ăć¸ăăžăăă ăăăŻimpl Trait
解éăćäžăăžăăăăăăŻăăŞăăŻăŞăźăłă ă¨ćăăžăăĺźć°ä˝ç˝Žimpl Trait
ă¨ćťăä˝ç˝Žimpl Trait
ăŽéăăćŁç˘şăŤčŞŹćăăŚăăžăďźăăăŻăĺ
¨ç§°č¨ĺˇăă§ăŻăăăžăăăĺŽéĺăăăă寞ăĺĺ¨çăŤĺŽéĺăăăăďźă ăăă¤ăăŽĺŽéçăŞçľčŤăăăăžăă
ăăŽä¸ă§ăç§ăŻăć˘ĺăŽĺă¨ă¤ăŞă˘ăšăăŽä¸čŹçăŤčż°ăšăăăŚăăčŚäťśăćşăăć°ăăć§ćăććĄăăžăă
type Foo: Bar = _;
ă¨ăŚăč¤éăŞăăăăŻăŞăŽă§ăćĺăŤć確ăŤăăĺż čŚăăăăă¨ăăăăăăăăŽă§ăĺĽăŽć稿ă¨ăăŚć¸ăăžăăă ăăŁăźăăăăŻăŻĺ¤§ćčżă§ăďź
@varkor
RFC 2071ăŻăăăžăă§ăăăăĺĺ¨ăăăżă¤ăăă¨ăăăăŹăźăşăăăă§ćĺłăăăăŽăŽč¤ć°ăŽč§Łéă訹ĺŻăăžăă
ăŠăŽăăăŤćć§ă§ăăďź ç§ăŻăăŞăăŽć稿ăčŞăżăžăă-ç§ăŻăžă éĺĺŚă¨ĺŽć°ăŤăăăéĺçăŞĺĺ¨ăŽ1ă¤ăŽćĺłăăçĽăăžăăă ă˘ă¤ăă ăă¨ăŤć°ăăĺŽĺĺĺŽçžŠăĺ°ĺ
Ľăăăă¨ăŤăăăćťăä˝ç˝Žimpl Trait
ă¨ĺăăăăŤĺä˝ăăžăă
type Foo: Bar = _;
ăăŽć§ćăŤă¤ăăŚăŻRFC2071ă§čŞŹćăăžăăăăăă§čż°ăšăăăăŤă Foo
ăĺä¸ăŽć¨čŤĺă§ăăăçžĺ¨ăŽă˘ă¸ăĽăźăŤăŽĺ¤é¨ăŤĺĺ¨ăăéć¨čŤĺăŽä˝ĺ°ăăăăă¨ăć確ăŤç¤şăăŚăăăŽă弽ăă§ăďźäžďź type Foo: Bar = u32;
ďźă ç§ăŻăăăŽ2ă¤ăŽĺ´é˘ăĺŤăă§ăăďźďź1ďźăăźăŻăźăăăŞăăăć¤ç´˘ăéŁăăăďźbďź type Foo = impl Trait
ă¨ćŻčźăăŚabstract type Foo: Bar;
ć§ćă¨ĺăĺéˇć§ăŽĺéĄăăăăžăćăŁăŚăăďź type Foo = impl Iterator<Item = impl Display>;
ăŻtype Foo: Iterator<Item = MyDisplay> = _; type MyDisplay: Display = _;
ăžăă ăăăăŽăŠăĄăăĺĺźă匨ăăăăŽă§ăŻăŞăă¨ćăăžăăăăăăăăŽIMOă§ć確ăŞĺĺŠăĺăăăă¨ăŻă§ăăžăăă
@cramertjăăăžăăăăăăŤçžăăžăďź
type Foo = impl Bar;
fn f() -> Foo { .. }
fn g() -> Foo { .. }
Foo
ăĺŽéăŤĺŽĺĺăŽĺă¨ă¤ăŞă˘ăšă§ăăĺ ´ĺă f
ă¨g
ăŻç°ăŞăĺ
ˇčąĄćťăĺăăľăăźăăăžăă ä˝äşşăăŽäşşă
ăŻćŹč˝çăŤăăŽć§ćăăăŽăăăŤčŞăă§ăăăĺŽéăRFC 2071ć§ćăŽč°čŤăŽä¸é¨ăŽĺĺ č
ăŻăăăăćčżăŽDiscordăŽč°čŤăŽä¸é¨ă¨ăăŚććĄăăŠăŽăăăŤćŠč˝ăăăă§ăŻăŞăăă¨ăŤć°ăĽăăă ăă§ăă
ĺéĄăŻăçšăŤĺźć°ăŽä˝ç˝Žimpl Trait
ăŤç´é˘ăăŚăĺĺ¨č¨ĺˇăăŠăăŤčĄăăŽăăăžăŁăăć確ă§ăŻăŞăă¨ăăăă¨ă§ăă č°čŤăŤă¤ăăŚăŻăăăăŻĺłĺŻăŤçŻĺ˛ăĺŽăăăăŚăăžăă ćťăä˝ç˝ŽăŤă¤ăăŚăŻăçŻĺ˛ăçătype Foo = impl Bar
ă严ćšăŽăă¸ăˇă§ăłă匼ĺ˝ă§ăă _
ăăźăšăŽć§ćăŻăăĺŽĺçăăăăĺŤăžăŞă解éăŤčżăĽăăăăŽĺéĄăăăĄăă¨ĺéżăăžăă
Foo
ăĺŽéăŤĺŽĺĺăŽĺă¨ă¤ăŞă˘ăšă§ăăĺ ´ĺ
ďźç§ăŽĺźˇčŞżďźă ăanăăăçšĺŽăŽăă¨čŞăżăžăăăăăăŻă f
ă¨g
ăŻăĺăĺŽĺĺăĺç
§ăăŚăăăăăç°ăŞăĺ
ˇčąĄăŽćťăĺăăľăăźăăăŞăăă¨ăćĺłăăžăă ç§ăŻăă¤ătype Foo = impl Bar;
let foo: impl Bar;
ă¨ĺăćĺłă使ç¨ăăŚăăăă¤ăžăć°ăăĺżĺăŽĺŽĺĺăĺ°ĺ
ĽăăŚăăăŽăčŚăŚăăžăăă ăăŞăăŽäžăĺçăŤăă
existential type _0: Bar;
type Foo = _0;
fn f() -> Foo { .. }
fn g() -> Foo { .. }
ç§ăŻăăăćŻčźçćç˝ă§ăăăă¨ăćăżăžăă
1ă¤ăŽĺéĄăŻăăăżă¤ăă¨ă¤ăŞă˘ăšăŽimpl Trait
ăăŽćĺłăRFCă§ćĺŽăăăŚăăŞăăă¨ă§ăă ăăăŻRFC2071ăŽăAlternativesăăťăŻăˇă§ăłă§ç°ĄĺăŤč¨ĺăăăŚă
ăžăăĺă¨ă¤ăŞă˘ăšăŻăă§ăŤĺç §ééć§ă§ăŻăŞăă¨ăăč¨ĺăčŚăăăăŞć°ăăăžăă u.rl.oăŤăăŁăă¨ćăăžăăăć¤ç´˘ăăŚăăăŁăšăŤăăˇă§ăłăčŚă¤ăăăžăăă§ăăă
@cramertj
@rpjohnstăŽăă¤ăłăăăimpl Trait
ăŽăťăăłăăŁăŻăšăŤăŻč¤ć°ăŽč§ŁéăăăăžăăăăăăŻăăšăŚă署ĺă§ăŽçžĺ¨ăŽä˝żç¨ćłă¨ä¸č´ăăŚăăžăăă impl Trait
ăäťăŤćĄĺźľăăă¨ç°ăŞăçľćăŤăŞăăžăăĺ ´ćďźć稿ăŤč¨čźăăăŚăăăăŽäťĽĺ¤ăŽ2ă¤ăŻçĽăŁăŚăăžăăăăžă č°čŤăŽćşĺăă§ăăŚăăžăăďźă ăăăŚăć稿ăŽč§Łéăĺż
ăăăćăćç˝ă§ăăă¨ăăăŽăŻćŹĺ˝ă§ăŻăŞăă¨ćăăžăďźç§ăŻĺäşşçăŤăăŽčŚłçšăăAPITă¨RTIPăŤă¤ăăŚĺć§ăŽčŞŹćăčŚăžăăă§ăăďźă
type Foo: Bar = _;
ăŤé˘ăăŚăŻăăăăăăăä¸ĺşŚč°čŤăăĺż
čŚăăăă¨ćăăžăăĺ¤ăă˘ă¤ăă˘ăć°éŽŽăŞçŽă§ĺć¤č¨ăăŚă厳ăŻăăăžăăă ăăăŤé˘ăăăăŞăăŽĺéĄăŤé˘ăăŚďź
ďź1ďźăăźăŻăźăăŻăăăžăăăăăŠăă§ăĺć¨čŤă¨ĺăć§ćă§ăă ăăăĽăĄăłăă§ăă˘ăłăăźăšăłă˘ă/ăă˘ăłăăźăšăłă˘ăżă¤ăăăŞăŠăć¤ç´˘ăăă¨ăĺć¨čŤăŤé˘ăăăăźă¸ăç°ĄĺăŤčŚă¤ăăăžăă
ďź2ďźăŻăăăăă§ăă ç§ăăĄăŻăăăŤĺŻžăă解湺çăčăăŚăăžăăăăăăŻă˘ăłăăźăšăłă˘čĄ¨č¨ă¨ăăžăä¸č´ăăă¨ćăăžăăăăăŻăăăŤććĄă§ăăăăăŤăŞăăă¨ăéĄăŁăŚăăžăă
@cramertjăŽăăăŤăç§ăŻăăă§č°čŤăčŚăŚăăžăăă
@varkorăŽć稿ă§čŞŹćăăăŚăăć šćŹçăŞăăăžăăăŻ@ varkorăŽć稿ăŤăăăăăŤďźăĺ°ăŞăă¨ă1ă¤ăŽĺăĺĺ¨ăăăă§ăŻăŞăăă...ĺşćăŽĺăĺĺ¨ăăăă¨ĺ¸¸ăŤč§ŁéăăŚăăă¨ćăăžăăĺžč
ăŻăăŚăăăźăľăŤăżă¤ăăă¨ĺçă§ăăăăăăăŽč§Łéă訹ĺŻăăă¤ăăă§ăăă°ăăĺĺ¨ăżă¤ăăă¨ăăĺĽăŻăžăŁăă彚ăŤçŤăăŞăă§ăăăă ăăŽä¸ťéĄăŤé˘ăăăăšăŚăŽRFCăŻă常ăŤćŽéçăŞăżă¤ăă¨ĺŽĺçăŞăżă¤ăă2ă¤ăŽç°ăŞăăăŽă§ăăă¨ćłĺŽăăŚăăžăăă ĺŽéăŽĺçčŤă§ăŻăăăćĺłăăĺĺĺĺăŻé常ăŤć°ĺŚçăŤçžĺŽçă§ăăăç§ăŤă¨ăŁăŚăŻăĺçčŤăŽç¨čŞă誤ç¨ăăŚăăăăăăŤăŻäťăŽĺ°éç¨čŞăé¸ćăăĺż
čŚăăăă¨ăăč°čŤă§ăăă impl Trait
ăŽćĺłăăăăťăăłăăŁăŻăšăŻĺ¸¸ăŤä¸ć確ă§ăăăĺčăăĺż
čŚăăăăžăă
@rpjohnstă誏ćăăăšăłăźăăŽăăăžăăăŻćˇąĺťăŞĺéĄă§ăăăććĄăăăăăšăŚăŽć§ćăŻăăżă¤ăalisăžăăŻé˘éŁăăăżă¤ăăŽăăăăă¨ćˇˇĺăăăĺŻč˝ć§ăăăăžăă ăăăăŽćˇˇäšąăŽăŠăĄăăăćŞăăăăăăĺŻč˝ć§ăéŤăăăăŻăćŁç˘şăŤăŻăć°çžăŽăłăĄăłăăŽĺžă§č§Łćąşă§ăăŞăăŁăçľăăăŽăŞăčŞčť˘čťĺ°ĺąă§ăă type Foo: Bar = _;
ăŻăăăăăŤéčŚăŞĺĺ¨ă厣č¨ăăăăăŤăăă¤ăăŽăšăăźăăĄăłăăŽççşăĺż
čŚă§ăăă¨ăătype Foo: Bar;
ăŽĺéĄă俎ćŁăăăăăŤčŚăăăŽă弽ăă§ăăăăăă ăă§ăŻĺŽéăŤĺ¤ć´ăăăŽăŤĺĺă§ăŻăŞăă¨ćăăžăăćąşăăŚčŞčť˘čťĺ°ĺąăăŽçśćłă
ç§ă確俥ăăŚăăăŽăŻăă type
ăăŽć§ćăŻăăšăŚčŞ¤č§ŁăćăăăăćçľçăŤăŻtype
䝼ĺ¤ăŽăăźăŻăźăăĺż
čŚăŤăŞăă¨ăăăă¨ă§ăă ĺŽéăć§ćă§type
ă使ç¨ăăŞăă§ăă ăăăăăŽăăă誰ăăăĺă¨ă¤ăŞă˘ăšă§ăăăăŠăăăăăăăăŁă¨ĺĺ¨ăăŚăăăă¨čŚăŞăćšćłăŻăăăžăăă
existential Foo = impl Trait;
fn f() -> Foo { .. }
fn g() -> Foo { .. }
existential Foo: Trait;
fn f() -> Foo { .. }
fn g() -> Foo { .. }
md5-b59626c5715ed89e0a93d9158c9c2535
existential Foo: Trait = _;
fn f() -> Foo { .. }
fn g() -> Foo { .. }
f
ă¨g
ăTrait
ĺŽčŁ
ăă2ă¤ăŽç°ăŞăăżă¤ăăčżăĺŻč˝ć§ăăăă¨ăă誤解ăĺŽĺ
¨ăŤ_é˛ć˘_ăăăă¨ăŻç§ăŤăŻćăăă§ăŻăăăžăăăăăăăŻé˛ć˘ăŤčżăă¨ćăăžăç§ăăĄăŻăăăăĺžăăă¨ăă§ăăžăăă
@Ixrec
ăĺĺ¨ăăăżă¤ăăă¨ăăăăŹăźăşăŻăçšăŤăšăłăźăăŽăăăžăăăŽăăăŤĺéĄăăăăžăă APITă¨RPITăŽăšăłăźăăăžăŁăăç°ăŞăăă¨ăäťăŽäşşăććăăŚăăăŽăčŚăăă¨ăăăăžăăă ăăăŻă type Foo = impl Bar
ăăăŞć§ćďź impl Bar
ăăĺĺ¨ĺăďźăćŹčłŞçăŤăăăžăă§ăăăă¨ăćĺłăăžăă
ăŻăăĺçčŤăŽç¨čŞăŻčޤç¨ăăăŚăăžăă ăăăăRFCă§ăŻčޤç¨ăăăŚăăžăďźăžăăŻĺ°ăŞăă¨ă誏ćăăăŚăăžăăďźăăăŽăăăRFCčŞä˝ăŤčľˇĺ ăăăăăžăăăăăăžăă
@rpjohnstă誏ćăăăšăłăźăăŽăăăžăăăŻćˇąĺťăŞĺéĄă§ăăăććĄăăăăăšăŚăŽć§ćăŻăăżă¤ăalisăžăăŻé˘éŁăăăżă¤ăăŽăăăăă¨ćˇˇĺăăăĺŻč˝ć§ăăăăžăă ăăăăŽćˇˇäšąăŽăŠăĄăăăćŞăăăăăăĺŻč˝ć§ăéŤăăăăŻăćŁç˘şăŤăŻăć°çžăŽăłăĄăłăăŽĺžă§č§Łćąşă§ăăŞăăŁăçľăăăŽăŞăčŞčť˘čťĺ°ĺąă§ăă
ăăăăăăăŻçĺŽă§ăŻăŞăă¨ćăăžăă ăăŽćˇˇäšąăŽăŞăä¸č˛Ťăăć§ćăćăäťăăă¨ăĺŻč˝ă§ăă ç§ăŻčŞčť˘čťăŽčąč˝ăćăĺăŁăŚčăăžăăăăăŻăçžĺ¨ăŽ2ă¤ăŽććĄăćŞăăăă§ăăăĺŽéăŤăŻčŞ°ăćşčśłăăăŞăăăă§ăă
ç§ă確俥ăăŚăăăŽăŻăćçľçăŤĺžăăăć§ćăŤăŻă
type
䝼ĺ¤ăŽăăźăŻăźăăĺż čŚă§ăăă¨ăăăă¨ă§ăă
ăăăĺż čŚăŞăă¨ćăăžăă ăăŞăăŽäžă§ăŻăăžăŁăăć°ăă襨č¨ćłăçşćăăžăăăăăăŻăč¨čŞč¨č¨ă§ăŻĺŻč˝ăŞéăéżăăăăăŽă§ăăăăăăŞăă¨ăä¸č˛Ťć§ăŽăŞăć§ćă§ăăŁăąăăŽĺˇ¨ĺ¤§ăŞč¨čŞăä˝ćăăžăă ăăčŻăăŞăăˇă§ăłăăŞăĺ ´ĺăŤăŽăżăĺŽĺ ¨ăŤć°ăăć§ćăć¤č¨ăăĺż čŚăăăăžăă ăăăŚăç§ăŻăăăčŻăé¸ćč˘ăăăă¨ä¸ťĺźľăăžăă
ä˝čŤă§ăăăăĺŽĺçăŞăżă¤ăăăăĺŽĺ ¨ăŤé˘ăăŚăçśćłĺ ¨ä˝ăć確ăŤăăăă¨ăŻĺŻč˝ă ă¨ćăăžăăăăăŤă¤ăăŚăŻăç§ăžăăŻäťăŽčŞ°ăăăăăŤăăŠăăźă˘ăăăăžăă
type
䝼ĺ¤ăŽć§ćă彚çŤă¤ă¨ćăăžăăăăăŻăĺ¤ăăŽäşşătype
ăĺç´ăŞç˝ŽćĺŻč˝ăŞă¨ă¤ăŞă˘ăšă¨ăăŚč§Łéăăăăă§ăăăăăŻăăćŻĺç°ăŞăăżă¤ăăŤăŞăĺŻč˝ć§ăăăăă¨ăă解éăćĺłăăžăă
APITă¨RPITăŽăšăłăźăăăžăŁăăç°ăŞăăă¨ăäťăŽäşşăććăăŚăăăŽăčŚăăă¨ăăăăžăăă
ăšăłăźăăłă°ăŻĺ¸¸ăŤimplTraitććĄăŽć示çăŞé¨ĺă§ăăă¨ćăŁăăŽă§ăăććăăăĺż
čŚăŻăăăžăăă§ăăă ăšăłăźăăłă°ăŤă¤ăăŚăăŞăăč¨ăŁăăă¨ăŻăăšăŚăéĺťăŽRFCă§ăă§ăŤĺăĺ
ĽăăŚăăăă¨ăçš°ăčżăăŚăăăăă§ăă ć§ćăăăŻčŞ°ăŤăćăăă§ăŻăŞăăăăăŻĺéĄă ă¨ćăăžăăăăăăžă§čŞ°ăăăăç解ăăŚăăŞăăŁăăăă§ăŻăăăžăăă ĺŽéăRFC 2701ăŤé˘ăăč°čŤăŽĺ¤§é¨ĺăŻăĺć¨čŤă¨ăŻä˝ăăăăăŚčŚăăă¨ă訹ăăăŚăăŞăă¨ăăćĺłă§ă type Foo = impl Trait;
ăŽăšăłăźăăłă°ăăŠăăăăšăăăŤă¤ăăŚăŽăăšăŚă ă¨ćăăžăăă
ăăŽćˇˇäšąăŽăŞăä¸č˛Ťăăć§ćăćăäťăăă¨ăĺŻč˝ă§ăă
type Foo: Bar = _;
ăăăŽć§ćă§ăăă¨č¨ăăăăŽă§ăăăăăă¨ăăžă čŚă¤ăăŁăŚăăŞăă¨ćăăžăăďź
ĺľé ć§ăä¸ĺĺăŞăăă§ăŻăŞăăăťă¨ăăŠăŽăăă°ăŠăăźăĺçčŤĺŽśă§ăŻăŞăăăăĺć§ăŽćˇˇäšąăăŞăć§ćăćăă¤ăăă¨ăŻă§ăăŞăă¨ćăăžăă ăăăăă桡䚹ă訹厚ă§ăăăŹăăŤăžă§ć¸ăăć§ćăčŚă¤ăăăă¨ăă§ăăžăă確ăăŤăĺçčŤăŽăăăŠăłăŤă¨ăŁăŚćç˝ăŞć§ćăŻăăăăăăăžăăă桡䚹ăĺŽĺ ¨ăŤćé¤ăăăă¨ăŻă§ăăžăăă
ăžăŁăăć°ăă襨č¨ćłăçşćăăžăă
ăăăăźăŻăźăăĺĽăŽăăźăŻăźăăŤç˝Žăćăăă ăă ă¨ćăăžăăă ç§ăćĺłăăŚăăŞăăŁăčż˝ĺ ăŽĺ¤ć´ă襨示ăăăŚăăžăăďź
čăăŚăżăă¨ăăăăžă§ăĺĺ¨ăă誤ç¨ăăŚăăăŽă§ă existential Foo: Trait
/ = impl Trait
ăăăăăăŻăćŁĺ˝ăŞć§ćă§ăŻăŞăăă¨ăćĺłăăžăă
ăăăăŁăŚăĺ¤é¨ăłăźăăä¸ćăŞăżă¤ăăĺç
§ăăĺĺăŽĺăŤć°ăăăăźăŻăźăăé
罎ăăĺż
čŚăăăăžă...ăăăŤçŠşç˝ăćçťăăŚăăžăă alias
ă secret
ă internal
ăŞăŠăŻăăšăŚăăŞăă˛ăŠăăăă§ă type
ăăăăä¸ćć§ăŽćˇˇäšąăăĺ°ăŞăă¨ăŻčăăăăžăăă
čăăŚăżăă¨ăăăăžă§ăĺĺ¨ăă誤ç¨ăăŚăăăŽă§ă
existential Foo: Trait
/= impl Trait
ăăăăăăŻăćŁĺ˝ăŞć§ćă§ăŻăŞăăă¨ăćĺłăăžăă
ăŻăăç§ăŻĺŽĺ
¨ăŤĺćăăžăâăĺŽĺçăă¨ăăç¨čŞăăĺŽĺ
¨ăŤé˘ăăĺż
čŚăăăă¨ćăăžă*ďź impl Trait
ăăžă誏ćăăŞăăăăăăčĄăćšćłăŤă¤ăăŚăăă¤ăăŽćŤĺŽçăŞă˘ă¤ăă˘ăăăăžăďźă
*ďźăăăădyn Trait
ăŽăżăŽćéăäşç´ăăžăďź
@ joshtriplett ă @ Ixrec ďź _
襨č¨ăŻă䝼ĺă¨ĺăç¨ĺşŚăŤç˝Žăćăăăă¨ăă§ăăŞăăŞăŁăăă¨ăćĺłăăăă¨ăŤĺćăăžăăăăăçśćăăăă¨ăĺŞĺ
ăăăĺ ´ĺăŻăĺĽăŽć§ćăĺż
čŚăŤăŞăăžăă
_
ăŻăă¨ăŤăă罎ćăŤé˘ăăŚăă§ăŤçšćŽăŞăąăźăšă§ăăăă¨ăŤćł¨ćăăŚăă ăăăăăă役éżăăăŽăŻăżă¤ăă¨ă¤ăŞă˘ăšă ăă§ăŻăăăžăăăçžĺ¨_
使ç¨ă§ăăĺ ´ćă§ăŻăĺŽĺ
¨ăŞĺç
§ééć§ă匨ăăăăŚăăžăă
ă¨ăŤăăă_ăŻç˝ŽćăŤé˘ăăŚăă§ăŤçšćŽăŞăąăźăšă§ăăăă¨ăŤćł¨ćăăŚăă ăăăăăă役éżăăăŽăŻăżă¤ăă¨ă¤ăŞă˘ăšă ăă§ăŻăăăžăăăçžĺ¨_ă使ç¨ă§ăăĺ ´ćă§ăŻăĺŽĺ ¨ăŞĺç §ééć§ă匨ăăăăŚăăžăă
ăăăćŁç˘şăŤä˝ăćĺłăăăŽăăćăăŚăăă ăăžăăďź _
ăŽĺ˝ąéżăĺăăăĺç
§ééć§ăăŽćŚĺżľăçĽăăžăă
_襨č¨ăŻă䝼ĺă¨ĺăç¨ĺşŚăŤç˝Žăćăăăă¨ăă§ăăŞăăŞăŁăăă¨ăćĺłăăăă¨ăŤĺćăăžăăăăăçśćăăăă¨ăĺŞĺ ăăăĺ ´ĺăŻăĺĽăŽć§ćăĺż čŚăŤăŞăăžăă
ăăă_ĺŞĺ
庌_ăăŠăăăŻăăăăžăăă ç§ăŤă¨ăŁăŚăăăć§ćăäťăŽć§ćăăă弽ăăăăŤćăăăăŽăŻăç§ăăĄăăăăžă§ăŤčŚă¤ăăĺŻä¸ăŽĺŽ˘čŚłçăŞč°čŤă§ăăă ăăăăăăăŻăăšăŚă type
ă罎ăćăăăăăŤčăĺşăăă¨ăă§ăăăăźăŻăźăăŤĺşăĽăăŚĺ¤ăăĺŻč˝ć§ăăăăžăă
ăăăćŁç˘şăŤä˝ăćĺłăăăŽăăćăăŚăăă ăăžăăďź
_
ăŽĺ˝ąéżăĺăăăĺç §ééć§ăăŽćŚĺżľăçĽăăžăă
ăăăăăżăžăăăç§ăŻăăăă誏ćăăăŤč¨čăćăăŚăăžăă ç§ăŽčăăéăăăăŚăă ăăăăăăŚç§ăŻăăăžă¨ăžăăŽăă誏ćăĺŽĺźĺăăžăă ăăăŻă impl Trait
ă調ăšăăăăŽäťŁćżăŽďźăăăŚć˝ĺ¨çăŤăă彚çŤă¤ďźćšćłă¨ăăžăéŠĺăăžăă
ĺç
§ééć§ă¨ăŻăăťăăłăăŁăŻăšăĺ¤ć´ăăăă¨ăŞăăăăŽĺŽçžŠăĺç
§ăŤç˝Žăćăăăă¨ăă§ăăăăŽéăĺŻč˝ă§ăăăă¨ăćĺłăăžăă Rustă§ăŻăăăăŻćăăăŤfn
ăŽćéăŹăăŤă§ăŻĺ˝ăŚăŻăžăăžăăă äžăă°ďź
fn foo() -> usize {
println!("ey!");
42
}
fn main() {
let bar = foo();
let baz = bar + bar;
}
bar
ĺăŞăŤăŹăłăšăfoo()
ďź bar
ăŽĺŽçžŠďźăŤç˝Žăćăăă¨ăćăăăŤç°ăŞăĺşĺăĺžăăăžăă
ăă ăăăżă¤ăă¨ă¤ăŞă˘ăšăŽĺ ´ĺăçžćçšă§ăŻĺç §ééć§ăäżćăăăžăďźAFAIKďźă ă¨ă¤ăŞă˘ăšăăăĺ ´ĺďź
type Foo = Definition;
揥ăŤăăăă°ăŠă ăŽăťăăłăăŁăŻăšăĺ¤ć´ăăăŤă Foo
ăŽăŞăŤăŹăłăšăDefinition
ăŤç˝Žăćăă Definition
ăŽăŞăŤăŹăłăšăFoo
ăŤç˝Žăćăăăă¨ăă§ăăžăďźăăŁăăăŁĺéżďźă ăăžăăŻăăŽĺăŽćŁăăă
ç´šäťďź
type Foo = impl Bar;
Foo
ăĺşçžăăăăłăŤĺăăżă¤ăăŤăŞăă¨ăăăă¨ăŻă揥ăŽăăăŤč¨čż°ăăĺ ´ĺăćĺłăăžăă
fn stuff() -> Foo { .. }
fn other_stuff() -> Foo { .. }
Foo
ăŞăŤăŹăłăšăimpl Bar
罎ăćăăăă¨ăŻă§ăăžăăăăăŽéăĺć§ă§ăă ă¤ăžăă揥ăŽăăăŤč¨čż°ăăžăă
fn stuff() -> impl Bar { .. }
fn other_stuff() -> impl Bar { .. }
ăŞăżăźăłăżă¤ăăŻFoo
ă¨çľąĺăăăžăăă ăăăăŁăŚăRFC 2071ăŽăťăăłăăŁăŻăšăĺ
é¨ăŤĺŤăimpl Trait
ăĺ°ĺ
Ľăăăă¨ăŤăăăĺă¨ă¤ăŞă˘ăšăŽĺç
§ééć§ă夹ăăăžăă
ĺç
§ééć§ă¨type Foo = _;
ăçśăăžă...ďź@ varkorăŤăăďź
ĺ¤ăăŽäşşăĺăĺç´ăŞäťŁćżĺŻč˝ăŞă¨ă¤ăŞă˘ăšă¨ăăŚč§Łéăăăăăĺ䝼ĺ¤ăŽć§ćă彚çŤă¤ă¨ćăăžăăăăăŻăăćŻĺç°ăŞăĺăŤăŞăĺŻč˝ć§ăăăăă¨ăă解éăćĺłăăžăă
ăăčŚçšăă ăăăă = _
ĺ˛ăĺ˝ăŚăăăăŻăăăăĺä¸ăŽăżă¤ăă§ăăăă¨ăćĺłăăžăăăďź
ăăăŻĺăŤć¸ăăăă¨ăăăăžăă...
ĺç
§ééć§ďźCăăŞăăăťăăľăŽăăăŞç˝Žćă§ăŻăŞăăăă¤ăłăăŁăłă°ďź let
ďźă¨ăăŚtype
ăčŚăćšăäžżĺŠă ă¨ćăăžăă ăăŽăăăŤčŚăă¨ă type Foo = impl Trait
ăŻăžăăŤăăŽăăăŤčŚăăăă¨ăćĺłăăžăă
ĺĺżč
ăŻimpl Trait
ăĺŽĺçăŞăżă¤ăă¨ćŽéçăŞăżă¤ăă§ăŻăŞăăă impl
sa Trait . If they want to know more, they can read the
implTrait`ăŽăăăĽăĄăłăă ă¨čăăĺŻč˝ć§ăŻä˝ăă¨ćăăžăăć§ćăĺ¤ć´ăăă¨ăć˘ĺăŽćŠč˝ă¨ăŽćĽçśă夹ăăăăăžăăĄăŞăăăăăăžăăă_誤解ăćăĺŻč˝ć§ăŽăăć§ćăĺĽăŽć§ćăŤç˝Žăćăăă ăă§ăă_
type Foo = _
ăŤé˘ăăŚăŻăĺŽĺ
¨ăŤçĄé˘äżăŞćĺłă§_
ăăŞăźăăźăăźăăăžăă ăžăăăăăĽăĄăłăăGoogleă§čŚă¤ăăăŽăŻéŁăăăăăŤćăăăăăăăăžăăă
@lnicola const
ăă¤ăłăăŁăłă°ăŽäťŁăăăŤă let
const
ăă¤ăłăăŁăłă°ă使ç¨ăăăă¨ăă§ăăžăăĺč
ăŻăĺç
§ééć§ăăăăžăă let
ďź fn
ĺ
ă§ĺç
§ééć§ăăŞăďźăé¸ćăăăă¨ăŻăçšăŤç´ćçă§ăŻăŞăă¨ćăäťťćăŽé¸ćă§ăă ĺă¨ă¤ăŞă˘ăšăŽç´ćçăŞčŚćšăŻăăăăăă¨ă¤ăŞă˘ăšă§ăăăăăďźăăŽĺčŞă使ç¨ăăăŚăăŞăĺ ´ĺă§ăďźĺç
§ééć§ă§ăăă¨ăăăă¨ă ă¨ćăăžăă
ăžăă type
ăCăăŞăăăťăăľăŽäťŁćżă¨ăăŚčŚăŚăăžăăăăăăŻăă¸ă§ăăŞăăŻăĺéżăăŚĺ°éăăĺż
čŚăăăăăă§ăďźSFINAEăŻăăăžăăďźă 䝣ăăăŤăăăšăŚăŽăă¤ăłăăŁăłă°ăç´ç˛ă§ăăIdrisăAgdaăŽăăăŞč¨čŞă§ăŽăă¤ăłăăŁăłă°ă¨ăžăŁăăĺăăăăŤă type
ăčăăŚăăžăă
ĺĺżč ăŻ
impl Trait
ăĺŽĺçăŞăżă¤ăă¨ćŽéçăŞăżă¤ăă§ăŻăŞăăăçšć§ăć示ăăăăŽăă¨čăăĺŻč˝ć§ăŻä˝ăă¨ćăăžăă
ăăăŻç§ăŤăŻéăăŽăŞăĺşĺĽăŽăăăŤćăăžăă ĺ°éç¨čŞăexistentialăăŻä˝żç¨ăăăŚăăžăăăăăŚăźăśăźăŻăăăexistentialăżă¤ăďźRustăŽăłăłăăăšăă§ăŻăBarăć示ăăăăăżă¤ăăŽFooăăŤăăăŞăďźă¨ĺăćŚĺżľăŤç´ćçăŤăŞăłăŻăăŚăăă¨ćăăžăă
type Foo = _
ăŤé˘ăăŚăŻăĺŽĺ ¨ăŤçĄé˘äżăŞćĺłă§_
ăăŞăźăăźăăźăăăžăă
ăŠăăăŚďź type Foo = _;
ăŻăĺăäşćłăăăäťăŽăłăłăăăšăă§ăŽ_
ăŽä˝żç¨ă¨ä¸č´ăăžăă
.collect::<Vec<_>>()
ă¨ć¸ăă¨ăă¨ĺăăăăŤăăĺŽéăŽĺăć¨ć¸Źăăăă¨ăăćĺłă§ăă
ăžăăăăăĽăĄăłăăGoogleă§čŚă¤ăăăŽăŻéŁăăăăăŤćăăăăăăăăžăăă
ăăăŞăŤéŁăăăă¨ă§ăŻăŞăă§ăăďź ătypealiasunderscoreăăŻăăăžăăăă°ăćăžăăçľćăăăăăăŻăă§ă...ďź
ătypealiasimpltraităăć¤ç´˘ăăăŽă¨ä˝ăĺ¤ăăăŻăŞăăăă§ăă
GoogleăŻçšćŽćĺăă¤ăłăăăŻăšăŤçťé˛ăăžăăă StackOverflowăŽčłŞĺăŤă˘ăłăăźăšăłă˘ăĺŤăžăăŚăăĺ ´ĺăGoogleăŻă˘ăłăăźăšăłă˘ă¨ăăĺčŞăĺŤăăŻă¨ăŞăŤĺŻžăăŚă˘ăłăăźăšăłă˘ăčŞĺçăŤă¤ăłăăăŻăšăŤçťé˛ăăžăă
@Centril
ăŠăăăŚďź
type Foo = _;
ăŻăĺăäşćłăăăäťăŽăłăłăăăšăă§ăŽ_ăŽä˝żç¨ă¨ä¸č´ăăžăă
.collect ::ă¨ć¸ăă¨ăă¨ĺăăăăŤăăĺŽéăŽĺăć¨ć¸Źăăăă¨ăăćĺłă§ăă>ďźďźă
ăă ăăăăŽćŠč˝ăŻĺăć¨ć¸ŹăăŚăăŽĺă¨ă¤ăŞă˘ăšăćäžăăăŽă§ăŻăŞăăďźă˘ă¸ăĽăźăŤăăŻăŹăźăăŞăŠăŽéĺŽăăăăšăłăźăăŽĺ¤ă§ďźăĺŽéăŽĺăă¨çľąĺăăăŞăĺŽĺĺăä˝ćăăžăă
GoogleăŻçšćŽćĺăă¤ăłăăăŻăšăŤçťé˛ăăžăăă
ăăăŻăăŻăçĺŽă§ăŻăăăžăăďźăăăă犺ç˝ăŤäžĺăăžăă..ďźďźă
ăă ăăăăŽćŠč˝ăŻĺăć¨ć¸ŹăăŚăăŽĺă¨ă¤ăŞă˘ăšăćäžăăăŽă§ăŻăŞăăďźă˘ă¸ăĽăźăŤăăŻăŹăźăăŞăŠăŽéĺŽăăăăšăłăźăăŽĺ¤ă§ďźăĺŽéăŽĺăă¨çľąĺăăăŞăĺŽĺĺăä˝ćăăžăă
type Foo = _;
ăŽć¨ĺĽ¨ăăăăťăăłăăŁăŻăšăŻăĺŽĺ
¨ăŤć¨čŤăŤĺşăĽăăăĺŽĺçăŞĺă¨ă¤ăŞă˘ăšăćă¤äťŁăăăŽćšćłă§ăă ăăăĺŽĺ
¨ăŤć確ă§ăŻăŞăăŁăĺ ´ĺăŻăćĺłăăăĺ°ăăă誏ćăăĺż
čŚăăăä˝ăăăăăŤăăŠăăźă˘ăăăăă¤ăăă§ăă
@iopqćčżăŽĺ¤ć´ăŤé˘ăă@varkorăŽăĄă˘ăŤĺ ăăŚăäťăŽć¤ç´˘ă¨ăłă¸ăłăŤă¤ăăŚăčż˝ĺ ăăăă¨ćăăžăăĺ
ŹĺźăăăĽăĄăłăăŞăŠă§ăŻă type
ă¨çľăżĺăăăŚćĺéăăŽĺčŞăă˘ăłăăźăšăłă˘ăăć示çăŤä˝żç¨ăăăă¨ă常ăŤĺŻč˝ă§ă
ăŞăăăăŽççąă§ăăŻă¨ăŞăŤ_ă使ç¨ăăŚăčŻăçľćăŻĺžăăăžăăă ă˘ăłăăźăšăłă˘ăć¤ç´˘ăăă¨ăă˘ăłăăźăšăłă˘ă¨ăăĺčŞăĺŤăžăăŚăăăăŽă襨示ăăăžăă _ăć¤ç´˘ăăă¨ăă˘ăłăăźăšăłă˘ăäťăăŚăăăăŽăăăšăŚčĄ¨ç¤şăăăăŽă§ăé˘éŁć§ăăăăăŠăăăăăăăăžăăă
@Centril
letďźfnĺ ă§ĺç §ééć§ăăŞăďźăé¸ćăăăă¨ăŻăçšăŤç´ćçă§ăŻăŞăă¨ćăäťťćăŽé¸ćă§ăă ĺă¨ă¤ăŞă˘ăšăŽç´ćçăŞčŚćšăŻăăăăăă¨ă¤ăŞă˘ăšă§ăăăăăďźăăŽĺčŞă使ç¨ăăăŚăăŞăĺ ´ĺă§ăďźĺç §ééć§ă§ăăă¨ăăăă¨ă ă¨ćăăžăă
çłă訳ăăăžăăăăç§ăŽç´ćăŻĺŽĺ ¨ăŤĺžăĺăă§ăăăăăç§ăŻăžă ăăăŤé ăĺ ăăă¨ăă§ăăžăăă
ăă¨ăă°ă type Foo = Bar
ĺ ´ĺăç§ăŽç´ćăŻćŹĄăŽăăăŤăŞăăžăă
ă Foo
厣č¨ăăŚăăžăăăăăŻBar
ă¨ĺăăżă¤ăăŤăŞăăžăăă
揥ăŤă type Foo = impl Bar
ă¨ć¸ăă¨ăç§ăŽç´ćăŻćŹĄăŽăăăŤăŞăăžăă
ă Foo
厣č¨ăăŚăăžăăăăăŻă Bar
ăĺŽčŁ
ăăĺăŤăŞăăžăăă
Foo
ăimpl Bar
ĺăŞăăăăšăăŽă¨ă¤ăŞă˘ăšă§ăăĺ ´ĺăăăăŻç§ăŤăŻé常ăŤç´ćçă§ăŻăăăžăăă ç§ăŻăăăăăăšăă¨ăťăăłăăŁăăŻăŽă¨ă¤ăŞă˘ăšă¨ăăŚčăăăŽă弽ăă§ăă
ăăăăŁăŚă Foo
ăimpl Bar
罎ăćăăăă¨ăă§ăăĺ ´ĺăăăăŻăăăšăăŽă¨ă¤ăŞă˘ăšă§ăăăç§ăŤă¨ăŁăŚăŻăăŻăă¨ăĄăżăăă°ăŠăăłă°ăćăéŁćłăăăžăă ăăăă Foo
ă厣č¨ăŽćçšă§ćĺłăĺ˛ăĺ˝ăŚăăăăăŽĺ
ăŽćĺłďźćčä¸ăŽćĺłă§ăŻăŞăďźďźă§č¤ć°ăŽĺ ´ćă§ä˝żç¨ă§ăăĺ ´ĺăăăăŻăťăăłăăŁăăŻă¨ă¤ăŞă˘ăšă§ăă
ăžăăă¨ăŤăăćčçĺĺ¨ĺăŽčĺžăŤăăĺćŠăç解ăăăă¨ăă§ăăžăăă ăăŹă¤ăă¨ă¤ăŞă˘ăšăăžăŁăăĺăăă¨ăéćă§ăăăă¨ăčăăă¨ăăăăăŻćç¨ă§ăăăăďź
ăăăăăHaskell䝼ĺ¤ăŽçľć´ăăăăăăĺç §ééć§ăç´ćçă§ăŻăŞăă¨ćăăŚăăžă... :)ăăăăăăăăŤăăăRustă§ćĺž ăăăăăŞĺä˝ă§ăŻăăăžăăă
@ Nemo157 @stjepang
Foo
ăĺŽéăŤĺŽĺĺăŽĺă¨ă¤ăŞă˘ăšă§ăăĺ ´ĺďźç§ăŽĺźˇčŞżďźă ăanăăăçšĺŽăŽăă¨čŞăżăžăăăăăăŻă
f
ă¨g
ăĺăĺŽĺĺăĺç §ăăŚăăăăăç°ăŞăĺ ˇčąĄăŽćťăĺăăľăăźăăăŞăăă¨ăćĺłăăžăă
ăăăŻăăĺŽĺĺăă¨ăăç¨čŞăŽčޤç¨ăăžăăŻĺ°ăŞăă¨ă@varkorăŽć稿ă¨type Foo = impl Bar
ä˝ăăăăŤčŚăăăă¨ăă§ăăžăFoo
ăżă¤ăăŽĺĽĺăâ T. T: Trait
-ăăŞăă䝣ăăĺ ´ĺăŻâ T. T: Trait
ă使ç¨ăŠăă§ăFoo
ăă§ăé-ăăăšăă§ăŻăĺä˝ç˝Žă§ç°ăŞăĺ
ˇä˝çăŞăżă¤ăăĺĺžă§ăăžăă
ăăŽâ T
ć°éčŠďźäžă§ăŻexistential type _0
ă¨ăăŚčĄ¨ăăăžăďźăŽăšăłăźăăĺéĄăŤăŞăăžăă APITă§ăŻăăŽăăăŤăżă¤ăă§ă-ĺźăłĺşăĺ
ăŻâ T. T: Trait
ăćşăăäťťćăŽĺ¤ă渥ăăă¨ăă§ăăžăă ăăăăăăăŻRPITă§ăŻăŞăăRFC 2071嚴䝣ăŤăŻăăăžăăexistential type
厣č¨ăăčŞĺăŽčąçłă§ăăŁäž-ăŞăăć°éčŠăŻăĺ
¨ćŠč˝ăžăăŻĺ
¨ă˘ă¸ăĽăźăŤăŹăăŤă§ăŻăé ăĺşăŚăăăă¨ăăŞăă寞ĺŚăăžăăŠăă§ăĺăT
ă
ăăăăŁăŚăăăăžăă-ăă§ăŤimpl Trait
ăăăŽä˝ç˝ŽăŤĺżăăŚăăžăăžăŞĺ ´ćăŤć°éčŠăé
罎ăăŚăăăŽă§ă type T = impl Trait
ăŠăĄăăćĺž
ăăĺż
čŚăăăăžăăďź ăăă¤ăăŽéĺ
ŹĺźăŽä¸čŤčŞżćťăăăăłRFC 2071ăšăŹăăăŽĺĺ č
ăŤăăăăă¤ăăŽäşĺžčŞčăŻăăăăăăăăăŽćšćłă§ć確ă§ăŻăŞăăă¨ă訟ćăăŚăăžăă
ăăăă impl Trait
ăĺĺ¨ă¨é˘äżăăăăăŽă¨ăăŚč§ŁéăăăŽă§ăŻăŞăăĺć¨čŤăŽčŚłçšăăăăŽăťăăłăăŁăŻăšă誏ćăăăççąă§ăă type T = _
ăŻăĺă税éĄăŽăăăžăăăŻăăăžăăăă T
䝣ăăăŤ_
ăăłăăźăăŚč˛źăäťăăăă¨ăŻă§ăăžăăăă¨ăă襨é˘ăŹăăŤăŻăžă ăăăžăăăăăŻăăăăžăăă ă T
ăă¨ă¤ăŞă˘ăšă§ăăĺä¸ăŽăżă¤ăăŻăč¤ć°ăŽĺ
ˇä˝çăŞăżă¤ăăćĺłăăĺŻč˝ć§ăăăăžăăă ďźä¸éć/çľąä¸ăăŞăĺä˝ăŻă @ varkorăăăŠăăźă˘ăăăŤă¤ăăŚčŠąăăŚăăăă¨ă§ăăďź
ĺç §ééć§
ăżă¤ăă¨ă¤ăŞă˘ăšăçžĺ¨ĺç §ééć§ă¨äşćć§ăăăăăă¨ăăŁăŚăäşşă ćĺž ăăŚăăăăă§ăŻăăăžăăă
äžă¨ăăŚă const
é
çŽăŻăďźhttps://github.com/rust-lang/rust/issues/34511#issuecomment-402520768ă§čż°ăšăďźéćĺčă§ăăăăăŽĺŽéăŤçăă桡䚹ć°ć§ă¸ăŚăźăśăźďźrust-lang-nursery / rust-clippyďź1560ďźă
ăăăăŁăŚăRustăăă°ăŠăăźăŤă¨ăŁăŚăĺç §ééć§ăŻĺ˝źăăćĺăŤčăăăă¨ă§ăŻăŞăă¨ćăăžăă
@stjepang @kennytm type Foo = impl Trait;
ĺă¨ă¤ăŞă˘ăšăĺç
§ééć§ă§ĺä˝ăăăă¨ă誰ăăćĺž
ăăŚăăă¨č¨ăŁăŚăăăăă§ăŻăăăžăăă ăăăăăăŽăšăŹăăăäťăŽĺ ´ćă§ăŽćˇˇäšąďź @rpjohnstăĺç
§ăăŚăăăăŽ...ďźăăćăăăŞăăăŤăăŚăźăśăźăŽć°ăŻĺ°ăŞăăŞăă ăăă¨ćăăžăă ăăăŻĺéĄă§ăăăăăăăĺ
ćă§ăăŞăĺéĄă§ăŻăăăžăăă ç§ăăĄăĺé˛ăăă¨ăăăăăŻĺżăŤçăăŚăăăšăăă¨ă§ăă
ăăŽĺéĄă§ä˝ăăăšăăăŤă¤ăăŚăŽç§ăŽçžĺ¨ăŽčăăŻă @ varkoră¨@rpjohnstăŤć˛żăŁăŚ
reďźĺç §ééć§
type Foo<T> = (T, T);
type Bar = Foo<impl Copy>; // not equivalent to (impl Copy, impl Copy)
ă¤ăžăăăăšăŚăŽă¤ăłăšăżăłăšă§ć°ăăĺăçćăăăă¨ă§ăăăă¸ă§ăăŞăăŻĺă¨ă¤ăŞă˘ăšăŽăłăłăăăšăă§ăŻĺç §ééć§ă§ăŻăăăžăăă
@centril type Foo = impl Bar;
Foo
ĺç
§ééć§ăćĺž
ăăĺ ´ĺăŻăćăćăăžăă ăă ăă type Foo: Bar = _;
ĺ ´ĺăĺç
§ééć§ăŻćĺž
ă§ăăžăăă
ĺźăłĺşăĺ
ďźăŽä¸é¨ďźăă˘ăă˘ăźăăŁăłă°ăăăă¨ăŤăăă enum impl Trait
ăăăŞăĄăŤăăşă ăŞăă§ăreturn-position impl Trait
ăćĄĺźľăăŚč¤ć°ăŽăżă¤ăăăľăăźăăăăă¨ăă§ăăžăă ăăăŻă "埡ĺimpl Trait
čżăĽăăŤć˛żăŁăŚăăăăăăăăă解é常ăŤĺŽĺă§ăă" dyn Trait
ăă¨ç¤şĺăăŚabstract type
使ç¨ăăŞăć§ćimpl Trait
ăžăŁăăă
ç§ăŻăăăĺ é¨ă§ăăăŤć¸ăăžăăďź https ďź
ć°ăăĺŽĺĺăĺŽĺŽăăăă¨ăăŽćł¨ćçš-ăĺŽĺçăăŻĺ¸¸ăŤä¸ćçăŞăăźăŻăźăďźRFCăŤăăďźă§ăăăă¨ăćĺłăăăŚăăăďźIMOďźăŻă˛ăŠăăăŽă§ăă ĺŽĺŽăăăĺăŤăăăŁă¨čŻăăăŽăčăĺşăăŞăăă°ăŞăăžăăă
ăĺŽĺçăăżă¤ăăŤă¤ăăŚăŽčŠąăŻăçŠäşăăŻăŞă˘ăăŚăăăăăŤăŻčŚăăžăăă impl Trait
ăŻăTraităĺŽčŁ
ăăçšĺŽăŽć¨čŤăăăĺă襨ăăžăă ăăŽăăăŤčŞŹćăăă¨ă type Foo = impl Bar
ăŻćăăăŤçšĺŽăŽă常ăŤĺăăżă¤ăă§ăăăĺŽéăŤĺ˝šçŤă¤ĺŻä¸ăŽč§Łéă§ăăăăžăăăăăăŁăŚăć¨ć¸Źăăăăłăłăăăšă䝼ĺ¤ăŽăłăłăăăšăă§ä˝żç¨ă§ăăžăăć§é ä˝ăŽăăăŤă
ăăŽćĺłă§ă impl Trait
ă_ : Trait
ć¸ăăă¨ăçăŤăăŞăŁăŚăăžăă
@rpjohnst ă
č¤ć°ăŽăżă¤ăăăľăăźăăăăăăŤreturn-position
impl Trait
ăćĄĺźľăăăă¨ăĺŻč˝ă§ăă
ăăăŻăăăĺłĺŻăŤăăžă彚ăŤçŤăimpl
ĺă¸ăŽă¨ă¤ăŞă˘ăšăŽăă¤ăłăăŻăé˘ć°ăimpl Foo
ăčżăăăăŤĺŽçžŠă§ăăăă¨ă§ăăăçšĺŽăŽĺăŻäťăŽć§é ä˝ăŞăŠă§ăăă°ăŠă ăäťăăŚäźćăăăžăă ăăăŻăăłăłăă¤ăŠăéŠĺăŞenum
ćéťçăŤçćăăĺ ´ĺăŤćŠč˝ăăžăăăĺ形ĺă§ăŻćŠč˝ăăžăăă
@ jan-hudecăăăăŽă˘ă¤ăă˘ăŻăDiscordăŤé˘ăăč°čŤă§ĺşăŚăăžăăă丝ăŤăreturn-positionă¨argument-position impl Trait
ăŽçžĺ¨ăŽč§ŁéăŤä¸č˛Ťć§ăăŞăă¨ăăäşĺŽăŤĺşăĽăăŚăăăă¤ăăŽĺéĄăăăăžăă
impl Trait
ăçšĺŽăŽć¨čŤăăăĺă襨ăăăăŤăăăă¨ăŻčŻăăŞăăˇă§ăłă§ăăăăăŽççžă俎ćŁăăăŤăŻăRustăçžĺ¨ćăŁăŚăăăăŽă¨ăŻimpl Trait
ăŽçžĺ¨ăŽĺä˝ă ăăăŻăăăăćăç°ĄĺăŞćšćłă§ăăăăăŞăăč¨ăăťăŠç°Ąĺă§ăŻăăăžăăă
ăă¨ăă°ă impl Trait
ăăăŽć°ăăăżă¤ăăŽć¨čŤă使ç¨ăăŚă Trait
ăĺŽčŁ
ăăĺŻč˝ăŞéăĺ¤ć
çăŞăżă¤ăăčŚă¤ăăăăă¨ăćĺłăăă¨ă type Foo = impl Bar
ăŻă˘ă¸ăĽăźăŤăŤé˘ăăăă¨ăć示ăĺ§ăăžăă abstract type
ăć¨čŤăăćšćłăŤé˘ăăRFC 2071ăŽčŚĺă§ăŻăăăšăŚăŽç¨éăçŹçŤăăŚĺăăżă¤ăăć¨čŤăăĺż
čŚăăăă¨ăăăŚăăžăăăăăŽĺ¤ĺ˝˘ć¨čŤăŻăĺ°ăŞăă¨ăăăĺ¤ăăŽĺŻč˝ć§ăăăăă¨ăă ăă§ăă寿ĺ˝ăčś
ăăăăŻăăăŤĺ¤ăăŽăăŁă¨ăăăăă˘ă¤ăă˘ăďźĺžăĺ ´ĺă¨ăăăŽç¸äşä˝ç¨ăŽĺ¨ăçĺăăăă§ăăăă
ăžăăăĺŽĺçăă¨ăăč¨čăç解ăăŚăăăăŠăăăăç§ăăĄăăŠăŽăăăŤćăăŚăăăăŤé˘äżăŞăă type Foo = impl Bar
ć§ćăĺŽĺçăŽă¨ă¤ăŞă˘ăšă¨ăăŚĺ¸¸ăŤč§Łéăăäşşăăăă¨ăăäşĺŽăăăăžăă ăăăăŁăŚăć¨čŤăăźăšăŽč§Łéă§ăăžăăăĺ ´ĺă§ăă䝣ćżć§ćăé¸ćăăăă¨ăŻăăăăäžçśă¨ăăŚčŻăčăă§ăă
ăăăŤă _: Trait
ć§ćăŻăĺŽéăŤăŻăăăăăć¨čŤăăźăšăŽč§ŁéăŤé˘ăăč°čŤăŤĺ˝ąéżăä¸ăăăăŽă§ăăăç§ăăĄăćăăă¨ăĺŽčĄăăžăăă ăžăă _
ăŤăăŁăŚć示ăăăć¨čŤăŻăăŞă˘ăźăăŁăăŻă§ăŻăŞăăăăäťăŽč¨čŞă¨ăŽéĄäźźć§ăŻčŻăăăăžăăă 揥ăŤă _
ăŻĺŽéăŽăżă¤ăăäťăŽĺ ´ćăŤčĄ¨ç¤şăăăăă¨ăćĺłăăžăăă impl Trait
ăŻĺŽéăŽăżă¤ăăé襨示ăŤăăăăăŤçšĺĽăŤč¨č¨ăăăŚăăžăă
ćĺžăŤăç§ăĺ形ĺăŽććĄăć¸ăăççąăŻăĺźć°ă¨ćťăä˝ç˝Žimpl Trait
ăŽćĺłăçľąä¸ăăĺĽăŽćšćłăčŚă¤ăăă¨ăă茳çšăăimpl Trait
ă ăŻăăăăăŻ-> impl Trait
ăĺä¸ăŽĺ
ˇä˝çăŞăżă¤ăăäżč¨źăăŞăăŞăŁăăă¨ăćĺłăăžăăăă¨ăŤăăăăăĺŠç¨ăăćšćłăŻçžĺ¨ăăăžăăă ăăăŚăććĄăăăă˝ăŞăĽăźăˇă§ăłăŻăăšăŚĺäťăŞĺéżçă§ă-ä˝ĺăŞĺŽĺçăŞabstract type
ăăŞăăŻă typeof
ăŞăŠăĺä¸ăżă¤ăăŽĺä˝ăŤäžĺăăăăăšăŚăŽäşşăŤă abstract type
äťăăŚăăŽĺä¸ăżă¤ăăŤăĺĺăabstract type
ć§ćďźăăăä˝ă§ăăďźăŻăééăăŞăĺ
¨ä˝çăŞĺŠçšă§ăă
ăăăăŽă˘ă¤ăă˘ăŻDiscordă§č°čŤăăăŚăăă丝ăŤreturn-positionă¨argument-position
impl Trait
ăŽçžĺ¨ăŽč§ŁéăŤä¸č˛Ťć§ăăŞăă¨ăăäşĺŽăŤĺşăĽăăŚăăă¤ăăŽĺéĄăăăăžăă
ĺäşşçăŤăŻăăăŽä¸ä¸č´ăĺŽéăŤăŻĺéĄăŤăŞăă¨ăŻćăăžăăă ĺźć°ăŽä˝ç˝Žă¨ćťăăŽä˝ç˝Žă¨ĺăŽä˝ç˝ŽăŤă¤ăăŚĺ ˇä˝çăŞĺăćąşĺŽăăăçŻĺ˛ăŻăăăŞăç´ćçăŤćŠč˝ăăăăă§ăă
ĺźăłĺşăĺ ăăŞăżăźăłăżă¤ăăćąşĺŽăăé˘ć°ăăăăžăă ăăĄăăăăăă§implTraită使ç¨ăăăă¨ăŻă§ăăžăăă éăăç解ăăăžă§ăŻăć示ăăăťăŠç´ćçă§ăŻăăăžăăă
ĺäşşçăŤăŻăăăŽä¸ä¸č´ăĺŽéăŤăŻĺéĄăŤăŞăă¨ăŻćăăžăăă
ăăăŻăăă ăăăç§ăŤç¤şĺăăŚăăăŽăŻăççžăçĄčŚăăĺż čŚăăăă¨ăăăă¨ă§ăŻăŞăăä¸č˛Ťć§ăăăăăăŤč¨č¨ăĺ誏ćăăĺż čŚăăăă¨ăăăă¨ă§ăďźăă¨ăă°ăĺ¤ĺ˝˘ĺć¨čŤă¨ăăŚčŞŹćăăăă¨ăŤăăŁăŚďźă ăăŽăăăŤăăŚăĺ°ćĽăŽćĄĺźľďźRFC 2071ăŞăŠďźăŻćˇˇäšąăŤăŞăŁăŚăăçŠäşăé˛ăăăăŤăć°ăăăä¸č˛Ťć§ăŽăă解éăŤç §ăăăŚăă§ăăŻăăăă¨ăă§ăăžăă
@rpjohnst
ĺä¸ĺăŽĺä˝ăŤäžĺăăăăăšăŚăŽäşşăŤăć˝čąĄĺć§ćďźăăăä˝ă§ăăďźăäťăăŚăăŽĺä¸ĺăŤăĺĺăäťăăăăăŤĺźˇĺśăăăă¨ăŻăééăăŞăĺ ¨ä˝çăŞĺŠçšă§ăă
ăăă¤ăăŽăąăźăšă§ăŻç§ăŻăăŽćć ăŤĺćăăžăăăăăăŻăŻăăźă¸ăŁăźăă¸ă§ăăŹăźăżăźă§ăŻćŠč˝ăăăăżă¤ăăä˝ă§ăăăăć°ăŤăăăçšĺŽăŽçšć§ăĺŽčŁ ăăăă¨ă ăăć°ăŤăăĺ¤ăăŽĺ ´ĺăŤăŻäşşé塼ĺŚçă§ăŻăăăžăăăă¨ăă°ăă¤ăăŹăźăżăłăłăăăźăżă使ç¨ăăžăă
@mikeyhewăăŞăăŻç§ă誤解ăăŚăăžă-ç§ăŻRFC2071 abstract type
ć§ćăäťăăŚĺĺăçşćăăăă¨ăŤă¤ăăŚčŠąĺż
čŚăăăăžăă
@rpjohnstăăăăăăăžăăăć確ăŤăăŚăăăŚăăăă¨ă
ĺżé
ăăăŤlet x: impl Trait
ĺž
ăŁăŚăăžăă
let x: impl Trait
ă¸ăŽĺĽăŽć缨ă¨ăăŚă futures
äžăŽăăă¤ăăç°ĄçĽĺăăžăăăăăäžăŽäžă§ăăçžĺ¨ă impl Trait
ă使ç¨ăăćŠč˝ăĺĺžăăăăă ăăŤé˘ć°ă使ç¨ăăŚăăžăă
fn make_sink_async() -> impl Future<Output = Result<
impl Sink<SinkItem = T, SinkError = E>,
E,
>> { // ... }
䝣ăăăŤăăăăŻé常ăŽletăă¤ăłăăŁăłă°ă¨ăăŚč¨čż°ă§ăăžăă
let future_sink: impl Future<Output = Result<
impl Sink<SinkItem = T, SinkError = E>,
E,
>> = // ...;
ĺż
čŚăŤĺżăăŚă let x: impl Trait
ăĺŽčŁ
ăăŚčŞ°ăăćĺ°ăăăă¨ăă§ăăžăă ăăăŻä¸ĺŻč˝ăŞăťăŠéŁăăăă¨ă§ăŻăăăžăăăă確ăăŤç°Ąĺă§ăăăăžăăă ă¨ăłăăŞăă¤ăłăďź
https://github.com/rust-lang/rust/blob/master/src/librustc/hir/lowering.rs#L3159ăŽreturntype impl TraităŤhttpsăŽăăźăŤăŤăżă¤ăăŤă˘ăŻăťăšăăĺż čŚăăăăžăă ďź//github.com/rust-lang/rust/blob/master/src/librustc/hir/lowering.rs#L3159ăăăŚăć°ăăçćăăăć˘ĺăŽă˘ă¤ăă ăăăźăŤăŤă¨ä¸çˇăŤčżăăăăă¨ă確čŞăăžăă
揥ăŤăĺ°ĺ
ăŽäşşăŽăżă¤ăăŤă˘ăŻăťăšăăă¨ăReturn
ăĺŽéăŤćĺšăŤăăăăăŤăĺż
ăExistentialContext
ăReturn
ăăŚăă ăăă
ăăăŻăă§ăŤç§ăăĄăé常ăŤé ăăăăŻăă§ăă ăăŁă¨ăăŠăăăŻăăăăžăăăă100ďź ăŞăżăźăłăă¸ăˇă§ăłăŽćéťăŽçšć§ăŽăăă§ăŻăăăžăăăăăťă¨ăăŠăŽĺ ´ĺăăăŽăăăŤĺä˝ăăăŻăă§ăă
@rpjohnst ă
ăăăăŽă˘ă¤ăă˘ăŻDiscordăŤé˘ăăč°čŤă§ćľŽăăłä¸ăăŁăŚăăžăăăă丝ăŤreturn-positionă¨argument-position implTraităŽçžĺ¨ăŽč§ŁéăŤä¸č˛Ťć§ăăŞăă¨ăăäşĺŽăŤĺşăĽăăŚăăă¤ăăŽĺéĄăăăăžăă
ăăŞăăăăŞăăŽč¨äşă§čŠąăăçŻĺ˛ăŤç§ăăĄăéŁăćťăăžăă ăăăŚăăăăăŻĺŽéăŤăŻĺ˛ăă§ăăăćŹĺź§ăăŤĺŻžĺżăăŚăăă¨ćăăžăăĺźć°ăŽä˝ç˝ŽăŽĺ ´ĺăŻĺźć°ăŞăšăăćťăăŽä˝ç˝ŽăŽĺ ´ĺăŻé˘ć°ăă¨ă¤ăŞă˘ăšăŽĺ ´ĺăŻă¨ă¤ăŞă˘ăšăĺŽçžŠăăăŚăăăšăłăźăăŤăŞăăžăă
ăăŽăšăŹăăă§ăŽč°čŤăĺ
ăŽRFCăăăăłĺćăŽč°čŤăŤĺşăĽăăŚă existential type
ĺ
ˇä˝çăŞć§ćăŽč§ŁćąşçăććĄăăRFCăéăăžăăďź https ďź
çžĺ¨ăŽĺŽĺăżă¤ăăŽĺŽčŁ
ă§ăŻăçžĺ¨ăŽăăšăŚăŽćťăä˝ç˝Žă襨ăăăăŤä˝żç¨ăăăă¨ăŻă§ăăžăăimpl Trait
䝼ćĽăĺŽçžŠimpl Trait
ăăšăŚăŽă¸ă§ăăŞăăŻĺĺźć°ăăă¨ĺăăă¨ăčĄăăă¨ăĺŻč˝ă§ăăăšăă§ăăă¨ăăŚăăćŞä˝żç¨ăŽĺ ´ĺăŽăăŁăăăŁexistential type
ă§ăăăćŞä˝żç¨ăŽĺăăŠăĄăźăżăźăŽčŚĺă襨示ăăăžă:(éăłĺ ´ďź
fn foo<T>(_: T) -> impl ::std::fmt::Display {
5
}
existential type Bar<T>: ::std::fmt::Display;
fn bar<T>(_: T) -> Bar<T> {
5
}
ăżă¤ăăăŠăĄăźăżăŤăŻăĺ¤čŞä˝ă使ç¨ăăăŚăăŞăĺ ´ĺă§ăăčżăăăimpl Trait
ćĺšćéăĺśéăăĺ
é¨ćĺšćéăĺŤăžăăĺŻč˝ć§ăăăăăăăăăŻĺéĄăŤăŞăĺŻč˝ć§ăăăăžăăéăłĺ ´ăŽBar
ăă<T>
ăĺé¤ăăŚăă ăăăä¸č¨ă§ă foo
ăŽĺźăłĺşăbar
ćŠč˝ăăăă¨ă確čŞăăžăă
çžĺ¨ăŽĺŽĺĺăŽĺŽčŁ ă使ç¨ăăŚăçžĺ¨ăŽăăšăŚăŽćťăä˝ç˝Žă襨ăăă¨ăŻă§ăăžăăă
ă§ăăžăăăăăŻé常ăŤä¸äžżă§ăă PhantomData
ăăŁăźăŤă+ĺŽéăŽăăźăżăăŁăźăŤăăćă¤ăăĽăźăżă¤ăăčżăăĺŽéăŽăăźăżăăŁăźăŤăă¸ăŽčť˘éă¨ăăŚăăŹă¤ăăĺŽčŁ
ăăăă¨ăă§ăăžă
@ oli-obkčż˝ĺ ăŽă˘ăăă¤ăšăăăăă¨ăă ăăŞăăŽäťĽĺăŽă˘ăăă¤ăšă¨@cramertjăăăŽăăă¤ăă§ăç§ăŻăăăăăăăŤăăă
@fasihrana @ Nemo157ä¸č¨ăĺç §ăăŚăă ăăă ăăśăć°éąéă§ďź :-)
existential type
ăĺăăŠăĄăźăżăźăćéťçăŤăăŁăăăŁă@ Nemo157ă§č¨ĺăăăŚăăďźĺä˝ăŻćĺłçăŞăăŽă§ăăăăăŽăžăžćŽăăă¨ă誰ăăć確ăŤă§ăăžăăďź ďź42940ă解ăăŽă§ć°ăŤĺ
ĽăŁăŚăăžă
ăăă¨ăăăăŁăŚĺŽčŁ ăăžăă
@ArnavionăŻăăăăăŻćĺłçăŞăăŽă§ăăăRustă§äťăŽă˘ă¤ăă 厣č¨ďźăăšăăăăé˘ć°ăŞăŠďźăćŠč˝ăăćšćłă¨ä¸č´ăăžăă
existential_type
ă¨never_type
éăŽç¸äşä˝ç¨ăŤă¤ăăŚ
ăăśă!
ăŻăé˘äżăăçšć§ăŤé˘äżăŞăăăăăăĺŽĺçăŞăżă¤ăăĺăăăă¨ăă§ăăăŻăă§ăă
existential type Mystery : TraitThatIsHardToEvenStartImplementing;
fn hack_to_make_it_compile() -> Mystery { unimplemented!() }
ăăă¨ăăĺĺ¨ăăăżă¤ăăčŞĺçăŤćşăăăă¨ăă§ăăăżă¤ăăŹăăŤăŽunimplemented!()
ă¨ăăŚćŠč˝ăăçšĺĽăŞă˘ăłăżăăăŁăăŤăżă¤ăăăăă§ăăăăďź
@viăăăŻăä¸čŹçăŞăăăăŠăŤă䝼ĺ¤ăŽéčŞĺˇąăĄă˝ăăăžăăŻé˘éŁăăĺăŞăă§ăĺăăăšăŚăŽçšć§ăĺŽčŁ ăăăšăă§ăŻăŞăăăŤčŠ˛ĺ˝ăăă¨ćăăžăă ăăăăăăăăŠăă§čż˝čˇĄăăăăăŻăăăăžăăă
ăăŹă¤ăăĄă˝ăăăŽćťăĺăŽăľăăźăăăžăăŞăćĄĺźľăăäşĺŽăŻăăăžăăďź
existential type
ăă§ăŤăăŹă¤ăăĄă˝ăăă§ćŠč˝ăăžăă Wrt impl Trait
ăăăăŻRFCă§ăăăŤăăźăăăŚăăžăăďź
@alexreg fn foo<T>(..) -> impl Bar<T>
ďźăăă-> Self::AnonBar0<T>
ďźăŽăăăŞăăŽăăăĺ ´ĺăGATăĺżĺăŽé˘éŁäťăăăăăżă¤ăăŤčąçłă§ăăĺż
čŚăăăă¨ćăăžăă
@CentrilăŻăăă§impl Bar
ăŤ<T>
ăăăă¤ăăimpl Bar
ăăďź impl Trait
ăŽćéťçăŞĺăăŁăăăŁĺä˝ăŻă fn foo<T>(self, t: T) -> impl Bar;
ăăăŞăăŽă§ăGATăŽĺăĺż
čŚć§ăĺĺžăăăă¨ăćĺłăăžăă
@ Nemo157çłă訳ăăăžăăăç§ăŻăăžăăă§ăăă ăăăăăăŞăăŽäžăŻĺéĄăăăăŤăă示ăăŚăăžăă ăăăă¨ă ďźďź
@alexreg fn fooăŽăăăŞăăŽăăăĺ ´ĺăGATăĺżĺăŽé˘éŁäťăăăăăżă¤ăăŤčąçłă§ăăĺż čŚăăăă¨ćăăžă
ďź..ďź-> implăăź ďźĺ¤§ăžăăŤăŞăăžă-> Self :: AnonBar0 ďźă
ăăăăŞăăťăŠă ćŁç´ăŞă¨ăăăĺłĺŻăŤĺż čŚă¨ăăăăă§ăŻăăăžăăăăăăăŻç˘şăăŤăăăĺŽčŁ ăă1ă¤ăŽćšćłă§ăă GATăŽĺăăŽćŹ ĺŚăŻăç§ăŤăŻĺ°ăĺżé ă§ăă...éˇăéä˝ăčăăŚăăžăăă
ăăŞă˘ăźă¸ďź https ďź {let,const,static} foo: impl Trait
ăă§ăăŻăăăŻăšăăŞăłăŤă§ăăă¨ćăăžăă
ç§ăŻăăăžă§ăŤć¸ăăă¨ăă§ăăă§ăăăăďź
trait Foo {
fn GetABar() -> impl Bar;
}
??
ăăăăăăă§ăŻăăăžăăă ăăăăç§ăăĄăĺžăăăăăăŞăăăăŤăăšăŚăćşĺăăăăăŽé˛čĄä¸ăŽč¨çťăăăăžă
trait Foo {
type Assoc: Bar;
fn get_a_bar() -> Assoc;
}
impl Foo for SomeType {
fn get_a_bar() -> impl Bar {
SomeThingImplingBar
}
}
ăăŽćŠč˝ăŻă揥ăŽĺ˝˘ĺźă§ćŻćŠčŠŚăăă¨ăă§ăăžăă
impl Foo for SomeType {
existential type Assoc;
fn get_a_bar() -> Assoc {
SomeThingImplingBar
}
}
ăăăŤé˘ăă芳細ć ĺ ąăĺ ĽćăăăăăŽčŻăăšăżăźăăŻă httpsďź//github.com/rust-lang/rfcs/pull/2071 ďźăăăłăăăăăŞăłăŻăăăŚăăăăšăŚăŽăăŽďźă§ăă
@ oli-obk on rustc 1.32.0-nightly (00e03ee57 2018-11-22)
ăăăŽăăăŞimpl
ăăăăŻă§ćŠč˝ăăăŤăŻă existential type
ăŽçšć§ĺ˘çăćĺŽăăĺż
čŚăăăăžăă ăăăŻćĺž
ăăăŚăăžăăďź
@jonhooăŻăĺż čŚăŞçšć§äťĽä¸ăŽăăŽăćäžă§ăăăăăçšć§ăćĺŽă§ăăă¨äžżĺŠă§ăă
impl Foo for SomeDebuggableType {
existential type Assoc: Bar + Debug;
fn get_a_bar() -> Assoc {
SomeThingImplingBarAndDebug
}
}
fn use_debuggable_foo<F>(f: F) where F: Foo, F::Assoc: Debug {
println!("bar is: {:?}", f.get_a_bar())
}
ĺż čŚăŞçšć§ăŻăĺŽĺçăŞé˘éŁăżă¤ăăŤćéťçăŤčż˝ĺ ă§ăăăăăăăăăćĄĺźľăăă¨ăăŤĺż čŚăŞăŽăŻĺ˘çă ăă§ăăăĺäşşçăŤăŻăĺŽčŁ ăŤăăăăé 罎ăăĺż čŚăăăă¨ăăăăźăŤăŤăăăĽăĄăłăă弽ăżăžăă
@ Nemo157ăăăăăżăžăăăç§ăćĺłăăăŽăŻăçžĺ¨ăăŞăăŻăăăŤéçăăăă¨ăăăă¨ă§ăă ă¤ăžăăăăăŻăłăłăă¤ăŤăăăžăăă
impl A for B {
existential type Assoc;
// ...
}
ä¸ćšăăăăŻďź
impl A for B {
existential type Assoc: Debug;
// ...
}
ăăăăăă§ăçšć§ăé˘éŁăăăżă¤ăăŽĺ˘çăĺż čŚă¨ăăŞăĺ ´ĺă§ăăăăăŞăăŻăžă ĺĺ¨ăżă¤ăďźçŠşăăăăăŞăďźďźéăłĺ ´ďźăŤĺ˘çăä¸ăăŞăăă°ăŞăăžăăďź
trait Foo {
type Assoc;
fn foo() -> Self::Assoc;
}
struct Bar;
impl Foo for Bar {
existential type Assoc: ;
fn foo() -> Self::Assoc { Bar }
}
ăăăŻç§ăŤăŻă¨ăă¸ăąăźăšăŽăăăŤćăăžăăçĄéăŽĺĺ¨ĺăćă¤ă¨ăăăă¨ăŻăăŚăźăśăźăŤďźčŞĺçšć§äťĽĺ¤ăŽďźćä˝ăćäžăăŞăăă¨ăćĺłăăžăăăăă§ăăăăŻä˝ăŤä˝żç¨ă§ăăă§ăăăăďź
ăžăă -> impl Trait
ă§ĺăăă¨ăčĄăćšćłăŻăăăžăăă -> impl ()
ăŻć§ćă¨ăŠăźă§ăăă -> impl
čŞä˝ăŻerror: at least one trait must be specified
ăžăă ĺŽĺĺăŽć§ćătype Assoc = impl Debug;
ăŞăŠăŤăŞăĺ ´ĺăĺ°ăŞăă¨ă1ă¤ăŽçšć§ăăă¤ăłăăăăŚăăŞăă¨ăé˘éŁäťăăăăĺăćĺŽăăćšćłăăŞăăăă§ăă
@ Nemo157ăăăç§ăŻăăŞăăä¸ă§ććĄăăăłăźăăćĺéă芌ăăăŽă§ć°ăĽăăžăăăăăăŚăăăŻăăžăăăăžăăă§ăăďźpç§ăŻăăăçšć§ăăĺ˘çăć¨ć¸Źăăă ăăă¨ä¸ç¨ŽăŽäťŽĺŽăăăžăăă äžăă°ďź
trait Foo {
type Assoc: Future<Output = u32>;
}
struct Bar;
impl Foo for Bar {
existential type Assoc;
}
ăăä¸ĺşŚFuture<Output = u32>
ăćĺŽăăĺż
čŚăăŞăăŽăŻĺççă§ăăăăăŤčŚăăžăăăăăăăŻćŠč˝ăăžăăă existential type Assoc: ;
ďźăăăé常ăŤĺĽĺŚăŞć§ćăŽăăă§ăďźăăăŽć¨čŤăčĄăăŞăă¨ćăăžăăďź
trait Foo { type Assoc; fn foo() -> Self::Assoc; } struct Bar; impl Foo for Bar { existential type Assoc: ; fn foo() -> Self::Assoc { Bar } }
ăăăŻç§ăŤăŻă¨ăă¸ăąăźăšăŽăăăŤćăăžăăçĄéăŽĺĺ¨ĺăćă¤ă¨ăăăă¨ăŻăăŚăźăśăźăŤďźčŞĺçšć§äťĽĺ¤ăŽďźćä˝ăćäžăăŞăăă¨ăćĺłăăžăăăăă§ăăăăŻä˝ăŤä˝żç¨ă§ăăă§ăăăăďź
ăăăăĺăçšć§ăŽĺŽčŁ ă§ćśč˛ťăăăăăŤä˝żç¨ăăăă¨ăŻă§ăăžăăăďź ăăŽăăăŞăăŽďź
trait Foo {
type Assoc;
fn create_constructor() -> Self::Assoc;
fn consume(marker: Self::Assoc) -> Self;
fn consume_box(marker: Self::Assoc) -> Box<Foo>;
}
ĺ°ă塼复ăĺăăăăŚăăžăăă彚ăŤçŤă¤ăăăăăžăăăç术ăŽççąăăăĺŽéăŽć§é ä˝ăŽĺăŤăăă¤ăăŽäşĺé¨ĺăć§çŻăăĺż čŚăăăçśćłăćłĺă§ăăžăă ăžăăŻă揥ăŽăăăŤăŞăăžăă
trait MarkupSystem {
type Cache;
fn create_cache() -> Cache;
fn translate(cache: &mut Self::Cache, input: &str) -> String;
}
ăŠăĄăăŽĺ ´ĺăă existential type Assoc;
ă彚çŤăĄăžăă
implăăŹă¤ăăŤé˘éŁäťăăăăăżă¤ăăĺŽçžŠăăéŠĺăŞćšćłăŻä˝ă§ăăďź
ăă¨ăă°ă Action
ăăŹă¤ăăăăăăăŹă¤ăăŤé˘éŁäťăăăăăżă¤ăăŽĺŽčŁ
ăé俥ĺŻč˝ă§ăăăă¨ă確čŞăăăĺ ´ĺă揥ăŽăăăŤă§ăăžăăďź
pub trait Action {
type Result;
fn call(&self) -> Self::Result;
}
impl MyStruct {
pub fn new(name: String) -> impl Action
where
Return::Result: Send //This Return should be the `impl Action`
{
ActionImplementation::new()
}
}
ăăăŻçžĺ¨ä¸ĺŻč˝ăŞăă¨ă§ăăďź
@acycliczebraăăŽć§ćăŻ-> impl Action<Result = impl Send>
ă ă¨ćăăžăăăăăŻăăă¨ăă°ăĺĽăŽĺżĺăŽimpl Trait
ăżă¤ăă使ç¨ăăă ăăŽ-> impl Iterator<Item = u32>
ă¨ĺăć§ćă§ăă
impl Trait
ć§ćăć§é ä˝ăăŁăźăŤăăŞăŠăŤćĄĺźľăăăă¨ăŤă¤ăăŚăŽč°čŤăŻăăăžăăďź ăă¨ăă°ăăăăŞăăŻă¤ăłăżăźăă§ă¤ăšăŽçšĺŽăŽă¤ăăŹăźăżăżă¤ăăŽăŠăăăźăĺŽčŁ
ăăŚăăĺ ´ĺăŻă揥ăŽăăăŤăŞăăžăă
struct Iter<'a> {
inner: std::collections::hash_map::Iter<'a, i32, i32>,
}
çšĺŽăŽçšć§ăŽçŻĺ˛ăćşăăăŚăăéăăĺŽéăŽăżă¤ăăăăžăć°ăŤăăŞăçśćłă§ĺ˝šçŤăĄăžăă ăăŽäžăŻĺç´ă§ăăăéĺťăŤăăšăăăăĺăăŠăĄăźăżăźăŽćă使ç¨ăăŚé常ăŤéˇăĺăč¨čż°ăăŚăăçśćłăŤééăăžăăăăăăExactSizeIterator
ăă¨äťĽĺ¤ăŻä˝ăć°ăŤăăŞăăŽă§ăćŹĺ˝ăŤä¸čŚă§ăă
ăă ăăIIRCăŽĺ ´ĺăçžćçšă§ăŻimpl Trait
ă§č¤ć°ăŽĺ˘çăćĺŽăăćšćłăŻăŞăă¨ćăăžăăăăŽăăă Clone
ăăăŞäžżĺŠăŞăăŽă夹ăăă¨ăŤăŞăăžăă
@AGausmannăăŽăăźăăŤé˘ăăćć°ăŽč°čŤăŻă httpsďź//github.com/rust-lang/rfcs/pull/2515ăŤăăăžăă ăăăŤăăă type Foo = impl Bar; struct Baz { field: Foo } ...
ă¨č¨ăăă¨ăă§ăăžăă type Foo = impl Bar;
ĺŽĺŽăăăĺžăăăŽăăăŽç çłă¨ăăŚfield: impl Trait
ăć¤č¨ăăăă¨ćăăăăăăžăăă ăăăŻĺççăŞăăŻăăăŹăłăăŞăźăŞäžżĺŠăŞćĄĺźľăŽăăăŤćăăžăă
@Centril ă
field: impl Trait
ăç çłă¨čŚăŞăăăă¨ćăăăăăăžăă
ăăăŻĺççă§ăŻăŞăă¨ćăăžăă ć§é ä˝ăăŁăźăŤăăŻăžă ĺ ˇčąĄĺă§ăŞăăă°ăŞăăŞăăŽă§ăăăăé˘éŁäťăăăăŚăăé˘ć°ăŽćťăĺ¤ăăłăłăă¤ăŠăźăŤéçĽăăĺż čŚăăăăžăă ăăăć¨ć¸Źăăăă¨ăŻă§ăăžăăăč¤ć°ăŽćŠč˝ăăăĺ ´ĺăăăăăŠăă§ăăăăčŚă¤ăăăŽăŻăăăťăŠç°Ąĺă§ăŻăăăžăăăăăŽăăăŞĺ ´ĺăRustăŽé常ăŽăăŞăˇăźăŻć示çă§ăă
ăăăć¨ć¸Źăăăă¨ăŻă§ăăžăăăč¤ć°ăŽćŠč˝ăăăĺ ´ĺăăăăăŠăă§ăăăăčŚă¤ăăăŽăŻăăăťăŠç°Ąĺă§ăŻăăăžăă
茪ĺăŽç¨éăĺŽçžŠăăéăŽčŚäťśăăăăŤă˘ăăăăžăă ăăŽĺ ´ĺă茪ĺăčżăăŽăŻĺăă˘ă¸ăĽăźăŤĺ
ăŽăăšăŚăŽé˘ć°ăŤăŞăăžăă čŚă¤ăăăŽăŻăăăťăŠéŁăăăă¨ă§ăŻăŞăăăă§ăă ăă ăăćĄĺźľćŠč˝ă使ç¨ăăĺăŤă type Foo = impl Bar;
芹ă解湺ăăăă¨ćăăžăă
çžĺ¨ăŽexistential type
ĺŽčŁ
ăŤăă°ăčŚă¤ăăŁăă¨ćăăžăă
ăłăźă
trait Collection {
type Element;
}
impl<T> Collection for Vec<T> {
type Element = T;
}
existential type Existential<T>: Collection<Element = T>;
fn return_existential<I>(iter: I) -> Existential<I::Item>
where
I: IntoIterator,
I::Item: Collection,
{
let item = iter.into_iter().next().unwrap();
vec![item]
}
ă¨ăŠăź
error: type parameter `I` is part of concrete type but not used in parameter list for existential type
--> src/lib.rs:16:1
|
16 | / {
17 | | let item = iter.into_iter().next().unwrap();
18 | | vec![item]
19 | | }
| |_^
error: defining existential type use does not fully define existential type
--> src/lib.rs:12:1
|
12 | / fn return_existential<I>(iter: I) -> Existential<I::Item>
13 | | where
14 | | I: IntoIterator,
15 | | I::Item: Collection,
... |
18 | | vec![item]
19 | | }
| |_^
error: could not find defining uses
--> src/lib.rs:10:1
|
10 | existential type Existential<T>: Collection<Element = T>;
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
ăăăŻstackoverflowă§ăčŚă¤ăăăă¨ăă§ăăžăă
ăăŽăąăźăšăăăăŤăľăăźăă§ăăăăŠăăăŻ100ďź ăăăăžăăăăă§ăăăă¨ăŻă2ă¤ăŽćąç¨ăăŠăĄăźăżăźăćă¤ăăăŤé˘ć°ăć¸ăç´ăăă¨ă§ăă
fn return_existential<I, J>(iter: I) -> Existential<J>
where
I: IntoIterator<Item = J>,
{
let item = iter.into_iter().next().unwrap();
vec![item]
}
ăăăă¨ăďź
ăăăăăăŻç§ăstackoverflowăŽć稿ăŤć稿ăăăăăŤăăăă¨ă§ăďź
fn return_existential<I, T>(iter: I) -> Existential<T>
where
I: IntoIterator<Item = T>,
I::Item: Collection,
{
let item = iter.into_iter().next().unwrap();
vec![item]
}
çšć§ăŽăłăłăăăšăĺ
ă§impl Trait
ăĺŠç¨ă§ăăăăăŤăăč¨çťăŻăăăžăăďź
é˘éŁăăĺă¨ăăŚă ăă§ăŞăăăĄă˝ăăăŽćťăĺ¤ă¨ăăŚăă
ăăŹă¤ăăŽimplăăŹă¤ăăŻăăăă§čż˝čˇĄăăăŚăăăăŽă¨ăŻĺĽăŽćŠč˝ă§ăăăçžĺ¨RFCăŻăăăžăăă ăăŽĺéăŤăŻăăŞăéˇăč¨č¨ăŽć´ĺ˛ăăăă2071ďźć˘ĺăŽăżă¤ăďźăŽĺŽčŁ ăĺŽĺŽăăăžă§ăăăăŞăĺ垊ăŻĺťśćăăăžăăăăăŻăĺŽčŁ ăŽĺéĄă¨ćŞč§ŁćąşăŽć§ćďźĺĽăŽRFCăăăăžăďźă§ăăăăŻăăăžăă
@cramertjć§ćăŻăťăźč§ŁćąşăăăŚăăžăă çžĺ¨ă丝ăŞăăăăŤăźăŻGATă ă¨ćăăžăă
@alexreg ďź https ďź
@varkorăăăç§ăŻăă 漽茳çă§ăă彟ăăŻăăăŤăăŽRFCă§ĺ ăčŚăă§ăăăă ;-)
揥ăŽăăăŞăă¨ăĺŻč˝ă§ăăăăďź
#![feature(existential_type)]
trait MyTrait {}
existential type Interface: MyTrait;
struct MyStruct {}
impl MyTrait for MyStruct {}
fn with<F, U>(cb: F) -> U
where
F: FnOnce(&mut Interface) -> U
{
let mut s = MyStruct {};
cb(&mut s)
}
hint
é˘ć°ă使ç¨ăăŚInterface
ĺ
ˇä˝çăŞăżă¤ăăćĺŽăăĺ ´ĺăŤăŽăżăăăăĺŽčĄă§ăăžăă
#![feature(existential_type)]
trait MyTrait {}
existential type Interface: MyTrait;
struct MyStruct {}
impl MyTrait for MyStruct {}
fn with<F, U>(cb: F) -> U
where
F: FnOnce(&mut Interface) -> U
{
fn hint(x: &mut MyStruct) -> &mut Interface { x }
let mut s = MyStruct {};
cb(hint(&mut s))
}
ăłăźăŤăăăŻăĺźć°ăŽĺăé¸ćă§ăăă¨ăăăăăŠăŽăăăŤč¨čż°ăăžăăďź ĺŽéăŤăŻnvmă§ăăăé常ăŽă¸ă§ăăŞăăŻă使ç¨ăăŚč§Łćąşă§ăăă¨ćăăžăă
@CryZeăăŞăăć˘ăăŚăăăăŽăŻimpl Trait
ă¨ăŻçĄé˘äżă§ăă ç§ăçĽăŁăŚăăăă¨ăŻăăšăŚă httpsďź//github.com/rust-lang/rfcs/issues/2413ăĺç
§ăăŚ
ăăăŻć˝ĺ¨çăŤăăŽăăăŤčŚăăă§ăăăďź
trait MyTrait {}
struct MyStruct {}
impl MyTrait for MyStruct {}
fn with<F, U>(cb: F) -> U
where
F: for<I: Interface> FnOnce(&mut I) -> U
{
let mut s = MyStruct {};
cb(hint(&mut s))
}
@KrishnaSannasiăăăé˘ç˝ăă ăăăă¨ăďź
ăăăŻćŠč˝ăăăŻăă§ăăďź
#![feature(existential_type)]
trait MyTrait {
type AssocType: Send;
fn ret(&self) -> Self::AssocType;
}
impl MyTrait for () {
existential type AssocType: Send;
fn ret(&self) -> Self::AssocType {
()
}
}
impl<'a> MyTrait for &'a () {
existential type AssocType: Send;
fn ret(&self) -> Self::AssocType {
()
}
}
trait MyLifetimeTrait<'a> {
type AssocType: Send + 'a;
fn ret(&self) -> Self::AssocType;
}
impl<'a> MyLifetimeTrait<'a> for &'a () {
existential type AssocType: Send + 'a;
fn ret(&self) -> Self::AssocType {
*self
}
}
existential_type
ćŠč˝ăŽăăăŤăč¨čŞă§existential
ăăźăŻăźăăäżćăăĺż
čŚăăăăžăăďź
@jethrogbăŻăă çžĺ¨ăăă§ăŻăŞăă¨ăăäşĺŽăŻăă°ă§ăă
@cramertjăăăăžăăă ăăŽăăăŤĺĽăŽĺéĄăćĺşăăĺż čŚăăăăžăăăăăă¨ăăăăŤç§ăŽć稿ă§ĺĺă§ăăďź
ĺéĄăćĺşăăăŽăŻç´ ć´ăăăăă¨ă§ăăăăăă¨ăďź :)
existential_type
ćŠč˝ăŽăăăŤăč¨čŞă§existential
ăăźăŻăźăăäżćăăĺż čŚăăăăžăăďź
type-alias-impl-traitćŠč˝ăĺŽčŁ ăăăă¨ăďźă¤ăžăălintăŤĺ Ľăăăăă¨ăďźăăăăăăăŤéć¨ĺĽ¨ăŤăăćçľçăŤć§ćăăĺé¤ăăăă¨ăćĺłăăŚăăă¨ćăăžăă
誰ăăăăăăć確ăŤăăăă¨ăă§ăăžăă
impl Trait
ăăä¸čŹçăŤčż˝čˇĄăăăĄăżă¤ăˇăĽăźăćŻćăăŚăăăéăăďź https ďź
implăăŹă¤ăăŽä˝żç¨ćšćłăŤé˘ăăčŻăäžăŻ1ă¤ăăăăžăăăé常ăŤć˛ăă
ćăĺčăŤăŞăăłăĄăłă
ăăăŻFCPăçľäşăăĺăŽćĺžăŽăăŁăłăšăŞăŽă§ăčŞĺčŞĺçšć§ăŤĺŻžăăŚćĺžăŽč°čŤăăăăă¨ćăăžăă ăăăŻĺ°ăăăăăăŽăă¨ă ă¨ćăăžăăŽă§ăçžĺ¨ăŽĺŽčŁ ăŤăłăăăăăĺăŤăăăăăăăŽĺéĄăŤćŁĺźăŤĺŻžĺŚăăăă¨ćăăžăă
impl Trait
ăăŠăăźăăŚăăŞăäşşăŽăăăŤć確ăŤăăăăăŤăăăăŻç§ăć示ăăŚăăĺéĄă§ăăimpl X
ĺă§čĄ¨ăăăĺăŻăçžĺ¨ăăăŽčĺžăŤăăĺ ˇä˝çăŞĺăčŞĺçšć§ăĺŽčŁ ăăŚăăĺ ´ĺăŤăŽăżăčŞĺçšć§ăčŞĺçăŤĺŽčŁ ăăžăă ĺ ˇä˝çăŤăŻă揥ăŽăłăźăĺ¤ć´ăčĄăăăĺ ´ĺăé˘ć°ăŻăłăłăă¤ăŤăçśčĄăăžăăăčżăăăĺăSend
ăĺŽčŁ ăăŚăăă¨ăăäşĺŽăŤäžĺăăé˘ć°ăŽä˝żç¨ăŻĺ¤ąćăăžăăďźăăç°ĄĺăŞäžďźĺä˝ä¸ăĺ é¨ĺ¤ć´ăŤăăé厳ăçşçăăžăďź
ăăŽĺéĄăŻć確ă§ăŻăăăžăăă čŞĺçšć§ăăăŞăźăŻăăăăă¨ăăé常ăŤć éăŞćąşĺŽăăăăžăăăăăă§ăŞăĺ ´ĺăŻăé俥ăžăăŻĺć䝼ĺ¤ăŽä˝ăăčżăăăšăŚăŽé˘ć°ăŤ
+ !Send + !Sync
ăč¨ĺŽăăĺż čŚăăăăžăăé˘ć°ăčżăĺ ˇä˝çăŞăżă¤ăăŤĺç´ăŤĺŽčŁ ă§ăăŞăĺŻč˝ć§ăŽăăäťăŽăŤăšăżă čŞĺçšć§ăŤă¤ăăŚăŽä¸ć確ăŞčŠąăăăăžăă ăăăăŻăĺžă§č§Śăă2ă¤ăŽĺéĄă§ăăăžăăăăŽĺéĄăŤĺŻžăăç§ăŽĺ寞ćčŚăç°ĄĺăŤčż°ăšăăă¨ćăăžăăăăăŤăăăé˘ć°ćŹä˝ăĺ¤ć´ăăŚăĺ ŹéăăăŚăăAPIăĺ¤ć´ă§ăăžăă ăăăŤăăăăłăźăăŽäżĺŽć§ăç´ćĽä˝ä¸ăăžăă
ăăłăŽçşçăéăăŚă使ăăăăăăăĺéˇć§ăŽĺ´ă§čޤăăçŻăćąşĺŽăăŞăăăŚăăžăăă ć°čŚĺĺ Ľč ăăăăăčŚăă¨ăĺéˇć§ăŽăăăŤĺéˇć§ă§ăăă¨čăăžăăăăăă§ăŻăăăžăăă ć§é ä˝ăŤăłăăźăčŞĺçăŤĺŽčŁ ăăăŞăăăé˘ć°ăˇă°ăăăŁă§ăăšăŚăŽĺăć示çăŤăăăăŠăăăŤăăăăăăĺćąşĺŽăŻäżĺŽć§ăŽăăă§ăă
ç§ăäşşă ăŤRustăç´šäťăăă¨ăă確ăăŤăç§ăŻĺ˝źăăŤăšăăźăăççŁââć§ăăĄă˘ăŞăŽĺŽĺ ¨ć§ă示ăăă¨ăă§ăăžăă ăăăăčĄăăŤăŻăšăăźăăăăăžăă ă¨ă¤ăăŻăĄă˘ăŞĺŽĺ ¨ć§ăăăăžăă PythonăŤăŻççŁć§ăăăăžăă RustăćăŁăŚăăăăŽăŻăăăăăšăŚăŤĺăŁăŚăăăäżĺŽć§ăăăăžăă ăŠă¤ăăŠăŞăŽä˝ćč ăă˘ăŤă´ăŞăşă ăăăĺšççăŤĺ¤ć´ăăăĺ ´ĺăăžăăŻăŻăŹăźăăŽć§é ăăăç´ăăăĺ ´ĺăŻăééăăçŻăăă¨ăăŤéçĽăăă¨ăă埡ĺăŞäżč¨źăăłăłăă¤ăŠăăăăăžăă ăăłăă¨ăăă§ăç§ăŽăłăźăăŻăĄă˘ăŞăŽĺŽĺ ¨ć§ă ăă§ăŞăăăă¸ăăŻă¨ă¤ăłăżăźăă§ă¤ăšăŽčŚłçšăăăćŠč˝ăçśăăă¨ç˘şäżĄă§ăăžăă _RustăŽăăšăŚăŽé˘ć°ă¤ăłăżăźăă§ăźăšăŻăé˘ć°ăŽĺ厣č¨ă§ĺŽĺ ¨ăŤčĄ¨çžă§ăăžă_ă
impl Trait
ăăŽăžăžĺŽĺŽăăăăă¨ăŻăăăŽäżĄĺżľăŤĺăăĺŻč˝ć§ăéŤăă§ăă 確ăăŤăăłăźăăăă°ăăä˝ćăăăăăŤăŻé常ăŤäžżĺŠă§ăăăăăăăżă¤ăăä˝ćăăĺ ´ĺăŻPythonă使ç¨ăăžăă RustăŻăçćéăŽć¸ăčžźăżĺ°ç¨ăłăźăă§ăŻăŞăăéˇćçăŞäżĺŽć§ăĺż čŚăŞĺ ´ĺăŤé¸ćăăăč¨čŞă§ăăăăă§ăăĺéĄăć確ă§ăŻăŞăăăăăăăćŞăĺŻč˝ć§ăŻă大ăăăă¨č¨ăăžăă ăăăăăčŞĺçšć§ăăŽĺ ¨ä˝çăŞčăćšăŻéć示çă§ăă Sendă¨SyncăŻăăăăŞăăŻĺŽŁč¨ă§ăŻăŞăăć§é ä˝ăŽĺ 厚ăŤĺşăĽăăŚĺŽčŁ ăăăžăă ăăŽćąşĺŽăŻăăłăŽăăăŤăăžăăăŁăăŽă§ăĺć§ăŤčĄĺăă
impl Trait
ăăăžăăăĺŻč˝ć§ăăăăžăăăă ăăé˘ć°ă¨ć§é ăŻăłăźăăăźăšă§ç°ăŞăćšćłă§ä˝żç¨ăăăăăăăŻĺăĺéĄă§ăŻăăăžăăă
ć§é ä˝ăŽăăŁăźăŤăăĺ¤ć´ăăă¨ăăăŠă¤ăăźăăăŁăźăŤăă§ăăŁăŚăăĺŽéăŽĺ 厚ăĺ¤ć´ăăŚăăăă¨ăăăăŤăăăăžăă éé俥ăžăăŻéĺćăăŁăźăŤăăćă¤ć§é ăŻăăŽé¸ćăčĄăăăŠă¤ăăŠăŞăŽăĄăłăăăŻăPRăć§é ăŽăăŁăźăŤăăĺ¤ć´ăăă¨ăăŤĺ確čŞăăăă¨ăçĽăŁăŚăăžăă
é˘ć°ăŽĺ é¨ăĺ¤ć´ăăĺ ´ĺăăăăŠăźăăłăšă¨ćŁç˘şăăŽä¸ĄćšăŤĺ˝ąéżăä¸ăăĺŻč˝ć§ăăăăă¨ăŻćăăă§ăă ăă ăăRustă§ăŻăćŁăăăżă¤ăăčżăăăŚăăăă¨ă確čŞăăĺż čŚăŻăăăžăăă é˘ć°ĺŽŁč¨ăŻç§ăăĄăĺŽăăŞăăă°ăŞăăŞăĺłăăĺĽç´ă§ăăă
rustc
ăŻç§ăăĄăŽĺžăăçŁčŚăăžăă ăăăŻăć§é ä˝ăŽčŞĺçšć§ă¨é˘ć°ăŽćťăĺ¤ăŽéăŽç´°ăçˇă§ăăăé˘ć°ăŽĺ é¨ăĺ¤ć´ăăăă¨ăŻăŻăăăŤćĽĺ¸¸çă§ăă ă¸ă§ăăŹăźăżăźăĺŠç¨ăăĺŽĺ ¨ăŞFuture
ăă§ăăăă-> impl Future
čżăé˘ć°ăĺ¤ć´ăăăŽăăăăŤćĽĺ¸¸çăŤăŞăăžăă ăăăăŻăăšăŚăăłăłăă¤ăŠăăăăăăŁăăăăŞăĺ ´ĺăĺ¤ć´ăăăé俥/ĺćĺŽčŁ ăŤă¤ăăŚä˝ćč ăăšăŻăŞăźăăłă°ăăĺż čŚăăăĺ¤ć´ăŤăŞăăžăăăăă解湺ăăăăăŤăĺ ăŽRFCăŽčŞŹćă¨ă¨ĺ¤ćă§ăăžăă äżĺŽçăŞimplçšć§RFCăŽăăŽăťăŻăˇă§ăłă§ăŻăčŞĺçšć§ăŽăŞăźăŻăŤé˘ăăć大ăŽč°čŤă示ăăŚăăžăďźăOIBITăăŻčŞĺçšć§ăŽĺ¤ăĺĺă§ăďźă
ăăăŤĺŻžăăç§ăŽä¸ťăŞĺçăŻăă§ăŤčŞŹćăăžăăăăćĺžăŤăă1ă¤ćł¨ćăăŚăăăžăă ć§é ăŽăŹă¤ă˘ăŚăăĺ¤ć´ăăăă¨ăŻăăăťăŠä¸čŹçă§ăŻăăăžăăă ăăăé˛ăăă¨ăă§ăăžăă é˘ć°ăĺăčŞĺçšć§ăĺŽčŁ ăçśăăăă¨ăäżč¨źăăăăăŽäżĺŽăŽč˛ ć ăŻăé˘ć°ăĺ¤§ĺš ăŤĺ¤ć´ăăăă¨ăăççąă ăă§ăć§é ăŽăăăăă大ăăăŞăăžăă
ćĺžăŤăčŞĺčŞĺçšć§ă ăăé¸ćč˘ă§ăŻăŞăăă¨ăăäźăăăăă¨ćăăžăă ăăăŻç§ăăĄăé¸ćăăăŞăăˇă§ăłă§ăăăăŞăăă˘ăŚăăŽčŞĺçšć§ăŽäťŁćżć掾ăŻäžçśă¨ăăŚäťŁćżć掾ă§ăă
éé俥/éĺćă˘ă¤ăă ăčżăé˘ć°ăŤăçść
+ !Send + !Sync
ăăăăăăŽĺ˘çăćă¤çšć§ďźĺĽĺďźďźăčżăăăăŤčŚćąăăăă¨ăă§ăăžăă ăăăŻčŻăćąşĺŽă§ăŻăăăžăăăăçžĺ¨é¸ćăăŚăăăăŽăăăčŻăăăăăăžăăăăŤăšăżă čŞĺçšć§ăŤé˘ăăć¸ĺżľăŤă¤ăăŚăŻăć°ăăčŞĺçšć§ăŻĺŽčŁ ăăăăšăă§ăŻăŞăă¨ä¸ťĺźľăăžăăčŞĺçšć§ăŽĺžăŤĺ°ĺ Ľăăăć°ăăăżă¤ăăŤĺŻžăăŚăŽăżĺŽčŁ ăăăžăă ăăăŻăç§ăçžĺ¨ĺŻžĺŚă§ăăăăăĺ¤ăăŽĺéĄăćäžăăĺŻč˝ć§ăăăăžăăăăăĺ¤ăăŽč¨č¨ă§ĺŻžĺŚă§ăăŞăĺéĄă§ăŻăăăžăăă
ăăăŻé常ăŤé ăăé常ăŤéˇăé塝ăčžźăžăăŚăăăç§ăŻäťĽĺăŤăăăăŽç°č°ăĺąăăăă¨ăăăă¨ç˘şäżĄăăŚăăžăă ćĺžăŤăăä¸ĺşŚăłăĄăłăă§ăăŚăăăăă§ăăăăăŚăç§ăăĄăä¸ăăŚăăćąşĺŽăŤĺŽĺ ¨ăŤćşčśłăăŚăăăă¨ă確čŞăăžăă
čŞăă§ăăă ăăăăă¨ăăăăăžăăćçľćąşĺŽăŤăăăRustăćĺăŽćšĺăŤé˛ăăă¨ăéĄăŁăŚăăžăă