ããã¯ç¹æ®åã®è¿œè·¡ã®åé¡ã§ãïŒrust-lang / rfcsïŒ1210ïŒã
äž»ãªå®è£ æé ïŒ
default impl
ïŒhttps://github.com/rust-lang/rust/issues/37653ïŒdefault
ã¡ã³ããŒãããªãå Žåã空ã®implãèš±å¯ããå¿
èŠããããŸããïŒ https://github.com/rust-lang/rust/issues/48444RFCããã®æªè§£æ±ºã®è³ªåïŒ
default type
æããã«ãªãã®ã¯ãã€ã§ããïŒ typeckäžã«ã¯ãããŸãããïŒ ãŸãã¯å圢ã®å ŽåïŒdefault
ïŒã€ãŸãç¹æ®åå¯èœïŒãšèŠãªãããã¹ãã§ããïŒdefault impl
ïŒãã¹ãŠã®ã¢ã€ãã ãdefault
ïŒãŸãã¯partial impl
ïŒ default
ããªããã€ã³ã®å ŽåïŒãå¿
èŠã§ãã default impl
ãå¶éãããŠããé¢é£ããäŸã«ã€ããŠã¯ã httpsïŒ //github.com/rust-lang/rust/issues/37653#issuecomment-616116577ãåç
§ããŠçŸåšå®è£
ãããŠããspecialization
æ©èœã¯æ£ãããªãããšã«æ³šæããŠãã ãããã€ãŸãã specialization
unsafe
ã³ãŒãããªããšæªå®çŸ©ã®åäœãçºçããå¯èœæ§ããããŸãã min_specialization
ã¯ãã»ãšãã©ã®èœãšãç©Žãåé¿ããŸãã
ããã€ãã®è¿œå ã®æªè§£æ±ºã®è³ªåïŒ
å°éåã«ãã£ãŠå€ç«ããã«ãŒã«ãå€ãããã©ããã¯ããããŸããã
ããã«æªãããšã«ããå°æ¥ã®äºææ§ãã®å€ç«ããã«ãŒã«ã¯ãã¯ã¬ãŒãéã®ç¹æ®åãããªãå³ãã管çãç¶ããŸãã ãããããªããšãã¡ãœãããéãããŸãŸã«ããdefault-implsã¯ããã«æªåããŸãã
ç§ã¯æçœãªåŠå®çãªæšè«ã奜ãã§ã¯ãããŸããã§ããã ç§ã¯ãå°éåãæäŸããå®å šãªåŠå®çãªæšè«ã¯è¯ã劥åç¹ã ãšæããŸãã
ãã®å®è£
ã¯ãå®è£
ãããç¹æ®åã§èš±å¯ããå¿
èŠããããŸããïŒ ãããšãç§ã¯äœãã足ããªãã®ã§ããïŒ
http://is.gd/3Ul0pe
ãããšåãããã«ãã³ã³ãã€ã«ãããããšãæåŸ ããŠããŸããïŒ http ïŒ
ãããç§ãç¹æ®åããŠã³ã³ãã€ã«ããããšãæåŸ ããã³ãŒãã®äžéšã§ãïŒ
#![feature(specialization)]
use std::str::FromStr;
struct Error;
trait Simple<'a> {
fn do_something(s: &'a str) -> Result<Self, Error>;
}
impl<'a> Simple<'a> for &'a str {
fn do_something(s: &'a str) -> Result<Self, Error> {
Ok(s)
}
}
impl<'a, T: FromStr> Simple<'a> for T {
fn do_something(s: &'a str) -> Result<Self, Error> {
T::from_str(s).map_err(|_| Error)
}
}
fn main() {
// Do nothing. Just type check.
}
ã³ã³ãã€ã«ã¯ãå®è£
ã®ç«¶åãçç±ã«ã³ã³ãã€ã©ã§å€±æããŸãã &str
ã¯FromStr
å®è£
ããŠããªãããã競åãçºçããªãããšã«æ³šæããŠãã ããã
@sgrif
æåã®2ã€ã®äŸãèŠãæéããããŸããã ãããç§ã®ã¡ã¢ã§ãã
æåã®ã±ãŒã¹ã§ã¯ã次ã®ããã«ãªããŸãã
FromSqlRow<ST, DB> for T where T: FromSql<ST, DB>
FromSqlRow<(ST, SU), DB> for (T, U) where T: FromSqlRow<ST, DB>, U: FromSqlRow<SU, DB>,
åé¡ã¯ããããã®implãéè€ããŠããããã©ã¡ããä»ãããå ·äœçã§ã¯ãªãããšã§ãã
T: FromSql<ST, DB>
ãååšããå¯èœæ§ããããŸããã T
ã¯ãã¢ã§ã¯ãããŸããïŒãããã£ãŠãæåã®implãšäžèŽããŸããã2çªç®ã®implãšã¯äžèŽããŸããïŒã(T, U)
æã€ããšãã§ããŸãããã§ïŒT: FromSqlRow<ST, DB>
ãU: FromSqlRow<SU, DB>
ãããã_not_(T, U): FromSql<(ST, SU), DB>
(T, U)
æã€ããšãã§ããããã2ã€ã®implã¯éè€ããŸããT: FromSqlRow<ST, DB>
U: FromSqlRow<SU, DB>
(T, U): FromSql<(ST, SU), DB>
ããã¯ãlattice implsã蚱容ãããããªç¶æ³ã§ããéè€ããã±ãŒã¹ã«å¯ŸããŠã3çªç®ã®implãèšè¿°ãããããäœããã¹ãããèšãå¿ èŠããããŸãã ãããã¯ãè² ã®ç¹æ§ã®å®è£ ã¯ãéè€ãé€å€ããæ¹æ³ããŸãã¯äžèŽããå¯èœæ§ã®ãã埮調æŽãè¡ãæ¹æ³ãæäŸããå ŽåããããŸãã
ããªããæã£ãŠããïŒ
Queryable<ST, DB> for T where T: FromSqlRow<ST, DB>
Queryable<Nullable<ST>, DB> for Option<T> where T: Queryable<ST, DB>
Option<T>
ã䜿çšã§ããããããããã¯éè€ããŠããŸãã
T: Queryable<ST, DB>
Option<T>: FromSqlRow<Nullable<ST>, DB>
ããããã©ã¡ãã®implãããå ·äœçã§ã¯ãããŸããã
T
ããã«T: FromSqlRow<ST, DB>
ãã T
ãªãOption<U>
ïŒç¬¬1ã第2ã®implãšäžèŽããã§ã¯ãªãïŒT: Queryable<ST, DB>
ããã«Option<T>
ãæã€ããšãã§ããŸããã Option<T>: FromSqlRow<Nullable<ST>, DB>
ã¯ã§ããŸãã@SergioBenitez
ã³ã³ãã€ã«ã¯ãå®è£ ã®ç«¶åãçç±ã«ã³ã³ãã€ã©ã§å€±æããŸãã
&str
ã¯FromStr
å®è£ ããŠããªãããã競åãçºçããªãããšã«æ³šæããŠãã ããã
åé¡ã¯ãã³ã³ãã€ã©ã&str
ãå°æ¥FromStr
ãå®è£
ããããã«ãªããããããªããšæ§ããã«æ³å®ããŠããããšã§ãã ãã®äŸã§ã¯ããã¯ã°ãããŠããããã«èŠãããããããŸããããäžè¬ã«ãæ°ããimplãåžžã«è¿œå ãããããã®implãè¿œå ãããšãã«ããŠã³ã¹ããªãŒã ã³ãŒããå£ããªãããã«ä¿è·ããããšèããŠããŸãã
ããã¯æ§ãããªéžæã§ãããæéããããŠãªã©ãã¯ã¹ããããšæããããããŸããã ããã§èæ¯ãååŸã§ããŸãïŒ
ãã®2ã€ã®ã±ãŒã¹ãæ確ã«ããŠããã ãããããšãããããŸãã ä»ã§ã¯å®å šã«çã«ããªã£ãŠããŸã
2016幎3æ22æ¥ç«ææ¥ãååŸ6æ34åã¢ãŒãã³ãã¥ãŒãã³[email protected]ã¯æ¬¡ã®ããã«æžããŠããŸãã
@SergioBenitez https://github.com/SergioBenitez
ã³ã³ãã€ã«ã¯ãå®è£ ã®ç«¶åãçç±ã«ã³ã³ãã€ã©ã§å€±æããŸãã 泚æ
ïŒstrã¯FromStrãå®è£ ããŠããªãããã競åãçºçããããšã¯ãããŸãããåé¡ã¯ãã³ã³ãã€ã©ãä¿å®çã«ïŒstrãæ³å®ããŠããããšã§ãã
å°æ¥çã«FromStrãå®è£ ããããã«ãªããããããŸããã ããã¯ã°ãããŠããããã«èŠãããããããŸãã
ãã®äŸã§ãããäžè¬çã«ã¯ãåžžã«æ°ããimplãè¿œå ããŸãã
ãããã®implãè¿œå ãããšãã«ãããŠã³ã¹ããªãŒã ã³ãŒããå£ããªãããã«ä¿è·ããŸããããã¯æ§ãããªéžæã§ãããç§ãã¡ããªã©ãã¯ã¹ããããšæããããããªããã®ã§ã
æéãšãšãã«ã ããã§èæ¯ãååŸã§ããŸãïŒ-
http://smallcultfollowing.com/babysteps/blog/2015/01/14/little-orphan-impls/
- rust-lang / rfcsïŒ1023 https://github.com/rust-lang/rfcs/pull/1023
- rust-lang / rfcsïŒ1053 https://github.com/rust-lang/rfcs/issues/1053
- rust-lang / rfcsïŒ1148 https://github.com/rust-lang/rfcs/pull/1148
â
ããªããèšåãããã®ã§ããªãã¯ãããåãåã£ãŠããŸãã
ãã®ã¡ãŒã«ã«çŽæ¥è¿ä¿¡ããããGitHubã§è¡šç€ºããŠãã ãã
https://github.com/rust-lang/rust/issues/31844#issuecomment -200093757
@aturon
åé¡ã¯ãã³ã³ãã€ã©ããïŒstrãå°æ¥FromStrãå®è£ ããããã«ãªãå¯èœæ§ããããšæ§ããã«æ³å®ããŠããããšã§ãã ãã®äŸã§ã¯ããã¯ã°ãããŠããããã«èŠãããããããŸããããäžè¬ã«ãæ°ããimplãåžžã«è¿œå ãããããã®implãè¿œå ãããšãã«ããŠã³ã¹ããªãŒã ã³ãŒããå£ããªãããã«ä¿è·ããããšèããŠããŸãã
ããã¯ãŸãã«å°éåéã察åŠããããšããŠããããšã§ã¯ãããŸãããïŒ å°éã§ãç§ã¯ãããæåŸ
ããå Žåã§ãã®å®è£
FromStr
ã®ããã®&str
ãå°æ¥çã«è¿œå ãããŸããããçŽæ¥å®è£
Simple
圢質ã®&str
åªå
ãããŸãã
@SergioBenitezã¯ãããäžè¬çãªimplã«default fn
ãå
¥ããå¿
èŠããããŸãã åã®
äŸã¯ç¹æ®åãããŠããŸããã
2016幎3æ22æ¥ç«ææ¥ãååŸ6æ54åã»ã«ãžãªãããã¹[email protected]
æžããŸããïŒ
@aturon https://github.com/aturon
åé¡ã¯ãã³ã³ãã€ã©ãä¿å®çã«ïŒstrãæ³å®ããŠããããšã§ãã
å°æ¥çã«FromStrãå®è£ ããããã«ãªããããããŸããã ããã«ã¯ã°ãããŠããããã«èŠãããããããŸãã
äŸã§ãããäžè¬çã«ã¯ãåžžã«æ°ããimplãè¿œå ããŸãã
ãããã®implãè¿œå ãããšãã«ãããŠã³ã¹ããªãŒã ã³ãŒããå£ããªãããã«ä¿è·ããŸããããã¯ãŸãã«å°éåéã察åŠããããšããŠããããšã§ã¯ãããŸãããïŒ ãš
å°éåéã§ã¯ãFromStrã®å®è£ ã§ãã£ãŠã
ïŒstrã¯å°æ¥è¿œå ãããã®çŽæ¥å®è£
ïŒstrã®ç¹æ§ãåªå ââãããŸããâ
ããªããèšåãããã®ã§ããªãã¯ãããåãåã£ãŠããŸãã
ãã®ã¡ãŒã«ã«çŽæ¥è¿ä¿¡ããããGitHubã§è¡šç€ºããŠãã ãã
https://github.com/rust-lang/rust/issues/31844#issuecomment -200097995
ãããã©ã«ããã®ãã¬ã€ãã¢ã€ãã ãèªåçã«default
ãšèŠãªãããã®impl
ãç·©åãããšãšãã«ãHaskellãªã©ã®ãããªç¹æ§ã®äž¡æ¹ã®ãã©ã¡ããªã·ãã£ãå¿
èŠã«ãªãå ŽåããããŸãã ãŸãã default
ããã«ãç°¡åã«grep
ããããšã¯ã§ããŸããã default
ããŒã¯ãŒããå
¥åããããã©ã«ãã®å®è£
ãæå®ããããšã¯é£ãããããŸãããããã®ãŸãŸåé¢ããããšã¯ã§ããŸããã ãŸããèšèªãæ確ã«ãããå Žåã¯ããããã®ãããã©ã«ããã®ç¹æ§ã¢ã€ãã ã®ååããããã¥ã¡ã³ãå
ã®ãç¹æ§ææ¡ãã¢ã€ãã ã«å€æŽã§ããŸãã
ïŒ32999ïŒã³ã¡ã³ãïŒããã®æ³šæïŒã©ãã£ã¹ã«ãŒã«ã䜿çšããïŒãŸãã¯è² ã®å¶çŽãèš±å¯ããïŒå Žåãäœãã®ãããªãç¹æ®åãé²ãããã®ãäžéç¹æ§ã䜿çšãããããªãã¯ã¯æ©èœããªããªããŸãã
@Stebalien
ãªããããæ©èœããªãã®ã§ããïŒ ãã®ããªãã¯ã¯ãå°éåéãç§çãªç¹æ§ã«éå®ããŸãã ããªããããã«ã¢ã¯ã»ã¹ã§ããªãå Žåãããªãã¯ç§çãªç¹æ§ãå°éã«ããããšã¯ã§ããŸããã
@ arielb1ããã ããèŠç¹ãã ç§ã®å Žåããã®ç¹æ§ã¯ç§çãªãã®ã§ã¯ãããŸããã
ãå€ç«ããäžäœäºææ§+ã³ããŒã¬ã³ã¹ã«ãŒã«ã®ããã«å€éšãœãŒã¹ãå°éåã§ããªãããšããæšè«ã¯ãç¹ã«èå³æ·±ããŸãã¯æçšã§ã¯ãªããšæããŸãã ç¹ã«ãç¹å®ã®äžè²«æ§ã«ãŒã«ã«ã³ãããããªãå Žåã
ãªãŒããŒã©ã€ããããdefault impl
ã«ã¢ã¯ã»ã¹ããæ¹æ³ã¯ãããŸããïŒ ãããããªããããã¯ãã¹ãã®æ§ç¯ã«åœ¹ç«ã€å¯èœæ§ããããŸãã å¥çŽã«ããèšèšãšlibhoareãåç
§ããŠãã ããã
åãã§ãã¯äžã«ããã©ã«ãã®é¢é£ä»ããããåã®æ圱ãèš±å¯ãããšãã³ã³ãã€ã«æã«åã®äžçåŒãé©çšã§ããŸãïŒ //gist.github.com/7c081574958d22f89d434a97b626b1e4
#![feature(specialization)]
pub trait NotSame {}
pub struct True;
pub struct False;
pub trait Sameness {
type Same;
}
mod internal {
pub trait PrivSameness {
type Same;
}
}
use internal::PrivSameness;
impl<A, B> Sameness for (A, B) {
type Same = <Self as PrivSameness>::Same;
}
impl<A, B> PrivSameness for (A, B) {
default type Same = False;
}
impl<A> PrivSameness for (A, A) {
type Same = True;
}
impl<A, B> NotSame for (A, B) where (A, B): Sameness<Same=False> {}
fn not_same<A, B>() where (A, B): NotSame {}
fn main() {
// would compile
not_same::<i32, f32>();
// would not compile
// not_same::<i32, i32>();
}
@burdgesã®ã³ã¡ã³ãããšã«ç·šé
CloudFlareã䜿çšããŠããããã«TorãŠãŒã¶ãŒã«å¯ŸããŠè§£æ±ºãããªããããããããfyi @ rphmeierã¯
@burdges FWIW play.rust-lang.orgèªäœã¯ããççž®ããã¿ã³ã«is.gdã䜿çšããŠããŸãã
ãã ããããããå€æŽã§ããŸãïŒ https ïŒ
ãã®ããã«äœ¿çšããŸãïŒhttps://is.gd/Ux6FNsïŒïŒ
#![feature(specialization)]
pub trait Foo {}
pub trait Bar: Foo {}
pub trait Baz: Foo {}
pub trait Trait {
type Item;
}
struct Staff<T> { }
impl<T: Foo> Trait for Staff<T> {
default type Item = i32;
}
impl<T: Foo + Bar> Trait for Staff<T> {
type Item = i64;
}
impl<T: Foo + Baz> Trait for Staff<T> {
type Item = f64;
}
fn main() {
let _ = Staff { };
}
ãšã©ãŒïŒ
error: conflicting implementations of trait `Trait` for type `Staff<_>`: [--explain E0119]
--> <anon>:20:1
20 |> impl<T: Foo + Baz> Trait for Staff<T> {
|> ^
note: conflicting implementation is here:
--> <anon>:16:1
16 |> impl<T: Foo + Bar> Trait for Staff<T> {
|> ^
error: aborting due to previous error
å°æ¥ã®specialization
ã¯ããããµããŒãããŸããïŒçŸåšãä»ã®çš®é¡ã®å®è£
ã¯ãããŸããïŒ
@zitsen
T: Foo + Bar
ãT: Foo + Baz
ãä»ãããç¹æ®åãããŠããªãããããããã®å®è£
ã¯çŸåšã®ç¹æ®åèšèšã§ã¯èš±å¯ãããŠããŸããã ã€ãŸãã T: Foo + Bar + Baz
å Žåãã©ã®implããåã€ãã¹ããã¯æ確ã§ã¯ãããŸããã
T: Foo + Bar + Baz
å«æã_ãŸã_äžããããšãã§ãããããã£ãŠææ§ãã解æ¶ã§ãããããè¡šçŸåè±ããªã·ã¹ãã ã«ã€ããŠããã€ãã®èãããããŸãããããã¯ãŸã å®å
šã«ã¯ææ¡ãããŠããŸããã
è² ã®ç¹æ§ãtrait Baz: !Bar
å°éããå Žåã¯ããããç¹æ®åãšãšãã«äœ¿çšããŠãBarãå®è£
ããã¿ã€ãã®ã»ãããšBazãå®è£
ããã¿ã€ãã®ã»ãããåºå¥ãããŠåå¥ã«ç¹æ®åã§ããããšã蚌æããããšãã§ããŸãã
@rphmeierã®è¿ä¿¡ã¯ç§ããŸãã«æãã§ãããã®ã®ããã§ãã T: Foo + Bar + Baz
implsã圹ç«ã¡ãŸãã
ãããç¡èŠããŠãã ãããç§ã¯ãŸã ç§ã®ã±ãŒã¹ãšé¢ä¿ãããã specialization
ããã®ä»ã®æ©èœãäžéžããã®ããã€ã楜ãã¿ã«ããŠããŸãã
ããããšã@ aturon @ rphmeier ã
ç§ã¯æè¿å°éåéã§éãã§ããŸãããããŠç§ã¯ãã®å¥åŠãªã±ãŒã¹ã«åºããããŸããïŒ
#![feature(specialization)]
trait Marker {
type Mark;
}
trait Foo { fn foo(&self); }
struct Fizz;
impl Marker for Fizz {
type Mark = ();
}
impl Foo for Fizz {
fn foo(&self) { println!("Fizz!"); }
}
impl<T> Foo for T
where T: Marker, T::Mark: Foo
{
default fn foo(&self) { println!("Has Foo marker!"); }
}
struct Buzz;
impl Marker for Buzz {
type Mark = Fizz;
}
fn main() {
Fizz.foo();
Buzz.foo();
}
ã³ã³ãã€ã©åºåïŒ
error: conflicting implementations of trait `Foo` for type `Fizz`: [--explain E0119]
--> <anon>:19:1
19 |> impl<T> Foo for T
|> ^
note: conflicting implementation is here:
--> <anon>:15:1
15 |> impl Foo for Fizz {
|> ^
äžèšã¯ã³ã³ãã€ã«ããå¿ èŠããããšæããŸããå®éã«æå³ãããšããã«æ©èœãã2ã€ã®èå³æ·±ãããªãšãŒã·ã§ã³ããããŸãã
1ïŒ where T::Mark: Fizz
ããŠã³ãã®åé€ïŒ
impl<T> Foo for T
where T: Marker //, T::Mark: Fizz
{
// ...
}
2ïŒãç¹æ§ãã€ã³ããšã€ãªã¢ã¹ãã®è¿œå ïŒ
trait FooMarker { }
impl<T> FooMarker for T where T: Marker, T::Mark: Foo { }
impl<T> Foo for T where T: FooMarker {
// ...
}
ïŒ Marker
ãå¥ã®ã¯ã¬ãŒãïŒïŒïŒã§å®çŸ©ãããŠããå Žåãããã¯æ©èœããŸããããã®äŸã®ãªããžããªãåç
§ããŠãã ããïŒ
ãŸãããã®åé¡ã¯äœããã®åœ¢ã§ïŒ20400ã«é¢é£ããŠããå¯èœæ§ããããšæããŸã
ç·šéïŒç§ã¯ããã«ã€ããŠã®åé¡ãéããŸããïŒïŒ36587
ã¹ãã·ã£ã©ã€ãŒãŒã·ã§ã³ã§åé¡ãçºçããŠããŸãã ãããå®è£ ã®åé¡ãªã®ããç¹æ®åã®æå®æ¹æ³ã®åé¡ãªã®ãããããªãã
use std::vec::IntoIter as VecIntoIter;
pub trait ClonableIterator: Iterator {
type ClonableIter;
fn clonable(self) -> Self::ClonableIter;
}
impl<T> ClonableIterator for T where T: Iterator {
default type ClonableIter = VecIntoIter<T::Item>;
default fn clonable(self) -> VecIntoIter<T::Item> {
self.collect::<Vec<_>>().into_iter()
}
}
impl<T> ClonableIterator for T where T: Iterator + Clone {
type ClonableIter = T;
#[inline]
fn clonable(self) -> T {
self
}
}
ïŒãããŒãµãŒã¯ã«ïŒ
ïŒã¡ãªã¿ã«ããã®ã³ãŒããæçµçã«stdlibã«å°éãããšãããããã§ãããïŒ
ãã®ã³ãŒãã¯æ¬¡ã®å Žåã«å€±æããŸãïŒ
error: method `clonable` has an incompatible type for trait:
expected associated type,
found struct `std::vec::IntoIter` [--explain E0053]
--> <anon>:14:5
|>
14 |> default fn clonable(self) -> VecIntoIter<T::Item> {
|> ^
æ»ãå€ãSelf::ClonableIter
å€æŽãããšã次ã®ãšã©ãŒãçºçããŸãã
error: mismatched types [--explain E0308]
--> <anon>:15:9
|>
15 |> self.collect::<Vec<_>>().into_iter()
|> ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ expected associated type, found struct `std::vec::IntoIter`
note: expected type `<T as ClonableIterator>::ClonableIter`
note: found type `std::vec::IntoIter<<T as std::iter::Iterator>::Item>`
ã©ããããããã©ã«ãã®é¢é£ã¿ã€ãã®å ·äœçãªã¿ã€ããåç §ããããšã¯ã§ããŸããããããã«ã¯ããªãã®å¶éããããŸãã
@tomakaããã¯åäœããã¯ãã§ããRFCããã¹ãã¯ãããæã£ãŠããŸãïŒ
impl<T> Example for T {
default type Output = Box<T>;
default fn generate(self) -> Box<T> { Box::new(self) }
}
impl Example for bool {
type Output = bool;
fn generate(self) -> bool { self }
}
ïŒhttps://github.com/rust-lang/rfcs/blob/master/text/1210-impl-specialization.md#the-default-keywordïŒ
ããã¯ããªãã®ã±ãŒã¹ã«é¢é£ããã®ã«åå䌌ãŠããããã§ãã
@aatchãã®äŸã¯ãäŸã®ç¹æ§ã®çŽæçãªå®çŸ©ã§ã³ã³ãã€ã«ãããŠããªãããã§ãïŒ https ïŒ //play.rust-lang.org/ïŒgist = 97ff3c2f7f3e50bd3aef000dbfa2ca4eïŒversion = nightlyïŒbacktrace = 0
ç¹æ®åã³ãŒãã¯ãããæ瀺çã«çŠæ¢ããŠããŸã-ïŒ33481ãåç §ããŠãã ãããããã¯æåã¯ãšã©ãŒã ãšæã£ãŠããŸãããã蚺æã®åé¡ã§ããããšãå€æããŸããã ããã§ã®èšºæãæ¹åããããã®ç§ã®PRã¯èŠéããããŠãããç§ã¯ããããææ°ã®ãã¹ã¿ãŒã«ããªãé·ãéç¶æããŠããŸããã
@rphmeier RFCããã¹ãã¯ãèš±å¯ããå¿ èŠãããããšã瀺åããŠããŸããããã®äŸã¯ããããã³ããŒãããŠããŸãã
ç¹æ®åã®æ©æµãåããããšãã§ããããã€ãã®ã³ãŒãã§éãã ã é£éã§ã¯ãªãã©ãã£ã¹ã«ãŒã«ãæ¡çšããå¿ èŠããããšåŒ·ãæããŸããããã¯èªç¶ãªæãã§ãããå¿ èŠãªæè»æ§ãåŸãå¯äžã®æ¹æ³ã§ããïŒå¹æçïŒã
impl
ãšåã
ã®ã¢ã€ãã ã§default
ããå Žåãããããã®ã¢ã€ãã ããªãŒããŒã©ã€ããããå Žåããããã¯ãã¹ãŠãªãŒããŒã©ã€ããããå¿
èŠãããããšã匷å¶ã§ããŸããïŒ ããã«ãããä»ã®é
ç®ã®ããã©ã«ãã®é¢é£ã¿ã€ãïŒããšãã°ïŒã®æ£ç¢ºãªã¿ã€ãã«åºã¥ããŠæšè«ã§ããããã«ãªããŸããããã¯ãè¡šçŸåãé«ããã®ã«åœ¹ç«ã€ããã§ãã
以äžãèš±å¯ããå¿
èŠããããŸããïŒ èŠçŽ ã¿ã€ããCopyã®å Žåã¯ArrayVecãCopy
ã«ãªãããã«ããã以å€ã®å Žåã¯ãã¹ãã©ã¯ã¿ãæã€ããã«ãã¿ã€ããç¹æ®åããããšæããŸãã ç¹æ®åã«çœ®ãæããããå
éšãã£ãŒã«ãã䜿çšããŠãããéæããããšããŠããŸãã
ãããã³ã³ãã€ã«ãããããšãæã¿ãŸãããã€ãŸãã A: Copy + Array
ããŠã³ãïŒéã³å Žã§ã³ã³ãã€ã«å¯èœãªã¹ããããïŒã«ãã£ãŠéžæããããã£ãŒã«ãã¿ã€ãããArrayVec<A>
ã®ãã£ãŒã«ãã®ã³ããŒå¯èœæ§ãæšæž¬ããŸãã
impl<A: Copy + Array> Copy for ArrayVec<A>
//where <A as Repr>::Data: Copy
{ }
ã³ã¡ã³ãã¢ãŠããããwhereå¥ã¯ããããªãã¯ã€ã³ã¿ãŒãã§ã€ã¹ã§ãã©ã€ããŒãã¿ã€ãRepr
ãå
¬ââéãããããäžèŠã§ãã ïŒãšã«ãããããICEã§ãïŒã
ç·šéïŒç§ã¯ããã«ã€ããŠãã§ã«åé¡ïŒ33162ãå ±åããããšãå¿ããŠããŸãããããããªããã
ç§ã®ã³ã¡ã³ããç§ã®å®éã®ãŠãŒã¹ã±ãŒã¹ããã©ããŒã¢ããããŸãã
// Ideal version
trait Scannable {}
impl<T: FromStr> Scannable for T {}
impl<T: FromStr> Scannable for Result<T, ()> {}
// But this doesn't follow from the specialisation rules because Result: !FromStr
// Lattice rule would allow filling in that gap or negative reasoning would allow specifying it.
// Second attempt
trait FromResult {
type Ok;
fn from(r: Result<Self::Ok, ()>) -> Self;
}
impl<T> Scannable for T {
default type Ok = T;
default fn from(r: Result<T, ()>) -> Self {...} // error can't assume Ok == T, could do this if we had `default impl`
}
impl<T> Scannable for Result<T, ()> {
type Ok = T;
default fn from(r: Result<T, ()>) -> Self { r }
}
fn scan_from_str<T: FromResult>(x: &str) -> T
where <T as FromResult>::Ok: FromStr // Doesn't hold for T: FromStr because of the default on T::Ok
{ ... }
// Can also add the FromStr bound to FromResult::Ok, but doesn't help
// Third attempt
trait FromResult<Ok> {
fn from(r: Result<Ok, ()>) -> Self;
}
impl<T> FromResult<T> for T {
default fn from(r: Result<Self, ()>) -> Self { ... }
}
impl<T> FromResult<T> for Result<T, ()> {
fn from(r: Result<T, ())>) -> Self { r }
}
fn scan_from_str<U: FromStr, T: FromResult<U>>(x: &str) -> T { ... }
// Error because we can't infer that U == String
let mut x: Result<String, ()> = scan_from_str("dsfsf");
@tomaka @Aatch
åé¡ã¯ãä»ã®ããã©ã«ãé ç®ã®å€ã«äŸåããããšãèš±å¯ãããŠããªãããšã§ãã ãããã£ãŠããã®implãããå ŽåïŒ
impl<T> ClonableIterator for T where T: Iterator {
default type ClonableIter = VecIntoIter<T::Item>;
default fn clonable(self) -> VecIntoIter<T::Item> {
// ^^^^^^^^^^^^^^^^^^^^
self.collect::<Vec<_>>().into_iter()
}
}
ç§ã匷調ããå Žæã§ã¯ã clonable
ã¯Self::ClonableIter
ã«äŸåããŠããŸããã CloneableIter
ãããã©ã«ããšããŠå®£èšãããŠããããããããè¡ãããšã¯ã§ããŸããã æžå¿µã¯ã誰ããCloneableIter
å°éã«ããŠãªãŒããŒã©ã€ããããããããªããã clonable
ã¯ãªããããããªããšããããšã§ãã
ããã§ããã€ãã®å¯èœãªçãã«ã€ããŠè©±ããŸããã ãããã®1ã€ã¯ã default
ã䜿çšããŠã¢ã€ãã ãã°ã«ãŒãåã§ããããã«ããããš
impl<T> ClonableIterator for T where T: Iterator {
default {
type ClonableIter = VecIntoIter<T::Item>;
fn clonable(self) -> VecIntoIter<T::Item> { ... }
}
}
ããã¯åé¡ãããŸããããå°ããå³æ¹åãžã®ããªãããèªçºãããŸãã default
ãããŒãã³ã°ã¹ã³ãŒãã®ããã«èŠããŸãããããã§ã¯ãããŸããã ãoverride-anyãïŒä»æ¥ã®ããã«ïŒãšãoverride-allãïŒå¿
èŠãªãã®ïŒãåãæ¿ããããšãã§ãããããåçŽãªããªã¢ã³ãããããããããŸããã
ãŸãã impl Trait
掻çšããããšã§ããŸãããããšãæãã§ããŸããã ããã§ã®å Žåã®ããã«ãã¡ãœããã®æ»ãå€ã®åãã«ã¹ã¿ãã€ãºããå Žåããããæãé »ç¹ã«çºçãããšããèãã§ãã ãããã£ãŠã impl Trait
ã䜿çšããããã«ãã¬ã€ããæžãçŽãããšãã§ããã°ïŒ
pub trait ClonableIterator: Iterator {
fn clonable(self) -> impl Iterator;
}
ããã¯ãã¿ã€ããšfnãå«ãããã©ã«ãã®ã°ã«ãŒãã«å®è£ ãããšãäºå®äžäžçš®ã®çç¥åœ¢ã«ãªããŸãã ïŒãã ããçŽç²ã«implã§ãããè¡ãæ¹æ³ããããã©ããã¯ããããŸãããïŒ
PSãããã¡ãã»ãŒãžãžã®è¿ä¿¡ãå€§å¹ ã«é ããŠç³ãèš³ãããŸãããæ¥ä»ã¯_ 7æ_ã§ãã
impl Traitã¯åœ¹ã«ç«ã¡ãŸãããåãå ¥ãããããå®è£ ããããããŠããããã圢åŒã®ãã¬ã€ãããã£ã§äœ¿çšã§ããRFCã¯ãªãããããã®RFCãæ¢ãã®ã¯å°ãå¥åŠã«æããŸãã
default impl
æ©èœïŒãã¹ãŠã®ã¢ã€ãã ãdefault
ïŒã®å®è£
ã«èå³ããããŸãã
ããã«ã€ããŠã®è²¢ç®ãåãå
¥ããŸããïŒ
@giannicicééããªãïŒ ä»äºã®æå°ãåãã§ãæäŒããããŠããã ããŸãã
çŸåšãé¢é£ããã¿ã€ããç¹æ®åããå¿ èŠããããã©ããã«ã€ããŠã®çµè«ã¯ãããŸããïŒ
以äžã¯ç§ã®ãŠãŒã¹ã±ãŒã¹ã®ç°¡ç¥åã§ãããç¹æ®åå¯èœãªé¢é£ã¿ã€ãã®å¿
èŠæ§ã瀺ããŠããŸãã
ã³ã³ãããã¬ã€ããªããžã§ã¯ãã®ã³ã¬ã¯ã·ã§ã³ïŒ &trait::Property
ïŒã調æŽããäžè¬çãªããŒã¿æ§é ãããšãã°Foo
ããããŸãã ç¹æ§trait::Property
ã¯ã Property<T>
ïŒ Vec<T>
è£æã¡ãããïŒãšPropertyBits
ïŒããããã¯ãã«ã§ããBitVec
ã«è£æã¡ãããïŒã®äž¡æ¹ã«ãã£ãŠå®è£
ãããŸãã
Foo
ãžã§ããªãã¯ã¡ãœããã§T
ã®æ£ããåºã«ãªãããŒã¿æ§é ã決å®ã§ããããã«ãããã®ã§ãããããã«ã¯ãç¹æ®åãå¿
èŠã§ããç¶ããŸãã
trait ContainerFor {
type P: trait::Property;
}
impl<T> ContainerFor for T {
default type P = Property<T>; // default to the `Vec`-based version
}
impl ContainerFor for bool {
type P = PropertyBits; // specialize to optimize for space
}
impl Foo {
fn add<T>(&mut self, name: &str) {
self.add_trait_obj(name, Box::new(<T as ContainerFor>::P::new())));
}
fn get<T>(&mut self, name: &str) -> Option<&<T as ContainerFor>::P> {
self.get_trait_obj(name).and_then(|prop| prop.downcast::<_>());
}
}
ããããšã@aturon ïŒ
åºæ¬çã«ã ast::ItemKind::Impl
æ§é äœã«æ°ãããdefaultnessãå±æ§ãè¿œå ããŠäœæ¥ãè¡ã£ãŠããŸãïŒæ¬¡ã«ãæ°ããå±æ§ãimplã¢ã€ãã ã®ãdefaultnessãå±æ§ãšäžç·ã«äœ¿çšããŸãïŒãããã°ããç°¡åã«å®è¡ããããšãã§ããŸã
解æäžã«ããã©ã«ããdefault impl
ãã¹ãŠã®implã¢ã€ãã ã«èšå®ããããšã§æ§æãããå¯èœæ§ã
ãããã©ã«ãããimplã®åé
ç®ã§ã¯ãªããimplã«é¢é£ããŠãããšããæ
å ±ã倱ã£ããããããã¯ãå®å
šãªã解決çã§ã¯ãããŸããã
ããã«ã partial impl
ãå°å
¥ããèšç»ãããå Žåãæåã®ãœãªã¥ãŒã·ã§ã³ã¯ã default
ãšpartial
ãæ ŒçŽããããã«äœ¿çšã§ããå±æ§ããã§ã«æäŸããŸãã ãããã念ã®ããã«
æéãç¡é§ã«ããªãã§ãããªãã¯ã©ãæããŸããïŒ
@giannicic @aturon default impl
ã«ã€ããŠè©±ãåãããã®ç¹å®ã®åé¡ãäœæããããšãææ¡ã§ããŸããïŒ
æ°ã«ããªãã§ãã ãããç§ã¯ãããäœæããŸããïŒ https ïŒ
äžããããå Žåãã©ãã£ã¹ã«ãŒã«ã¯ç§ã«èš±å¯ããŸããïŒ
trait Foo {}
trait A {}
trait B {}
trait C {}
// ...
A
ã B
ã C
ã...ã®çµã¿åãããå®è£
ããã¿ã€ãã®ãµãã»ããã«Foo
å®è£
ãè¿œå ããŸãã
impl Foo for T where T: A { ... }
impl Foo for T where T: B { ... }
impl Foo for T where T: A + B { ... }
impl Foo for T where T: B + C { ... }
// ...
ãããŠãããã€ãã®çµã¿åããããçŠæ¢ãããããšãèš±å¯ããŸããããšãã°ã A + C
ã¯æ±ºããŠèµ·ãããªãã¯ãã§ãã
impl Foo for T where T: A + C = delete;
ïŒ
ã³ã³ããã¹ãïŒããŸããŸãªçš®é¡ã®åœ¢ç¶ïŒãã€ã³ãããã¥ãŒããããªãŽã³ãªã©ïŒã«ApproxEqual(Shape, Shape)
ãã¬ã€ããå®è£
ãããšãã«ããããããã¹ãŠãã¬ã€ãã§ããå Žåã«ããããå¿
èŠã«ãªããŸããã å®è£
ã®ç«¶åãé¿ããããã«ããããããŸããŸãªç¹æ§ãããšãã°ApproxEqualPoint(Point, Point)
ã«ãªãã¡ã¯ã¿ãªã³ã°ããããšã§ããããåé¿ããå¿
èŠããããŸããã
@gnzlbg
ãããŠãããã€ãã®çµã¿åããããçŠæ¢ãããããšãèš±å¯ããŸããããšãã°ãA + Cã¯æ±ºããŠèµ·ãããªãã¯ãã§ãã
ããããããã¯ã©ãã£ã¹ã«ãŒã«ã§èš±å¯ããããã®ã§ã¯ãããŸããã ããã¯ãäœããã®åœ¢ãçš®é¡ã®ãåŠå®çãªæšè«ãã®é åã«ãªããŸãã
ã³ã³ããã¹ãïŒããŸããŸãªçš®é¡ã®ã·ã§ã€ãïŒãã€ã³ãããã¥ãŒããããªãŽã³ãªã©ïŒã«è¿äŒŒïŒShapeãShapeïŒãã¬ã€ããå®è£ ãããšãã«ããããããã¹ãŠãã¬ã€ãã§ããå Žåã«ããããå¿ èŠã«ãªããŸããã å®è£ ã®ç«¶åãåé¿ããããã«ããããããŸããŸãªç¹æ§ãããšãã°ãApproxEqualPointïŒPointãPointïŒã«ãªãã¡ã¯ã¿ãªã³ã°ããããšã«ããããããåé¿ããå¿ èŠããããŸããã
ãã®ããã @ withoutboatsã¯ãç¹å®ã®ç¹æ§ã»ãããçžäºã«æä»çã§ãããšå®£èšã§ããïŒã€ãŸããæ倧ã§1ã€ãå®è£ ã§ããïŒãé€å€ã°ã«ãŒããã®ã¢ã€ãã¢ãæšé²ããŠããŸãã ç§ã¯ãããåæåã®ãããªãã®ãšããŠæ³åããŠããŸãïŒã€ãŸããç¹æ§ã¯ãã¹ãŠäžç·ã«å®£èšãããŸãïŒã ç§ã¯ããã®ã¢ã€ãã¢ã奜ãã§ããç¹ã«ïŒç§ãæãã«ïŒïŒãããåŠå®çãªæšè«ã®ããæ害ãªåŽé¢ã®ããã€ããé¿ããã®ãå©ããã®ã§ã ããããç§ã¯ãã®é¢ã§ãã£ãšèããå¿ èŠãããããã«æããŸã-ãããŠãŸããåŠå®çãªæšè«ã«ã€ããŠèããæ¹æ³ã«ã€ããŠæµ®ããã§ãããã¹ãŠã®ãããŒã¿ããèŠçŽããããšããè¯ãèšäºããããŸãã ããããä»ãç§ã¯ïŒã»ãšãã©ïŒHKTãšå°éã·ãªãŒãºããŸãšããã®ã§ãããã«ã€ããŠèããããšãã§ããŸã...
@nikomatsakis ïŒ
ãã®ããã @ withoutboatsã¯ãç¹å®ã®ç¹æ§ã»ãããçžäºã«æä»çã§ãããšå®£èšã§ããïŒã€ãŸããæ倧ã§1ã€ãå®è£ ã§ããïŒãé€å€ã°ã«ãŒããã®ã¢ã€ãã¢ãæšé²ããŠããŸãã ç§ã¯ãããåæåã®ãããªãã®ãšããŠæ³åããŠããŸãïŒã€ãŸããç¹æ§ã¯ãã¹ãŠäžç·ã«å®£èšãããŸãïŒã ç§ã¯ããã®ã¢ã€ãã¢ã奜ãã§ããç¹ã«ïŒç§ãæãã«ïŒïŒãããåŠå®çãªæšè«ã®ããæ害ãªåŽé¢ã®ããã€ããé¿ããã®ãå©ããã®ã§ã ããããç§ã¯ãã®é¢ã§ãã£ãšèããå¿ èŠãããããã«æããŸã-ãããŠãŸããåŠå®çãªæšè«ã«ã€ããŠèããæ¹æ³ã«ã€ããŠæµ®ããã§ãããã¹ãŠã®ãããŒã¿ããèŠçŽããããšããè¯ãèšäºããããŸãã ããããä»ãç§ã¯ïŒã»ãšãã©ïŒHKTãšå°éã·ãªãŒãºããŸãšããã®ã§ãããã«ã€ããŠèããããšãã§ããŸã...
ãããæžããŠãããšãã«é€å€ã°ã«ãŒãã«ã€ããŠèããŸãããïŒå
æ¥ãã©ãŒã©ã ã§èšåããŸããïŒããã®ç¹å®ã®äŸã§ã¯ãã¹ãŠã®ãã¬ã€ãã®å®è£
ãæä»çã§ãããšã¯éããªããããé€å€ã°ã«ãŒããæ©èœãããšã¯æããŸããã æãç°¡åãªäŸã¯ã Point
ãšFloat
ç¹æ§ã§ãã Float
ã¯1Dãã€ã³ãã«ãªãå¯èœæ§ãããããã ApproxEqualPoint(Point, Point)
ãšApproxEqualFloat(Float, Float)
ã¯ã§ããŸãããæä»çã Square
ãšPolygon
ããŸãã¯Box
|ã®ãããªä»ã®äŸããããŸã Cube
ããã³AABB
ïŒè»žã«æ²¿ã£ãå¢çããã¯ã¹ïŒãããã§ããç¹æ§éå±€ãã¯å®éã«ã¯ããè€éãªå¶çŽãå¿
èŠãšããŸãã
ããããããã¯ã©ãã£ã¹ã«ãŒã«ã§èš±å¯ããããã®ã§ã¯ãããŸããã ããã¯ãäœããã®åœ¢ãçš®é¡ã®ãåŠå®çãªæšè«ãã®é åã«ãªããŸãã
ç§ã¯å°ãªããšãç¹å®ã®ã±ãŒã¹ãå®è£
ããããã«unimplemented!()
ãå
¥ããããšãã§ããã§ãããã ããã§ååã§ããã unimplemented!()
ãå«ãé¢æ°ãåŒã³åºãã±ãŒã¹ãã³ã³ãã€ã©ãŒãéçã«ãã£ããããã®ã§ããã°ãæããã«ãã£ãšæ¬²ããã§ãïŒãããŠãã®æç¹ã§ãç§ãã¡ã¯åã³åŠå®çãªæšè«ã®å°ã«ããŸãïŒ ã
@gnzlbgã©ãã£ã¹ã®ç¹æ®åã«ããããã®æé»ã®ãããã¯ãåŒãèµ·ããããšãã§ããŸããããããè¡ããšããã¢ã€ãã¢ã¯ç§ãïŒ cryïŒã«ããŸãã
ãé€å€ã°ã«ãŒããã®æŠå¿µã¯ãå®éã«ã¯åãªãè² ã®è¶ ç¹æ§å¢çã§ãã ããŸã培åºçã«èª¿æ»ããŠããªãããšã®1ã€ã¯ãé極æ§ã®ç¹æ®åã®æŠå¿µã§ããããã«ããã極æ§ãéã®ç¹æ®åãããimplããããŸãç¹æ®åãããŠããªãimplã«æžã蟌ãããšãã§ããŸãã ããšãã°ããã®å Žåã次ã®ããã«èšè¿°ããŸãã
impl<T> !Foo for T where T: A + C { }
ãããèš±å¯ããããšã®æå³ãå®å šã«ã¯ããããŸããã ããã¯ãç¹æ®åãã³ãŒãã®åå©çšãšããªã¢ãŒãã£ãºã ãçŸåšã©ã®ããã«æ··åããŠããã®ãã«ã€ããŠããã³ããã§ã«åŒ·èª¿ããŠããåé¡ã«é¢é£ããŠãããšæããŸãã
ãã¬ãã£ããªæšè«ãšãã¬ãã£ããªå«æã«ã€ããŠã®ãã®ãã¹ãŠã®è°è«ã§ãç§ã¯ãã€ã³ã¹ã¿ã³ã¹ãã§ãŒã³ãã®å€ãHaskellã®ã¢ã€ãã¢ïŒçŽãçŽã GHCåé¡è¿œè·¡ã·ã¹ãã ã Rust pre-RFC ïŒããäœããªããšããŠãæœåšçãªã€ã³ã¹ãã¬ãŒã·ã§ã³ã®æºãšããŠåã³æã¡åºãããšãäœåãªããããŠãããšæããŠããŸãããããªããšã
åºæ¬çã«ã trait
implãèšè¿°ã§ããå Žæã§ããã°ã©ãã§ããåã®ç¯ã®å Žåã«é©çšããå¿
èŠãããå¥ã®impl
ãæå®ãããelseifç¯ããããã€ã§ãèšè¿°ã§ãããšããèãæ¹ã§ããè² ã®implãæå®ãããªãã·ã§ã³ã®æåŸã®ãelseå¥ãã䜿çšããŠãããã§ã¯ãããŸããã§ããïŒã€ãŸãã Trait
ã®å¥ãã©ããé©çšãããªãå Žåã !Trait
é©çšãããŸãïŒã
@withoutboats
ãé€å€ã°ã«ãŒããã®æŠå¿µã¯ãå®éã«ã¯åãªãè² ã®è¶ ç¹æ§å¢çã§ãã
ç§ã®ãŠãŒã¹ã±ãŒã¹ã§ã¯ããã§ååã ãšæããŸãã
ããã¯ãç¹æ®åãã³ãŒãã®åå©çšãšããªã¢ãŒãã£ãºã ãçŸåšã©ã®ããã«æ··åããŠããã®ãã«ã€ããŠããã³ããã§ã«åŒ·èª¿ããŠããåé¡ã«é¢é£ããŠãããšæããŸãã
ãããã解ãããšãã§ãããã©ããã¯ããããŸããã ç§ã欲ããïŒ
impl
ãè¿œå ãã代ããã«ãããã°ã©ã ã段éçã«èšè¿°ããŠãã¹ãããããšãã§ããŸãããã¹ãŠã®ã±ãŒã¹ãã«ããŒããã®ã¯é£ããã§ãããã³ã³ãã€ã©ãŒãç§ã«ãã¹ãŠã®ã±ãŒã¹ãã«ããŒããããã«åŒ·å¶ããå ŽåïŒ
trait Foo {}
trait A {}
trait B {}
impl<T> Foo for T where T: A { ... }
impl<T> Foo for T where T: B { ... }
// impl<T> Foo for T where T: A + B { ... } //< compiler: need to add this impl!
ãããŠãŸãç§ã«åŠå®çãªå«æãäžããŸãïŒ
impl<T> !Foo for T where T: A + B { }
impl<T> !Foo for T where T: _ { } // _ => all cases not explicitly covered yet
å¿ èŠã«å¿ããŠimplã段éçã«è¿œå ã§ããŸãããŸããimplããªãã¿ã€ãã§ãã¬ã€ãã䜿çšããããšãããšãã³ã³ãã€ã©ãšã©ãŒãçºçããŸãã
ãããèš±å¯ããããšã®æå³ãå®å šã«ã¯ããããŸããã
ãã³ã¯åŠå®çãªæšè«ã«åé¡ããããšè¿°ã¹ãŸããã FWIWäžèšã®äŸã§åŠå®çãªæšè«ã䜿çšãããŠããã®ã¯ãç¹å®ã®ã±ãŒã¹ã®implãå¿ èŠã§ããããšããŠãŒã¶ãŒãç¥ã£ãŠãããããã®å®è£ ãæäŸããªãããšãæ瀺çã«æ±ºå®ããããšã ãã§ãã
ïŒ33017ãæŒãããšããããŸã ããã«ãªã³ã¯ãããŠããŸããã å¥å šæ§ã®ç©ŽãšããŠããŒã¯ãããŠããã®ã§ãããã§è¿œè·¡ãããšããã§ãããã
https://github.com/dtolnay/quote/issues/7ã®å ŽåãRFCã®ãã®äŸã«äŒŒããã®ãå¿ èŠã§ããããŸã æ©èœããŠããŸããã ããã«ã€ããŠä»¥åã«ã³ã¡ã³ãããcc @ tomaka @ Aatch @ rphmeier ã
trait Example {
type Output;
fn generate(self) -> Self::Output;
}
impl<T> Example for T {
default type Output = Box<T>;
default fn generate(self) -> Box<T> { Box::new(self) }
}
impl Example for bool {
type Output = bool;
fn generate(self) -> bool { self }
}
åãããšãè¡šçŸããæ¹æ³ãæäŸãã次ã®åé¿çã«åºããããŸããã
#![feature(specialization)]
use std::fmt::{self, Debug};
///////////////////////////////////////////////////////////////////////////////
trait Example: Output {
fn generate(self) -> Self::Output;
}
/// In its own trait for reasons, presumably.
trait Output {
type Output: Debug + Valid<Self>;
}
fn main() {
// true
println!("{:?}", Example::generate(true));
// box("s")
println!("{:?}", Example::generate("s"));
}
///////////////////////////////////////////////////////////////////////////////
/// Instead of `Box<T>` just so the "{:?}" in main() clearly shows the type.
struct MyBox<T: ?Sized>(Box<T>);
impl<T: ?Sized> Debug for MyBox<T>
where T: Debug
{
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
write!(f, "box({:?})", self.0)
}
}
///////////////////////////////////////////////////////////////////////////////
/// Return type of the impl containing `default fn`.
type DefaultOutput<T> = MyBox<T>;
impl Output for bool {
type Output = bool;
}
impl<T> Example for T where T: Pass {
default fn generate(self) -> Self::Output {
T::pass({
// This is the impl you wish you could write
MyBox(Box::new(self))
})
}
}
impl Example for bool {
fn generate(self) -> Self::Output {
self
}
}
///////////////////////////////////////////////////////////////////////////////
// Magic? Soundness exploit? Who knows?
impl<T: ?Sized> Output for T where T: Debug {
default type Output = DefaultOutput<T>;
}
trait Valid<T: ?Sized> {
fn valid(DefaultOutput<T>) -> Self;
}
impl<T: ?Sized> Valid<T> for DefaultOutput<T> {
fn valid(ret: DefaultOutput<T>) -> Self {
ret
}
}
impl<T> Valid<T> for T {
fn valid(_: DefaultOutput<T>) -> Self {
unreachable!()
}
}
trait Pass: Debug {
fn pass(DefaultOutput<Self>) -> <Self as Output>::Output;
}
impl<T: ?Sized> Pass for T where T: Debug, <T as Output>::Output: Valid<T> {
fn pass(ret: DefaultOutput<T>) -> <T as Output>::Output {
<T as Output>::Output::valid(ret)
}
}
ç§ã¯ãŸã https://github.com/dtolnay/quote/issues/7ã«åãçµãã§ããããã€ã€ã¢ã³ããã¿ãŒã³ãå¿ èŠã§ããã ãããç§ã®è§£æ±ºçã§ãã 以åã«ããã«ã€ããŠå°ããcc @ zitsenãšãå¿çãã@aturonãš@rphmeier ã
#![feature(specialization)]
/// Can't have these impls directly:
///
/// - impl<T> Trait for T
/// - impl<T> Trait for T where T: Clone
/// - impl<T> Trait for T where T: Default
/// - impl<T> Trait for T where T: Clone + Default
trait Trait {
fn print(&self);
}
fn main() {
struct A;
A.print(); // "neither"
#[derive(Clone)]
struct B;
B.print(); // "clone"
#[derive(Default)]
struct C;
C.print(); // "default"
#[derive(Clone, Default)]
struct D;
D.print(); // "clone + default"
}
trait IfClone: Clone { fn if_clone(&self); }
trait IfNotClone { fn if_not_clone(&self); }
impl<T> Trait for T {
default fn print(&self) {
self.if_not_clone();
}
}
impl<T> Trait for T where T: Clone {
fn print(&self) {
self.if_clone();
}
}
impl<T> IfClone for T where T: Clone {
default fn if_clone(&self) {
self.clone();
println!("clone");
}
}
impl<T> IfClone for T where T: Clone + Default {
fn if_clone(&self) {
self.clone();
Self::default();
println!("clone + default");
}
}
impl<T> IfNotClone for T {
default fn if_not_clone(&self) {
println!("neither");
}
}
impl<T> IfNotClone for T where T: Default {
fn if_not_clone(&self) {
Self::default();
println!("default");
}
}
ç¹æ®åãšåæšè«ã§ãã°ïŒãŸãã¯å°ãªããšãç§ã®èŠ³ç¹ããã¯äºæããªãåäœïŒããããããŸãïŒïŒ38167
ãããã®2ã€ã®å®è£ ã¯ãç¹æ®åã«ãã£ãŠæå¹ã§ãããšæåŸ ãããŸããã ããŸãæŸããªãããã§ãã
impl<T, ST, DB> ToSql<Nullable<ST>, DB> for T where
T: ToSql<ST, DB>,
DB: Backend + HasSqlType<ST>,
ST: NotNull,
{
...
}
impl<T, ST, DB> ToSql<Nullable<ST>, DB> for Option<T> where
T: ToSql<ST, DB>,
DB: Backend + HasSqlType<ST>,
ST: NotNull,
{
...
}
Serdeã«ã¹ãã·ã£ã©ã€ãŒãŒã·ã§ã³ãæ§ç¯ããäœæ¥äžã«ééããäºæããªãåäœã«ã€ããŠã httpsïŒ//github.com/rust-lang/rust/issues/38516ãæåºããŸããã https://github.com/rust-lang/rust/issues/38167ãšåæ§ã«ãããã¯ãããã°ã©ã ãç¹æ®ãªimplãªãã§ã³ã³ãã€ã«ãããè¿œå ããããšã¿ã€ããšã©ãŒãçºçããå Žåã§ãã 以åã«ãã®ç¶æ³ãå¿é ããŠããcc @ bluss ã
åäžã®ã¯ã¬ãŒãå
ã§åŠå®çãªæšè«ãèš±å¯ããã®ãšåæ§ã«ãåäžã®ã¯ã¬ãŒãå
ã§default
ããŒã¯ãŒããªãã§ç¹æ®åãèš±å¯ããå Žåã¯ã©ããªããŸããïŒ
ç§ã®äž»ãªçç±ã¯ããã§ãïŒãã€ãã¬ãŒã¿ãšãã¯ãã«ã®ãã¿ãŒã³ãã æã ããŠãŒã¶ãŒã¯ãã¹ãŠã®ã€ãã¬ãŒã¿ãŒãšãã¯ãã«ã®ããã«äœããå®è£ ããããšæãã§ãããïŒ
impl<I> Foo for I where I: Iterator<Item = u32> { ... }
impl Foo for Vec<u32> { ... }
ïŒããã¯ãã€ãã¬ãŒã¿ãŒãšãã¯ãã«ä»¥å€ã®ç¶æ³ã«é¢é£ããŠããŸãããã¡ãããããã¯1ã€ã®äŸã«ãããŸãããïŒ
ä»æ¥ãããã¯ã³ã³ãã€ã«ããããããªã¹ãšæ¯ãããããããŸãã å°éåã¯ãã®åé¡ã解決ããŸãïŒ
default impl<I> Foo for I where I: Iterator<Item = u32> { ... }
impl Foo for Vec<u32> { ... }
ãããããã®åé¡ã解決ããããã«ãã¯ã¬ãŒãã«ãããªãã¯ã³ã³ãã©ã¯ããè¿œå ããŸããã Foo
ã®ã€ãã¬ãŒã¿ãŒimplãç¡å¹ã«ããããšãã§ããŸãã ãã¶ãç§ãã¡ã¯ããªãã«ããããããšã匷å¶ããããªãã§ããã-ãããã£ãŠã default
ãªãã®ããŒã«ã«ã¹ãã·ã£ã©ã€ãŒãŒã·ã§ã³ã
ç§ãæã質åã¯ã default
圹å²ã¯æ£ç¢ºã«ã¯äœã§ããããšããããšã§ãã default
èŠæ±ããããšã¯ãå
ã
ãæ瀺æ§ãšèªå·±ææžåã³ãŒããžã®ãžã§ã¹ãã£ãŒã ã£ããšæããŸãã Rustã³ãŒããããã©ã«ãã§äžå€ãããã©ã«ãã§ãã©ã€ããŒããããã©ã«ãã§å®å
šã§ããããã«ãããã©ã«ãã§ãfinalã§ããå¿
èŠããããŸãã ãéçµå±ã¯ããã°ããŒãã«ããããã£ã§ããã®ã§ãç§ã¯ããªããã¢ã€ãã ãç¹åãããªãéããããããç§ã¯ã¢ã€ãã ãç¹åããããšã¯ã§ããŸããã
default
èŠæ±ããããšã¯ãå ã ãæ瀺æ§ãšèªå·±ææžåã³ãŒããžã®ãžã§ã¹ãã£ãŒã ã£ããšæããŸãã ãã ãã[..]å°éåãããªãéããå°éåããããšã¯ã§ããŸããã
ããã¯æ¬åœã«æªãã§ããïŒ implãå°éã«ãããå Žåã¯ãä»ã®äººãåæ§ã«ããããšæããããããŸããã
ãã®RFCã«ã€ããŠèããã ãã§ããããã€ãªéã®ãªãŒããŒããŒããšç¶æ¿ã䜿çšããC ++ã³ãŒãããŒã¹ã§ã®äœæ¥ã®PTSDãã©ãã·ã¥ããã¯ããã§ã«åŸãããŠãããã¡ãœããåŒã³åºããããã³ãŒãè¡ã§wtfãçºçããŠããããšãããããŸããã @aturonãè²»ãããé·ãã«æ¬åœã«æè¬ããŠããŸãã
ããã¯æ¬åœã«æªãã§ããïŒ implãå°éã«ãããå Žåã¯ãä»ã®äººãåæ§ã«ããããšæããããããŸããã
ä»ã®äººãããã¶ãããããå°éã«ãããã ãã§ãç§ãã¡ã圌ãã«æãŸãªãè¯ãå Žåããããªãããããæå®ããããšãäžå¯èœã«ãã¹ãã§ã¯ãããŸããã ïŒã«ãã»ã«åã«å°ã䌌ãŠããŸããäžéšã®ããŒã¿ã«ã¢ã¯ã»ã¹ãããããä»ã®äººãã¢ã¯ã»ã¹ãããå Žåãããããããã¹ãŠã®ããŒã¿ãããã©ã«ãã§ãããªãã¯ã«ããã®ã§ã¯ãªããæ瀺çã«_this data_ publicãšããŒã¯ããŸããïŒ
ãã®RFCã«ã€ããŠèããã ãã§ããã§ã«PTSDãã©ãã·ã¥ããã¯ãçºçããŠããã®ã§å¿é ã§ã...
ãããããã®ä»æ§ãçŠæ¢ãããšããããã®ããšãèµ·ãããªãããã«ããæ¹æ³ã¯ãããŸããïŒ
æãŸãªãè¯ãã±ãŒã¹ãããå Žåã¯ããããæå®ã§ããªãããã«ããã¹ãã§ã¯ãããŸããã
ãŠãŒã¶ãŒãé©åãªãŠãŒã¹ã±ãŒã¹ãæã£ãŠããå Žåã¯ãã€ã§ãããŠãŒã¶ãŒã«ãã¯ãŒãäžããããšã¯å¿ ãããè¯ãèãã§ã¯ãããŸããã ãŸãããŠãŒã¶ãŒãçŽããããã³ãŒããèšè¿°ã§ããå Žåã¯ããã§ã¯ãããŸããã
ãããããã®ä»æ§ãçŠæ¢ãããšããããã®ããšãèµ·ãããªãããã«ããæ¹æ³ã¯ãããŸããïŒ
foo.bar()
ã衚瀺ãããŠããŠã bar()
æ©èœã確èªããããšããŸãã çŸåšãäžèŽããåã«å®è£
ãããŠããã¡ãœãããèŠã€ããã default
ããŒã¯ãä»ããŠããªãå Žåã¯ãæ¢ããŠããã¡ãœããå®çŸ©ã§ããããšãããããŸãã @withoutboatsã®ææ¡ã§ã¯ãããã¯ãã¯ãçå®ã§ã¯ãããŸããã代ããã«ãå®è¡ãããŠããã³ãŒããå®éã«èŠãŠãããã©ããã確å®ã«ç¥ãããšã¯ã§ããŸããã
代ããã«ãå®è¡ãããŠããã³ãŒããå®éã«èŠãŠãããã©ããã確å®ã«ç¥ãããšã¯ã§ããŸããã
ããã¯ãããŒã«ã«ã¿ã€ãã®ããã©ã«ã以å€ã®implã®ç¹æ®åãèš±å¯ããå¹æã®ããªãèªåŒµã§ãã ããªããå ·äœçãªimplãèŠãŠãããªããããªãã¯ããªããæ£ããimplãèŠãŠããããšãç¥ã£ãŠããŸãã ãããŠãããªãã¯ãã®ã¯ã¬ãŒãã®ãœãŒã¹å šäœã«ã¢ã¯ã»ã¹ã§ããŸãã ãã®implãç¹æ®åãããŠãããã©ããããŸãã¯ã決ããŠããããå€§å¹ ã«æ©ããªããã©ãããå€æã§ããŸãã
äžæ¹ã default
ã䜿çšããŠããimplããã¡ã€ãã©ã€ãºãããŠããªãå Žåã¯åé¡ãæ®ããŸãã æ£ããimplãå®éã«default
implã§ããå Žåããããæ£ããimplã§ãããã©ããããããªããšããåãç¶æ³ã«ãããŸãã ãããŠãã¡ãããç¹æ®åãæ¡çšãããŠããå Žåãããã¯éåžžã«äžè¬çã«åœãŠã¯ãŸããŸãïŒããšãã°ãããã¯ä»æ¥ã ToString
ã»ãŒãã¹ãŠã®å®è£
ã«åœãŠã¯ãŸããŸãïŒã
å®éãããã¯ããªãæ·±å»ãªåé¡ã ãšæããŸããã default
解決ã§ãããšã¯æããŸããã å¿
èŠãªã®ã¯ãããåªããã³ãŒãããã²ãŒã·ã§ã³ããŒã«ã§ãã çŸåšãrustdocã¯ããã¬ã€ãimplã«é¢ããŠã¯ãéåžžã«ããã¹ããšãã©ãŒããã¢ãããŒããæ¡çšããŠããŸãããœãŒã¹ã«ãªã³ã¯ããŠããããå
æ¬çimplã«ãã£ãŠæäŸãããimplããªã¹ããããŠããŸããã
ãã®å€æŽã決ããŠã¹ã©ã ãã³ã¯ã ãšèšã£ãŠããããã§ã¯ãããŸãããããã£ãšåŸ®åŠãªæ€èšã®äŸ¡å€ããããšæããŸãã
ãŠãŒã¶ãŒãé©åãªãŠãŒã¹ã±ãŒã¹ãæã£ãŠããå Žåã¯ãã€ã§ãããŠãŒã¶ãŒã«ãã¯ãŒãäžããããšã¯å¿ ãããè¯ãèãã§ã¯ãããŸããã ãŸãããŠãŒã¶ãŒãçŽããããã³ãŒããèšè¿°ã§ããå Žåã¯ããã§ã¯ãããŸããã
æ£ç¢ºã«ãç§ã¯çµ¶å¯Ÿã«åæããŸãã ããã§ã¯ãããªããæžããæšæ ã®ãŠãŒã¶ãŒã§ããå¥ã®ããŠãŒã¶ãŒãã«ã€ããŠè©±ããŠãããšæããŸãã ããªãã¯åœŒããããªãã®ã¯ã¬ãŒãã®ç¹æ§ãèªç±ã«å°éåããããšãæãŸãªãïŒããããããªãã®ã¯ã¬ãŒãã®æ¯ãèãã«ããããŒãªæ¹æ³ã§åœ±é¿ãäžããïŒã äžæ¹ãç§ãã¡ã¯ããªãã話ããŠããããŠãŒã¶ãŒããã€ãŸãã¯ã¬ãŒãã®äœè ã«ãã£ãšåãäžããã§ããããã @ withoutboatsã®ææ¡ããªããŠãããããã©ã«ããã䜿çšããŠåãåé¡ã«
default
ã¯ãã³ãŒãã®èªã¿åããåçŽåãããå Žåã¯ã誰ãdefault
䜿çšããªãããã«äŸé Œããããã³ãŒãã䜿çšããããã®å³å¯ãªããã¥ã¡ã³ãã«ãŒã«ã確ç«ãããã§ãããšããæå³ã§åœ¹ç«ã€ãšæããŸãã ãã®æç¹ã§ãããªãã¯std
ããã®default
ã«ã€ããŠå¿é
ããã ãã§ããããããã人ã
ã¯ãã£ãšããç解ããã§ãããã
ã¹ãã·ã£ã©ã€ãŒãŒã·ã§ã³ã®äœ¿çšæ³ã«ææžåã«ãŒã«ã課ãããšãã§ããã¹ãã·ã£ã©ã€ãŒãŒã·ã§ã³RFCã®æ¿èªã«è²¢ç®ãããšããèããæãåºããŸãã
@withoutboatsã¯ãããªãŒããŒã©ã€ãå¯èœã§ããããã®ã¯ã¬ãŒãå
ã§ã®ã¿ããæå³ããå¶éããã圢åŒã®default
ãå¿
èŠãªããã default
ãç·©ããåæ©ãèªãã§æ£ããã§ãïŒã€ãŸãã pub(crate)
ãããdefault
ïŒïŒ ãã ããç©äºãåçŽã«ããããã«ã default
ãããã®ç®çããè¿œå ããã®ã§ã¯ãªãã default
ãçç¥ããã»ãã³ãã£ã¯ã¹ãå€æŽããããšãææ¡ããŠããŸããïŒ
æ£ããã default(crate)
ãããªããšãããã®ã¯ããéãã®ããã§ãã
å
éšçã«ãç§ã¯ãæšæ ãäœã茞åºããããéããŠãããã·ãã¥ã¬ãŒãã§ãããšæããŸããããã§ã¯ãããŸãããïŒ default
ã¡ãœããã䜿çšããŠãã©ã€ããŒããã«ããŒãã¬ã€ããåçŽã«å°å
¥ãããããèªåã®æçµçãªimpl
ããåŒã³åºãããšãã§ããªãç¶æ³ã¯ãããŸããïŒ ãŠãŒã¶ãŒã«default
ã䜿çšããããããç¬èªã®ãã®ã¯æäŸããªãããã«ãããã§ããïŒ
æ£ããã defaultïŒcrateïŒã®ãããªããšãããã®ã¯ããéãã®ããã§ãã
åæããŸããã ç§ã¯æ¬åœã«ããã©ã«ãã®å¶éããã圢åŒã欲ããã§ãã ç§ã¯ãããææ¡ããã€ããã§ããã ç§ã®åæ©ã¯ã亀差ç¹ãªã©ãããã©ã«ããè¿œå ããããšã匷å¶ããããšããããšããããšã§ãããããã¯ããªããä»»æã®ã¯ã¬ãŒããããªãã®è¡åãå€ããããšãèš±å¯ããããšããæå³ã§ã¯ãããŸããã ç³ãèš³ãããŸããããäŒè°ããããŸããå°ãäŸãæããŠè©³ãã説æããŸãã
@nikomatsakisç§ã¯åãåæ©ãæã£ãŠããŸããç§ãææ¡ããŠããã®ã¯ãã¬ããŒãè¿œå ããã®ã§ã¯ãªããåãã¯ã¬ãŒãã«ç¹åãããšããããã©ã«ãã®èŠä»¶ãåé€ããããšã§ãã :-)
ããŸããŸãã®ãšã¯ã¹ããŒããããŠããªãããã©ã«ããããäžè¬çãªäœ¿çšæ³ã§ããå¯èœæ§ãããå Žåã #[default_export]
æ©èœã¯ã #[macro_export]
ãšã®é¡æšã«ãã£ãŠèŠãããããªããŸãã äžéãªãã·ã§ã³ã¯ã pub use
ãŸãã¯pub mod
è¡ã«å¯ŸããŠãã®ãšã¯ã¹ããŒãæ©èœãèš±å¯ããããšã§ãã
Macros 2.0ã¯éåžžã®ã¢ã€ãã ãšããŠãã¯ãããµããŒããã #[macro_use]
代ããã«pub
ã䜿çšããããã pub
ããŒã¯ãŒãã䜿çšããæ¹ãé©åã§ãã pub
ã䜿çšããŠå
šäœçãªå¯èŠæ§ã瀺ãããšã¯ããã®äžè²«æ§ã«ãšã£ãŠå€§ããªã¡ãªããã«ãªããŸãã
@withoutboatsã«é¢ä¿ãªããããŒã«ã«ã«ç¹åããããšæãããšããããšæããŸãããå¿ ããããã¹ãŠã®äººã«éæžãéãå¿ èŠã¯ãããŸãã
pubããŒã¯ãŒãã䜿çšããæ¹ãè¯ãã§ããã
pub default fn
ãšããããšã¯ãé¢æ°èªäœã®å¯èŠæ§ã«åœ±é¿ãäžããã®ã§ã¯ãªãããfnã®ããã©ã«ãããããªãã¯ã«ãšã¯ã¹ããŒããããããšãæå³ããŸããããã¯åå¿è
ã«ãšã£ãŠéåžžã«æ··ä¹±ããŸãã
@jimmycuadraã¯ã pub
ããŒã¯ãŒãã䜿çšãããšããæå³ã§ããïŒ @sgrifã®æ¹ãçŽããããããã«æãããããšã«åæããŸããããã©ã«ãã®ã¹ã³ãŒããæ瀺çã«èš±å¯ããå Žåã¯ãå¯èŠæ§ãã¹ã³ãŒãããããã«æ±ºå®ããã®ãšåãæ§æãæ£ãããã¹ã®ããã«èŠããŸãã
ãããããæ£ç¢ºã«ã¯pub default fn
ã§ã¯ãããŸãããããã¯ãäž¡æ¹ãšãèšåããŠããããã«ããããŸãã ããã§ãã pub
æ®éçã«ãå€éšã«ãã©ã€ããŒããªãã®ãå
¬éããããšããæå³ã«ããããšã«pub
ãå«ãæ§æã®å®åŒåããããããããŸãã
å°ãæ§æçã§ããã default(foo)
ãpub(foo)
ããã«æ©èœããããšã«å察ããã€ããã¯ãããŸããã2ã€ã®éã®å¯Ÿç§°æ§ã¯ãç§ã«ãšã£ãŠæ§æã®ç
©ãããããããã«äžåã£ãŠããŸãã
BikeshedèŠåïŒæã
ã¯ãããåŒã³åºããšèããããŠããoverridable
ã®ä»£ããã«default
ïŒ ããã¯æåéã説æçã§ããã overridable(foo)
ã¯default(foo)
ãããèªã¿ããããªã£ãŠããŸã-åŸè
ã¯ãããã¯foo
ã®ç¯å²å
ã®ããã©ã«ãã§ãããä»ã®äœããããã©ã«ãã§ããå¯èœæ§ããããŸãåè
ã¯ãããã¯foo
ã®ç¯å²å
ã§äžæžãå¯èœã§ãããšèšã£ãŠããŸãããããã¯æ£ããã§ãã
æåã®2ã€ã®è³ªåã¯æ¬åœã«æ¬¡ã®ãšããã§ãã default
ãšã¯ã¹ããŒããããããªããã¯ãããªãäžè¬çã§ããã default
ãšã¯ã¹ããŒãããããšãããã©ã«ãã®åäœã«ãã¹ãã§ã¯ãããŸãããïŒ
ã¯ãã®å ŽåïŒä»ã®å Žæã§ã®ãšã¯ã¹ããŒããšã®é¡äŒŒæ§ãæ倧åããããšãã§ããŸãã pub mod mymodule default;
ãpub use mymodule::MyTrait default;
ããŸãã¯overridable
ãŸãã å¿
èŠã«å¿ããŠã pub use MyModule::MyTrait::{methoda,methodb} default;
䜿çšããäžéšã®ã¡ãœããã«å¯ŸããŠã®ã¿default
ãšã¯ã¹ããŒãã§ããŸãã
ã±ãŒã¹ãªãïŒãšã«ããRustã®ä»ã®ãã®ãšã¯ããªãç°ãªããå
¬éã§ã¯ãªãéå
¬éãè¡šçŸããå¿
èŠãããããã default(crate)
ããããã®ãšã¯ã¹ããŒããå¶åŸ¡ããéåžžã®æ¹æ³ã«ãªããŸãã
ãŸãã default
ãšã¯ã¹ããŒãããå Žåãšãšã¯ã¹ããŒãããªãå Žåãæ¯èŒçäžè¬çã§ããå Žåã¯ããã¯ãããŸãã¯ãããããã®ã©ã¡ãã®å Žåã§ãä»»æã«éžæã§ããããã pub use MyModule::MyTrait::{methoda,methodb} default;
éžæããã ãã§åé¡ãããŸããã
ãããã®è¡šèšã¯ãã¹ãŠããšã«ããäºææ§ãããããã«èŠããŸãã å¥ã®ãªãã·ã§ã³ã¯ã default
ãéããç¹å¥ãªimpl
ãããããŸããããããã¯è€éã§å¥åŠã«èãããŸãã
@burdgesåŸãã«ã nocase ããšããã©ãã«ããããŸããããããšãç§ã¯ããªããèšã£ãŠããããšã誀解ããŠããŸããïŒ
ããããã£ãšïŒ ä¿®ç¹ïŒ
impl<T> Borrow<T> for T where T: ?Sized
ã®ã§ã Borrow<T>
ããŠã³ãã¯ãææããå€ãåçšãããã®ããã«æ±ãããšãã§ããŸãã
ç¹æ®åã䜿çšããŠã Borrow<T>
ããclone
ãžã®åŒã³åºããæé©åã§ãããšæããŸãã
pub trait CloneOrTake<T> {
fn clone_or_take(self) -> T;
}
impl<B,T> CloneOrTake<T> for B where B: Borrow<T>, T: Clone {
#[inline]
default fn clone_or_take(b: B) -> T { b.clone() }
}
impl<T> CloneOrTake<T> for T {
#[inline]
fn clone_or_take(b: T) -> T { b };
}
ããã«ããã Borrow<T>
ãããå€ãã®ç¶æ³ã§äœ¿çšã§ããããã«ãªããšæããŸãã T
è¿ããšãã«Sized
ãå¿
èŠã«ãªããšæãããããã T: ?Sized
ãã€ã³ããåé€ããŸããã
å¥ã®ã¢ãããŒãã¯
pub trait ToOwnedFinal : ToOwned {
fn to_owned_final(self) -> Self::Owned;
}
impl<B> ToOwnedFinal for B where B: ToOwned {
#[inline]
default fn to_owned_final(b: B) -> Self::Owned { b.to_owned() }
}
impl<T> ToOwnedFinal for T {
#[inline]
fn to_owned_final(b: T) -> T { b };
}
ä»æ¥ãããã€ãã®åä»ãªçºèŠãããŸãããããã§IRCãã°ãèªãããšãã§ããŸãïŒ https ïŒ
ç¹ã«äºåŸã®ãã³ã®ã³ã¡ã³ããé«æããŠããããã«èŠããã®ã§ãç§ã¯ç§ãã¡ãå°éãããã¹ãŠã®çµè«ã«ã€ããŠ100ïŒ èªä¿¡ããããŸããã ãã°ããã®éãããã¯ç§ã«ã¯å°ãé»ç€ºé²çãªããã«èŠããŸããã
ç§ãããªã確信ããŠããããšã®1ã€ã¯ã default
ãèŠæ±ããããšã¯ãæ°ããdefault
implãè¿œå ããããšãåžžã«äžäœäºææ§ããããšããä¿èšŒãšäºææ§ãæãããããšãã§ããªããšããããšã§ãã ããããã¢ã³ã¹ãã¬ãŒã·ã§ã³ã§ãïŒ
parent
v 1.0.0
trait A { }
trait B { }
trait C {
fn foo(&self);
}
impl<T> C for T where T: B {
// No default, not specializable!
fn foo(&self) { panic!() }
}
client
ïŒ parent
ã«ãã£ãŠç°ãªããŸãïŒextern crate parent;
struct Local;
impl parent::A for Local { }
impl parent::C for Local {
fn foo(&self) { }
}
ããŒã«ã«ã¯A
ãšC
å®è£
ããŸããã B
å®è£
ããŸããã ããŒã«ã«ã§å®è£
ãããB
å Žåããã®C
å®è£
B
ãç¹æ®åãããŠããªãC for T where T: B
å
æ¬çå®è£
ãšç«¶åããŸãã
parent
v 1.1.0
// Same code as before, but add:
default impl<T> B for T where T: A { }
ãã®implãè¿œå ãããå®å šã«ç¹æ®åå¯èœãªimplã§ãããããããã¯é倧ãªå€æŽã§ã¯ãªããšè¿°ã¹ãŸããã ãã ããä»åè©ã®æå³ãäœæããŸããããã¹ãŠã®A impl CïŒç¹æ®åäžå¯ïŒããè¿œå ããããšã§ãããã¹ãŠã®A impl CïŒç¹æ®åäžå¯ïŒããšããã¹ããŒãã¡ã³ããæé»çã«è¿œå ããŸããã "ã çŸåšãåã¯ã¬ãŒãã¯ã¢ããã°ã¬ãŒãã§ããŸããã
ã¢ãŒãã³ã¯ïŒäžèšã®ãªã³ã¯ã®ãã°ã§ãããããã«ïŒããã©ã«ãæ§ã«é¢ããŠåçã®ä¿èšŒãè¡ãimplãèšè¿°ã§ããããšã瀺ãããããç¹æ®ãªimplãè¿œå ããããšãé倧ãªå€æŽã§ã¯ãªãããšãä¿èšŒãããšããèãã¯å®å šã«çªã®å€ã«ããå ŽåããããŸãã ã ãã ããNikoã®ãã®åŸã®ã³ã¡ã³ãã¯ããã®ãããªimplãå€ç«ããã«ãŒã«ã«ãã£ãŠçŠæ¢ãããŠããïŒãŸãã¯å°ãªããšãçŠæ¢ãããŠããïŒå¯èœæ§ãããããšã瀺åããŠããŸãã
ãããã£ãŠããimplãéç Žå£ã§ããããšããä¿èšŒãææžå¯èœãã©ããã¯ç§ã«ã¯ããããŸããããimplã®æçµæ§ã«å¯Ÿããæ瀺çãªå¶åŸ¡ãšäºææ§ããªãããšã¯ç¢ºãã§ãã
ãããèš±å¯ããäºå®ã¯ãããŸããïŒ
struct Foo;
trait Bar {
fn bar<T: Read>(stream: &T);
}
impl Bar for Foo {
fn bar<T: Read>(stream: &T) {
let stream = BufReader::new(stream);
// Work with stream
}
fn bar<T: BufRead>(stream: &T) {
// Work with stream
}
}
ãããã£ãŠãåºæ¬çã«ã¯ã A
ã«å¢çãããtypeãã©ã¡ãŒã¿ãŒãæã€ãã³ãã¬ãŒãé¢æ°ã®ç¹æ®åã§ããç¹æ®åãããããŒãžã§ã³ã«ã¯B
å¢çããããŸãïŒ A
ãå¿
èŠã§ãïŒã
@torkleyyã¯çŸåšã§ã¯ãããŸãããã T: Read
ãšT: BufRead
äž¡æ¹ã«å®è£
ããããã®ãã¬ã€ãã®å®è£
ã«ç¹åãããã³ãŒãã®éšåãå«ããã¬ã€ããäœæããããšã§ãå¯ãã«ãããè¡ãããšãã§ããŸãã ãããªãã¯APIã§è¡šç€ºããå¿
èŠã¯ãããŸããã
äžäœäºææ§ã®åé¡ã«é¢ããŠã¯ãå€ç«ããã«ãŒã«ã®ãããã§ã次ã®ã«ãŒã«ãåé¿ã§ãããšæããŸãã
_implã¯ã以äžãé€ããŠè¿œå ããããã®äžäœäºææ§ããããŸãïŒ_
ã€ãŸããåé¡ã®ãããã¹ãŠã®äŸã§ãè¿œå ãããimplã¯å æ¬çimplã§ãããšæããŸãã å®å šã«ããã©ã«ãã®ãã©ã³ã±ããã€ã³ãã倧äžå€«ã ãšèšãããã£ãã®ã§ãããæ¢åã®ãã©ã³ã±ããã€ã³ããè¿œå ããããšã¯é倧ãªå€æŽã«ãªãå¯èœæ§ããããšèšããªããã°ãªããªããšæããŸãã
åé¡ã¯ãããã«çŽé¢ããŠã©ã®ãããªä¿èšŒããããã®ããšããããšã§ã-ããšãã°ãå°ãªããšãå æ¬çimplãã¯ã¬ãŒãå ã®ã³ãŒãã«åºã¥ããé倧ãªå€æŽã«ãããªãå Žåã¯ãéåžžã«åªããããããã£ã«ãªããšæããŸããããªãã®ã¯ã¬ãŒããšããªããã¡ãžã£ãŒããŒãžã§ã³ãã€ã³ã¯ãªã¡ã³ãããå¿ èŠããããã©ããã確å®ã«ç¥ã£ãŠããŸãã
@withoutboats
äžäœäºææ§ã®åé¡ã«é¢ããŠã¯ãå€ç«ããã«ãŒã«ã®ãããã§ã次ã®ã«ãŒã«ãåé¿ã§ãããšæããŸãã
_implã¯ã以äžãé€ããŠè¿œå ããããã®äžäœäºææ§ããããŸãïŒ_
- _å®è£ ãããŠãããã¬ã€ãã¯èªåãã¬ã€ãã§ãã_
- _ã¬ã·ãŒããŒã¯ã¿ã€ããã©ã¡ãŒã¿ãŒã§ãããimplã®ãã¹ãŠã®ç¹æ§ã¯ä»¥åã«ååšããŠããŸããã_
ã€ãŸããåé¡ã®ãããã¹ãŠã®äŸã§ãè¿œå ãããimplã¯å æ¬çimplã§ãããšæããŸãã å®å šã«ããã©ã«ãã®ãã©ã³ã±ããã€ã³ãã倧äžå€«ã ãšèšãããã£ãã®ã§ãããæ¢åã®ãã©ã³ã±ããã€ã³ããè¿œå ããããšã¯é倧ãªå€æŽã«ãªãå¯èœæ§ããããšèšããªããã°ãªããªããšæããŸãã
1é±éåŸãå€ãã®è°è«ããããŸããããæ®å¿µãªããããã§ã¯
çµæã¯ïŒcrying_cat_faceïŒã§ãããç§ãããã«æžããããšã¯ããªãã®çµè«ãšåãã ãšæããŸãã å æ¬çå®è£ ãè¿œå ããããšã¯ãäœããã£ãŠããé倧ãªå€æŽã§ãã ãã ããå æ¬çå®è£ ïŒããã³èªåç¹æ§å®è£ ïŒã®ã¿ã§ãã ç§ã®ç¥ãéããå æ¬çã§ãªãimplãããŠã³ã¹ããªãŒã ã³ãŒããå£ãå¯èœæ§ãããã±ãŒã¹ã¯èŠã€ãããŸããã§ããïŒãããŠããã¯éåžžã«æªãããšã§ãïŒã
ããæç¹ã§ãå€ç«ããã«ãŒã«ãç·©åããŠã Vec<MyType>
ãããªã¿ã€ãã®ç¹æ§ãå®è£
ã§ããããã«ãªããããããªããšæã£ãŠããŸãããããããããšããã®ç¶æ³ã¯ãŸã£ããåãããã«çºçããŸãã
//crate A
trait Foo { }
// new impl
// impl<T> Foo for Vec<T> { }
// crate B
extern crate A;
use A::Foo;
trait Bar {
type Assoc;
}
// Sadly, this impl is not an orphan
impl<T> Bar for Vec<T> where Vec<T>: Foo {
type Assoc = ();
}
// crate C
struct Baz;
// Therefore, this impl must remain an orphan
impl Bar for Vec<Baz> {
type Assoc = bool;
}
@withoutboatsãããç§ã¯ããªãã®2ã€ã®ç®æ¡æžãã®ãªã¹ããandã§ã¯ãªããŸãã¯ãšããŠç解ããŸãããããã¯ããªããæå³ããããšã®ããã§ããïŒ
@aturonãããç§ã¯ããŸãã¯ããæå³ããŸãã-ãããã¯ããããŸãïŒ //is.gd/k4Xtlp
ã€ãŸããæ°ããååãå«ãŸããŠããªãéãã§ãã æ°ããååãå«ãimplãå£ããããšã¯ãããŸããã
@withoutboatsèªåç¹æ§ã«é¢ããåŠå®çãªè«çã«äŸåããŠãã人ã
ãå¶éã§ãã/ãã¹ããã©ããçåã«æããŸãã ã€ãŸããèªåç¹æ§ã®æ°ããimplãè¿œå ããããšã¯æ³çãªéåã®å€æŽã§ãããšèšã£ãå Žåã Send
è¿œå ããäžæµã®ã¯ã¬ãŒãã«ãã£ãŠç Žæããå¯èœæ§ã®ããimplã«ã€ããŠèŠåããå¯èœæ§ããããŸãã ããã¯ã次ã®å Žåã«æé©ã«æ©èœããŸãã
default
ãæŠç¥çãªå Žæã«Rc
ãããªåã¯ã決ããŠSend
ã«ãªããªããšããæå³ã宣èšã§ããããã«ãäœããã®åœ¢åŒã®æ瀺çãªè² ã®implã§ãããã ããèªåç¹æ§çšã®ãã®ãããã®ã§ãããããèæ
®ã«å
¥ããããšãã§ããŸãã匷ãã¢ãããŒã·ã§ã³ããããã©ããã«ãããšæããŸãã ãã§ã«ãªãªãŒã¹ããåŸãã¿ã€ãã«unsafe impl Send/Sync
ãå«ãŸããå¯èœæ§ãããããšã«æ°ä»ãå¯èœæ§ã¯ç¹ã«äœãããã§ãã ã»ãšãã©ã®å Žåãå®å
šã ãšæããŸãããå®å
šã§ãããšããäºèŠãæã£ãŠåãäœæããŠããã¯ãã§ãïŒãããåã®ãã€ã³ãã ããã§ãïŒã
ç§ã¯ãã€ãäºåŸã«unsafe impl Send/Sync
ãè¿œå ããŸãã ã¹ã¬ããã»ãŒãã«ããããšãããã°ãã€ã³ã¿ãŒãã§ãŒã¹ããŠããC APIãã¹ã¬ããéã§å
±æããŠãåé¡ãªãããšãèªèããŠããããšããããŸãããŸããäœããSend
/ Sync
ããã¹ããã©ãããšããçç±ã ãã§ããå ŽåããããŸããã¿ã€ãã玹ä»ãããšãã«ç§ãèããŠããããšã§ã¯ãããŸããã
C APIããã€ã³ããããšãã«ããäºåŸã«è¿œå ããŸããå€ãã®å Žåã誰ããæ瀺çã«ãããã®å¢çãèŠæ±ãããããåºã«ãªãã©ã€ãã©ãªãäœãä¿èšŒãããã確èªããŸãã
é¢é£ããç¹æ§ã®ç¹æ®åãçŸåšã©ã®ããã«æ©èœãããã«ã€ããŠç§ãæ°ã«å ¥ããªãããšã®1ã€ã¯ããã®ãã¿ãŒã³ãæ©èœããªãããšã§ãã
trait Buffer: Read {
type Buffered: BufRead;
fn buffer(self) -> impl BufRead;
}
impl<T: Read> Buffer for T {
default type Buffered = BufReader<T>;
default fn buffer(self) -> BufReader<T> {
BufReader::new(self)
}
}
impl<T: BufRead> Buffer for T {
type Buffered = Self;
fn buffer(self) -> T {
self
}
}
ããã¯ãçŸåšã®ã·ã¹ãã ã§ã¯ããã®implãæå¹ã§ããå¿ èŠãããããã§ãã
impl Buffer for SomeRead {
type Buffered = SomeBufRead;
// no overriding of fn buffer, it no longer returns Self::Buffered
}
ç¹æ§ã®impl Trait
ã¯ããã®çš®ã®ãã¿ãŒã³ã«å¯Ÿããå€ãã®æ¬²æ±ã解æŸããŸãããäžè¬çãªimplãæå¹ã§ããããåãšã©ãŒãçºçããããããã®ç¹æ®åãæ©èœããªããããè¯ã解決çã¯ãªãã®ã§ã¯ãªãããšæããŸãã ïŒ
@withoutboatsãããããã¯ãã¶ã€ã³ã«é¢ããäž»ãªæªè§£æ±ºã®è³ªåã®1ã€ã§ãïŒæè¿ã®è°è«ã§åãäžããããšãå¿ããŠããŸããïŒã ããã«ã€ããŠã¯å ã®RFCã¹ã¬ããã§ããªãã®éã®è°è«ããããŸããããªãã·ã§ã³/ãã¬ãŒããªãã®èŠçŽãããã«æžãäžããããšããŸãã
@aturonçŸåšã®ãœãªã¥ãŒã·ã§ã³ã¯æãä¿å®çã§ããïŒç§ãã¡ãããããããšãšäžäœäºææ§ããããŸãïŒããããšãå®å®ããåã«æ±ºå®ããå¿ èŠããããŸããïŒ
å人çã«ã¯ã @ withoutboatsãçºçãããã®åé¡ã®å¯äžã®å®éã®è§£æ±ºçã¯ã default
ã¿ã°ãæå®ãããšãã«ã¢ã€ãã ããã°ã«ãŒãåãã§ããããã«ããããšã ãšæããŸãã ããã¯äžçš®ã®ããè¯ã解決çã§ãããããæªã-ããè¯ãããªã¢ã³ãïŒãã¹ãŠããªãŒããŒã©ã€ãããæ段ããªãŒããŒã©ã€ãããïŒã¯ããªãæªãããã«æããŸãã ïŒããããå®éã«ã¯ããã®ã³ãŒããèšè¿°ããæ¹æ³ã§Buffer
ã®æ»ãå€ã®åãšããŠimpl BufRead
ã䜿çšãã代ããã«ã Self::BufReader
ãæå³ãããšæããŸãããïŒïŒ
ãã®å Žåã以äžãèš±å¯ãããŸãã
trait Buffer: Read {
type Buffered: BufRead;
fn buffer(self) -> impl BufRead;
}
impl<T: Read> Buffer for T {
default {
type Buffered = BufReader<T>;
fn buffer(self) -> BufReader<T> {
BufReader::new(self)
}
}
}
impl<T: BufRead> Buffer for T {
type Buffered = Self;
fn buffer(self) -> T {
self
}
}
ãããããããããããã®ã°ã«ãŒãåãæšæž¬ããããšãã§ããŸããïŒ ããŸãèããŠããŸããããã¢ã€ãã ã®ããã©ã«ããã絡ã¿åã£ãŠããããšããäºå®ã¯ãç¹æ§ã®å®çŸ©ããæãããªããã§ãã
ãããå®éã«ã¯ããã®ã³ãŒããæžããæ¹æ³ã§@withoutboatsã¯æ··ä¹±ãæããŸãã Bufferã®æ»ãå€ã®åãšããŠimplBufReadã䜿çšãã代ããã«ãSelf :: BufReaderãæå³ããŠãããšæããŸãããïŒ
ã¯ãããœãªã¥ãŒã·ã§ã³ãimplç¹æ§ããŒã¹ã®ãœãªã¥ãŒã·ã§ã³ã«å€æŽããŠããå ã«æ»ããŸããããç¹æ§ã®æ»ãå€ã®åãèŠéããŠããŸããã
Rustsã«äŒŒãŠããããã«èŠããã®ã§ããã®èšèªã®åã·ã¹ãã ã®ãããªãã®ãèå³æ·±ããããããŸããããããã€ãã®æ©èœãåããŠãããããçŸåšã®åé¡ã解決ã§ããå¯èœæ§ããããŸãã
ïŒ A <: B
ã¯ã A
ãæ§é äœã§ããããã¬ã€ãB
ãå®è£
ããŠããå ŽåããŸãã¯A
ããã¬ã€ãã§ããããã®ç¹æ§ã¯ååšãããšæããŸãïŒ
ç¹æ®åã®Display
ç¹æ§ã«åé¡ãããããã§ãã
ããšãã°ããã®äŸã¯ã³ã³ãã€ã«ãããŸããã
use std::fmt::Display;
pub trait Print {
fn print(&self);
}
impl<T: Display> Print for T {
default fn print(&self) {
println!("Value: {}", self);
}
}
impl Print for () {
fn print(&self) {
println!("No value");
}
}
fn main() {
"Hello, world!".print();
().print();
}
次ã®ãšã©ãŒãçºçããŸãïŒ
error[E0119]: conflicting implementations of trait `Print` for type `()`:
--> src/main.rs:41:1
|
35 | impl<T: Display> Print for T {
| _- starting here...
36 | | default fn print(&self) {
37 | | println!("Value: {}", self);
38 | | }
39 | | }
| |_- ...ending here: first implementation here
40 |
41 | impl Print for () {
| _^ starting here...
42 | | fn print(&self) {
43 | | println!("No value");
44 | | }
45 | | }
| |_^ ...ending here: conflicting implementation for `()`
ãããã³ã³ãã€ã«ãããŠããéïŒ
pub trait Print {
fn print(&self);
}
impl<T: Default> Print for T {
default fn print(&self) {
}
}
impl Print for () {
fn print(&self) {
println!("No value");
}
}
fn main() {
"Hello, world!".print();
().print();
}
ãã®åé¡ãä¿®æ£ããŠããã ãããããšãããããŸãã
@antoyoã¯ã Display
ãç¹å¥ã§ãããããã Default
ãã¿ãã«ã«å®è£
ãããŠããªãã®ã«Display
ãå®è£
ãããŠããªãããã§ããããã
@shepmaster
Display
ã«ã€ããŠãã©ããã¯ããããŸããããã¿ãã«ã«å®è£
ãããŠããªãCustom
ãã¬ã€ãã§ä»¥äžãæ©èœããŸãã
pub trait Custom { }
impl<'a> Custom for &'a str { }
pub trait Print {
fn print(&self);
}
impl<T: Custom> Print for T {
default fn print(&self) {
}
}
impl Print for () {
fn print(&self) {
println!("No value");
}
}
fn main() {
"Hello, world!".print();
().print();
}
ã¡ãªã¿ã«ããããç§ãå°éåã§éæãããæ¬ç©ã§ãïŒ
pub trait Emit<C, R> {
fn emit(callback: C, value: Self) -> R;
}
impl<C: Fn(Self) -> R, R, T> Emit<C, R> for T {
default fn emit(callback: C, value: Self) -> R {
callback(value)
}
}
impl<C> Emit<C, C> for () {
fn emit(callback: C, _value: Self) -> C {
callback
}
}
ããã©ã«ãã§é¢æ°ãåŒã³åºããããã©ã¡ãŒã¿ãŒãunitã®å Žåã¯å€ãè¿ããŸãã
競åããå®è£
ã«ã€ããŠãåããšã©ãŒãçºçããŸãã
å°éåéã§ãããè¡ãããšã¯å¯èœã§ãïŒãŸãã¯ããã¯å¯èœã§ããããïŒïŒ
ããã§ãªãå Žåã代æ¿æ段ã¯äœã§ããïŒ
ç·šéïŒç§ã¯ãããã³ã³ãã€ã«ãããªãçç±ãç解ãããšæããŸãïŒ
T
ã§for T
ããäžè¬çã§ãã()
ã§for ()
æåã«impl
ç¹æ®ã§ããããšã¯ã§ããŸããã
ãŸãã C
ã¯C: Fn(Self) -> R
ãããäžè¬çã§ããããã2çªç®ã®impl
ãç¹æ®åããããšã¯ã§ããŸããã
ç§ãééã£ãŠãããã©ããæããŠãã ããã
ãããã Display
ã®æåã®äŸã§æ©èœããªãçç±ã¯ãŸã ããããŸããã
ããã¯çŸåšæ£ããåäœã§ãã
Custom
äŸã§ã¯ãç¹å¥ãªããŒã«ã«ã®åŠå®çãªæšè«ã®ããã«ããããã®implã¯ãªãŒããŒã©ããããŸããã ç¹æ§ã¯ãã®ã¯ã¬ãŒãããã®ãã®ã§ããããã Custom
å®è£
ãæããªã()
ã T: Custom
ãšéè€ããªããšæšæž¬ã§ããŸãã å°éåã¯å¿
èŠãããŸããã
ãã ããã¯ã¬ãŒãã«ç±æ¥ããªãç¹æ§ã«ã€ããŠã¯ããã®åŠå®çãªæšè«ã¯å®è¡ããŸããã æšæºã©ã€ãã©ãªã¯æ¬¡ã®ãªãªãŒã¹ã§Display for ()
ãè¿œå ããå¯èœæ§ãããããããé倧ãªå€æŽã«ãªãããšã¯æãŸãããããŸããã ç§ãã¡ã¯ãå³æžé€šã«ãã®ãããªå€æŽãå ããèªç±ãæãããããšæã£ãŠããŸãã ãããã£ãŠãïŒïŒã¯è¡šç€ºãæå³ããŸããããéãªããã§ãã¯ã§ãã®æ
å ±ã䜿çšããããšã¯ã§ããŸããã
ãã ããïŒïŒã¯Displayãæå³ããªãããã T: Display
ãããå
·äœçã§ã¯ãããŸããã ãããç¹æ®åãæ©èœããªãçç±ã§ãããããã©ã«ãã®å Žåã¯(): Default
ã§ããããããã®implã¯T: Default
ãããå
·äœçã§ãã
ãã®ãããªæé»ã®æå³ã¯ãã蟺çãã®ãããªãã®ã§ãããéè€ããããšãéè€ããªãããšãæ³å®ã§ããŸããã ãããæ©èœãããããã®ååçãªæ¹æ³ãèŠã€ããããšããŠããŸãããããã¯ç¹æ®åã®æåã®å®è£ ã§ã¯ãªããåŸã§æäŸããããã®æ©èœã®äžäœäºææ§ã®ããæ¡åŒµæ©èœã§ãã
ç涯ã«é¢é£ããå¥å šæ§ã®åé¡ã远跡ããããã«ïŒ40582ãæåºããŸããã
ã¹ãã·ã£ã©ã€ãŒãŒã·ã§ã³ã䜿çšããããšããŠåé¡ãçºçããŸããã@ antoyoã®åé¡ãšã¯ãŸã£ããåãã§ã¯ãªããšæããŸããå¥ã®åé¡ãšããŠæåºããŸãããïŒ41140ãå¿ èŠã«å¿ããŠãµã³ãã«ã³ãŒããããã«åã蟌ãããšãã§ããŸãã
@ afonso360ããããå¥ã®åé¡ã§åé¡ãããŸããã
äžè¬çãªãã€ã³ããšããŠïŒãã®æç¹ã§ããã§ãŒã¯ã®äœæ¥ã§ã¯å°éåã®äœæ¥ããããã¯ãããŸããããã«ãããå¥å šæ§ã®åé¡ã«åãçµãããšãã§ããä»æ¥ãããããŠããICEãã¯ãªã¢ã§ããå¯èœæ§ããããŸãã
ããããã°ãªã®ããæå³çã«çŠæ¢ãããŠãããã®ãªã®ãã誰ããæ確ã«ã§ããŸããïŒ https://is.gd/pBvefi
@sgrifããã§ã®åé¡ã¯ãããã©ã«ãã®é¢é£ã¿ã€ãã®æ圱ãèš±å¯ãããŠããªãããšã ãã ãšæããŸãã ãã ãã蚺æã®æ¹ãåªããŠããå¯èœæ§ããããŸãïŒ https ïŒ
ãªããããèš±å¯ãããªããšäºæ³ãããã®ãã«ã€ããŠè©³ããæããŠãã ããã å€ç«ããã«ãŒã«ã«éåããããããã以äžç¹å®ã®implãè¿œå ã§ããªãããšã¯ããã£ãŠããŸãã
ãã®ã³ã¡ã³ãã¯ãå¥å šæ§ãèŠæ±ããããã«å¿ èŠãªå Žåãããã°ïŒçç±ã¯ããããŸãããïŒãã€ã³ã¿ãŒãã§ãŒã¹ã®ã³ã³ã·ã¥ãŒããŒã«ãããæœè±¡åãšããŠæ±ãããã«åŒ·å¶ããå¿ èŠãããããšã瀺ããŠããŸãïŒ https ïŒ
誰ããhttps://github.com/rust-lang/rust/issues/31844#issuecomment-266221638ãèŠãããšãã§ããããšããããŸããïŒ ãããã®implã¯ãç§ãç¥ãéããç¹æ®åã«ãã£ãŠæå¹ã«ãªãã¯ãã§ãã ãããã劚ããŠãããã°ããããšæããŸãã
@sgrifã³ãŒãã®åé¡ã¯ã httpsïŒ //github.com/rust-lang/rust/issues/31844#issuecomment-284235369ã®åé¡ãšåæ§ã§ããå¯èœæ§ããããšæããŸãwithoutboatsã¯https://github.comã§èª¬æããŠã@ withoutboatsã®ã³ã¡ã³ãã«åºã¥ããšãçŸåšã®ããŒã«ã«ãªæšè«ã§äŸãã³ã³ãã€ã«ã§ããã¯ãã§ãããããããäœãæ©èœãããã«ã€ããŠã¯ééã£ãŠããŸãã
äœè«ã§ããã次ã®å®è£ ãè©Šã¿ãŸãããã倱æããŸããã
trait Optional<T> {
fn into_option(self) -> Option<T>;
}
impl<R, T: Into<R>> Optional<R> for T {
default fn into_option(self) -> Option<R> {
Some(self.into())
}
}
impl<R> Optional<R> for Option<R> {
fn into_option(self) -> Option<R> {
self
}
}
Option<R>
ã¯<R, T: Into<R>> T
ãããå
·äœçã§ãããšçŽæçã«äºæ³ããŠããŸãããããã¡ãããå°æ¥çã«impl<R> Into<R> for Option<R>
ã劚ãããã®ã¯äœããããŸããã
ãã ãããªããããèš±å¯ãããªãã®ãããããŸããã å°æ¥impl<R> Into<R> for Option<R>
ãè¿œå ããããšããŠããç§ãèŠãéããRustãédefault
å®è£
ãéžæããããšãæåŸ
ããŸãããã®ã³ãŒããèš±å¯ããŠããäžäœäºææ§ã«ã¯åœ±é¿ããŸãããäºææ§ã
å
šäœãšããŠãå°éåéãæ±ãã®ã¯éåžžã«èç«ããããšæããŸãã ç§ãæåŸ
ããã»ãšãã©ãã¹ãŠãæ©èœããªãã ç§ãç¹æ®åã§æåããå¯äžã®ã±ãŒã¹ã¯ã T where T: A
ãšT where T: A + B
ãå«ã2ã€ã®impl
ããããªã©ãéåžžã«åçŽãªã±ãŒã¹ã§ãã ä»ã®ãã®ãæ©èœãããã®ã«èŠåŽããŠããŸãããšã©ãŒã¡ãã»ãŒãžã«ã¯ãç¹æ®åã®è©Šã¿ãæ©èœããªãçç±ã瀺ãããŠããŸããã ãã¡ããããŸã éã®ãã¯ããã®ã§ãããŸã圹ç«ã€ãšã©ãŒã¡ãã»ãŒãžã¯æåŸ
ããŠããŸããã ããããïŒäžèšã®ããã«ïŒå®éã«äœããæ©èœããããšãæåŸ
ããŠããã±ãŒã¹ã¯ããªãããããã§ãããããã§ã¯ãããŸãããçŸåšãèš±å¯ãããŠããããšã誀解ããŠãããããã©ããã確èªããã®ã¯éåžžã«å°é£ã§ãïŒããã«éèŠãªã®ã¯ãçç±ïŒãäœããééã£ãŠããå ŽåããŸãã¯äœãããŸã å®è£
ãããŠããªãå Žåã ãã®æ©èœãçŸç¶ã®ãŸãŸã§äœãèµ·ãã£ãŠããã®ãã«ã€ããŠã®æŠèŠã¯éåžžã«åœ¹ç«ã¡ãŸãã
ãããé©åãªå Žæã«ãããšã¯æããŸããããããã§èšåããããŠãŒã¶ãŒãã©ãŒã©ã ã§åé¡ãçºçããŸããã
次ã®ã³ãŒãïŒããã§ã¯RFCããæ¡çšãããŠããŸãïŒã¯å€éã«ã³ã³ãã€ã«ãããŸããã
#![feature(specialization)]
trait Example {
type Output;
fn generate(self) -> Self::Output;
}
default impl<T> Example for T {
type Output = Box<T>;
fn generate(self) -> Self::Output { Box::new(self) }
}
impl Example for bool {
type Output = bool;
fn generate(self) -> Self::Output { self }
}
ããã¯å®éã«ã¯ã°ãªããã®ããã«ã¯èŠããŸãããã䜿ããããã®åé¡ã®ããã«èŠããŸã-æ¶ç©ºã®impl
äžèšã®äŸã®é¢é£ããã¿ã€ãã®ã¿ã«ç¹åããŠããå Žåã generate
ã®defaulti impl
ã¯ã¿ã€ããã§ãã¯ããŸããã
ãã¡ãã®ã¹ã¬ãããžã®ãªã³ã¯
@ burns47ããã«ã¯ãçŽããããã䟿å©ãªåé¿çããããŸãïŒ https ïŒ//github.com/rust-lang/rust/issues/31844#issuecomment-263175793ã
@dtolnayæºè¶³ã®ãããã®ã§ã¯ãããŸãã-ç§ãã¡ãææããŠããªãïŒãããŠå€æŽã§ããªãïŒç¹æ§ã«ç¹åããŠããå Žåã¯ã©ããªããŸããïŒ ãã®IMOãå®è¡ããããã«ããã¬ã€ãå®çŸ©ãæžãçŽããããªãã¡ã¯ã¿ãªã³ã°ãããããå¿ èŠã¯ãããŸããã
次ã®å·ã®ã³ãŒããæå³çã«æåŠãããŠãããã©ããã«ã€ããŠèª°ããã³ã¡ã³ãã§ããŸããïŒ https://github.com/rust-lang/rust/issues/45542
ç¹æ®åã«ãããlibcoreã«æ¬¡ã®ãããªãã®ãè¿œå ã§ããŸããïŒ
impl<T: Ord> Eq for T {}
impl<T: Ord> PartialEq for T {
default fn eq(&self, other: &Self) -> bool {
self.cmp(other) == Ordering::Equal
}
}
impl<T: Ord> PartialOrd for T {
default fn partial_cmp(&self, other: &Self) -> Option<Ordering> {
Some(self.cmp(other))
}
}
ãã®ããã«ããŠãã«ã¹ã¿ã ã¿ã€ãã«Ord
ãå®è£
ãã Eq
ã PartialEq
ãããã³PartialOrd
ãèªåçã«å®è£
ããããšãã§ããŸãã
Ord
ãå®è£
ããåæã«PartialEq
ãŸãã¯PartialOrd
ãå°åºããããšã¯å±éºã§ãããéåžžã«åŸ®åŠãªãã°ã«ã€ãªããå¯èœæ§ãããããšã«æ³šæããŠãã ããã ãããã®ããã©ã«ãã®implã䜿çšãããšããããã®ç¹æ§ãå°ãåºãèªæãå°ãªããªããããåé¡ã¯ããçšåºŠè»œæžãããŸãã
ãŸãã¯ãç¹æ®åãå©çšããããã«æŽŸçãå€æŽããŸãã äŸãã°ãæžã蟌ã¿#[derive(PartialOrd)]
以äžstruct Foo(String)
次ã®ã³ãŒããçæã§ããŸãã
impl PartialOrd for Foo {
default fn partial_cmp(&self, other: &Foo) -> Option<Ordering> {
self.0.partial_cmp(&other.0)
}
}
impl PartialOrd for Foo where Foo: Ord {
fn partial_cmp(&self, other: &Self) -> Option<Ordering> {
Some(self.cmp(other))
}
}
ãã®ããã«ããŠã Ord
ãå®è£
ãããŠããªãå Žåãããã©ã«ãã®implã䜿çšãããŸãã ãã ããããã§ããå Žåã PartialOrd
ã¯Ord
äŸåããŸãã æ®å¿µãªãããããã¯ã³ã³ãã€ã«ãããŸããïŒ error[E0119]: conflicting implementations of trait `std::cmp::PartialOrd` for type `Foo`
@stjepangç§ã¯ç¢ºãã«ãã®ãããªæ¯åžãè¿œå ãããããšãé¡ã£ãŠããŸã- impl<T:Copy> Clone for T
ãã
ããã
impl<T: Ord> PartialEq for T
ããå¿ èŠããããŸã
impl<T, U> PartialEq<U> for T where T : PartialOrd<U>
PartialOrd
ã¯PartialEq
ãå¿
èŠã§ããããããæäŸã§ããããã§ãã
çŸåšãé¢é£ä»ããããåã䜿çšããŠç¹æ®åãå¶çŽããããšã¯ã§ããŸãããããã¯ãé¢é£ä»ããããåãæå®ããªããŸãŸã«ããããšäžèŠãªååž°ãããªã¬ãŒããããã§ãã https://github.com/dhardy/rand/issues/18#issuecomment-358147645ãåç §ããŠ
æçµçã«ã¯ã@ nikomatsakisãhttps://github.com/rust-lang/rust/issues/31844#issuecomment-249355377ã§ææ¡ããæ§æã䜿çšããŠãç§ãç¬èªã«å°éåã°ã«ãŒããšåŒãã§ãããã®ã確èªããããšæããŸãã åŸã§å°éåéã®å®å®åã«è¿ã¥ãããšãã«ããã®ææ¡ã«é¢ããRFCãäœæããããšæããŸãã
誰ãèŠãªãã£ãå Žåã«åããŠããã®ããã°æçš¿ã§ã¯ãç涯ããŒã¹ã®ãã£ã¹ãããã«çŽé¢ããŠå°éåãå¥å šã«ããææ¡ã«ã€ããŠèª¬æããŠããŸãã
ã³ããŒã®ééã¯ãã§ã«ããŒã¿çã§å®å®åãããŠãããããéçºè
ã¯çŸåšãå°éåãå®å®ãããããã®ããå€ãã®åæ©ãæã£ãŠããŸãã ãã®çç±ã¯ã Fn
ãšFnOnce + Clone
ã2ã€ã®éè€ããã¯ããŒãžã£ã®ã»ãããè¡šããå€ãã®å Žåãäž¡æ¹ã®ç¹æ§ãå®è£
ããå¿
èŠãããããã§ãã
rfc 2132ã®è¡šçŸã¯ãã¯ããŒãžã£ã5çš®é¡ãããªãããšãæå³ããŠããããã«æãããããšãç解ããŠãã ããã
FnOnce
ïŒãã£ããã£ããããã¹ãŠã®å€æ°ãCopy
ã§ãClone
ã§ããªãmove
ã¯ããŒãžã£ïŒFnOnce + Clone
ïŒãã£ããã£ããããã¹ãŠã®å€æ°ãClone
ããmove
ã¯ããŒãžã£ïŒFnOnce + Copy + Clone
ïŒ move
ã¯ããŒãžã£ããã£ããã£ããããã¹ãŠã®å€æ°ã¯Copy
ã§ããããã Clone
ïŒFnMut + FnOnce
ïŒãã£ããã£ãããå€æ°ãå€æŽãããmove
ã¯ããŒãžã£ïŒFn + FnMut + FnOnce + Copy + Clone
ïŒãã£ããã£ãããå€æ°ãå€æŽãããŠããªãmove
ã¯ããŒãžã£ïŒãããã£ãŠãè¿ãå°æ¥ã«ä»æ§ãå©çšã§ããªããªã£ãå Žåã¯ã Fn
ç¹æ§ã®å®çŸ©ãæŽæ°ããŠã Fn
ãFnOnce + Clone
ãšéè€ããªãããã«ããå¿
èŠããããŸããïŒ
誰ããCopy/Clone
ãªãã§Fn
ç¹å®ã®ã¿ã€ãããã§ã«å®è£
ããŠããå¯èœæ§ãããããšãç解ããŠããŸãããããã¯éæšå¥šã«ããå¿
èŠããããŸããïŒ åãããšãããããè¯ãæ¹æ³ã¯åžžã«ãããšæããŸãã
以äžã¯ç¹æ®åã«ãã£ãŠèš±å¯ãããããšã«ãªã£ãŠããŸããïŒ default
ããªãããšã«æ³šæããŠãã ããïŒããããšããã°ã§ããïŒ
#![feature(specialization)]
mod ab {
pub trait A {
fn foo_a(&self) { println!("a"); }
}
pub trait B {
fn foo_b(&self) { println!("b"); }
}
impl<T: A> B for T {
fn foo_b(&self) { println!("ab"); }
}
impl<T: B> A for T {
fn foo_a(&self) { println!("ba"); }
}
}
use ab::B;
struct Foo;
impl B for Foo {}
fn main() {
Foo.foo_b();
}
å°éåããªããšãããã¯æ¬¡ã®ãã®ã§æ§ç¯ã§ããŸããã
error[E0119]: conflicting implementations of trait `ab::B` for type `Foo`:
--> src/main.rs:24:1
|
11 | impl<T: A> B for T {
| ------------------ first implementation here
...
24 | impl B for Foo {}
| ^^^^^^^^^^^^^^ conflicting implementation for `Foo`
@glandiumãã£ããäœãèµ·ãã£ãŠããã®ïŒ è¯ãäŸã§ããããã«éã³å Žã®ãªã³ã¯ããããŸãïŒ https ïŒ
ããã¯...ã§ããïŒ ç§ã®äŸã«ã¯ç©ºã®implã¯ãããŸããã
@glandium
impl B for Foo {}
@MoSalã§ããã B
ã¯ããã©ã«ãã®å®è£
ã§ã¡ãœãããè¿œå ããããããã®implã¯ã空ã§ã¯ãããŸãããã
@gnzlbgå®çŸ©
#![feature(specialization)]
use std::borrow::Borrow;
#[derive(Debug)]
struct Bla {
bla: Vec<Option<i32>>
}
// Why is this a conflict ?
impl From<i32> for Bla {
fn from(i: i32) -> Self {
Bla { bla: vec![Some(i)] }
}
}
impl<B: Borrow<[i32]>> From<B> for Bla {
default fn from(b: B) -> Self {
Bla { bla: b.borrow().iter().map(|&i| Some(i)).collect() }
}
}
fn main() {
let b : Bla = [1, 2, 3].into();
println!("{:?}", b);
}
error[E0119]: conflicting implementations of trait `std::convert::From<i32>` for type `Bla`:
--> src/main.rs:17:1
|
11 | impl From<i32> for Bla {
| ---------------------- first implementation here
...
17 | impl<B: Borrow<[i32]>> From<B> for Bla {
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ conflicting implementation for `Bla`
|
= note: upstream crates may add new impl of trait `std::borrow::Borrow<[i32]>` for type `i32` in future versions
å°éåã¯ãèµ·ããããå°æ¥ã®å¯Ÿç«ãé²ããŸãããïŒ
ããã£ããããã¯åãã®é ãæ©èœã§ãïŒ 2幎以äžçµã£ãŠãé²å±ã¯ãªãããã§ãïŒç¢ºãã«å ã®æçš¿ã«ãããšïŒã langããŒã ã¯ãããæŸæ£ããŸãããïŒ
@alexregã®ææ°ã®éçºã«ã€ããŠã¯ã httpïŒ //aturon.github.io/2018/04/05/sound-specialization/ãåç §ããŠãã ããã
@alexregå¥å šæ§ã¯_https://github.com/rust-lang/rust/pull/49624ãåç §ããŠ
å°ãè°è«ããåŸã specialization
ãšoverlapping_marker_traits
ã䜿çšããããã¯ãä»ããŠã亀差ç¹ã®å®è£
ãå¹æçã«å®è£
ã§ããããã§ãã
https://play.rust-lang.org/?gist=cb7244f41c040db41fc447d491031263&version=nightly&mode=debug
ãã®C ++ã³ãŒããšåçã®ãã®ãå®è£ ããããã«ãååž°çãªç¹æ®é¢æ°ãäœæããããšããŸããã
C ++ã³ãŒã
#include <cassert>
#include <vector>
template<typename T>
size_t count(T elem)
{
return 1;
}
template<typename T>
size_t count(std::vector<T> vec)
{
size_t n = 0;
for (auto elem : vec)
{
n += count(elem);
}
return n;
}
int main()
{
auto v1 = std::vector{1, 2, 3};
assert(count(v1) == 3);
auto v2 = std::vector{ std::vector{1, 2, 3}, std::vector{4, 5, 6} };
assert(count(v2) == 6);
return 0;
}
ç§ã¯ãããè©ŠããŸããïŒ
ãã³ã³ãŒã
#![feature(specialization)]
trait Count {
fn count(self) -> usize;
}
default impl<T> Count for T {
fn count(self) -> usize {
1
}
}
impl<T> Count for T
where
T: IntoIterator,
T::Item: Count,
{
fn count(self) -> usize {
let i = self.into_iter();
i.map(|x| x.count()).sum()
}
}
fn main() {
let v = vec![1, 2, 3];
assert_eq!(v.count(), 3);
let v = vec![
vec![1, 2, 3],
vec![4, 5, 6],
];
assert_eq!(v.count(), 6);
}
ããããç§ã¯åŸãŠããŸãïŒ
overflow evaluating the requirement `{integer}: Count`
impl<T> Count for T where T::Item: Count
ããªãŒããŒãããŒããŠã¯ãªããªãã®ã§ããããèµ·ããã¹ãã ãšã¯æããŸããã
ç·šéïŒç³ãèš³ãããŸããããããã¯ãã§ã«èšåãããŠããã®ãèŠãŸãã
@Boiethios implã§ã¯ãªãfnãããã©ã«ãã«ãããšããŠãŒã¹ã±ãŒã¹ã¯æ©èœããŸãã
#![feature(specialization)]
trait Count {
fn count(self) -> usize;
}
impl<T> Count for T {
default fn count(self) -> usize {
1
}
}
impl<T> Count for T
where
T: IntoIterator,
T::Item: Count,
{
fn count(self) -> usize {
let i = self.into_iter();
i.map(|x| x.count()).sum()
}
}
fn main() {
let v = vec![1, 2, 3];
assert_eq!(v.count(), 3);
let v = vec![vec![1, 2, 3], vec![4, 5, 6]];
assert_eq!(v.count(), 6);
}
å¥å šæ§ã®ç©Žã¯ãŸã ä¿®æ£ãããŠããŸãããïŒ
@alexregããã¯æããŸããã http://smallcultfollowing.com/babysteps/blog/2018/02/09/maximally-minimal-specialization-always-applicable-impls/ãåç §ããŠ
ç§ã®æšæž¬ã§ã¯ã誰ããä»ãšãã£ã·ã§ã³ã«éäžããŠãããšæããŸã...
ããããŸããããããšã...ãã®åé¡ã¯æ°žé ã«ç¶ããŠããããã§ãããååã«å ¬å¹³ã§ãã 倧å€ã ãšæããŸãã æ®å¿µãªãããçŸåšãä»ã®å Žæã«æ³šæãåããããŠããŸãã
å®å šã«å圢ã®å Žåã«ããã©ã«ãã®é¢é£ã¿ã€ãã®äºæž¬ãèš±å¯ããªãèåŸã«ããçè«çæ ¹æ ã誰ããããå ·äœçã«èª¬æã§ããŸããïŒ ãã®æ©èœãå¿ èŠãªãŠãŒã¹ã±ãŒã¹ãããïŒç¹ã«ãå®å šã«å圢ã§ã¯ãªãåã§ãã¬ã€ããåŒã³åºãããããšã¯æå³çã«æ£ãããããŸããïŒãå¥å šæ§ã®åé¡ããªãå Žåã¯ãçç±ãå®å šã«ã¯ããããŸãããèš±å¯ãããŠããŸããã
@pythonesquehttpsïŒ//github.com/rust-lang/rust/pull/42411ã§ããã€ãã®è°è«ããããŸã
ããããããžã§ã¯ã·ã§ã³ãäžè¬çã«ã¹ãã·ã£ã©ã€ãŒãŒã·ã§ã³ãšã²ã©ãçžäºäœçšããããšãå€æãããã©ããã¯ããã
æ®å¿µãªããããã®ãããªæ©èœãªãã§ç§ãããããããšãæ¬åœã«è¡ãæ¹æ³ããããã©ããã¯ããããŸãããç¹å®ã®ç¹æ§ãå®è£ ãã2ã€ã®æž¡ãããåãæ§æçã«çããå Žåã«ããTrueããåºåããé¢é£ä»ããããåãå¿ èŠã§ãããããŠãããã§ãªãå Žåã¯ãFalseãïŒãFalseãã®å Žåã¯ããæå³çã«ãçãããã©ãããå€æã§ãããããé«äŸ¡ãªç¹æ§æ€çŽ¢ãããªã¬ãŒããŸãïŒã å¯äžã®æ¬åœã®éžæè¢ã¯ïŒç§ã«ã¯ïŒåžžã«é«äŸ¡ãªæ€çŽ¢ãè¡ãããšã ãšæãããŸãã ããã¯çè«çã«ã¯åé¡ãããŸããããã¯ããã«é«äŸ¡ã«ãªãå¯èœæ§ããããŸãã
ïŒãã¬ã€ããéããããããšãæå³ããŠããå Žåã¯ããããäœçœ®ã«ããã³ã³ã¹ãã©ã¯ã¿ãŒã®å¯èœãªãã¹ãŠã®ãã¢ãåæãããããã«TrueãŸãã¯Falseãåºåãããããšã§ããããåé¿ã§ããŸããããªããžããªãŒã®å€éšã§æ¡åŒµã§ããããã«ããããšãç®çãšããŠããŸããç¹ã«ã2ã€ã®ç°ãªããŠãŒã¶ãŒãªããžããªã§ã®å®è£ ãå¿ ããããäºããèªèããŠãããšã¯éããªããããæ©èœããªãå¯èœæ§ããããŸãã
ãšã«ãããããã¯ç§ãããããããšãç¹æ§ã·ã¹ãã ã«é©ããŠããªãããšã瀺ããŠããã ããããããŸããããã¯ãã®ãããªä»ã®ã¡ã«ããºã ã«åãæ¿ããå¿ èŠããããŸãïŒP
ãããŠãç§ãæãã§ããã®ã¯ãåŠå®çãªæšè«ãã®ãã¬ãŒããŒã§ããããšã¯ç¢ºãã«çå®ã§ãïŒãã ããéããç¹æ§ã¯å®éã«ã¯ååã§ã¯ãããŸããïŒã
åŠå®çãªæšè«ã®ä»£ããã«ãåãéããç¹æ§ã®ã»ããã®1ã€ã®ç¹æ§ã®ã¿ãå®è£
ããããšãèŠæ±ããã»ããå
ã®ä»ã®ç¹æ§ãšã®å®è£
ãéè€ããªãããã«ããŸãïŒããšãã°ã T
ã¯{ Float | Int | Bool | Ptr }
ã€ãå®è£
ããŸãïŒ ïŒã
Rustã§ããã匷å¶ããæ¹æ³ããã£ããšããŠãïŒAFAIKã¯ãããŸãããïŒïŒããããç§ã®åé¡ã解決ãããšã¯æããŸããã ç°ãªãã¯ã¬ãŒãã®ãŠãŒã¶ãŒãä»»æã®æ°ã®æ°ããå®æ°ãå®è£ ã§ããããã«ããããšæããŸãããããã®å®æ°ã¯ãã¯ã¬ãŒãã®å®çŸ©æã«äžæãªãã®ãå«ããèªåã ãã«çãããä»ã®ãã¹ãŠã®å®çŸ©æžã¿å®æ°ãšçãããªãå¿ èŠããããŸãã éããç¹æ§ã®ã»ããïŒãŸãã¯ç¹æ§ã®ãã¡ããªãŒã®ã»ããïŒãããèªäœã§ãã®ç®æšãã©ã®ããã«éæã§ãããããããŸãããããã¯ãã¿ã€ããçŽæ¥èŠãªããšåºæ¬çã«è§£æ±ºã§ããªãåé¡ã§ãã ããã©ã«ãã®ãããžã§ã¯ã·ã§ã³ã§æ©èœããçç±ã¯ããã¹ãŠãããã©ã«ãã§ãçããæ¯èŒããªããã«èšå®ããŠãããå®æ°ãå®çŸ©ããã¯ã¬ãŒãã«æ°ããå®æ°ã®åçæ§ãå®è£ ã§ããããã§ããããã«ãããå€ç«ç¶æ ã«é¥ãããšã¯ãããŸãããç¹æ§å®è£ ã®ãã¹ãŠã®ã¿ã€ããåãã¯ã¬ãŒãã«ãã£ããããã«ãŒã«ã å¹³ç以å€ã®ã»ãšãã©ãã¹ãŠã®ãã®ãããªã«ãŒã«ã
çŸåšã®æ¯æ©ãããã¯æ©èœããŸãïŒ
trait Foo {}
trait Bar {}
impl<T: Bar> Foo for T {}
impl Foo for () {}
ããããå°éåããŠããŠãæ¯æ©äœ¿çšããŠããå Žåã§ããããã¯ããŸããïŒ
#![feature(specialization)]
trait Foo<F> {}
trait Bar<F> {}
default impl<F, T: Bar<F>> Foo<F> for T {}
impl<F> Foo<F> for () {}
ããã«ã¯è«ççæ ¹æ ããããŸããããããšããã°ã§ããïŒ
@rmanokaããã¯éåžžã®å€ç«ããã«ãŒã«ã§ã¯ãããŸãããïŒ æåã®ã±ãŒã¹ã§ã¯ãããŠã³ã¹ããªãŒã ã¯ã¬ãŒãã¯impl Bar for ()
ã§ããªããããã³ã³ãã€ã©ã¯ãããèš±å¯ããŸããã2çªç®ã®äŸã§ã¯ãããŠã³ã¹ããªãŒã ã¯ã¬ãŒãã¯impl Bar<CustomType> for ()
ãããããã©ã«ãã®implãšç«¶åããŸãã
@Boscopãã®ã·ããªãªã§ã¯ãããã©ã«ãã®implã¯ããšã«ãã以äžã®ããã©ã«ã以å€ã®implã«ãã£ãŠãªãŒããŒã©ã€ããããŸãã ããšãã°ãä»ã®implã®åã«impl Bar<bool> for () {}
è¿œå ããå Žåããããæ©èœããããšãæåŸ
ããŸãïŒRFC /æåŸ
ã©ããïŒã ããã¯æ£ãããããŸãããïŒ
ããªããèšåããåäŸã®ç·ã«æ²¿ã£ãŠæ·±ãæãäžããŠãç§ã¯ãã®äŸããåžžã«é©çšå¯èœãªããã¹ããæºãããåãçµãã§ããå¯èœæ§ãããããšãèªèïŒãŸãã¯ä¿¡ããŠããŸãïŒã
ãã®åé¡ã¯ããããïŒ45814ã«äŸåããŠããŸãã
ã¹ãã·ã£ã©ã€ãŒãŒã·ã§ã³ã«ååšããªãããã©ã«ãã®ãã¬ã€ãå¢çããµããŒãããèšç»ã¯ãããŸããïŒ
ãããéåžžã«åœ¹ç«ã€äŸãšããŠãå ±æããŠã¯ãªããªãæ©èœã«å¯ŸããŠä»»æã®å éšãæã€æ±çšStructãäœæããããšã§ãããŸããŸãªã¿ã€ãã®åŠçãç°¡åã«æ§æã§ããŸãã
#![feature(specialization)]
trait Handler<M> {
fn handle(&self, m:M);
}
struct Inner;
impl Handler<f64> for Inner {
fn handle(&self, m : f64) {
println!("inner got an f64={}", m);
}
}
struct Struct<T>(T);
impl<T:Handler<M>, M:std::fmt::Debug> Handler<M> for Struct<T> {
default fn handle(&self, m : M) {
println!("got something else: {:?}", m);
self.0.handle(m)
}
}
impl<T> Handler<String> for Struct<T> {
fn handle(&self, m : String) {
println!("got a string={}", m);
}
}
impl<T> Handler<u32> for Struct<T> {
fn handle(&self, m : u32) {
println!("got a u32={}", m);
}
}
fn main() {
let s = Struct(Inner);
s.handle("hello".to_string());
s.handle(5.0 as f64);
s.handle(5 as u32);
}
ããã«ãäžèšã®äŸã§ã¯ãç§ãçµéšããå¥åŠãªããšã§ã-ããã©ã«ãã®Handler implïŒããã³self.0.handleïŒmïŒïŒã«ãã€ã³ããããç¹æ§ãåé€ããåŸãã³ãŒãã¯åé¡ãªãã³ã³ãã€ã«ãããŸãã ãã ããu32ã®å®è£ ãåé€ãããšãä»ã®ç¹æ§ã®æ§é€ãç Žãããããã§ãã
#![feature(specialization)]
trait Handler<M> {
fn handle(&self, m:M);
}
struct Struct<T>(T);
impl<T, M:std::fmt::Debug> Handler<M> for Struct<T> {
default fn handle(&self, m : M) {
println!("got something else: {:?}", m);
}
}
impl<T> Handler<String> for Struct<T> {
fn handle(&self, m : String) {
println!("got a string={}", m);
}
}
// impl<T> Handler<u32> for Struct<T> {
// fn handle(&self, m : u32) {
// println!("got a u32={}", m);
// }
// }
fn main() {
let s = Struct(());
s.handle("hello".to_string());
s.handle(5.0 as f64);
}
u32ã®ãã³ãã©ãŒãåŒã³åºãã³ãŒãã¯ãããŸããããç¹æ®åãååšããªããšãã³ãŒããã³ã³ãã€ã«ãããŸããã
ç·šéïŒããã¯ã Gladdyã1ã€ã®æçš¿ã«åãããã§ãã
rustc 1.35.0-nightlyïŒ3de010678 2019-04-11ïŒã§ã¯ã次ã®ã³ãŒãã§ãšã©ãŒãçºçããŸãã
#![feature(specialization)]
trait MyTrait<T> {
fn print(&self, parameter: T);
}
struct Message;
impl<T> MyTrait<T> for Message {
default fn print(&self, parameter: T) {}
}
impl MyTrait<u8> for Message {
fn print(&self, parameter: u8) {}
}
fn main() {
let message = Message;
message.print(1_u16);
}
ãšã©ãŒïŒ
error[E0308]: mismatched types
--> src/main.rs:20:19
|
18 | message.print(1_u16);
| ^^^^^ expected u8, found u16
ãã ãã impl MyTrait<u8>
ãããã¯ãçç¥ãããšãã³ãŒããã³ã³ãã€ã«ãããŠæ©èœããŸãã
#![feature(specialization)]
trait MyTrait<T> {
fn print(&self, parameter: T);
}
struct Message;
impl<T> MyTrait<T> for Message {
default fn print(&self, parameter: T) {}
}
/*
impl MyTrait<u8> for Message {
fn print(&self, parameter: u8) {}
}
*/
fn main() {
let message = Message;
message.print(1_u16);
}
ããã¯ä»æ§ã«ãããã®ã§ãããå®è£ ãäžå®å šãªããã§ããããããšããã°ã§ããïŒ
ãŸãããã®ç¹æ®åã®ãŠãŒã¹ã±ãŒã¹ïŒéè€ããåã«å¯ŸããŠåãç¹æ§ãå®è£ ããã®ã§ã¯ãªããåäžã®å ·è±¡åã«å¯ŸããŠéè€ããåãã©ã¡ãŒã¿ãŒã䜿çšããŠç¹æ§ãå®è£ ããïŒããµããŒãããããã©ãããç¥ãããã§ãã RFC 1210ã®ãåªå ã«ãŒã«ã®å®çŸ©ãã®ã»ã¯ã·ã§ã³ãèªãã§ããµããŒãããããšæããŸãããRFCã¯ãã®ãããªäŸã瀺ããŠãããããã®RFCã«å³å¯ã«åŸã£ãŠããã®ãã©ããã¯ããããŸããã
å¥åŠããå ±åããïŒ
trait MyTrait {}
impl<E: std::error::Error> MyTrait for E {}
struct Foo {}
impl MyTrait for Foo {} // OK
// But this one is conflicting with error message:
//
// "... note: upstream crates may add new impl of trait `std::error::Error` for type
// std::boxed::Box<(dyn std::error::Error + 'static)>` in future versions"
//
// impl MyTrait for Box<dyn std::error::Error> {}
ãã®å ŽåããªãBox<dyn std::error::Error>
ç¹æ®ãªã®ã§ããïŒãç¹å¥ããšããåèªã®äœ¿çšã¯é¿ããŠãã ããïŒã å°æ¥çã«std::error::Error
ãæ瀺ãããšããŠãã impl MyTrait for Box<dyn std::error::Error>
ã¯impl<E: std::error::Error> MyTrait for E
æå¹ãªç¹æ®åã§ãããïŒ
ãŸã æå¹ãªå°éåéã§ã
ããªãã®å Žåã impl<E: std::error::Error> MyTrait for E
default
ã¡ãœããããªãããã impl<E: std::error::Error> MyTrait for E
ãç¹æ®åããããšã¯ã§ããŸããã
@ bjorn3ããã¯æ©èœããã¯ãã§ããããããŒã®ã¡ãœãããè¿œå ããŠãæ©èœããŸãã
ã¯ã¬ãŒãã§bar
pub trait Bar {}
impl<B: Bar> Bar for Box<B> {}
ã¯ã¬ãŒãã§foo
#![feature(specialization)]
use bar::*;
trait Trait {
fn func(&self) {}
}
impl<E: Bar> Trait for E {
default fn func(&self) {}
}
struct Foo;
impl Trait for Foo {} // OK
impl Trait for Box<dyn Bar> {} // Error error[E0119]: conflicting implementations of trait
ã¯ã¬ãŒãbar
ãã«å€æŽããå Žåã¯æ³šæããŠãã ãã
pub trait Bar {}
impl<B: ?Sized + Bar> Bar for Box<B> {}
次ã«ãã¯ã¬ãŒãfoo
ã³ã³ãã€ã«ãããŸãã
@ bjorn3ãããdefault
ã¡ãœããã¯å¿
èŠãªãããã§ãïŒéã³å ŽïŒã
@KrishnaSannasiããªãã®äŸïŒ playground ïŒã§ã競åããå®è£ ããšã©ãŒãåçŸããããšã¯ã§ããŸããã
æŽæ°ïŒããããªãã»ã©ã ãã¬ã€ãBar
ã¯ãäŸãæ©èœããããã«äžæµã®ã¯ã¬ãŒãããã®ãã®ã§ããå¿
èŠããããŸãã
Foo
ã¯Error
å®è£
ããŠããªããããäŸã®@updogliuã¯ç¹æ®åã瀺ããŠããŸããã
ä»å€ã¯ããã°ã©ãã³ã°ãé ãããŸããããããšãã¹ã¿ãã¯ãªãŒããŒãããŒãåŒãèµ·ãããŠã¯ãããŸãããïŒ
#![feature(specialization)]
use std::fmt::Debug;
trait Print {
fn print(self);
}
default impl<T> Print for [T; 1] where T: Debug {
fn print(self) {
println!("{:?}", self);
}
}
impl<T> Print for [T; 1] where T: Debug + Clone {
fn print(self) {
println!("{:?}", self.clone());
}
}
fn main() {
let x = [0u8];
x.print();
}
ç²ç²åºŠã®default impl
ãããã¯ã¯ãåžžã«éåžžã«å¥åŠãªããšãè¡ã£ãŠããŸããã代ããã«ã default fn
现ç²åºŠã®ç¹æ®åæ§æãè©Šãããšããå§ãããŸãã
ç·šéïŒRFCãã¯ãã¹ãã§ãã¯ãããšãããã¯äºæ³ãããŸãã default impl
å®éã«ã¯impl
ãããã¯å
ã®ãã¹ãŠã®ã¢ã€ãã ãdefault
edã§ããããšãæå³ããŸããã æ§ããã«èšã£ãŠãããããã®ã»ãã³ãã£ã¯ã¹ã¯é©ãã¹ããã®ã ãšæããŸãã
@ HadrienG2ç§ã¯å®éããã®ãããžã§ã¯ãã§ã¯åžžã«default fn
ããŠããŸããããä»åã¯default
ããŒã¯ãŒããå¿ããã³ã³ãã€ã©ãŒããããimpl
ã«è¿œå ããããææ¡ããŸããã ã¹ã¿ãã¯ååž°ã®åé¡ã¯ãããŸã§èŠãããšããªãããã®æ®µéã§äºæ³ããããã©ãããããããŸããã§ããã ææ¡ãããããšãã default fn
ã¯ããŸããããŸãã
å ã®RFCãèŠããšãåºæã®implã®ç¹æ®åã«é¢ããã»ã¯ã·ã§ã³ããããŸãã 誰ããç§ãè©ŠããããšãäžããŸãããïŒ
RFCã§ææ¡ãããŠããã¢ãããŒãã¯ãå°ãªããšãåºæã®constã¡ãœããã§ã¯çŽæ¥æ©èœããªããªãå¯èœæ§ããããŸãã
// This compiles correctly today:
#![feature(specialization)]
use std::marker::PhantomData;
struct Foo<T>(PhantomData<T>);
impl<T> Foo<T> {
default const fn foo() -> Self { Self(PhantomData) }
// ^^should't default here error?
}
// ----
// Adding this fails:
impl<T: Copy> Foo<T> {
const fn foo() -> Self { Self(PhantomData) }
}
å ã®RFCã¯ãã¡ãœããããã¬ã€ãã«ãªããããã¿ã€ãã«å¯ŸããŠãããå®è£ ããimplãç¹æ®åããããšãææ¡ããŠããŸãã const fnã¡ãœããã®å Žåãåã®ç¹æ§ã®ãããã®implã¯constimplã§ããå¿ èŠããããšæããŸãã
ããã«åºããããã¹ããŒã¿ã¹ã«èå³ããã人ã«ãšã£ãŠã¯ã2018幎ã«ããã€ãã®éèŠãªæŠå¿µäžã®é²æ©ããããŸããïŒ
http://smallcultfollowing.com/babysteps/blog/2018/02/09/maximally-minimal-specialization-always-applicable-impls/
http://aturon.github.io/tech/2018/04/05/sound-specialization/
æè¿ã§ã¯ãå æ@nikomatsakisã次ã®ããã«æžããŠããŸãïŒäŸãšããŠãå¥ã®ã³ã³ããã¹ãã§ã倪åã®é±å±±ïŒã
[å°éåéã§]ååã«è§£æ±ºãããªãã£ãéèŠãªåé¡ã1ã€ãããŸãããããã¯ã寿åœãšç¹æ§ã«é¢ããæè¡çãªå¥å šæ§ã®æžå¿µã§ã[...]次ã«ã[äžèšã®2ã€ã®æçš¿]ã ãããã®ã¢ã€ãã¢ã¯ãåºæ¬çã«åé¡ã解決ããŠããããæã ã¯ãã®éã«å¿ããã£ããããã©ããŒã¢ããããæéããªãã£ã
ãŸã ããã¹ãããšãæããã«æ®ã£ãŠããŸãããåžæã«æºã¡ãŠããããã§ãã
ïŒæ°é±éåã«ãã®ã¹ã¬ãããèŠã€ããŠæšå¹Žã®é²æç¶æ³ãããããªãã£ãããããããæçš¿ããŸããããæè¿ãå¶ç¶ã«ãããã®æçš¿ã«åºããããŸãããäžèšã®ã³ã¡ã³ãããããŸãããGitHubã§ã¯æåã®ã¹ã¬ãããšé·ãã¹ã¬ããã«é¢ããæåŸã®ããã€ãã®ã³ã¡ã³ãïŒcry:ããã®æŽæ°ãåé¡ã®èª¬æã«å«ãŸããŠãããšåœ¹ç«ã€å ŽåããããŸããïŒ
ã¿ãªãããããã«ã¡ã¯ïŒ ãã®ãŠãŒã¹ã±ãŒã¹ãæ©èœããªãçç±ã誰ãã«æããŠããããŸããïŒ ãã°ãŸãã¯äºæ³ãããåäœïŒ
ãã®äŸãšããŠã impl A for i32
ã¯åé¡ãããŸãããã impl A for ()
ã¯1.39.0-nightlyã§ã¯ã³ã³ãã€ã«ã§ããŸããã
#![feature(specialization)]
trait A {
fn a();
}
default impl <T: ToString> A for T {
fn a() {}
}
impl A for i32 {
fn a() {}
}
impl A for () {
fn a() {}
}
ã¡ãã»ãŒãžã®ã³ã³ãã€ã«ïŒ
error[E0119]: conflicting implementations of trait `A` for type `()`:
--> src/lib.rs:16:1
|
8 | default impl <T: ToString> A for T {
| ---------------------------------- first implementation here
...
16 | impl A for () {
| ^^^^^^^^^^^^^ conflicting implementation for `()`
|
= note: upstream crates may add new impl of trait `std::fmt::Display` for type `()` in future versions
@Hexileeimplã§ã¯ãªãã¡ãœããã«default
ã眮ããŸãã
@KrishnaSannasiã®äŸ2
@zserikã¯ããããã£ãŠããŸãã ãŸã å®è£ ãããŠããªãããåé€ããããšæããŸãã ãããã«ãããä»ã¯æ©èœããŸããã
æããã«çŸåšã¯æ©èœããŠããŸããããæ©èœããã¯ãã§ãã
ãã®ãããã¯ãä»ã®å Žæã§åãäžããããŠããããšã«æ°ä»ããŠããªãã®ã§ãããã§ãããå°ããŠããŸã- const
ãšåæ§ã«ãããŸããŸãªæšæºã©ã€ãã©ãªé¢æ°ãdefault
ããèšç»ã¯ãããŸããïŒå®å
šã§ãããšèŠãªããããšãã«const
åãããé¢æ°ïŒ ç§ãå°ããŠããäž»ãªçç±ã¯ãããã©ã«ãã®ãžã§ããªãã¯From
ãšInto
å®è£
ïŒ impl<T, U: From<T>> Into<U> for T
ãšimpl<T> From<T> for T
ïŒãå
æ¬çãªãžã§ããªãã¯From
èšè¿°ãé£ããããŠããããšã§ãã Into
å®è£
ã¯core
äžæµã«ãããèªåã®ã¯ã¬ãŒãã§ãããã®å€æããªãŒããŒã©ã€ãã§ããã°äŸ¿å©ã§ãã
From
/ Into
ç¹æ®åãèš±å¯ãããšããŠããæ Œååé¡ã®ããã«äžè¬çãªå®è£
ã«ã¯åœ¹ç«ã¡ãŸããã
@KrishnaSannasiããã¯æããªãã ããšãã°ããã®ã³ãŒãã¯ã From
ãšInto
ãç¹æ®åå¯èœã§ããå Žåã«æ©èœããã¯ãã§ãããããã§ãªãããæ©èœããŸããã
impl<M: Into<[S; 2]>, S> From<M> for GLVec2<S> {
fn from(to_array: M) -> GLVec2<S> {
unimplemented!()
}
}
impl<M, S> Into<M> for GLVec2<S>
where
[S; 2]: Into<M>,
{
fn into(self) -> M {
unimplemented!()
}
}
pub struct GLVec2<S> {
pub x: S,
pub y: S,
}
ããã¯ã From
ãšInto
ãããããã®äžè¬çãªå®è£
ãæããªãã«ã¹ã¿ã ç¹æ§ã«å€æããå Žåã«æ©èœããŸãïŒ https ïŒ
@OsspialããŠãããã©ã«ãã®implã䜿çšããŠã·ãã¥ã¬ãŒã·ã§ã³ããããšãããšãåé¡ãçºçããŸãã
ç¹°ãè¿ããŸããã From/Into
implãæšæºã©ã€ãã©ãªã®ããã©ã«ãimplã«å€æŽããŠãã Into
æ±çšimplã¯äœ¿çšã§ããŸããã ïŒãããŠããã¯From
äžè¬çãªå®è£
ã«ã¯åœ±é¿ããŸããïŒ
ããã«ã¡ã¯ãçŸåšã®ã¹ãã·ã£ã©ã€ãŒãŒã·ã§ã³ã®å®è£ ã«ã¯é倧ãªãã°ããããŸãã æ瀺çãªèšèšäžã®æ±ºå®ã§ãã£ããšããŠããæã匷åãªç¹æ®åæ©èœã®1ã€ãã€ãŸããäžéæïŒOPAQUEïŒåãïŒæ£åŒãªååã§ã¯ãªãïŒã®äœæã®å¯èœæ§ã䜿çšã§ããªããªãããããã°ãšããŠã©ãã«ä»ãããŸãã ãã®ãã¿ãŒã³ã¯ãHaskellãScalaãªã©ã®åã¯ã©ã¹ãæäŸããä»ã®èšèªã§æãåå§çãªæ§æèŠçŽ ã®1ã€ã§ãã
ãã®ãã¿ãŒã³ã¯åçŽã§ãã WithLabel
ãWithID
ãããªæ§é ãå®çŸ©ããŠãåºç€ãšãªãæ§é ã«ããã€ãã®ãã£ãŒã«ããšã¡ãœãããè¿œå ã§ããŸããããšãã°ã WithLabel<WithID<MyType>>
ãäœæãããšã次ã®ããšãå¯èœã«ãªããŸãã id
ã label
ãããã³MyType
ãã¹ãŠã®ãã£ãŒã«ã/ã¡ãœãããååŸããŸãã æ®å¿µãªãããçŸåšã®å®è£
ã§ã¯ãããã¯äžå¯èœã§ãã
以äžã¯ããã®ãã¿ãŒã³ã®äœ¿çšæ³ã瀺ããµã³ãã«ã³ãŒãã§ãã ã³ã¡ã³ãã¢ãŠããããã³ãŒãã¯ã³ã³ãã€ã«ãããŸãããããã®ãã¿ãŒã³ãæ¬åœã«äŸ¿å©ã«ããå¿ èŠããããŸãã
#![feature(specialization)]
use std::ops::Deref;
use std::ops::DerefMut;
// =================
// === WithLabel ===
// =================
struct WithLabel<T>(String, T);
pub trait HasLabel {
fn label(&self) -> &String;
}
impl<T> HasLabel for WithLabel<T> {
fn label(&self) -> &String {
&self.0
}
}
// THIS SHOULD COMPILE, BUT GETS REJECTED
// impl<T> HasLabel for T
// where T: Deref, <Self as Deref>::Target : HasLabel {
// default fn label(&self) -> &String {
// self.deref().label()
// }
// }
impl<T> Deref for WithLabel<T> {
type Target = T;
fn deref(&self) -> &Self::Target {
&self.1
}
}
// ==============
// === WithID ===
// ==============
struct WithID<T>(i32, T);
pub trait HasID {
fn id(&self) -> &i32;
}
impl<T> HasID for WithID<T> {
fn id(&self) -> &i32 {
&self.0
}
}
// THIS SHOULD COMPILE, BUT GETS REJECTED
// impl<T> HasID for T
// where T: Deref, <Self as Deref>::Target : HasID {
// default fn id(&self) -> &i32 {
// self.deref().id()
// }
// }
impl<T> Deref for WithID<T> {
type Target = T;
fn deref(&self) -> &Self::Target {
&self.1
}
}
// =============
// === Usage ===
// =============
struct A(i32);
type X = WithLabel<WithID<A>>;
fn test<T: HasID + HasLabel> (t: T) {
println!("{:?}", t.label());
println!("{:?}", t.id());
}
fn main() {
let v1 = WithLabel("label1".to_string(), WithID(0, A(1)));
// test(v1); // THIS IS EXAMPLE USE CASE WHICH DOES NOT COMPILE
}
test(v1)
è¡ãæ©èœãããã«ã¯ããã®ãããªç¹æ§implãæåã§è¿œå ããå¿
èŠããããŸãã
impl<T: HasID> HasID for WithLabel<T> {
fn id(&self) -> &i32 {
self.deref().id()
}
}
ãã¡ããããããå®æãããã«ã¯ããã®ç¹æ§ãæé»çã«ããå¿ èŠããããŸãã
impl<T: HasLabel> HasLabel for WithID<T> {
fn label(&self) -> &String {
self.deref().label()
}
}
ãããŠãããã¯éåžžã«æªãã§ãã ãã£ã2çš®é¡ã§ç°¡åã§ãã ãã ãã WithID
ã WithLabel
ã WithCallback
ãªã©ã®ããŸããŸãªãã£ãŒã«ããè¿œå ãã10çš®é¡ã®äžéæïŒOPAQUEïŒåã®å®çŸ©ããããšæ³åããŠãã ããã ã¹ãã·ã£ã©ã€ãŒãŒã·ã§ã³ã®çŸåšã®åäœã§ã¯ã1000ãè¶
ããç°ãªããã¬ã€ãã®å®è£
ãå®çŸ©ããå¿
èŠããããŸãã ã³ã¡ã³ãã¢ãŠããããã³ãŒããåãå
¥ããããå Žåãå¿
èŠãªç¹æ§ã®å®è£
ã¯10åã ãã§ãããæ°ããã¿ã€ããå®è£
ããããã«å¿
èŠãªè¿œå ã®å®è£
ã¯1ã€ã ãã§ãã
ããªãã®ã³ãŒããç¹æ®åã«ã©ã®ããã«é¢é£ããŠãããããããŸããã æåã®#![feature(specialization)]
è¡ãåé€ãããå Žåã§ããåŒæ°ïŒæåã®ã³ãŒãã¯ã³ã³ãã€ã«ãããŸãããã³ã¡ã³ãä»ãã®test(v1);
è¡ã¯æåã®implããªããšã³ã³ãã€ã«ãããŸããïŒãé©çšãããŸãã
@qnighyã³ãŒãã¯ãimpls HasLabel for T
ãšHasID for T
ã³ã¡ã³ãã解é€ããåŸã«ã³ã³ãã€ã«ããå¿
èŠããããŸã-ãããã¯ç¹æ®åã䜿çšããŠããŸãã çŸåšããããã¯æåŠãããŠããŸãïŒç§ãæäŸããã³ãŒãã§ã³ã¡ã³ããå€ããŠã¿ãŠãã ããïŒïŒã ä»ããªãã«ãšã£ãŠããã¯çã«ããªã£ãŠããŸããïŒ ð
3ã€ã®ã€ã³ã¹ã¿ã³ã¹WithLabel<WithID<A>>
ã WithID<WithLabel<A>>
ãããã³WithLabel<WithLabel<A>>
ã«ã€ããŠèããŠã¿ãŸãããã 次ã«
WithLabel<WithID<A>>
ãšWithLabel<WithLabel<A>>
ã«ããŒããŸããWithID<WithLabel<A>>
ãšWithLabel<WithLabel<A>>
ã«ããŒããŸãããããã£ãŠãimplã®ãã¢ã¯RFCã®æ¬¡ã®ç¯
ç¹æ®åã®äžè²«æ§ã確ä¿ããããã«ãéè€ãã2ã€ã®impl
I
ãšJ
ã«å¯ŸããŠãI < J
ãŸãã¯J < I
ãããããããããšã確èªããŸãã ã€ãŸããäžæ¹ãä»æ¹ãããæ¬åœã«å ·äœçã§ãªããã°ãªããŸããã
ãŸãã WithLabel<WithLabel<A>>
ã®HasLabel
implã¯2ã€ã®æ¹æ³ã§è§£éãããå¯èœæ§ããããããããã¯ããªãã®å Žåã«ãå®éã®åé¡ã§ãã
ãã®ã±ãŒã¹ãã©ã®ããã«ã«ããŒã§ãããã¯RFCã§ããã§ã«
ã©ãã£ã¹ã«ãŒã«ã察åŠããå¶éã¯ãïŒåæ©ä»ãã§èª¬æãããŠããããã«ïŒç¹æ®åã®äž»ãªç®æšã®ããªãäºæ¬¡çãªãã®ã§ãããã©ãã£ã¹ã«ãŒã«ã¯åŸã§è¿œå ã§ãããããRFCã¯ä»ã®ãšããåçŽãªãã§ãŒã³ã«ãŒã«ã«åºå·ããŸãã
@qnighy ãèããŠãããŠããããšãã
ãŸãã
WithLabel<WithLabel<A>>
ã®HasLabel implã¯2ã€ã®æ¹æ³ã§è§£éãããå¯èœæ§ããããããããã¯ããªãã®å Žåã«ãå®éã®åé¡ã§ãã
ããã¯ã impl<T> HasLabel for WithLabel<T>
ãWithLabel<WithLabel<A>>
å
¥åã«å¯ŸããŠimpl<T> HasLabel for T
ãããç¹æ®ã§ãããšèŠãªããªãå Žåã«åœãŠã¯ãŸããŸãã 貌ãä»ããRFCã®äžéšã¯ç¢ºãã«ãããã«ããŒããŠããŸãããããã¯é倧ãªå¶éã§ãããšç§ã¯ä¿¡ããŠããããã®æ¡åŒµæ©èœã®æåã®ãªãªãŒã¹ã§ãã®ãŠãŒã¹ã±ãŒã¹ã®ãµããŒããåæ€èšãããããé¡ãããŸãã
ãã®éãç§ã¯negative trait impls
éãã§ããŸããããªããªãã圌ãã¯ããªããã«ããŒãããã€ã³ããå®éã«è§£æ±ºãããããããªãããã§ãã ããªãã説æããåé¡ããªãã³ãŒããäœæããŸãããïŒäœãã足ããªãå Žåãé€ããŠïŒãããã§ãã³ã³ãã€ã«ãããŸããã ä»åã¯ã解å床ããããŸãã§ãã£ãŠã¯ãªããªãããããšã©ãŒã«èšèŒãããŠããå¶çŽãã©ãããæ¥ãã®ãããããŸããã
è¯ãããšã¯ãå®éã«ã¯ãã¹ãŠãïŒç¹æ®åãå«ããŠïŒä»ã³ã³ãã€ã«ãããŸããã test(v1)
䜿çšæ³ã§ã¯ãªããšããããšã§ãã
#![feature(specialization)]
#![feature(optin_builtin_traits)]
use std::ops::Deref;
use std::ops::DerefMut;
// =================
// === WithLabel ===
// =================
struct WithLabel<T>(String, T);
auto trait IsNotWithLabel {}
impl<T> !IsNotWithLabel for WithLabel<T> {}
pub trait HasLabel {
fn label(&self) -> &String;
}
impl<T> HasLabel for WithLabel<T> {
fn label(&self) -> &String {
&self.0
}
}
impl<T> HasLabel for T
where T: Deref + IsNotWithLabel, <Self as Deref>::Target : HasLabel {
default fn label(&self) -> &String {
self.deref().label()
}
}
impl<T> Deref for WithLabel<T> {
type Target = T;
fn deref(&self) -> &Self::Target {
&self.1
}
}
// ==============
// === WithID ===
// ==============
struct WithID<T>(i32, T);
pub trait HasID {
fn id(&self) -> &i32;
}
impl<T> HasID for WithID<T> {
fn id(&self) -> &i32 {
&self.0
}
}
auto trait IsNotWithID {}
impl<T> !IsNotWithID for WithID<T> {}
impl<T> HasID for T
where T: Deref + IsNotWithID, <Self as Deref>::Target : HasID {
default fn id(&self) -> &i32 {
self.deref().id()
}
}
impl<T> Deref for WithID<T> {
type Target = T;
fn deref(&self) -> &Self::Target {
&self.1
}
}
// =============
// === Usage ===
// =============
struct A(i32);
type X = WithLabel<WithID<A>>;
fn test<T: HasID + HasLabel> (t: T) {
println!("{:?}", t.label());
println!("{:?}", t.id());
}
fn main() {
let v1 = WithLabel("label1".to_string(), WithID(0, A(1)));
test(v1);
}
ãããŸã§ã®éã RFC1268 overlapping_marker_traits
ãæªçšããŠãããŒã«ãŒä»¥å€ã®ç¹æ§ãéè€ãããããšãã§ããŸããããã®ããã¯ã«ã¯ããã«3ã€ã®ç¹æ§ãå¿
èŠã§ãïŒ1ã€ã¯ããŒã«ãŒç¹æ§ãééããããã2ã€ã¯ç¹æ®åã«ãã£ãŠæ¶å»ãããããŒã¿ãåååŸããããïŒã
@qnighyãã®ãã°ã«ã€ããŠå¥ã®åé¡ãäœæããŸããïŒ https ïŒ
ããããŸãããïŒhttps://doc.rust-lang.org/nightly/unstable-book/language-features/optin-builtin-traitsã«ãããšïŒ auto traits
ãããã§è§£æ±ºãããããšã¯æ±ºããŠãªãããšãçºèŠããŸããã htmlïŒãããã¯æ§é äœã®ãã¹ãŠã®ãã£ãŒã«ãã«äŒæããŸãïŒ
æšæºã©ã€ãã©ãªã®SendãSyncãªã©ã®èªåãã¬ã€ãã¯ãã¿ã€ããŸãã¯ããã«å«ãŸããã¿ã€ããè² ã®implãä»ããŠæ瀺çã«ãªããã¢ãŠããããŠããªãéãããã¹ãŠã®ã¿ã€ãã«èªåçã«å®è£ ãããããŒã«ãŒãã¬ã€ãã§ãã
ç·šé
@qnighyã©ãããããããããªããéã³å Žãžã®ãªã³ã¯ãæäŸããŠããã®ãèŠèœãšããŠããŸããã â€ïžããããšãããããŸããã ããã¯æ©èœããç§ã¯ãã®ãœãªã¥ãŒã·ã§ã³ãããã«ããããŒã§ãããã«é©ããŠããŸãã çŸåšãããè¡šçŸã§ããã®ã¯çŽ æŽãããããšã§ããããã®å¯èœæ§ãå°æ¥æ¶ããªãããšãé¡ã£ãŠããŸãïŒ
ãã®ãããªç¶æ³ã§ã¯ãçŸåšäœ¿çšã§ããããã¯ã¯overlapping marker traits
ã ãã§ãããå°æ¥ãäžéæïŒOPAQUEïŒåãè¡šçŸããããã®äœããã®ç°¡åãªãœãªã¥ãŒã·ã§ã³ãèš±å¯ãããšãããšæããŸãïŒä»¥åã®æçš¿ã§èª¬æããããã«ïŒhttps ïŒ//github.com/rust-lang/rust/issues/31844#issuecomment-549023367ïŒã
倱æããéåžžã«åçŽãªäŸïŒäžèšã®äŸã®ç°¡ç¥åïŒïŒ
trait Trait<T> {}
impl<T> Trait<T> for T {}
impl<T> Trait<()> for T {}
ãããã©ãã£ã¹ã«ãŒã«ã§ç¹å®ãããåé¡ã«åœãŠã¯ãŸããšã¯æããªãããããããé床ã«åçŽåããããœã«ããŒã¯ããèããŠããã®ã ãããïŒ
ããããªããã°ãçŸåšã®å®è£
ã¯ç§ã®ç®çã«ã¯åœ¹ã«ç«ããªãã äžèšãèš±å¯ãããŠããã°ãã©ãããŒã¿ã€ãã«From
ãå®è£
ããããšãå¯èœã ãšæãInto
ã«ã€ããŠã¯ããããŸãããïŒã
ãŸã ç¥ããªãäœã®ããã«ïŒå®å®ããéã«ïŒéåžžã«éãããïŒå°éã䜿çšããããšãå¯èœã«ããdtolnayã«ãã£ãŠçºèŠããããã®çŽ æŽãããããªãã¯ããããŸã
ããããã§ã«å¯ŸåŠãããŠãããã©ããã¯ããããŸããããã¡ãœããã®ããã©ã«ãã®å®è£
ãæã€ãã¬ã€ãã¯ã default
ãšããŠããŒã¯ã§ããããã«åå®çŸ©ããå¿
èŠããããŸãã äŸ;
trait Trait {
fn test(&self) { println!("default implementation"); }
}
impl<T> Trait for T {
// violates DRY principle
default fn test(&self) { println!("default implementation"); }
}
ãããä¿®æ£ããããã«ã次ã®æ§æãææ¡ããŸãïŒä¿®æ£ãå¿ èŠãªå ŽåïŒã
impl<T> Trait for T {
// delegates to the already existing default implementation
default fn test(&self);
}
ïŒ68309ã«ç§»å
@jazzfoolãããåé¡ãšããŠåæåºãïŒäžè¬çã«ãããã§åæ§ã®è³ªåããããã¹ãŠã®äººã«é©çšãããŸãïŒããã®åé¡ã«ã€ããŠç§ã«èª¬æããŠãã ããã
å°éåéããã¹ãããããã®ã¢ãããŒãã¯ãããŸããïŒ ããšãã°ãã¹ãã·ã£ã©ã€ãŒãŒã·ã§ã³ã®æ£ç¢ºãããã§ãã¯ãããã¹ããäœæããå Žåãæåã«ããã¹ãããããšããŠããã¹ãã·ã£ã©ã€ãŒãŒã·ã§ã³ãããã©ã«ãã®å®è£ ã§ã¯ãªãå®éã«é©çšãããŠãããã©ãããç¥ãå¿ èŠããããŸãã
@ the8472ã³ã³ãã€ã©ããã¹ãããããšãæå³ããŸããããããšãç¬èªã®ã³ãŒãã§ãã¹ãããããšãæå³ããŸããïŒ ç¢ºãã«ãåäœãç°ãªãåäœãã¹ããäœæã§ããŸãïŒã€ãŸããfnãåŒã³åºããŠãç¹æ®ãªããªã¢ã³ããååŸãããã©ããã確èªããŸãïŒã ããããã2ã€ã®ããªã¢ã³ãã¯åçã§ãããšèšã£ãŠããŸããã1ã€ã¯ããé«éã§ãããšèããããŠãããããã©ã¡ãã®ããŒãžã§ã³ãååŸããŠãããããã¹ãããæ¹æ³ãããããŸããã ãã®å Žåãç§ã¯åæããŸããç§ã¯ããªããä»ãããã©ã®ããã«ãã¹ãããããšãã§ãããããããŸããã
åãimplã®ã»ããã䜿çšããŠä»ã®ç¹æ§ãäœæãããšæããŸãããfnsã®åäœãç°ãªãå Žåã¯ãå®å¿ããŠãã ããã
ããããã2ã€ã®ããªã¢ã³ãã¯åçã§ãããšèšã£ãŠããŸããã1ã€ã¯ããé«éã§ãããšèããããŠãããããã©ã¡ãã®ããŒãžã§ã³ãååŸããŠãããããã¹ãããæ¹æ³ãããããŸããã ãã®å Žåãç§ã¯åæããŸããç§ã¯ããªããä»ãããã©ã®ããã«ãã¹ãããããšãã§ãããããããŸããã
ãã¯ãã䜿çšããŠããããã¹ãã§ããŸãã ç§ã¯Rustã«å°ãéã³ãŠããŸããããããã®ç·ã«æ²¿ã£ãäœã...
[#cfg(test)]
static mut SPECIALIZATION_TRIGGERED : bool = false;
[#cfg(test)]
macro_rules! specialization_trigger {
() => { SPECIALIZATION_TRIGGERED = true; };
}
[#cfg(not(test))]
macro_rules! specialization_trigger {
() => {};
}
次ã«ãç¹æ®ãªå®è£
ã§specialization_trigger!()
ã䜿çšãããã¹ãã§ã¯assert!(SPECIALIZATION_TRIGGERED);
䜿çšããŸã
[#cfg(test)] static mut SPECIALIZATION_TRIGGERED : bool = false; ...
ããªãã¯äœ¿ããããšæãã§ãããthread_local! { static VAR: Cell<bool> = Cell::new(false); }
ã®ä»£ããã«static mut
ãã以å€ã®å€æ°ã¯äžã€ã®ãã¹ãã±ãŒã¹ã®ã¹ã¬ããã§èšå®ãã誀ã£ãŠå¥ã®ã¹ã¬ããããèªã¿åãåŸãå¯èœæ§ãããããã ãŸããåãã¹ãã®éå§æã«å€æ°ããªã»ããããããšãå¿ããªãã§ãã ãããããããªããšãåã®ãã¹ãããtrue
ãååŸããŸãã
RFCããã¹ãã«é¢ããŠè³ªåããããŸããããŸãããã°ãããã¯è³ªåããã®ã«é©ããå Žæã§ãã
åå©çšã»ã¯ã·ã§ã³ã§ã¯ããã®äŸã瀺ããŸãã
trait Add<Rhs=Self> {
type Output;
fn add(self, rhs: Rhs) -> Self::Output;
fn add_assign(&mut self, rhs: Rhs);
}
// the `default` qualifier here means (1) not all items are implied
// and (2) those that are can be further specialized
default impl<T: Clone, Rhs> Add<Rhs> for T {
fn add_assign(&mut self, rhs: Rhs) {
let tmp = self.clone() + rhs;
*self = tmp;
}
}
tmp
åãSelf::Output
ããããã®é¢é£ä»ããããåã«ã€ããŠäœãç¥ãããŠããªãããšãèãããšãããã¯ã©ã®ããã«åãã§ãã¯ããããšã«ãªã£ãŠããã®ã ãããã RFCããã¹ãã¯ãå°ãªããšãäŸã瀺ãããŠããå Žæã®è¿ãã§ã¯ãããã説æããŠããªãããã§ãã
ãããæ©èœããã/æ³å®ãããŠããã¡ã«ããºã ãããã«ãããŸããïŒ
ãã®ããã©ã«ãã¯where T: Add<Output = T>
å¶çŽãããŸããïŒ ãããšãå æé¢ä¿ã®ã«ãŒãã§ããïŒ
@RalfJungç§ã¯ãããééã£ãŠããããã«èŠããããšã«åæããŸãã
æé ã«ã€ããŠè³ªåããããŸãããã®åé¡ã¯ã©ã®çšåºŠæå³ãããã人ã ããã®æ©èœãè©Šãããšã¯ã©ã®çšåºŠæå³ããããŸããïŒ ç§ãç解ããŠããããã«ãçŸåšã®å®è£ ã¯äžå¥å šã§äžå®å šã§ããããã§ãŒã¯ãŸãã¯äœãä»ã®ãã®ã«å®å šã«çœ®ãæããããå¯èœæ§ããããŸãã ãããæ¬åœãªããé©åã«ããçŽãããšãã§ãããŸã§ããã®æ©èœãšä»ã®æ©èœïŒGATãªã©ïŒãå®è£ 解é€ããå¿ èŠããããŸããïŒ
å®è£ ã解é€ããªãã§ãã ããã å£ãããäžå¥å šã§äžå®å šãªãã®ã§ããå®éšã¯å¯èœã§ãã
ãããæ¬åœãªããé©åã«ããçŽãããšãã§ãããŸã§ããã®æ©èœãšä»ã®æ©èœïŒGATãªã©ïŒãå®è£ 解é€ããå¿ èŠããããŸããïŒ
çŸåšãPyO3ïŒPythonãã€ã³ãã£ã³ã°ã©ã€ãã©ãªïŒã¯å°éåéã«äŸåããŠããŸãã https://github.com/PyO3/pyo3/issues/210ãåç §ããŠ
ããªãã®éé¡ã®std
ãããã«äŸåããŠããŸãããïŒ ç§ã¯ããã¯ãã«ãšæååã«é¢é£ãããã®ã®ããã®å€ãã®ç¹æ®ãªå
éšå®è£
ãèŠãããšãæãåºããŸããã ã¿ã€ããã§ãã«ãŒããé¢é£ããã»ã¯ã·ã§ã³ãåé€ããã»ã©ç°¡åã§ã¯ãªããšããã ãã§ããããå®è£
解é€ãé²ãã¯ãã§ã¯ãããŸããã
@Lucretielã¯ããå€ãã®æçšãªæé©åïŒç¹ã«ã€ãã¬ãŒã¿åšèŸºïŒã¯ç¹æ®åã«äŸåããŠããããããããå®è£
ããšãã°ã FusedIterator
ãšTrustedLen
ã¯ãç¹æ®åãªãã§ã¯åœ¹ã«ç«ã¡ãŸããã
PyO3ïŒPythonãã€ã³ãã£ã³ã°ã©ã€ãã©ãªïŒã¯çŸåšãå°éåéã«äŸåããŠããŸã
ãäžå¥å
šãªãéšåãããã®ã§ãããã¯æãã§ãã æšæºã©ã€ãã©ãªã«ã¯ãç¹æ®åã®äœ¿çšãééã£ãŠãããããé倧ãªå¥å
šæ§ã®ãã°ããããŸããã åããã°ããªãããšãã©ã®çšåºŠç¢ºä¿¡ããŠããŸããïŒ ä»£ããã«min_specialization
ã䜿çšããŠã¿ãŠãã ãããå°ãªããšããäžå¥å
šããå°ãªããªãããšãé¡ã£ãŠããŸãã
ãã¶ãspecialization
ã¯ã const_generics
ãšåæ§ã®èŠåãåãåããããã®æ©èœã¯äžå®å
šã§ãå¥å
šã§ãªããå£ãæ¬çªç°å¢ã§ã¯äœ¿çšããªãã§ã¯ãã§ãã
å€ãã®æçšãªæé©åïŒç¹ã«ã€ãã¬ãŒã¿åšèŸºïŒã¯ç¹æ®åã«äŸåããŠããããããããå®è£ 解é€ããããšã¯å€§ããªããã©ãŒãã³ã¹ååž°ã«ãªããŸãã
æè¿ã§ã¯ãæ倧ã®å¥å
šæ§ã®ç©Žãå¡ãããŠããmin_specialization
ïŒhttps://github.com/rust-lang/rust/pull/71321ãªã©ãåç
§ïŒã«äŸåããŠããŸãã
@nikomatsakis
ç§ã¯ãããééã£ãŠããããã«èŠããããšã«åæããŸãã
æå³ãããã³ãŒããäœã§ãããã«ã€ããŠäœãèãã¯ãããŸããïŒ ç§ã¯æåã default impl
ãtype Output = Self;
èšå®ããããšãæå³ããŠãããšæããŸããããææ¡ãããRFCã§ã¯å®éã«ã¯Output = T
ãã€ã³ãããããšã§ãããïŒ
@RalfJung min_specialization
ãææžåãããå¯èœæ§ã¯ãããŸããïŒ å¥å
šæ§ã®ãã°ãããã£ãŠããïŒå Žåã«ãã£ãŠã¯äžæãªïŒãã®ããããå®å
šã«ææžåãããŠããªãæ©èœãã¯ã¬ãŒãã§äœ¿çšããæ¹ããªã¹ã¯ãé«ããšæããŠããŸãã ã©ã¡ããè¯ãããšã§ã¯ãããŸããããå°ãªããšãåŸè
ã¯ã³ã³ãã€ã©ã®å
éšã ãã§ã¯ãããŸããã
ïŒ71321 PRã®å€ã§ããã®è¿œè·¡ã®åé¡ããmin_specialization
ã«ã€ããŠã®èšåãèŠã€ããããšãã§ããŸããã§ãããäžå®å®ãªæ¬ã«ãããšãããã¯ãã®æ©èœã®è¿œè·¡ã®åé¡ã§ãã
ãã®æ©èœã«ã€ããŠãããããããŸãããlibstdã®å¥å šæ§ã®ä¿®æ£ãèŠãã ãã§ãã https://github.com/rust-lang/rust/pull/68970ã§çŽ¹ä»ãããŠãããããã«ã€ããŠããã«ããã€ãã®ããšã説æãããŠã
@matthewjasperãããããå°ãææžåããŠã feature(specialization)
å€éãŠãŒã¶ãŒã«ç§»è¡ãäŸé Œããã®ã¯çã«ããªã£ãŠããŸããïŒ
å°ãªããšãèŠåãããã¯ãã®ããã§ãã ãã®æ©èœã¯æããã«å£ããŠãããçŸåšã®ç¶æ ã§äœ¿çšããã®ã¯å±éºãªããã§ãã
specialization
ã¯min_specialization
å矩èªã«ãªãå¯èœæ§ããããšæããŸãããPyO3ãªã©ã®æ¢åã®ãããžã§ã¯ãã«å¿
èŠãªå Žåã¯ãå¥ã®unsound_specialization
æ©èœãè¿œå ããŸãã min_specialization
ã ãã䜿çšãã人ã¯èª°ã§ãç¯çŽã§ããŸãããä»ã®äººã¯ãšã©ãŒã¡ãã»ãŒãžãåãåããããã§æ°ããååãæ€çŽ¢ã§ããŸãã
@RalfJung
æå³ãããã³ãŒããäœã§ãããã«ã€ããŠäœãèãã¯ãããŸããïŒ
ããŠãããæç¹ã§ãããã©ã«ããçžäºã«äŸåã§ããã¢ãŒããæ€èšããŠããŸããã ãããã£ãŠããã®æç¹ã§æ¬¡ã®ããšãæ©èœãããšæããŸãã
default impl<T: Clone, Rhs> Add<Rhs> for T {
type Output = T;
fn add_assign(&mut self, rhs: Rhs) {
let tmp = self.clone() + rhs;
*self = tmp;
}
}
泚æç¹ã¯ã impl
ããããã®ã¡ã³ããŒããªãŒããŒã©ã€ãããå Žåãããããã¹ãŠããªãŒããŒã©ã€ãããå¿
èŠããããšããããšã§ããã ãã®åŸããã®ã¢ã€ãã¢ãæ€åãããããã©ã«ãã°ã«ãŒããïŒããã§ãæ©èœããŸãïŒãªã©ã®ããŸããŸãªå埩ãéå§ããŸãããã察åŠããã°åŸã§å°éã§ãããšèãããããæçµçã«ã¯ãœãªã¥ãŒã·ã§ã³ãæ¡çšããŸããã§ããããã1ã€ã¯ãå·®ãè¿«ã£ãåé¡ã§ãïŒccïŒ71420ïŒã
çŸåšãPyO3ïŒPythonãã€ã³ãã£ã³ã°ã©ã€ãã©ãªïŒã¯å°éåéã«äŸåããŠããŸãã PyO3 / pyo3ïŒ210ãåç §ããŠãã ãã
ããã®PyO3ã¡ã³ãããŒ-å®å®ããRustã«ä¹ããããã«ãå°éåéããé¢ããããšã«è³æã§ãã min_specialization
ã¯ãæ®ãã®ã¹ãã·ã£ã©ã€ãŒãŒã·ã§ã³ãå®äºããåã«å®å®ããå¯èœæ§ããããŸããïŒ
2021幎çã®èšç»èšèªèšèšäŒè°ã§min_specializationãå®å®ãããããšãè©Šã¿ãããšã«ã€ããŠã®è°è«ããã£ããšæããŸãïŒããã¯youtubeã«ãããŸã;ç³ãèš³ãããŸããããç§ã¯ç§ã®é»è©±ã«ããŸãããŸãã¯ç§ã¯ãªã³ã¯ãèŠã€ããããšããŸãïŒã ç§ã¯åœŒããããã«ã€ããŠèšã£ãããšãå¿ããŸãã
2021幎çã®èšç»èšèªèšèšäŒè°ã§min_specializationãå®å®ãããããšãè©Šã¿ãããšã«ã€ããŠã®è°è«ããã£ããšæããŸãïŒããã¯youtubeã«ãããŸã;ç³ãèš³ãããŸããããç§ã¯ç§ã®é»è©±ã«ããŸãããŸãã¯ç§ã¯ãªã³ã¯ãèŠã€ããããšããŸãïŒã ç§ã¯åœŒããããã«ã€ããŠèšã£ãããšãå¿ããŸãã
ããã¯æ£ããYouTubeãªã³ã¯ã ãšæããŸãïŒ https ïŒ
ïŒç§ã®é»è©±ã§ãïŒ
ãããããã ãã§ãã ç¹å®ã®ãã£ã¹ã«ãã·ã§ã³ãžã®ãªã³ã¯ã¯æ¬¡ã®ãšããã§ãïŒ https ïŒ
ç§ã¯èªåãéçºããŠããå®éšã©ã€ãã©ãªã§#[min_specialization]
ããŠããã®ã§ãèªåã®çµéšãå
±æããããšæããŸããã ç®æšã¯ãç¹æ®åãæãåçŽãªåœ¢åŒã§äœ¿çšããããšã§ããã€ãŸããäžè¬çãªã±ãŒã¹ãããå®è£
ãé«éãªçãã±ãŒã¹ãããã€ãæã€ããšã§ãã ç¹ã«ãäžè¬çãªã±ãŒã¹ã§æå·åã¢ã«ãŽãªãºã ãäžå®æéã§å®è¡ãããããã¹ãŠã®å
¥åãPublic
ãšããŒã¯ãããŠããå Žåã¯ãããé«éãªå¯å€æéã§å®è¡ãããç¹æ®ãªããŒãžã§ã³ããããŸãïŒå
¬éãããŠããå Žåã¯å
¬éãããŠããªãããïŒå®è¡æéãä»ããŠãããã«é¢ããæ
å ±ãæŒããããšã«æ³šæããŠãã ããïŒã ããã«ãäžéšã®ã¢ã«ãŽãªãºã ã¯ãæ¥åæ²ç·ç¹ãæ£èŠåãããŠãããã©ããã«å¿ããŠé«éã«ãªããŸãã ãããæ©èœãããã«ã¯ããŸã
#![feature(rustc_attrs, min_specialization)]
次ã«ãæ倧éã«æå°éã®ç¹æ®åã§èª¬æãããŠããããã«_ç¹æ®åè¿°èª_ç¹æ§ãäœæããå¿
èŠãããå Žåã¯ãç¹æ§å®£èšã«#[rustc_specialization_trait]
ããŒã¯ãä»ããŸãã
ç§ã®ãã¹ãŠã®ç¹æ®åã¯ãã®ãã¡ã€ã«ã§è¡ãããäŸã§ãã
ãã®æ©èœã¯æ©èœããç§ãå¿ èŠãšããŠããããšãæ£ç¢ºã«å®è¡ããŸãã ããã¯æããã«rustcå éšããŒã«ãŒã䜿çšããŠãããããèŠåãªãã«ç ŽæããåŸåããããŸãã
ãã£ãŒãããã¯ã®å¯äžã®åŠå®çãªç¹ã¯ã default
ããŒã¯ãŒããæå³ããªããªããšæããŠããããšã§ãã åºæ¬çã«ãçŸåšdefault
æå³ããã®ã¯ãããã®implã¯ç¹æ®åå¯èœã§ããããããã®implã®ãµãã»ãããã«ããŒããimplãã競åããimplã§ã¯ãªãç¹æ®åãšããŠè§£éããããšããããšã§ãã åé¡ã¯ãéåžžã«å¥åŠãªã³ãŒãã«ã€ãªããããšã§ãã
ããã§ã2çªç®ã®implã¯æåã®implãç¹æ®åããŠããŸããããããdefault
ã§ãã default
ã®æå³ã倱ãããŠããããã§ãã æ®ãã®implãèŠããšãã©ã®implãã©ããå°éã«ããŠããã®ããç解ããã®ã¯éåžžã«å°é£ã§ãã ããã«ãæ¢åã®ãã®ãšéè€ãã誀ã£ãimplãäœæãããšããã©ããééã£ãŠããã®ããç解ããã®ãé£ããããšããããããŸããã
ãã¹ãŠãç¹æ®åãããŠããŠãäœããç¹æ®åãããšãã«ãã©ã®implãç¹æ®åããããæ£ç¢ºã«å®£èšãããšãããã¯ããç°¡åã«ãªãããã«æããŸãã RFCã®äŸãç§ãèããŠãããã®ã«å€æããŸãã
impl<A, T> Extend<A, T> for Vec<A> where T: IntoIterator<Item=A>
{
// no need for default
fn extend(&mut self, iterable: T) {
...
}
}
// We declare explicitly which impl we are specializing repeating all type bounds etc
specialize impl<A, T> Extend<A, T> for Vec<A> where T: IntoIterator<Item=A>
// And then we declare explicitly how we are making this impl narrower with âwhenâ.
// i.e. This impl is like the first except replace all occurances of âTâ with â&'a [A]â
when<'a> T = &'a [A]
{
fn extend(&mut self, iterable: &'a [A]) {
...
}
}
ãã£ãŒãããã¯ããå¯ãããã ãããããšãããããŸãã
ç§ã®ã³ã¡ã³ãããã§ã¯ãå
·äœçé
ç®6ã¯ãéšåçã«ãããªãŒããŒã©ã€ãã§å°éãæããããšãæãŸããæšæºã©ã€ãã©ãªã§ãå
·äœçãªã±ãŒã¹ãæäŸããŸãïŒ IndexSet
æ確ãªå¿
èŠãããã§ãããOutput
ã®ã§ãã¿ã€ããIndexSet
ã¯Index
ãªãã§å®è£
ã§ããŸããã2ã€ã®ã¿ã€ããç°ãªãOutput
ã¿ã€ããšå
±åãããããªãå ŽåããããŸãã IndexSet
ã¯IndexMut
ã«é¢ããŠããã©ã«ãã®å®è£
ãæã€ããšãã§ããã®ã§ã Output
ç¹æ®åãèš±å¯ããã«ã index_set
ã¡ãœããã®ç¹æ®åãèš±å¯ããããšã¯åççã§ãã
ç§ã¯ãããªã§èŠåŽããŠããã®ã§ããªã³ã¯ããããããªãæ€çŽ¢ããããšã¯ã§ããŸãããã #[min_specialization]
ã«ã€ããŠ1ã€ã®è³ªåããããŸãã çŸç¶ã§ã¯ã FusedIterator
ãããªç¹æ§ã«ã¯ãæé©åã®ãã³ããæäŸããrustc_unsafe_specialization_marker
å±æ§ããããããããå°éã«ããããšãã§ããŸãã @matthewjasperã¯æžããïŒ
ããã¯äžå¥å šã§ããããã¬ã€ãã¡ãœããã«ç¹åããã®ãšåãããã«ãçŽç²ã«å®å šãªã³ãŒãã§è§£æŸåŸã«äœ¿çšããããšã¯ã§ããªããããçæçã«ã¯èš±å¯ããŸãã
èšç»ã¯@aturonã®ææ¡ãå®è£
ãããããã®ãããªç¹æ§ïŒ where specialize(T: FusedIterator)
ïŒã®ç¹æ®åã¢ããªãã£ãè¿œå ããããšã ãšæããŸãã ãããçŸåšãã©ã®ã³ãŒãããããã®ç¹æ§ã«ç¹åã§ããããã§ãã ããããã®ãŸãŸå®å®ããŠããã°ã人ã
ã¯ããã«äŸåããå®å®ããå°éåéãæžãããšãã§ããŸããã€ãŸãããã®äžå¥å
šããå®å®ããããšãæå³ããŸãã
ã§ã¯ããããã®ç¹æ§ã®å°éåãæšæºã©ã€ãã©ãªã«éå®ããå¿ èŠããããŸããïŒ æšæºã©ã€ãã©ãªã¯ããããã«ç¹åã§ããããšããååãªå©çãåŸãŠããŸããïŒ
ããããã®ãŸãŸå®å®ããŠããã°ã人ã ã¯ããã«äŸåããå®å®ããå°éåéãæžãããšãã§ããŸããã€ãŸãããã®äžå¥å šããå®å®ããããšãæå³ããŸãã
min_specialization
ã¯çŸç¶ã®ãŸãŸã§ã¯ãå®å®åãç®çãšãããã®ã§ã¯ãªãããšãç解ããŠããŸãã
次ã«ãimplã®ç¹æ®åã«äœããã®ããŒã«ãŒãä»ããããšæããŸãã ç¹æ®åãå®éã«è¡ãããŠããããšãç¥ãæ¹æ³ããªããããrustcãšæšæºã©ã€ãã©ãªã®ã³ãŒããèŠãç®ã©ããã«åäœããªãã±ãŒã¹ãããªããããŸãã
Copy
ã®äžèŠãªç¹æ®åïŒ
https://github.com/rust-lang/rust/pull/72707/files#diff -3afa644e1d09503658d661130df65f59L1955
ããã§ã¯ãªããå°éåéãïŒ
https://github.com/rust-lang/rust/pull/71321/files#diff -da456bd3af6d94a9693e625ff7303113L1589
ããã©ã«ãã®implããªãŒããŒã©ã€ããããã©ã°ãæž¡ãããªãéãããã¯ãã«ãã£ãŠçæãããå®è£
ïŒ
https://github.com/rust-lang/rust/pull/73851/files?file-filters%5B%5D=#diff -ebb36dd2ac01b28a3fff54a1382527ddR124
@matthewjasperæåŸã®ãªã³ã¯ã¯ãç¹å®ã®ã¹ããããã«ãªã³ã¯ããŠããããã«ã¯èŠããŸããã
ãããæ確ãªç®æšã§ãããã©ããã¯ããããŸããããAIUIã¯ãç¹æ®ãªimplãããŒã¯ãããŠããªããšããäºå®ã«ãããå
æ¬çimplã®å€æŽãå£ããªãããã«ããæ¹æ³ãæäŸããŸãã æ°ããdefault impl<T> Trait for T
ã¯ãããŠã³ã¹ããªãŒã ã®implãšç«¶åããŸããããããã¯ãç¹æ®åããã ãã§ãã
ããŒã¯ãå€ãã ãã®èŠåã§ããããïŒ
ç¹æ®åãå®éã«è¡ãããŠããããšãç¥ãæ¹æ³ããªããããrustcãšæšæºã©ã€ãã©ãªã®ã³ãŒããèŠãç®ã©ããã«åäœããªãã±ãŒã¹ãããªããããŸãã
ç§ã®Javaã®çµéšã¯äŒŒãŠããŸãïŒæ£ç¢ºã«ã¯äŒŒãŠããŸãããïŒã ã¯ã©ã¹ã®ã©ã®ãµãã¯ã©ã¹ãå®éã«å®è¡ãããŠããããèŠã€ããã®ã¯é£ããå ŽåããããŸã...
ãã ããèªã¿ãããããããã«ãç¹æ®ãªimplã«ãããŒã«ãŒãå¿ èŠã§ãã
ããŒã«ãŒãäž¡æ¹ã®å Žæã«é 眮ãããšãç¹æ®åãå¿ èŠãã©ãããããããååšããå Žåã¯å¥ã®å Žæãæãããšãã§ãããããrustcãšã©ãŒãŸãã¯èŠåã¡ãã»ãŒãžãæ¹åãããŸãã
ã¢ããã¹ããªãŒã ã¯ã¬ãŒããimplãè¿œå ããå Žåãåã«ã¢ããã°ã¬ãŒããã以å€ã«ãããŠã³ã¹ããªãŒã ã¯ã¬ãŒãã¯ãæ°ããããŒãžã§ã³ãšå€ãããŒãžã§ã³ã®äž¡æ¹ã«å¯ŸããŠã³ã³ãã€ã«ã§ããããªãã¯ã䜿çšããå¯èœæ§ããããŸããããããæçãã©ããã¯ããããŸããã
å·®åã倧ããããŠå€åãèŠãããªãã®ã§ã¯ãªãããšæããŸãã ãããæããŠããŸãïŒ https ïŒ
ReïŒãã©ã³ã±ããã¯ããšã«ããå€æŽãå£ããŠããŸãïŒ
min_specialization
ãããããšïŒã@cuviperå®ã¯ãç¹æ®åãããšããŠããæ°ãããã©ã³ã±ããimplãè¿œå ããããšã«é¢ããŠã¯ãŸã ãšããžã±ãŒã¹ããã£ãããã«æããŸãã impl<T: Copy> Clone for T { }
ã€ã³ããè¿œå ããã®ã«äœãå¿
èŠããç解ããããšããŠããããšãèŠããŠããŸãããããã«ããã
ãšã«ããã #[override]
ã¢ãããŒã·ã§ã³ããªãããšã糞ããã®èŠåã«ããããšãã§ããŸãã
ãšã¯èšããã®ã®ããŠãŒã¶ãŒãã©ã®implãå°éã«ããŠããã®ãã宣èšããããšãã§ããã°ïŒã©ã®ããã«è¡ãã®ãããããªãïŒãããã€ãã®ããšãåçŽåãããŸãã çŸåšãã³ã³ãã€ã©ã¯impléã®é¢ä¿ãæšæž¬ããå¿ èŠããããããã¯åžžã«å°ã泚æãå¿ èŠã§ãã
ãã§ãŒã¯ãããžã§ã¯ãã§ç§ãã¡ãããªããã°ãªããªãä¿çäžã®é ç®ã®1ã€ã¯ãæ»ã£ãŠãããã§å°éæ§ãã©ã®ããã«è¡šçŸãã¹ããã詳ãã説æããããšã§ãã
ç¹æ®åãå®éã«è¡ãããŠããããšãç¥ãæ¹æ³ããªããããrustcãšæšæºã©ã€ãã©ãªã®ã³ãŒããèŠãç®ã©ããã«åäœããªãã±ãŒã¹ãããªããããŸãã
ç§ã®Javaã®çµéšã¯äŒŒãŠããŸãïŒæ£ç¢ºã«ã¯äŒŒãŠããŸãããïŒã ã¯ã©ã¹ã®ã©ã®ãµãã¯ã©ã¹ãå®éã«å®è¡ãããŠããããèŠã€ããã®ã¯é£ããå ŽåããããŸã...
5æã«ãéè€ããimplã«å®éã«ã¯äŸåãããåãã©ã¡ãŒã¿ãŒã§åäžã®implãwhere match
ã«èš±å¯ãããIRLOã®ç¹æ®åã®ä»£æ¿æ¡ãææ¡ããŸããã
impl<R, T> AddAssign<R> for T {
fn add_assign(&mut self, rhs: R) where match T {
T: AddAssignSpec<R> => self.add_assign(rhs),
T: Add<R> + Copy => *self = *self + rhs,
T: Add<R> + Clone => { let tmp = self.clone() + rhs; *self = tmp; }
}
}
ããŠã³ã¹ããªãŒã ã®ã¯ã¬ãŒãã¯ããã®ãããªimpl
ã䜿çšããŠãç¹æ®åããå®è£
ã§ããŸããããã¯ãæ
£äŸã«ããããã¬ã€ãTrait
ãã®ãããªå®è£
ã¯ãå¥ã®ãã¬ã€ãTraitSpec
ãå®è£
ããã¿ã€ããšããŠã³ã¹ããªãŒã ã¿ã€ãã§æåã«äžèŽããããã§ãããã®ç¹æ§ãå®è£
ããŠãäžè¬çãªåäœããªãŒããŒã©ã€ãããããšãã§ããŸãã
// Crate upstream
pub trait Foo { fn foo(); }
pub trait FooSpec { fn foo(); }
impl<T> Foo for T {
fn foo() where T {
T : FooSpec => T::foo(),
_ => { println!("generic implementation") }
}
}
fn foo<T : Foo>(t: T) {
T::foo()
}
// crate downstream
struct A {}
struct B {}
impl upstream::FooSpec for A {
fn foo() { println!("Specialized"); }
}
fn main() {
upstream::foo(A); // prints "specialized"
upstream::foo(B); // prints "generic"
}
ãã®å®åŒåã«ãããäžæµã§é©çšå¯èœãªimplã®é åºãéžæããããã®å¶åŸ¡ã匷åãããŸããããã¯ç¹æ§/é¢æ°ã®ã·ã°ããã£ã®äžéšã§ãããããããã¥ã¡ã³ãã«è¡šç€ºãããŸãã IMOã¯ã解決é åºãæ瀺çã§ãããããã©ã®ãã©ã³ããå®éã«é©çšå¯èœããç¥ãããã®ãæé»ã®è¿œè·¡ããé²ããŸãã
ããã«ãããç¹æ®åã®å®è£ äžã«ã¢ããã¹ããªãŒã ã®ã¿ããããã«å¯Ÿå¿ã§ãããããã©ã€ãã¿ã€ã ãšã¿ã€ãã®åçæ§ã«é¢ãããšã©ãŒãããæããã«ãªãå¯èœæ§ããããŸãïŒããŠã³ã¹ããªãŒã ã¯ãç¹æ®åç¹æ§ãã®ã¿ãå®è£ ããŠããããïŒã
ãã®å®åŒåã®æ¬ ç¹ã¯ãRFCã®ã«ãŒããšã¯å€§ããç°ãªãã2016幎以éã«å®è£ ãããŠããããšãšãã¹ã¬ããã®å°ãªããšãäžéšã®äººã ããçŸåšã®ã«ãŒãã»ã©è¡šçŸçããã³/ãŸãã¯çŽæçã§ã¯ãªãããšãžã®æžå¿µãè¡šæããããšã§ããç¹æ®åæ©èœïŒãã¿ã€ãã®ãããã³ã°ãã¯éåžžã«çŽæçã§ãããå®åŒåãææ¡ãããšãã«åãããããŸãïŒã
äžèŽæ§æã«ã¯ãå¥ã®ïŒæ§æäžã®ïŒå©ç¹ãããå¯èœæ§ããããŸããå°æ¥ã®ããæç¹ã§ãconstã§è©äŸ¡ãããäžèŽã¬ãŒãã§æ¡åŒµãããå ŽåãconståŒãæ¡ä»¶ãšããŠå¢çãè¡šçŸããããã«äœæãè¡ãå¿
èŠã¯ãããŸããã ããšãã°ã size_of
ã align_of
ã needs_drop
ãŸãã¯é
åãµã€ãºã«åºã¥ããŠç¹æ®åãé©çšã§ããŸãã
@dureuillæ å ±ãããããšãïŒ ããã¯ç¢ºãã«èå³æ·±ãã¢ã€ãã¢ã§ãã ç§ãæžå¿µããŠããããšã®1ã€ã¯ãç¹æ®åã®ããã«äºæ³ãããä»ã®ãŠãŒã¹ã±ãŒã¹ã®ããã€ããç¹ã«ãã®ããã°æçš¿ã§@aturonã«ãã£ãŠèª¬æãããŠããã段éçã«æŽç·Žãããåäœãã®ã±ãŒã¹ãå¿ ããã解決ããªãããšã§ãã ããã§ããèŠããŠãã䟡å€ã¯ãããŸãã
@dureuillãã®ã¢ã€ãã¢ã¯ç¢ºãã«èå³æ·±ããå€ãã®å¯èœæ§ãç§ããŠãããããããŸãããã代æ¿æ¡ã¯å¿
ãããåçã®äº€æã§ã¯ãããŸããã
ç§ãããã¯æããªãçç±ã¯ãããäžè¬çãªå®è£
ãå®å
šã«çœ®ãæããæ©äŒãäžããããŠããªãããã§ãã ãŸããå¥ã®åé¡ã¯ãææ¡ãäŸåããwhere
æ§æRFCã«ååšãããã¹ãŠã®æ©èœãå®éã«ãµããŒãããŠããªããšããäºå®ã§ããå¯èœæ§ããããŸãã
ææ¡ã¯èå³ããããã®ã§ãããããããã¯å°éåã®ç«¶äºçžæã§ã¯ãªããå¥åã®æ©èœãšããŠããèªèº«ã®RFCãæã£ãŠããå¯èœæ§ããããŸãã
@ the8472 @nikomatsakisãããŒã¯è»å£@ïŒæ£ã®ãã£ãŒãããã¯ãããããšãïŒ è¿œè·¡ã®åé¡ã«ã€ããŠããŸããããããªããããªãã®ã§ã IRLOã¹ã¬ããã§ããªãã®
å ¬éå¯èœãªãã®ãæžãããšãã§ããã°ãå¥ã®RFCãéãããšãã§ããŸãã ãã®éãç§ã¯ãªã³ã¯ãããIRLOã¹ã¬ããã«é¢ãããã£ãŒãããã¯ãéåžžã«
ç§ã¯ãŸããimplãå°éåããäžã§ããçš®ã®ããŒã«ãŒãæã€ããšã«è³æã§ãã
2021 Editionã®ã¢ãããŒãã«ãããããã«ããŒã¯ãŒãïŒ specialize
ïŒãäºçŽã§ããŸãã ãã®æ©èœã®è€éããšæŽå²ãèŠããšã2021幎çã®ãªãªãŒã¹åã«å®å®ãããšã¯æããŸããïŒç§ãééã£ãŠããããšã蚌æããŠãã ããïŒãã€ãŸããç§ã®æèŠã§ã¯ãïŒaïŒæ°ããããŒã¯ãŒãã§éãã§ããŸãã ïŒåççã§ãã
ããã§ãªããã°ãããŒã«ãŒãšããŠé©ããŠãããšæãããæ¢åã®ããŒã¯ãŒãã¯super
ãããããŸããã
@LLFournã®äŸãåå©çšããããšã§ãŸãšãhttps://github.com/rust-lang/rust/issues/31844#issuecomment -639977601ïŒ
super
ïŒãã§ã«äºçŽãããŠããŸããã default
代ãããšããŠèª€è§£ãããå¯èœæ§ããããŸãïŒsuper impl<A, T> Extend<A, T> for Vec<A> where T: IntoIterator<Item=A>
specialize
specialize impl<A, T> Extend<A, T> for Vec<A> where T: IntoIterator<Item=A>
spec
ïŒ impl
ã¯implement
ããã«specialize
ç¥ïŒïŒhttps://github.com/rust-langã®æžå¿µ/ rust / issues / 31844ïŒissuecomment-690980762ïŒspec impl<A, T> Extend<A, T> for Vec<A> where T: IntoIterator<Item=A>
override
ïŒäºçŽæžã¿ãããããšã@ the8472 https://github.com/rust-lang/rust/issues/31844#issuecomment-691042082ïŒoverride impl<A, T> Extend<A, T> for Vec<A> where T: IntoIterator<Item=A>
ãã§ã«äºçŽãããŠããããŒã¯ãŒãã¯ããã«ãããŸã
ãŸãã¯
spec
ïŒimpl
ã¯implement
ããã«ãspecialize
ç¥ïŒ
ãspecãã¯ããspecificationãã®çç¥åœ¢ïŒãHTML 5 specããªã©ïŒãšããŠãã§ã«äººã ã«èŠªããŸããŠããããããspecializeãã®çç¥åœ¢ãšããŠã¯é©åã§ã¯ãªããšæããŸãã
override
ã¯äºçŽæžã¿ã®ããŒã¯ãŒãã§ããé¢æ°ã察象ãšããŠãããšæããŸãã®ã§ãimplãããã¯ã§äœ¿çšã§ããå¯èœæ§ããããŸãã
specializeã¯ãã±ãŒã«ã«ãäŸåããŸã-ãªãŒã¹ãã©ãªã¢äººãšããŠã¯ç§ã«ç¹åããŠããã®ã§ããspecãã䜿çšãããšãã±ãŒã«ã®ãããŸããããªããªããŸãã
specializeã¯ãã±ãŒã«ã«ãäŸåããŸã-ãªãŒã¹ãã©ãªã¢äººãšããŠã¯ç§ã«ç¹åããŠããã®ã§ããspecãã䜿çšãããšãã±ãŒã«ã®ãããŸããããªããªããŸãã
'spec'ã¯ä»æ§ã®äžè¬çãªç¥èªã§ãããšããç¹ãé€ããŠãããã¯æ©èœããŸãããããã£ãŠã 'spec'ã䜿çšããŠç¹æ®åãæå³ããã®ã¯æ··ä¹±ãæããšæããŸãã ãªãŒã¹ãã©ãªã¢ã§ã¯åèªã®ã¹ãã«ãç°ãªã£ãŠããŠãããzããŸãã¯ãsãã®ããããã§ã¹ãã«ãããŠããã°ã誰ããã©ã®åèªãæå³ãããŠããããç解ã§ããŸãã
ã«ãã人ãšããŠãç§ã¯å°éåé/å°éåéã ãããã±ãŒã«ã«ãã£ãŠç°ãªãããã°ã©ãã³ã°ã§äœ¿çšãããåèªã§ã¯ãªããšèšããªããã°ãªããŸããã
ããã§ã¯ãè²ãã䜿çšããŠããŸãããããã°ã©ãã³ã°èšèªãã©ã€ãã©ãªããè²ãã®ä»£ããã«ãè²ãã䜿çšããŠããå Žåã¯ããŸãã«ã€ãŸãããŸãã è¯ããæªãããã¢ã¡ãªã«è±èªã¯APIèšèšã®äºå®äžã®æšæºã§ãããè²/è²ãªã©ã®åèªã§ã¯ãå®éã«å·¥å€«ããããšãªããäžæ¹ã®ã¹ãã«ãä»æ¹ãããåªå ããããšãéžæããããšã¯é¿ããããŸããã
ãä»æ§ãããä»æ§ããæå³ããããšãã©ãã»ã©åŒ·ãæåŸ ããŠããã®ããèãããšãããã¯ãã¢ã¡ãªã«è±èªã®ã¹ãã«ãææªã®éžæè¢ãšèŠãªãå¿ èŠããããã1ã€ã®ç¶æ³ã ãšæããŸãã
ããã¯äºå®ãããããŸããããããã¯ãããã䜿çšããŠã倧äžå€«ã ãšããæå³ã§ã¯ãããŸããã ããšãã°ããè²ãè²ãšããŠäœ¿çšããããªã©ã®ã€ã³ããŒããè¡ã£ãŠããŸãã ç§ã¯ãã€ãs察zã«ãã€ãŸãããŸãã å æ¬æ§ãšã¢ã¯ã»ã·ããªãã£ã«å¯ŸããRustã®ååããªå§¿å¢ãèãããšãè²/è²ãs / zãªã©ã®å°ããªãŠãŒã¶ãŒã®æ¬²æ±äžæºãé«ãŸãããããã±ãŒã«ã«äŸåããªãèšèªçšèªãéžæããããšã¯çã«ããªã£ãŠãããšæããŸãã
ååãšããŠåæããŸãã ãã®å Žåã解決ãã以äžã®åé¡ãåŒãèµ·ãããªããã±ãŒã«äžç«ã®éžæãããã®ã§ã¯ãªãããšç§ã¯æççã§ãã
è±èªãæ¯åœèªãšããªã人ãšããŠãè±èªãæ¯åœèªãšãã人ããå
æ¬æ§ã®éå£ãšããŠäœåãªu
ã«ã€ããŠäžå¹³ãèšãã®ã¯å°ãé¢çœããšæããŸãã ãã¹ãŠãå°ãå¥åŠãªç¶Žãã§ã¯ãªãããŸã£ããç°ãªãèšèªã§æžãããŠãããšãããã©ããªããæ³åããŠã¿ãŠãã ããã
èšãæãããšãRustã§äœ¿çšããããã¹ãŠã®çšèªã¯ãã±ãŒã«ã«äŸåããŸãã
è¯ããæªãããRustã®å
容ã¯ã¢ã¡ãªã«è±èªã§ç¶ŽãããŠããŸãã ããã®å€ãã®äººã«ãšã£ãŠãããã¯åœŒãã®ç¬¬äºãŸãã¯ç¬¬äžèšèªã§åãããšãæå³ããŸãã ä»ã®äººã«ãšã£ãŠã¯ãã¹ãã«ãå°ã調æŽããå¿
èŠãããããšãæå³ããŸãã ããã¯ãããããã®äººã
ãäžç·ã«åãããã«ããããã«å¿
èŠãªããšã§ãã è±èªã®å€ãã®ããªãšãŒã·ã§ã³ã§åãã¹ãã«ã®åèªãéžæããããšã®å©ç¹ã¯ãæ確ãªçšèªãéžæããããšãšæ¯èŒããŠãããã§ãããšæããŸãããŸããäžèšã§ææããããã«ã spec
ã¯ãããŸãã§ãã
ããŒã¯ãŒããšããŠspecial
ã䜿çšããŸããïŒ
å¥ã®æ¹æ³ãšããŠã specialize
ãšspecialise
2ã€ã®ããŒã¯ãŒããäœæããããããåçã«ããŸã...
ïŒãŸãã¯ãé¢çœãéã¢ã¡ãªã«äººã¯æ¬åœã®é©åãªã¹ãã«ãåŠã¶ããšãã§ããŸãïŒusïŒðïŒ
ç§ã¯ã»ãšãã©ã®èšèªãäœããããã«ã€ããŠè©±ãããšãã§ããŸããããCSSã¯ãã¹ãŠã®æ°ãããã®ã«ã¢ã¡ãªã«è±èªã®ã¹ãã«ã䜿çšããŸãã éžè©±çã«ãã¢ã¡ãªã«è±èªã¯ããã°ã©ãã³ã°ã§ãããé »ç¹ã«äœ¿çšãããŠããããã§ãã
@ mark-imæ®å¿µãªãããããã¯æ»ããããåéã§ãããRustã¯ãåŠç¿è ãæ¥ãå¯èœæ§ã®ãããã¹ãŠã®äž»èŠèšèªã§ä»£æ¿ã®ããŒã¯ãŒãã»ããã䜿çšããå¿ èŠããããšããè°è«ã«ã€ãªãããŸãã
ãŸãã人ã ãšããŒãµãŒã¯ç©ºçœããã®ããã«å€åããå¯èœæ§ããããšããèãã«ããæ £ããŠããªããããããŒã¯ãŒãã®è€æ°ã®å矩èªãæã€ããã«èšèªãäžå¿ èŠã«è€éã«ããŸãã
ïŒèšããŸã§ããªããã©ã€ãã©ãªå ã®åçã®å矩èªã®ããã·ã¥ã«åœ±é¿ãäžããå¯èœæ§ãããããã®å Žåãããããæ£å³ã®ãã¬ãã£ãã«ãªããªãããã«ããããã«rustdocã®èšèšãšå®è£ äœæ¥ãå¿ èŠã«ãªããŸããïŒ
ãã®èå¥åãã©ã®è±èªã®æ¹èšã«å ¥ããããã«ã€ããŠè°è«ããã®ã§ã¯ãªãã劥åããŠããã©ã€èªã«å ¥ããããšãã§ããã§ããããã
@ssokolowã¯ãäžè¬çã«æ»ããããåã®è°è«ã䜿çšããããã®åŒ·åãªè°è«ã§ã¯ãããŸãããããã®å Žåã¯ããªãã«åæããŸãã è€æ°ã®èšèªã§åé¡ãªããšäž»åŒµãã人ããããããããŸããããããã§ãªãçç±ã¯å°ãªããšã2ã€ãããŸãã
a
and
ã¯è±èªã®ä»ãéã«åãçµãã§ããŸãããä»ã®èšèªã§ã¯ãªãã«ããŠãããªãè±èªã®ç°ãªãæ¹èšã奜ãŸããã®ã§ããïŒ æå³ãããããŸããã äžè²«æ§ïŒãã¹ãŠãç±³åœè±èªïŒã¯ãæãåçŽã§ãç解ããããããšã©ãŒãçºçãã«ããããã§ãã
ããã¯èšã£ãŠãããXXXã®ããšã§ããïŒããšãšãŠãå¬ããã§ãã ãšã©ãŒã¡ãã»ãŒãžã¢ãããŒãã ä»ã«åé¡ã®ãªãäžç«çãªèšèã§ãæ§ããŸããã
å°ãªããšããã³ãŒãã§ãµãã«ãŒã«ã€ããŠè°è«ããå¿ èŠã¯ãããŸããã ;ïŒ
è±èªãæ¯åœèªãšãã人ã®çŽ70ïŒ ã¯ãç±³åœã®ã¹ãã«ã䜿çšããŠããåœã«äœãã§ããŸãã
ãŸã..
ã-izeã®ã€ã¥ãã¯ãè±åœã§ã¯ã¢ã¡ãªã«ããºã ãšèª€ã£ãŠèŠãªãããããšããããããŸãã15äžçŽãã䜿çšãããŠããã-iseãã1äžçŽä»¥äžåã«äœ¿çšãããŠããŸãã-izeã¯ã®ãªã·ã£èªã®-ιζειΜ-izeinãšã©ãã³èªã®-izÄreã«çŽæ¥ç±æ¥ããŸãã iseã¯ãã©ã³ã¹èªã®-iserãä»ããŠæäŸãããŸããOxfordEnglishDictionaryïŒOEDïŒã¯ã-izeãæšå¥šãã代ããã«-ise圢åŒããªã¹ãããŠããŸããã
ããªãã¯ã¹ãã©ãŒã倧åŠåºçå±ïŒOUPïŒã«ããåºçç©ïŒãã³ãªãŒã¯ããœã³ãã¡ãŠã©ãŒã®çŸä»£è±èªçšæ³èŸå žãããŒãã®èŠåããªãã¯ã¹ãã©ãŒãè±èªäœ¿çšæ³ã¬ã€ããªã©ïŒã-izeãæšå¥šããŠããŸãããã ãããããŒãã¢ã©ã³ã®ãã±ãããã¡ãŠã©ãŒã®çŸä»£è±èªçšæ³ã¯ã©ã¡ãã®ç¶Žããèæ ®ããŠããŸããç±³åœä»¥å€ã®ã©ãã§ãåãå ¥ããããããã«ã
åç §ã https://en.wikipedia.org/wiki/American_and_British_English_spelling_differences# -iseã_- ize _ïŒ-isationã_- izationïŒ
ã¹ãã€ã³èªãšã€ã¿ãªã¢èªã«ã¯azã1ã€ã2ã€ããããã§ããããã©ã³ã¹èªãã©ãã§ååŸããããããããªãã®ã§ããããããã€ãèªããã§ããïŒ
ç¹å®ã®ããŒã¯ãŒããšååã®åšãã®ãã€ã¯ã·ã§ãã£ã³ã°ãå éšã¹ã¬ããã«ç§»åã§ã
æãåèã«ãªãã³ã¡ã³ã
ç§ã¯èªåãéçºããŠããå®éšã©ã€ãã©ãªã§
#[min_specialization]
ããŠããã®ã§ãèªåã®çµéšãå ±æããããšæããŸããã ç®æšã¯ãç¹æ®åãæãåçŽãªåœ¢åŒã§äœ¿çšããããšã§ããã€ãŸããäžè¬çãªã±ãŒã¹ãããå®è£ ãé«éãªçãã±ãŒã¹ãããã€ãæã€ããšã§ãã ç¹ã«ãäžè¬çãªã±ãŒã¹ã§æå·åã¢ã«ãŽãªãºã ãäžå®æéã§å®è¡ãããããã¹ãŠã®å ¥åãPublic
ãšããŒã¯ãããŠããå Žåã¯ãããé«éãªå¯å€æéã§å®è¡ãããç¹æ®ãªããŒãžã§ã³ããããŸãïŒå ¬éãããŠããå Žåã¯å ¬éãããŠããªãããïŒå®è¡æéãä»ããŠãããã«é¢ããæ å ±ãæŒããããšã«æ³šæããŠãã ããïŒã ããã«ãäžéšã®ã¢ã«ãŽãªãºã ã¯ãæ¥åæ²ç·ç¹ãæ£èŠåãããŠãããã©ããã«å¿ããŠé«éã«ãªããŸãã ãããæ©èœãããã«ã¯ããŸã次ã«ãæ倧éã«æå°éã®ç¹æ®åã§èª¬æãããŠããããã«_ç¹æ®åè¿°èª_ç¹æ§ãäœæããå¿ èŠãããå Žåã¯ãç¹æ§å®£èšã«
#[rustc_specialization_trait]
ããŒã¯ãä»ããŸããç§ã®ãã¹ãŠã®ç¹æ®åã¯ãã®ãã¡ã€ã«ã§è¡ãããäŸã§ãã
ãã®æ©èœã¯æ©èœããç§ãå¿ èŠãšããŠããããšãæ£ç¢ºã«å®è¡ããŸãã ããã¯æããã«rustcå éšããŒã«ãŒã䜿çšããŠãããããèŠåãªãã«ç ŽæããåŸåããããŸãã
ãã£ãŒãããã¯ã®å¯äžã®åŠå®çãªç¹ã¯ã
default
ããŒã¯ãŒããæå³ããªããªããšæããŠããããšã§ãã åºæ¬çã«ãçŸåšdefault
æå³ããã®ã¯ãããã®implã¯ç¹æ®åå¯èœã§ããããããã®implã®ãµãã»ãããã«ããŒããimplãã競åããimplã§ã¯ãªãç¹æ®åãšããŠè§£éããããšããããšã§ãã åé¡ã¯ãéåžžã«å¥åŠãªã³ãŒãã«ã€ãªããããšã§ããhttps://github.com/LLFourn/secp256kfun/blob/6766b60c02c99ca24f816801fe876fed79643c3a/secp256kfun/src/op.rs#L196 -L206
ããã§ã2çªç®ã®implã¯æåã®implãç¹æ®åããŠããŸãããããã
default
ã§ããdefault
ã®æå³ã倱ãããŠããããã§ãã æ®ãã®implãèŠããšãã©ã®implãã©ããå°éã«ããŠããã®ããç解ããã®ã¯éåžžã«å°é£ã§ãã ããã«ãæ¢åã®ãã®ãšéè€ãã誀ã£ãimplãäœæãããšããã©ããééã£ãŠããã®ããç解ããã®ãé£ããããšããããããŸããããã¹ãŠãç¹æ®åãããŠããŠãäœããç¹æ®åãããšãã«ãã©ã®implãç¹æ®åããããæ£ç¢ºã«å®£èšãããšãããã¯ããç°¡åã«ãªãããã«æããŸãã RFCã®äŸãç§ãèããŠãããã®ã«å€æããŸãã