!
ãã¿ã€ãã«ããã¢ãŒãããrust-lang / rfcsïŒ1216ã®è¿œè·¡ã®åé¡ã
()
ãžã®ååž°https://github.com/rust-lang/rust/issues/67225äžæ³ïŒ
ããã«ããã®WIPå®è£ ããããŸãïŒ https ïŒ
çŸåšã®ã¹ããŒã¿ã¹ã¯æ¬¡ã®ãšããã§ããold-transã§ãã«ãããã䜿çšå¯èœã§ãããããã€ãã®å€±æãããã¹ãããããŸãã ãã©ã³ã¹äžã«if (return) {}
ãããªã³ãŒããã¯ã©ãã·ã¥ãããã°ãåå ã§ãäžéšã®ãã¹ãã倱æããŸãã ä»ã®ãã¹ãã¯ãªã³ã¯æéã®æé©åã«é¢ãããã®ã§ãããç§ã«ãšã£ãŠã¯åžžã«ãã°ãå€ãã®ã§ãããããç§ã®å€æŽãšé¢ä¿ããããã©ããã¯ããããŸããã
ç§ã®çŸåšã®ããŒããããã¯æ¬¡ã®ãšããã§ãã
FnOutput
ã FnDiverging
ããã³é¢é£ïŒã!
ã¯ãæ»ãäœçœ®ã®åãšããŠã®ã¿è§£æã§ããŸãã()
ã§ãã()
ãç¹æ§ã®è§£æ±ºã«äœ¿çšããããšãã«ãäºææ§ã®èŠåã衚瀺ããæ¹æ³ãç解ããŠãã ããã ãããè¡ã1ã€ã®æ¹æ³ã¯ã DefaultedUnit
ãšåŒã°ããæ°ããã¿ã€ããASTã«è¿œå ããããšã§ãã ãã®ã¿ã€ãã¯()
ããã«åäœããç¶æ³ã«ãã£ãŠã¯()
ã«å€ãããŸãããç¹æ§ã解決ãããšïŒ ()
ïŒèŠåãçºçããŸãã ãã®ã¢ãããŒãã®åé¡ã¯ãå®è£
ã®ãã¹ãŠã®ãã°ãèŠã€ããŠä¿®æ£ããã®ãé£ãããšæãããšã§ããã³ãŒããå£ããªãããã«ããããã«ã人ã
ã®ã³ãŒããå£ããŠããŸãããšã«ãªããŸãããã®ãªã¹ãã«è¿œå ããå¿ èŠããããã®ã¯ãããŸããïŒ ããã«åãçµãã§ããã®ã¯ç§ã ãã§ããïŒ ãããŠããã®ãã©ã³ããã¡ã€ã³ãªããžããªã«ç§»åããå¿ èŠããããŸããïŒ
ããã©ã«ãã®
()
ãç¹æ§ã®è§£æ±ºã«äœ¿çšããããšãã«ãäºææ§ã®èŠåã衚瀺ããæ¹æ³ãç解ããŠãã ããã ãããè¡ã1ã€ã®æ¹æ³ã¯ãDefaultedUnit
ãšåŒã°ããæ°ããã¿ã€ããASTã«è¿œå ããããšã§ãã ãã®ã¿ã€ãã¯()
ããã«åäœããç¶æ³ã«ãã£ãŠã¯()
ã«å€ãããŸãããç¹æ§ã解決ãããšãã«èŠåãçºããŸãïŒ()
ïŒã ãã®ã¢ãããŒãã®åé¡ã¯ãå®è£ ã®ãã¹ãŠã®ãã°ãèŠã€ããŠä¿®æ£ããã®ãé£ãããšæãããšã§ããã³ãŒããå£ããªãããã«ããããã«ã人ã ã®ã³ãŒããå£ããŠããŸãããšã«ãªããŸãã
@eddybã@ arielb1ã@anyone_elseïŒãã®ã¢ãããŒãã«é¢ããèå¯ïŒ ç§ã¯ã»ãŒãã®æ®µéãŸã§é²ãã§ããŸãïŒç§ãïŒéåžžã«ãã£ãããšïŒä¿®æ£ããããšããŠããããã€ãã®å€±æãããã¹ãã¯ãããŸããïŒã
ã©ã®ãããªç¹æ§ãå®è£ ããå¿ èŠããããŸããïŒïŒ æåã®PRïŒ35162ã«ã¯ãOrdãšä»ã®ããã€ããå«ãŸããŠããŸãã
!
èªåçã«_all_ãã¬ã€ããå®è£
ããã¹ãã§ã¯ãããŸãããïŒ
ãã®çš®ã®ã³ãŒãã¯ããªãäžè¬çã§ãã
trait Baz { ... }
trait Foo {
type Bar: Baz;
fn do_something(&self) -> Self::Bar;
}
Bar
ãå®éã«ã¯ååšããªãããšã瀺ãããã«ã !
ãFoo::Bar
ã§äœ¿çšã§ããããšãæåŸ
ããŸãã
impl Foo for MyStruct {
type Bar = !;
fn do_something(&self) -> ! { panic!() }
}
ãã ããããã¯!
ããã¹ãŠã®ç¹æ§ãå®è£
ããŠããå Žåã«ã®ã¿å¯èœã§ãã
@tomakaããã«ã€ããŠã®RFCããããŸãïŒ https ïŒ
åé¡ã¯ã !
ãTrait
ãå®è£
ããå Žåã !Trait
ãå®è£
ããå¿
èŠãããããšã§ã...
åé¡ã¯ãããïŒ ãã¬ã€ããå®è£ ããŸãããã¬ã€ããå®è£ ããå¿ èŠããããŸãã
次ã«ãç¹æ®ãªã±ãŒã¹ã®!
ãç¹æ§èŠä»¶ãç¡èŠããŸããïŒ
@tomaka !
ã¯ããã¬ã€ãã«éçã¡ãœãããšé¢é£ããå/å®æ°ãå«ããããšãã§ããããã_all_ãã¬ã€ããèªåçã«å®è£
ããããšã¯ã§ããŸããã ãã ããééçã¡ãœããïŒã€ãŸãã Self
ãåãã¡ãœããïŒãæã€ãã¬ã€ããèªåçã«å®è£
ã§ããŸãã
!Trait
ã誰ãã!
ãTrait
_ãš_ !Trait
äž¡æ¹ãèªåå®è£
ã§ãããšææ¡ããŸããã ãããæ£ãããã©ããã¯ããããŸããããåŠå®çãªç¹æ§ã¯ãŸã£ããèãããªãã®ã§ã¯ãªãããšæããŸãã
ããããããã§ãã !
ãããŸãã«ãã®çš®ã®å Žåã«äžããäŸã§Baz
ãèªåå®è£
ã§ããã°ãããããããŸããã
çºæ£åå€æ°ãããã©ã«ãã§()
/ !
ã«èšå®ããã®ã¯ãã€ã§ããïŒãŸããååãªåæ
å ±ãæšæž¬ã§ããªããšãããšã©ãŒãã¹ããŒããã®ã¯ãã€ã§ããïŒ ããã¯ã©ããã«æå®ãããŠããŸããïŒ æ¬¡ã®ã³ãŒããã³ã³ãã€ã«ã§ããããã«ããããšæããŸãã
let Ok(x) = Ok("hello");
ããããç§ãåŸãæåã®ãšã©ãŒã¯ã unable to infer enough type information about _
ãã§ãã ãã®å Žåã _
ãããã©ã«ãã§!
ã«èšå®ããã®ãçã«ããªã£ãŠãããšæããŸãã ããããããã©ã«ãã®åäœã«é¢ãããã¹ããæžããŠãããšããåå€æ°ãããã©ã«ãã«ããã®ã¯é©ãã»ã©é£ããããšã«æ°ã¥ããŸããã ãã®ããããããã®ãã¹ãã¯éåžžã«è€éã§ãã
ãªããã®ããã©ã«ãã®åäœãçºçããã®ãããã€åŒã³åºãããã®ããæ確ã«ææ¡ããããšæããŸãã
ããããç§ãæåã«åŸããšã©ãŒã¯ãã_ã«é¢ããååãªåæ å ±ãæšæž¬ã§ããªãããšãããã®ã§ãã ãã®å Žåã_ãããã©ã«ãã§ïŒã«èšå®ããã®ãçã«ããªã£ãŠãããšæããŸãã ããããããã©ã«ãã®åäœã«é¢ãããã¹ããæžããŠãããšããåå€æ°ãããã©ã«ãã«ããã®ã¯é©ãã»ã©é£ããããšã«æ°ã¥ããŸããã ãã®ããããããã®ãã¹ãã¯éåžžã«è€éã§ãã
ããã¯ç§ã®æèŠã§ã¯éåžžã«è¯ãèãã§ãã ããšãã°ãããã©ã«ãã§Option<!>
ã«ãªãNone
ã«ã€ããŠãåãã§ãã
@carllerche
unit_fallback
ãã¹ãã¯ç¢ºãã«ãããå®èšŒããããã®å¥åŠãªæ¹æ³ã§ãã ãã¯ãã®å°ãªãããŒãžã§ã³ã¯
trait Balls: Default {}
impl Balls for () {}
struct Flah;
impl Flah {
fn flah<T: Balls>(&self) -> T {
Default::default()
}
}
fn doit(cond: bool) {
let _ = if cond {
Flah.flah()
} else {
return
};
}
fn main() {
let _ = doit(true);
}
return
/ break
/ panic!()
ã«ãã£ãŠäœæãããåå€æ°ã®ã¿ãããã©ã«ãã§äœã«ã§ããªããŸãã
æ£ç¢ºã«ãã€çºæ£åå€æ°ãïŒïŒ/ã«ããã©ã«ãèšå®ããŸããïŒ ååãªåæ å ±ãæšæž¬ã§ããªããšãããšã©ãŒããã€ã¹ããŒããŸããïŒ ããã¯ã©ããã«æå®ãããŠããŸããïŒ
ãæå®ããå®çŸ©ããŸãã :)çãã¯ãã³ãŒãã®å€éšã«æžãçããããŠããªãç¹å®ã®æäœã§ã¯ããã®æç¹ã§åãããã£ãŠããå¿
èŠããããšããããšã§ãã æãäžè¬çãªã±ãŒã¹ã¯ãã£ãŒã«ãã¢ã¯ã»ã¹ïŒ .f
ïŒãšã¡ãœãããã£ã¹ãããïŒ .f()
ïŒã§ãããå¥ã®äŸã¯derefïŒ *x
ïŒã§ããããããã1ã€ã2ã€ä»¥äžãããŸãã ãããå¿
èŠãšãããã®ã«ã¯ãã»ãšãã©ã®å ŽåããŸãšããªçç±ããããŸããäžè¬çã«èšã£ãŠãé²ãã«ã¯è€æ°ã®ç°ãªãæ¹æ³ããããã©ãããšãã¹ãããç¥ããã«é²æ©ããããšã¯ã§ããŸããã ïŒæœåšçã«ããã®å¿
èŠæ§ãäžçš®ã®ãä¿çäžã®çŸ©åããšããŠç»é²ã§ããããã«ã³ãŒãããªãã¡ã¯ã¿ãªã³ã°ããããšã¯å¯èœã§ãããããããããšã¯è€éã§ããïŒ
fnã®æåŸãŸã§å°éãããšãå®åžžç¶æ ã«éãããŸã§ãä¿çäžã®ãã¹ãŠã®ç¹æ§éžææäœãå®è¡ãããŸãã ããã¯ãããã©ã«ãïŒi32ãªã©ïŒãé©çšããããã€ã³ãã§ãã ãã®æåŸã®éšåã¯ããŠãŒã¶ãŒæå®ã®ããã©ã«ãã¿ã€ããã©ã¡ãŒã¿ãŒã«ã€ããŠèª¬æããŠããRFCã§èª¬æãããŠããŸãïŒãã ããRFCã¯äžè¬ã«äœæ¥ãå¿ èŠã§ãïŒã
https://github.com/rust-lang/rust/issues/36011
https://github.com/rust-lang/rust/issues/36038
https://github.com/rust-lang/rust/issues/35940
ä¿çäžã®åé¡ã®ãªã¹ãã«è¿œå ããããã€ãã®ãã°ããããŸãã
@canndrewãããã¯https://github.com/rust-lang/rust/issues/12609ã«å°ã䌌ãŠã
å°å¹Žãããã¯å€ããã°ã§ãïŒ ããããã¯ããç§ã®ïŒ36038ã¯ãã®è€è£œã ãšæããŸãïŒä»¥åã©ããã§èŠãããšããããšæããŸããïŒã !
ã¯ããããä¿®æ£ããããŸã§ããã©ã€ã ã¿ã€ã ã§å®éã«æ€èšã§ãããšã¯æããŸããã
!
ããã¿ãŒã³ãããã³ã°ã®ç¶²çŸ
æ§ã«åœ±é¿ãäžããäºå®ã§ããïŒ çŸåšã®ãããããééã£ãåäœã®äŸïŒ
#![feature(never_type)]
fn main() {
let result: Result<_, !> = Ok(1);
match result {
// ^^^^^^ pattern `Err(_)` not covered
Ok(i) => println!("{}", i),
}
}
@tikueã¯ããããã¯äžèšã®ãã°ã®1ã€ã§ãã
@lfairyãã£ãšãäžéšã®ãã§ãã¯ããã¯ã¹ã«è¡šç€ºãããŠããªãã£ãããã衚瀺ãããŸããã§ããã ããããšãïŒ
From<!> for T
ãšAdd<T> for !
ïŒåºåã¿ã€ãã¯!
ïŒãå®è£
ããèšç»ã¯ãããŸããïŒ ç§ã¯ãããæ¬åœã«å¥åŠãªç¹å®ã®èŠæ±ã§ããããšãç¥ã£ãŠããŸã-ç§ã¯ãã®PRã§äž¡æ¹ã䜿ãããšããŠããŸãã
From<!> for T
ééããªãã Add<T> for !
ã¯ããããlibsããŒã ã決å®ããããšã§ãããç§ã¯å人çã«!
ãè«ççã§æšæºçãªå®è£
ãæã€ãã¹ãŠã®ç¹æ§ãå®è£
ããå¿
èŠããããšæããŸãã
@canndrewããããšãïŒ ç§ã¯ãã¹ãŠã®ã¿ã€ãã®ãµãã¿ã€ãã§ããscalaã®Nothing
ãã¬ã€ãã«æ
£ããŠããã®ã§ãå€ã衚瀺ãããã»ãšãã©ãã¹ãŠã®å Žæã§äœ¿çšã§ããŸãã ãããã impl All for !
ãªã©ããã³ã®åã·ã¹ãã ã«äžãã圱é¿ãç¹ã«è² ã®ç¹æ§éçãªã©ãç解ããããšããé¡æã«ã¯ééããªãå
±æããŸãã
https://github.com/rust-lang/rfcs/issues/1723#issuecomment -241595070ã«ãããšã From<!> for T
ã¯äžè²«æ§ã®åé¡ããããŸãã
ãããããããã ã ç§ãã¡ã¯ããã«ã€ããŠäœããããå¿ èŠããããŸãã
ãã¬ã€ãã€ã³ããä»ã®ãã¬ã€ãã€ã³ãã«ã«ãã£ãŠãªãŒããŒã©ã€ããããããšãæ瀺çã«è¿°ã¹ãããšãã§ããã°ãããã¯è¯ãããšã§ãã äœãã®ãããªãã®ïŒ
impl<T> From<T> for T
overridden_by<T> From<!> for T
{ ... }
impl<T> From<!> for T { ... }
ããã¯å°éåéã§ã«ããŒãããŠããŸãããïŒ ç·šéïŒããã¯ã©ãã£ã¹ã®å®è£ ã«ãŒã«ã ãšæããŸãã
ç¡äººã¿ã€ãã®ç¹å¥ãªãµããŒããå¯èœãªéãåé¿ããããšã¯å®è¡å¯èœãªä»£æ¿æ段ã§ããïŒ
ããããã¹ãŠã®match (res: Res<A, !>) { Ok(a) /* No Err */ }
ã Result
ç¹å¥ãªã¡ãœããã¯ãæ©èœã®ããã®æ©èœã®ããã«éåžžã«å·¥å€«ãããŠããããã«èŠããåŽåãšè€éãã®äŸ¡å€ããªãããã§ãã
!
ã¯@canndrewã®ãããæ©èœã§ããã圌ã¯ãããããã«éçºããããšæã£ãŠããããšãç解ããŠããŸãããæåããé²ãã®ã¯ééã£ãæ¹åã§ãããïŒ12609ã¯ãã°ã§ããããŸãããïŒ
@ petrochenkov ïŒ12609ã¯ãNeverã¿ã€ãã®ç¹å¥ãªæ©èœã§ã¯ãããŸããã æããã«å°éäžèœãªã³ãŒããæ€åºããã®ã¯åãªããã°ä¿®æ£ã§ãã
@petrochenkov !
ãå¿ããŠãåæåãèŠãŠãã ããã
2ã€ã®ããªã¢ã³ããæã€åæåãããå Žåã2ã€ã®ã±ãŒã¹ã§äžèŽãããããšãã§ããŸãã
enum Foo {
Flim,
Flam,
}
let foo: Foo = ...;
match foo {
Foo::Flim => ...,
Foo::Flam => ...,
}
ããã¯ã2ã€ã ãã§ãªããä»»æã®nã§æ©èœããŸãã ãããã£ãŠãããªã¢ã³ãããŒãã®åæåãããå Žåã¯ãã±ãŒã¹ãªãã§äžèŽãããããšãã§ããŸãã
enum Void {
}
let void: Void = ...;
match void {
}
ãããŸã§ã¯é 調ã§ããã ãããããã¹ãããããã¿ãŒã³ã§äžèŽãããããšãããšã©ããªããèŠãŠã¿ãŸãããã ããã¯ã Result
å
ã®2ã€ã®ããªã¢ã³ãã®åæåã§ã®ãããã³ã°ã§ãã
enum Foo {
Flim,
Flam,
}
let result_foo: Result<T, Foo> = ...;
match result_foo {
Ok(t) => ...,
Err(Flim) => ...,
Err(Flam) => ...,
}
å
åŽã®ãã¿ãŒã³ãå€åŽã®ãã¿ãŒã³ã®å
åŽã«æ¡åŒµã§ããŸãã Foo
ããªãšãŒã·ã§ã³ã¯2ã€ããããã Err
ã«ã¯2ã€ã®ã±ãŒã¹ããããŸãã Result
ãšFoo
ãç
§åããããã«ãåå¥ã®matchã¹ããŒãã¡ã³ãã¯å¿
èŠãããŸããã ããã¯ãä»»æã®æ°ã®ããªã¢ã³ããæã€åæåã§æ©èœããŸã..._ãŒããé€ã_ã
enum Void {
}
let result_void: Result<T, Void> = ...;
match result_void {
Ok(t) => ...,
// ERROR!
}
ãªããããæ©èœããªãã®ã§ããïŒ ç§ã¯ãããä¿®æ£ããããšãç¡äººã¿ã€ãã®ãç¹å¥ãªãµããŒãããè¿œå ããããšãšã¯åŒã³ãŸãããç§ã¯ãããççŸãä¿®æ£ããããšãšåŒã³ãŸãã
@petrochenkovå€åç§ã¯ããªããèšã£ãŠããããšã誀解ããŸããã ïŒ12609ã¹ã¬ããã§èª¬æãããŠãã2ã€ã®è³ªåããããŸãã
ïŒ0ïŒãã®ã³ãŒãã®ã³ã³ãã€ã«ãèš±å¯ããå¿ èŠããããŸããïŒ
let res: Result<u32, !> = ...;
match res {
Ok(x) => ...,
}
ïŒ1ïŒãã®ã³ãŒãã®ã³ã³ãã€ã«ãèš±å¯ããå¿ èŠããããŸããïŒ
let res: Result<u32, !> = ...;
match res {
Ok(x) => ...,
Err(_) => ...,
}
çŸåšå®è£ ãããŠããããã«ãçãã¯ããããããããããšãã¯ããã§ãã ïŒ12609ã¯ç¹ã«åé¡èªäœã§ïŒ1ïŒã«ã€ããŠè©±ããŸãããç§ãçãããšãç§ã¯ïŒ0ïŒãèããŠããŸããã çãã¯ã©ãããã¹ãããšãããšãïŒ0ïŒã¯ééããªããã¯ããã ãšæããŸãããïŒ1ïŒã«ã€ããŠãããããŸããã
@canndrew
ããã¯é¢ä¿ãªããç¡äººã®çš®é¡ãïŒ1ïŒããªãã¡å°éäžèœãã¿ãŒã³ã糞ããããªãããŒããšã©ãŒãããããšãåççã§ããã RFC 1445ã¯ãããã圹ç«ã€ããšãã§ããçç±ã®å€ãã®äŸãå«ãŸããŠããŸãã
ïŒ0ïŒã«ã€ããŠã¯ãå€ããå°ãªããããªãã®èª¬æã«çŽåŸããŠããŸãã ãã®ã¹ããŒã ãã³ã³ãã€ã©ãŒã®ãã¿ãŒã³ãã§ãã¯ã®å®è£ ã«èªç¶ã«äŸåããè¿œå ãããããå€ãã®ç¹å¥ãªã³ãŒããåé€ããã®ã§ããã°ãç§ã¯å®å šã«æºè¶³ããŠããŸãã
ã¡ãªã¿ã«ãç§ã¯ããã§ïŒ0ïŒãä¿®æ£ããããã®PRãè¡ããŸããïŒ https ïŒ
ãã®ã¹ããŒã ãã³ã³ãã€ã©ãŒã®ãã¿ãŒã³ãã§ãã¯ã®å®è£ ã«èªç¶ã«äŸåããè¿œå ãããããå€ãã®ç¹å¥ãªã³ãŒããåé€ããã®ã§ããã°ãç§ã¯å®å šã«æºè¶³ããŠããŸãã
ããã¯ãå¥åŠãªããšã«ãããã§ã¯ãããŸããã ããããããã¯ããããããšã¬ã¬ã³ããªæ¹æ³ããªããšããããããæ¢åã®ã³ãŒãã«ãããã³ã°ããæ¹æ³ã®ã¢ãŒãã£ãã¡ã¯ãã§ãã
ãã¯ãã®å ŽåãïŒ1ïŒãããŒããšã©ãŒã«ãªããªãããã«ããã®ã䟿å©ã ãšæããŸãã
ïŒ1ïŒã¯ããã©ã«ãã§ã³ã³ãã€ã«ããå¿ èŠããããšæããŸããããããšåãlintããèŠåãåºããŸãã
fn a() -> u32 {
return 4;
5
}
warning: unreachable expression, #[warn(unreachable_code)] on by default
ç§ãã¡ãããã«åãçµãã§ããéã !
çŽé¢ããŠããã€ãã®ãã¿ãŒã³ãåé§ã§ããªãããã«ããããšã¯çã«ããªã£ãŠããŸããïŒ
let res: Result<u32, !> = ...;
let Ok(value) = res;
ç¶²çŸ çã§ã¯ãªããã®ããšã©ãŒãšäžèŽãããããšã«åæããŸãããå°éäžèœãã€ãŸãåé·ãªãã¿ãŒã³ã¯èŠåã ããçã«ããªã£ãŠããããã§ãã
ç§ã¯è æãéããŠããéãããã€ãã®PRã座ã£ãŠããŸããã ããããã¬ãã¥ãŒããããã«ç§ã«ã§ããããšã¯ãããŸããïŒ ãããããããã«ã€ããŠããã€ãã®è°è«ãå¿ èŠã§ãã ïŒ36476ãïŒ36449ãïŒ36489ã«ã€ããŠè©±ããŠããŸãã
çºæ£åïŒãŸãã¯åçè«ã§ã¯ãããã ãåïŒã¯ç©ºã®enum
åïŒãŸãã¯åçè«ã§ã¯ããŒããåïŒãšåãã§ãããšèããããšã«å察ããŸãã ãããã¯ç°ãªãã¯ãªãŒãã£ãŒã§ãããã©ã¡ããå€ãã€ã³ã¹ã¿ã³ã¹ãæã€ããšã¯ã§ããŸããã
ç§ã®æèŠã§ã¯ãããã åã¯ãªã¿ãŒã³åãè¡šãã³ã³ããã¹ãã§ã®ã¿è¡šç€ºã§ããŸãã äŸãã°ã
fn(A,B)->!
fn(A,fn(B,C)->!)->!
ããããããªãã¯èšãã¹ãã§ã¯ãããŸãã
let g:! = panic!("whatever");
ãŸã
fn(x:!) -> !{
x
}
ãããã¯
type ID=fn(!)->!;
å€æ°ã®ã¿ã€ãã!
ã§ãã£ãŠã¯ãªããªããããå
¥åå€æ°ã®ã¿ã€ãã!
ãã£ãŠã¯ãªããŸããã
ãã®å Žåã空ã®enum
ã¯ç°ãªããŸãããšèšãããšãã§ããŸã
enum Empty {}
impl Empty {
fn new() -> Empty {
panic!("empty");
}
}
ãããã
match Empty::new() {}
ã€ãŸãã !
ãšEmpty
éã«ã¯æ ¹æ¬çãªéãããããŸããã€ãŸããå€æ°ã!
åãšããŠå®£èšããããšã¯ã§ããŸãããã Empty
ã«å¯ŸããŠã¯å®£èšã§ããŸãã ã
@earthengine 2çš®é¡ã®äœããªãã¿ã€ãã®éã«ãã®ïŒç§ã®ç®ã«ã¯å®å šã«äººå·¥çãªïŒåºå¥ãå°å ¥ããããšã®å©ç¹ã¯äœã§ããïŒ
ãã®ãããªåºå¥ããªãçç±ã¯æ°å€ããããŸããããšãã°ã Result<!, E>
ãèšè¿°ã§ããããšããããçºæ£é¢æ°ãšããŸãçžäºäœçšããäžæ¹ã§ã Result
ã¢ããã£ãã¯æŒç®ã䜿çšã§ããããšãªã©ã§ãã map
ãmap_err
ã
é¢æ°åããã°ã©ãã³ã°ã§ã¯ã空ã®åïŒ zero
ïŒã¯ãé¢æ°ãè¿ãããªãããŸãã¯å€ãååšããªããšããäºå®ããšã³ã³ãŒãããããã«é »ç¹ã«äœ¿çšãããŸãã bottom
åãšèšããšããããªããåç
§ããŠããåçè«ã®æŠå¿µã¯ç§ã«ã¯ããããŸããã éåžžã bottom
ã¯ããã¹ãŠã®ã¿ã€ãã®ãµãã¿ã€ãã§ããã¿ã€ãã®ååã§ããããã®æå³ã§bottom
ãRustã§ã¯!
ã空ã®åæåãbottom
ã§ã¯ãããŸããã ããããç¹°ãè¿ãã«ãªããŸããã zero
ãbottom
åã§ã¯ãªãããšã¯ãåçè«ã§ã¯çããããšã§ã¯ãããŸããã
ã€ãŸãã
!
ãšEmpty
éã«ã¯æ ¹æ¬çãªéãããããŸããã€ãŸããå€æ°ã!
åãšããŠå®£èšããããšã¯ã§ããŸããããEmpty
ã«å¯ŸããŠã¯å®£èšã§ããŸãã ã
ããããã®RFCãä¿®æ£ããŠããããšã§ãã !
ã¯ãã¿ã€ãã®ããã«äœ¿çšã§ããªãå Žåãå®éã«ã¯ãã¿ã€ããã§ã¯ãããŸããã
@RalfJung
ãããã®æŠå¿µã¯ç·åœ¢è«çããã®ãã®ã§ãhttps://en.wikipedia.org/wiki/Linear_logic
ãã®æçš¿ã®åã®ããã¹ãã«ããã€ãã®ééããããã®ã§ãç§ã¯ããããåé€ããŸããã ç§ããããæ£ããç解ãããããããæŽæ°ããŸãã
top
ã¯ãä»»æã®æ¹æ³ã§äœ¿çšã§ããå€ã§ãã
ããã¯ãµãã¿ã€ãã³ã°ã§ã©ãããæå³ã§ããïŒ ããã¯ã©ããªã¿ã€ãã«ããªãåŸããšããããšã§ããïŒ ããã¯bottom
ã ããã§ãã
@eddybç§ã¯ããã€ãã®ééããç¯ããŸãããç§ã®æ°ããæŽæ°ãåŸ ã£ãŠãã ããã
ãã®PRïŒ 1æ¥ã§ããŒãžãããŸããïŒã¯ã1ãæ以äžã¬ãã¥ãŒãããŠããç§ã®ãã¿ãŒã³ãããã³ã°PRãšããªãã²ã©ãççŸããŠããŸãã ç³ãèš³ãããŸããããæåã®ãã¿ãŒã³ãããã³ã°PR以éã®2çªç®ã®ãã¿ãŒã³ãããã³ã°PRã¯ããŒãžäžèœã«ãªãã2ãæéã¬ãã¥ãŒãããåŸã«æžãçŽãå¿ èŠããããŸããã
ffsã¿ããª
@canndrew argh ãããããªããã =ïŒç§ãä»æ¥ããªãã®PRãr +ããããšãèšç»ããŠããŸãã...
ç³ãèš³ãããŸããããç§ã¯æ³£ãèšãèšããããããŸããããããã¯ãã©ãŒãåŒããã£ãŠããŸãã ç§ã¯äžåºŠã«è€æ°ã®PRãç¶æããããšããã®ããããããä»ã§ã¯9æãããã®1ã€ã®å€æŽãååŸããããšããŠããŸãã åé¡ã®äžéšã¯ã¿ã€ã ãŸãŒã³ã®éãã ãšæããŸã-ç§ããããã«ããéãããªãã¯ãã¹ãŠãªã³ã©ã€ã³ã§ããããããã®ããšã«ã€ããŠãã£ããããã®ã¯é£ããã§ãã
äŸå€ã¯åã·ã¹ãã ã®è«ççã§å¿ èŠãªç©Žã§ããããšãèãããšã誰ããããããïŒã§ããæ£åŒã«åŠçããæ¹åã«é²ãããšãçå£ã«èããŠããã®ã§ã¯ãªãããšæããŸããã
äŸãšåç §ãã€ã³ããšããŠhttps://is.gd/4EC1Dkã䜿çšããŠããããè¶ ããå Žåã¯ã©ããªããŸããã
1ïŒãããã¯ã«ãªãå¯èœæ§ããããããšã©ãŒãçµæãè¿ããªãé¢æ°ãåŠçããŸããåã·ã°ããã£ãæé»çã«-> Foo
ãã-> Result<Foo,!>
2) any
çµætypes would have their Error types implicitly be converted to
åæåAnonMyErrWrapper {DieïŒïŒïŒãError} `` `
3ïŒä»¥æ¥ïŒ ã¯ãŒããµã€ãºã®åºåã§ãããå±
äœäžå¯èœã§ããã¿ã€ãéã®å€æã«ãããã³ã¹ãã¯ãŒãã§ãããäžäœäºææ§ãæãããããã«æé»çãªå€æãè¿œå ã§ããŸãã
ãã¡ãããäŸå€ãåã·ã¹ãã ã«å¹æçã«ãªããããããããã«ã€ããŠæšè«ããããéçåæãå®è¡ãããã§ãããšããå©ç¹ããããŸãã
ããã¯ãæè¡çãªèŠ³ç¹ããã§ã¯ãªããŠããã³ãã¥ããã£ã®èŠ³ç¹ããã¯éèŠãªããšã ãšæããŸãã :)
ãŸããããã¯ããããå°æ¥ã®ãšãã§ã¯ãã·ã¹ãã ãšéè€ããŸãã
@tupshinããã¯ãå°ãªããšãå€ãã®äœæããªããã°ãç»æçãªå€åã§ãã ãããããããããå Žåã¯ãå·»ãæ»ããç¡å¹ã«ããŠãçµæããæåã§äœ¿çšããããšããå§ãããŸãã [ãšããã§ããã®åé¡ã¯å®éã«ã¯ãã®ãããªããšãæèµ·ããå Žæã§ã¯ãããŸãã--- !
ã®ãã¶ã€ã³ã¯ããªããçåèŠããŠãããã®ã§ã¯ãªãã®ã§ãããã¯çŽç²ã«å°æ¥ã®äœæ¥ã§ãã]
ç§ã¯ãå°ãªããšãéèŠãªäœæããªããã°ããããã©ãã»ã©å£ããã ãããããããŠãããå®å šã«å°æ¥ã®ä»äºã§ããããšã«ã€ããŠã®å ¬æ£ãªç¹ãç解ããŠããŸãã ãããŠãã¯ããç§ã¯èšç»ãããŠããããšã«éåžžã«æºè¶³ããŠããŸãïŒ ãããŸã§ã®ãšããããããè¡ãéãã :)
@nikomatsakisä¿çäžã®åé¡ã«é¢ããŠãããã2ã€ã¯ãã§ãã¯ããããšãã§ããŸã
- ïŒ35162ããã®ã³ãŒãã®ã¯ãªãŒã³ã¢ãããexpr_tyãåŒã³åºã代ããã«ãæ»ãäœçœ®ãä»ããŠtypeckãã¹ã¬ããã¿ã€ãã«å°ãåç·šæããŸã
- è©Šåã§ã®ç¡äººã¿ã€ãã®æ±ãã解決ãã
ç§ã¯ããã§å¥ã®äºè£ãå§ããã€ããã§ãïŒ
- ïŒïŒã«äŸåããŠãã人ã ã«èŠåãå®è£ ããæ¹æ³ïŒãã®åäœãå°æ¥å€æŽãããå¯èœæ§ããããã¬ã€ããã©ãŒã«ããã¯ïŒ
TyTuple
ã«ãã©ã°ãè¿œå ããŠãçºæ£åå€æ°ãããã©ã«ãã§äœæããããšã瀺ããç¹æ§éžæã§ãã®ãã©ã°ã確èªããããšãèšç»ããŠããŸãã
@canndrew
TyTupleã«ãã©ã°ãè¿œå ããŠãçºæ£åå€æ°ãããã©ã«ãã§äœæããããšã瀺ããç¹æ§éžæã§ãã®ãã©ã°ã確èªããããšãèšç»ããŠããŸãã
OKããããïŒ
ãŸããå€åçŽ æŽãããã =ïŒãã®ããã«ç°ãªã2ã€ã®æå³çã«åçã®ã¿ã€ãïŒ ()
ãš()
ïŒãããã®ã¯å°ãè€éã«èãããŸããããã以äžã®æ¹æ³ã¯èããããŸããã =ïŒãããŠããªãŒãžã§ã³ã®ãããã§ããšã«ããå€ãã®ã³ãŒããæºåããå¿
èŠããããŸãã
ã€ãŸãã TyTuple
ããŒã«å€ãè¿œå ããŠãããšããããšã§ãã
TyTuple(&'tcx Slice<Ty<'tcx>>, bool),
ããã¯ããã®ïŒãŠãããïŒã¿ãã«ã§ç¹å®ã®ç¹æ§ãéžæããããšããå Žåã«èŠåãçºããå¿
èŠãããããšã瀺ããŠããŸãã ããã¯ãå¥ã®TyDefaultedUnit
ãè¿œå ãããšããç§ã®å
ã®ã¢ãããŒããããå®å
šã§ãã
ããŸãããã°ã1ã€ã®èŠåãµã€ã¯ã«ã®éã ããã®boolãç¶æããå¿ èŠããããŸãã
uninitialized
/ transmute
/ MaybeUninitialized
åé¡ã«é¢ããŠãè³¢æãªè¡åæ¹éã¯æ¬¡ã®ããã«ãªããšæããŸãã
mem
äžã®æšæºã©ã€ãã©ãªã«MaybeUninitialized
ãè¿œå ããŸãuninitialized
ããã®ã¿ã€ãã«äººãäœãã§ããããšãããã£ãŠããããšã確èªãããã§ãã¯ãè¿œå ããŸãã ãã以å€ã®å Žåã¯ãããã¯å°æ¥çã«ããŒããšã©ãŒã«ãªããšããã¡ã¢ãä»ããŠèŠåãçºããŸãã 代ããã«MaybeUninitialized
ã䜿çšããããšããå§ãããŸããtransmute
ããtoãã¿ã€ããç¡äººã§ããããfromãã¿ã€ããç¡äººã§ããããšã確èªãããã§ãã¯ãè¿œå ããŸãã åæ§ã«ãããŒããšã©ãŒã«ãªãèŠåãçºããŸããèãïŒ
ç¶²çŸ æ§ã«å¯Ÿããæè¿ã®å€æŽã«ã€ããŠã¯ã次ã®ã¹ã¬ãããåç §ããŠãã ããã
&!
ã®ã»ãã³ãã£ã¯ã¹ã«ã€ããŠã¯æèŠã®çžéãããããã§ãã ïŒ39151以éã never_type
æ©èœã²ãŒããæå¹ã«ãããšããããã§ã¯ç¡äººãšããŠæ±ãããŸãã
!
èªåãã¬ã€ãå®è£
ããªãå Žåã¯ãå°ãªããšãstd
ããé©åãªãã¬ã€ããå®è£
ãããšéåžžã«åœ¹ç«ã¡ãŸãã void::Void
倧ããªå¶éã®1ã€ã¯ã std
å€éšã«ååšããããšã§ããã€ãŸããå
æ¬çimpl<T> From<Void> for T
ã¯äžå¯èœã§ããããšã©ãŒåŠçãå¶éãããŸãã
å°ãªããšãFrom<!>
ã¯ãã¹ãŠã®ã¿ã€ãã«å®è£
ããå¿
èŠãããã Error
ã Display
ã Debug
ã¯!
å®è£
ããå¿
èŠããããšæããŸãã
å°ãªããšã
From<!>
ã¯ãã¹ãŠã®ã¿ã€ãã«å®è£ ããå¿ èŠããããšæããŸã
æ®å¿µãªãããããã¯From<T> for T
implãšç«¶åããŸãã
æ®å¿µãªãããããã¯
From<T> for T
implãšç«¶åããŸãã
å°ãªããšããlatticeimplã®ç¹æ®åãå®è£ ããããŸã§ã¯ã
è¯ãç¹ã ãã€ããããæãéããããããšãé¡ã£ãŠããŸãã
[T; 0]
ãµãã¿ã€ãã¯[!; 0]
ã &[T]
ãµãã¿ã€ãã¯&[!]
ãŸããïŒ çãã¯ãã¯ããã§ããã¹ãã ãšç§ã«ã¯çŽæçã«æããŸãããçŸåšã®å®è£
ã§ã¯ããã§ã¯ãªããšèããŠããŸãã
[!; 0]
ã¯äººãäœãã§ããŠã &[!]
ãäœãã§ããã®ã§ãç§ã¯ããŒãšèšããŸãã ãŸããä»åã¯ãµãã¿ã€ãã³ã°ã䜿çšããŠããŸããã
[!; 0]
ãš&[!]
äž¡æ¹ã«ç¡äººã§ãã£ãŠã¯ãªããŸãããã©ã¡ãã®ã¿ã€ãããå€[]
ïŒãŸãã¯&[]
ïŒãåãå
¥ããããšãã§ããŸãã
誰ã圌ããç¡äººã§ããããŸãã¯ç¡äººã§ããã¹ãã ãšã¯èšããŸããã§ããã
let _: u32 = unsafe { mem::transmute(return) };
ååãšããŠããã¯åé¡ãããŸããããã³ã³ãã€ã©ã¯ã0ããããš32ãããã®éã§å€æããããšæå¥ãèšããŸãã
ãã ãã !
-> ()
å€æã¯èš±å¯ãããŠããŸãã ãããææããç¹å¥ãªçç±ã¯ãããŸããã ããã¯ççŸã§ãããç§ã¯ããã«é¢ããå®éçãŸãã¯çè«çãªåé¡ãèããããšãã§ããŸããã
ç§ã¯ãµãã¿ã€ãã³ã°ãæåŸ ãããã³ã³ãã€ã©ãŒã®ããããçš®é¡ã®ããžãã¯ãè€éã«ããããšãé¿ãããšããçç±ã§ããã«å察ããŸãã åºæ¬çã«ããªãŒãžã§ã³ããªãŒãžã§ã³ãã€ã³ãã£ã³ã°ã«é¢ä¿ã®ãªããµãã¿ã€ãã¯å¿ èŠãããŸããã
ãããå®çŸããããšãå¯èœã§ããFn
ã FnMut
ãšFnOnce
ããããã«!
ãããã¯ãã¹ãŠã®å
¥åããã³åºåã®çš®é¡ãè¶
ãããžã§ããªãã¯ã§ãããããªæ¹æ³ã§ïŒ
ç§ã®å Žåããã«ãæã«åŒã³åºãããé¢æ°ãåãåãããšãã§ããæ±çšãã«ããŒããããŸãã
struct Builder<F: FnOnce(Input) -> Output> {
func: Option<F>,
}
func
ã¯Option
ã§ããããã None
ã䜿çšããã³ã³ã¹ãã©ã¯ã¿ãŒã¯ã F
åãæšæž¬ã§ããŸããã ãããã£ãŠã fn new
å®è£
ã§ã¯Bangã䜿çšããå¿
èŠããããŸãã
impl Builder<!> {
pub fn new() -> Builder<!> {
Builder {
func: None,
}
}
}
ãã«ããŒã®func
é¢æ°ã¯ã Builder<!>
ãšBuilder<F>
äž¡æ¹ã§åŒã³åºãããããã«ãªããŸãã
impl<F: FnOnce(Input) -> Output> Builder<F> {
pub fn func<F2: FnOnce(Input) -> Output>(self, func: F) -> Builder<F2> {
Builder {
func: func,
}
}
}
ããã§åé¡ïŒçŸåšã Fn*
ãã¬ã€ãã¯!
å®è£
ãããŠããŸããã ãŸããããªãã¯ç¹æ§ã®ããã®äžè¬çãªé¢é£ä»ããããŠããåãïŒäŸãã°æã€ããšãã§ããŸããOutput
ã§Fn
ïŒã ããã§ãã !
ã®Fn*
ãã¬ã€ããã¡ããªãŒãããã¹ãŠã®å
¥åã¿ã€ããšåºåã¿ã€ãã§äžè¬çãªæ¹æ³ã§å®è£
ããããšã¯å¯èœã§ããïŒ
ããã¯ççŸããŠããããã«èãããŸãã <! as Fn>::Output
åäžã®ã¿ã€ãã«è§£æ±ºããå¿
èŠã¯ãããŸãããïŒ
<! as Fn>::Output
ã¯!
ã§ãããïŒ
çè«çã«ã¯<! as Fn>::Output
ã¯!
ã§ããå¿
èŠããããŸãããçŸåšã®ã¿ã€ããã§ãã«ãŒã¯é¢é£ããã¿ã€ããå®å
šã«äžèŽããããšãæãã§ããŸãïŒ https ïŒ
@SimonSapinåäžã®ã¿ã€ãã«è§£æ±ºããå¿
èŠãããã®ã§ãç§ã¯è³ªåãããŸãã èšèªã®èŠ³ç¹ããã¯ãããã¯å®å
šã«æ£ããæ¯ãèãã§ãã ããããã©ã€ãã©ãªã®èŠ³ç¹ããã¯ãçŸåšã®åäœãç¶æãããŠããå Žåããžã§ããªãã¯é¢æ°ã®ã³ã³ããã¹ãã§ã®!
ã®äœ¿çšã¯éåžžã«å¶éãããŸãã
次ã®ã³ãŒããå¿ èŠã§ã
#![feature(never_type)]
fn with_print<T>(i:i32, r:T) -> T {
println!("{}", i);
r
}
fn main() {
#[allow(unreachable_code)]
*with_print(10,&return)
}
10
ãŸããïŒ çŸåšãäœãå°å·ãããŸããã ãŸãã¯ãå°å·ãŸã§return
ãé
ãããä»ã®åé¿çã¯ãããŸããïŒ
ã€ãŸããåã«èšã£ãããã«ãå®éã«ã¯2çš®é¡ã®!
ã¿ã€ãããããŸãã1ã€ã¯æ æ°ã§ããã1ã€ã¯ç±å¿ã§ãã éåžžã®è¡šèšã¯ç±å¿ãªè¡šèšã瀺ããŸãããæ æ°ãªè¡šèšãå¿
èŠã«ãªãå ŽåããããŸãã
@RalfJungã¯&return
ã䜿çšãã以åã®ããŒãžã§ã³ã«é¢å¿ãããã®ã§ãã³ãŒããå床調æŽããŸããã ç¹°ãè¿ãã«ãªããŸãããç§ã®ãã€ã³ãã¯ãåŸã§return
ãé
ãããããšãã§ããã¯ãã ãšããããšã§ãã ããã§ã¯ã¯ããŒãžã£ã䜿çšã§ããŸããã䜿çšã§ããã®ã¯return
ã break
ãcontinue
ãªã©ã¯äœ¿çšã§ããŸããã
ããšãã°ãç§ãã¡ãæžãããšãã§ããã°ããã§ããã
#![feature(never_type)]
fn with_print<T>(i:i32, r:T) -> T {
println!("{}", i);
r
}
fn main() {
for i in 1..10 {
if i==5 { with_print(i, /* delay */break) }
with_print(i, i);
}
}
5
ãå°å·ããããŸã§äŒæ©ãé
ããŸãã
@earthengineããã-ããã¯ééããªãäœãå°å·ããªãã¯ãã§ãã !
ã¯ç¡äººã§ããã€ãŸããã¿ã€ã!
ã®å€ã¯äœæã§ããŸããã ãããã£ãŠãã¿ã€ã!
å€ãžã®åç
§ãããå Žåã¯ããããã³ãŒããããã¯ã®å
éšã«ããŸãã
return
ã¿ã€ãã!
ããçç±ã¯ãåå²ããŠããããã§ãã return
ããçµäºãããªãããã return
åŒã®çµæã䜿çšããã³ãŒããå®è¡ããããšã¯ã§ããŸããã
oO &return
æžãããšã¯ç¥ããŸããreturn
ã®ã¢ãã¬ã¹ãåãããšãèš±å¯ãããã¹ãã§ããïŒ^^
ãã ãããšã«ãããã³ãŒãå
ã®@earthengineã§ã¯ã quit_with_print
ãåŒã³åºãããåã«åŒæ°ãè©äŸ¡ãããŸãã 2çªç®ã®åŒæ°ãè©äŸ¡ãããšã return
ãå®è¡ãããããã°ã©ã ãçµäºããŸãã ããã¯ã foo({ return; 2 })
ãããªãã®ãæžããããªãã®ã§ã- foo
ã¯æ±ºããŠå®è¡ãããŸããã
@RalfJung return
ã¯ã break
ãcontinue
ãšåãããã«ãã¿ã€ã!
ã®åŒã§ãã ã¿ã€ãã¯ãããŸããããã®ã¿ã€ãã¯ç¡äººã§ãã
!
ãå®è£
ããã1幎éæ¯æ©çšŒåããŠããŸãã ãããå®å®åã«åããŠåããããã«äœãããå¿
èŠãããã®ãââç¥ãããã®ã§ããã
解決ãããŠããªãããšã®1ã€ã¯ã !
è¿ãããšãã§ããçµã¿èŸŒã¿é¢æ°ïŒã€ãŸãã uninitialized
ã ptr::read
ãããã³transmute
ïŒãã©ããããã§ãã uninitialized
ãæåŸã«ã MaybeUninit
ã¿ã€ããšå°æ¥ã®å¯èœæ§ã®ãã&in
ã &out
ã &uninit
ãåªå
ããŠéæšå¥šã«ããå¿
èŠããããšããã³ã³ã»ã³ãµã¹ããããšèããŸããã Inhabited
ãã¬ã€ããå®è£
ããªãã¿ã€ãã®ããã ãã«uninitialized
éæšå¥šã«ããããšãææ¡ãã以åã®RFCããããŸãã ãããããRFCãå»æ£ããŠããéæšå¥šã®uninitialized
ãããã³ãadd MaybeUninit
ãã®RFCã«çœ®ãæããå¿
èŠããããŸããïŒ
ptr::read
å ŽåãUBã®ãŸãŸã«ããŠããã®ã¯åé¡ãªããšæããŸãã 誰ããptr::read
ã«é»è©±ãããããšã圌ãã¯èªãã§ããããŒã¿ãæå¹ã§ãããšäž»åŒµããŠããŸããã !
å Žåã¯ééããªãããã§ã¯ãããŸããã ãã¶ã誰ããããã«ã€ããŠãã£ãšåŸ®åŠãªæèŠãæã£ãŠããŸããïŒ
transmute
ä¿®æ£ã¯ç°¡åã§ã-ïŒçŸåšã®ããã«ICEingãã代ããã«ïŒç¡äººã¿ã€ãã«å€æããã®ããšã©ãŒã«ããã ãã§ãã ãããä¿®æ£ããããã®PRããããŸããã
ã§ã¯ãçŸæç¹ã§ãããã¯ã©ãã«ããã®ã§ããããã ïŒ/ cc @nikomatsakisïŒïŒ uninitialized
ãå»æ¢ãã MaybeUninit
ã¿ã€ããè¿œå ããŠãå
ã«é²ãæºåã¯ã§ããŠããŸããïŒ !
ã§åŒã³åºããããšãã«ãããã®çµã¿èŸŒã¿é¢æ°ããããã¯ã«ããå Žåãããã¯!
ãå®å®ãããã®ã«é©ããäžæçãªå¯Ÿçã§ããããïŒ
ãªã¹ããããŠããä¿çäžã®åé¡ããããŸãïŒ
!
ã«å¯ŸããŠã©ã®ãããªç¹æ§ãå®è£ ããå¿ èŠããããŸããïŒ æåã®PRïŒ35162ã«ã¯ãOrd
ãšãã®ä»ã®ããã€ããå«ãŸããŠããŸãã ããã¯ããããT-libsã®åé¡ã§ããããããã®ã¿ã°ãåé¡ã«è¿œå ããŸãã
çŸåšãããªãåºæ¬çãªéžæè¢ããããŸãïŒ PartialEq
ã Eq
ã PartialOrd
ã Ord
ã Debug
ã Display
ã Error
ã ééããªããã®ãªã¹ãã«è¿œå ããå¿
èŠãããClone
以å€ã«ãéåžžã«éèŠãªãã®ã¯ä»ã«ãããŸããã ããã§å®å®åããããã¯ããå¿
èŠããããŸããïŒ é©åãšæãããå Žåã¯ãåŸã§implãè¿œå ããããšãã§ããŸãã
(): Trait
ãã©ãŒã«ããã¯ã«äŸåããŠãã人ã ã«å¯ŸããŠããã®åäœãå°æ¥å€æŽãããå¯èœæ§ãããå Žåã«èŠåãå®è£ ããã«ã¯ã©ãããã°ããã§ããïŒ
resolve_trait_on_defaulted_unit
èŠåãå®è£
ããããã§ã«å®å®ããŠããŸãã
匷å¶ã«ããã
!
ã«å¿ èŠãªã»ãã³ãã£ã¯ã¹ïŒïŒ40800ïŒ
ã©ã®åå€æ°ã!
ãã©ãŒã«ããã¯ããå¿ èŠããããïŒïŒ40801ïŒ
ãããã¯æ¬åœã®ãããã«ãŒã®ããã§ãã @nikomatsakis ïŒå®è£ ãããã®ãåŸ ã£ãŠãããããã«ã€ããŠäœããã¹ããã«ã€ããŠå ·äœçãªã¢ã€ãã¢ã¯ãããŸããïŒ
!
ãSync
ãšSend
ãå®è£
ããããšã¯æå³ããããŸããïŒ ãšã©ãŒã¿ã€ãã«Sync
ããã³/ãŸãã¯Send
å¢çãããå Žåãããã€ãããã !
ãã倱æã§ããªãããšããŠäœ¿çšãããšäŸ¿å©ã§ãã
@canndrewå®å
šã§ãªãã³ãŒãã§ãããçŠæ¢ããããšã«åæããŸããã unreachable
ã¯ã¬ãŒãã¯ããã©ã³ã¹ãã¥ãŒãã䜿çšããŠç¡äººã¿ã€ããäœæãããããã³ãŒãã®ç¹å®ã®ãã©ã³ããçºçããªãããã«ãªããã£ãã€ã¶ãŒã«ãã³ããäžããŸãã ããã¯æé©åã«åœ¹ç«ã¡ãŸãã ãããªãã¯ããã¯ãé¢çœãæ¹æ³ã§äœ¿ã£ãŠãèªåã§æšæ ãäœãã€ããã§ãã
@Kixunilããã§https://doc.rust-lang.org/beta/std/intrinsics/fn.unreachable.htmlã䜿çšããæ¹ãæ確ã§ã¯ãªãã§ããããã
@RalfJungã ããããããã¯äžå®å®ã ã ç¡äººã¿ã€ããžã®å€æãçŠæ¢ããããšã¯ãé倧ãªå€æŽã«ãªãããšãç§ã«æãåºãããŸãã
@jsgfç³ãèš³ãããŸããããã¯ãã !
ã¯ããã¹ãŠã®ããŒã«ãŒç¹æ§ïŒ Send
ã Sync
ã Copy
ã Sized
ïŒãæå³ããŸãã
@KixunilããŒããããã¯æ®å¿µã§ãã ãã ãã unreachable
çµã¿èŸŒã¿ãå®å®ãããæ¹ãã¯ããã«åªããŠããŸãã
å®å®åãããã«ãŒã§ã¯ãããŸãããïŒã»ãã³ãã£ã¯ã¹ã§ã¯ãªãperfã§ããããïŒã Result<T, !>
ã¯åæåã¬ã€ã¢ãŠããŸãã¯äžèŽcodegenã§!
ã®ç¡äººã䜿çšããŠããªãããã§ãïŒ https ïŒ
ããã¯éåžžã«æŒ ç¶ãšããèããªã®ã§ãããã«ãããããããšçœªæªæãèŠããŸããã次ã®ããã«ãªããŸãã
ãã§ãŒã¯ã¯ã !: Trait
å®è£
ã«é¢ããé£ãã質åã®ããã€ãã«çããã®ã«åœ¹ç«ã€å¯èœæ§ããããŸããïŒ
@ExpHPããã¯æããŸããã ã¿ã€ã/å®æ°ãé¢é£ä»ããããŠããããééçã¡ãœããã®ã¿ãé©åã§ããããšãããã£ãŠãããã¬ã€ãã«å¯ŸããŠã !: Trait
ãèªåå®è£
ããŸãã ããã¯ç§ãã¡ãããããããããã©ããã®åé¡ã§ãã ã³ã³ãã€ã©ã¯é¢é£ããå/å®æ°ã«ä»»æã®å€ãæ¿å
¥ããç¬èªã®ä»»æã®éçã¡ãœããimplãçºæããå¿
èŠããããããä»ã®ç¹æ§ã®èªåå®è£
ã¯å®éã«ã¯æå³ããããŸããã
rustcã«ã¯ãã§ã«resolve-trait-on-defaulted-unit
ãªã³ãããããŸãã 察å¿ããé
ç®ã«ãã§ãã¯ããŒã¯ãä»ããå¿
èŠããããŸããïŒ
@canndrewé¢é£ä»ããããã¿ã€ãã!
ã«èšå®ããã®ã¯äžå¥å
šã§ããïŒ
@taralxäžå¥å šã§ã¯ãããŸããããæå¹ãªã³ãŒããæ©èœããªããªããŸãã 次ã®ã³ãŒããä»æ¥ã³ã³ãã€ã«ãããããšã«æ³šæããŠãã ããã
trait Foo {
type Bar;
fn make_bar() -> Self::Bar;
}
impl Foo for ! {
type Bar = (i32, bool);
fn make_bar() -> Self::Bar { (42, true) }
}
@lfairy ãæå¹ãªãã³ãŒããšã¯äœãã«ã€ããŠã®ããªãã®æèŠã«äŸåããŸãã ç§ã«ãšã£ãŠã¯ã !
ããäœãååŸã§ããªãã¯ããªã®ã§ãæå®ããã³ãŒãããç¡å¹ãã§ããããšãåãã§åãå
¥ããŸãã
@earthengineããªãã!
ãããäœããåŸããããšãã§ãããã©ããã¯ããããšã¯äœã®é¢ä¿ããããŸããã
!
ã¿ã€ãããäœãååŸã§ããªãã¯ãã®çç±ã¯ãããŸããã ãã ãã !
ããã¯äœãååŸã§ããŸããããã®ãããããã°ã©ããŒã«æ±ºå®ã匷å¶ããããšãªãã !
ééçã¡ãœãããå°åºã§ããŸãã
èŠããããã«ãŒã«ã¯ãæå¹ãªå®è£
ã1ã€ã ããããã¬ã€ããå®è£
ããããšã ãšæããŸãïŒã¹ã³ãŒãå
ã®!
ãããå€ãã®çžéãè¿œå ãããã®ãé€ãïŒã
ç§ãã¡ã䜿çšãããã®ã¯ãã¹ãŠããããšåçããã以äžã«ä¿å®çã§ããå¿ èŠããããŸãïŒèªåå®è£ ãé©åããŸããïŒã
@ Ericson2314ãããäœãæå³ããã®ãããããŸããããããã€ãäŸãæããŠ
@SimonSapin ããã以äžçºæ£ããªããã«ãŒã«ã¯ã panic!()
ãŸãã¯loop { }
ããªãããšãæå³ããŸããããã§ã«ã¹ã³ãŒãå
ã«ããv: !
ã¯åé¡ãããŸããã ãã®ãããªè¡šçŸãé€å€ãããŠãããããå€ãã®ç¹æ§ã«ã¯ãïŒã®å¯èœãªå®è£
ã1ã€ãããããŸããã ãã®ã¿ã€ããã§ãã¯ã ïŒä»ã®äººã¯ã1ã€ã®implãé€ããã¹ãŠãé€å€ããéå
¬åŒã®å¥çŽãçµãã§ããå¯èœæ§ããããŸãããããããèªåçã«åŠçããããšã¯ã§ããŸãããïŒ
// two implementations: constant functions returning true and false.
// And infinitely more with side effects taken into account.
trait Foo { fn() -> bool }
// Exactly one implementation because the body is unreachable no matter what.
trait Bar { fn(Self) -> Self }
æ°åŠçã«èšãã°ã !
ã¯ãåæèŠçŽ ãã§ããã€ãŸããåŒæ°ã«!
ãå«ãŸããåã·ã°ããã£ã®å Žåãå®è£
ã¯1ã€ã ãã§ããã€ãŸãããã¹ãŠã®å®è£
ãçããå Žåã§ããå€ããèŠãã ããã¯ããã¹ãŠãåŒã³åºãããšãã§ããªãããã§ãã
ãããå®å®åããã®ãå®éã«åŠšããŠããã®ã¯äœã§ããïŒ ããã¯mem::uninitialized
ç¶æ³ã ãã§ããããããšãä»ã®äœãã§ããïŒ
@ arielb1 ïŒïŒ40800ãšïŒ40801ãããã ãšæããŸãã ãããã®ã¹ããŒã¿ã¹ãç¥ã£ãŠããŸããïŒ
ããã«ã€ããŠã©ã®ãããªããã¥ã¡ã³ããæžãããŠããŸããããããšã人ã ã¯ããã®ããã«æžãããšãèšç»ããŠããŸããïŒ std docsïŒïŒ43529ãïŒ43560ïŒã®ããªããã£ãåããŒãžã«æè¿è¿œå ãããã®ã§ãïŒ ããã«ããŒãžãååŸããŸããïŒ ãŸã æŽæ°ãããŠããªãå Žåã¯ãåç §ãæŽæ°ãããã¯ãã§ãã
asmãçºæ£ããŠããããšãæå®ããŠã次ã®ãããªãã®ãèšè¿°ã§ããããã«ããèšç»ã¯ãããŸããïŒ
#[naked]
unsafe fn error() -> !{
asm!("hlt");
}
ã¿ã€ããã§ãã«ãŒããªã ããããã«loop{}
ã䜿çšããå¿
èŠ
ç·šéïŒ core::intrinsics::unreachable
ã¯ãéåžžã«äœã¬ãã«ã®ã³ãŒãã§ã¯èš±å®¹ã§ãããšæããŸããã
@ Eroc33 !
ãã¿ã€ãã®å Žåã次ã®ããã«å®è¡ã§ããŸãã
#[naked]
unsafe fn error() -> ! {
asm!("hlt");
std::mem::uninitialized()
}
ãããŸã§ã¯ã次ã®ããšãã§ããŸãã
#[naked]
unsafe fn error() -> ! {
asm!("hlt");
enum Never {}
let never: Never = std::mem::uninitialized();
match never {}
}
@Kixunil !
ã¯ã asm!
ã䜿çšããå¿
èŠãããå€éã®ã¿ã€ãã§ãã ããã¯éåžžã次ã®ããã«è¡ãããŸãã
#[naked]
unsafe fn error() -> ! {
asm!("hlt");
std::intrinsics::unreachable();
}
@Kixunil std::intrinics::unreachable()
ã䜿çšãããšãããç°¡åã«å®è¡ã§ããŸããããã¯ãåã®ã³ãŒããçºæ£ããŠããããšãæ£ç¢ºã«æå®ããŸãã
@Kixuniläžèšã®è°è«ããã std::mem::uninitialized
ã!
ãè¿ãããšãã§ãããã©ããã¯ãå€æŽãããå¯èœæ§ããããŸããïŒ ç§ãããã誀解ããŠããªãéãïŒ
äžèšã®è°è«ããã
std::mem::uninitialized
ã!
ãè¿ãããšãã§ãããã©ããã¯ãå€æŽãããå¯èœæ§ããããŸããïŒ ç§ãããã誀解ããŠããªãéãïŒ
uninitialized
ã¯æçµçã«å®å
šã«éæšå¥šã«ãªããã¹ãããã®ã£ãããšããŠã !
ãšäžç·ã«äœ¿çšãããšãå®è¡æã«ãããã¯ã«é¥ããšæããŸãïŒãã ãããã®å Žåã¯åœ±é¿ããŸããïŒã
ãŸããlibcoreã®ã©ããã§std::intrinsics::unreachable
ãå®å®ããã unchecked_unreachable
ãªã©ã®ååãä»ããŠunreachable!
ãã¯ããšåºå¥ããå¿
èŠããããšæããŸãã ç§ã¯ãã®ããã®RFCãæžãã€ããã§ããã
@eddybãããããã asm!()
ãäžå®å®ã§ããããšãå¿ããã®ã§ã std::intrinsics::unreachable()
ã䜿çšãããå¯èœæ§ããããŸãã
@ tbu-確ãã«ãç§ã¯ç¡äººã¿ã€ããäœæããã®ã§ã¯ãªããããã匷ã奜ã¿ãŸãã åé¡ã¯ããããäžå®å®ã§ãããããã³ãŒãã®ãã©ã³ããå°éäžèœãšããŠå®å šã«ããŒã¯ããããšãã©ããããããäžå¯èœã§ããå Žåãæ¢åã®ã³ãŒããå£ãã ãã§ãªããä¿®æ£äžå¯èœã«ããããšã§ãã ãã®ãããªããšã¯Rustã®è©å€ã«æ·±å»ãªæªåœ±é¿ãäžãããšæããŸãïŒç¹ã«äž»èŠãªéçºè ããããå®å®ããŠãããšèªãããã«äž»åŒµããŠããããšãèãããšïŒã ç§ã¯Rustã倧奜ãã§ããããã®ãããªããšã§ãRustãæçšãªèšèªã§ããããšãåèããããšã«ãªããŸãã
@ Eroc33ç§ã®ç解ã§ã¯ããããè¡ãããšãææ¡ãã人ãããŸãããããã¯åãªãææ¡ã§ãããæ確ãªæ±ºå®ã§ã¯ãããŸããã ãããŠãç§ã¯ãã®ãããªææ¡ã«å察ããŸãããªããªããããã¯äžäœäºææ§ãå£ããRustã2.0ã«ããããšãäœåãªããããããã§ãã ãããè£ä»ãã害ã¯ãªããšæããŸãã 人ã ããã°ãå¿é ããŠãããªããlintãããé©åã§ãããã
@canndrew uninitialized
ãéæšå¥šã«ãªãã®ã¯ãªãã ãšæããŸããïŒ ãããªããšä¿¡ããããªãã éåžžã«äŸ¿å©ã ãšæãã®ã§ãéåžžã«è¯ã代æ¿åããªãéããããããçç±ã¯ããããŸããã
æåŸã«ã intrinsics::unreachable()
ãçŸåšã®ãããã³ã°ãããåªããŠããããšã«åæããããšãç¹°ãè¿ãè¿°ã¹ãããšæããŸãã ããã¯èšã£ãŠããååãªä»£æ¿åãèŠã€ãããŸã§ããããã®ãããã³ã°ãçŠæ¢ããããéæšå¥šã«ãããããããšã«ã¯å察ã§ãã
åæåãããŠããªããã®ã®ä»£ããã«union {ïŒãT}ã䜿çšããŸãã ããªãã¯å°éäžèœã«ãªãããšãã§ããŸã
ptr :: read :: <* constïŒ>ïŒïŒingããã³ä»ã®å€ãã®åæ§ã®æ¹æ³ã
2017幎8æ8æ¥15:58ããMartinHabovÅ¡tiakã [email protected]
æžããŸããïŒ
@eddyb https://github.com/eddybãããããããã®asmãå¿ããŸããïŒïŒïŒã¯
äžå®å®ãªã®ã§ãstd :: intrinsics :: unreachableïŒïŒã䜿çšãããå¯èœæ§ããããŸãã@ tbu- https://github.com/tbu-確ãã«ãç§ã¯ä»£ããã«ããã匷ã奜ã¿
ç¡äººã¿ã€ããäœæããŸãã åé¡ã¯ããããäžå®å®ã§ãããšããããšã§ãã
ã³ãŒãã®ãã©ã³ããå°éäžèœãšããŠå®å šã«ããŒã¯ããããšã¯ã©ããããããäžå¯èœã§ãããããã§ã¯ãããŸãã
æ¢åã®ã³ãŒããå£ãã ãã§ãªããä¿®æ£äžå¯èœã«ããŸãã ãããªããšã ãšæããŸã
Rustã®è©å€ãèããæãªãïŒç¹ã«äž»èŠãªéçºè ãèæ ®ããïŒ
å®å®ããŠãããšèªãããã«äž»åŒµããŠããŸãïŒã ç§ãRustãæããŠããéãããã®ãããªããšã¯
ãããæçšãªèšèªã§ããããšãåèãããŠãã ããã@ Eroc33 https://github.com/eroc33ç§ã®ç解ã§ã¯ãäžéšã®äººã¯
ãããè¡ãããšãææ¡ããŸãããããã¯åãªãææ¡ã§ãããæ確ãªæ±ºå®ã§ã¯ãããŸããã ãããŠç§
äžäœäºææ§ãæãªãããããããã®ãããªææ¡ã«å察ããŸãã
Rustã匷å¶çã«2.0ã«ããŸãã ãããè£ä»ãã害ã¯ãªããšæããŸãã
人ã ããã°ãå¿é ããŠãããªããlintãããé©åã§ãããã@canndrew https://github.com/canndrewãªãåæåãããŠããªããšæã
éæšå¥šã«ãªããŸããïŒ ãããªããšä¿¡ããããªãã ãšãŠã䟿å©ã ãšæããŸãã
ãããã£ãŠãéåžžã«åªãã代æ¿åãååšããªãéããçç±ã¯ããããŸããã
ãããããæåŸã«ãçµã¿èŸŒã¿é¢æ°:: unreachableïŒïŒã«åæããããšãç¹°ãè¿ãè¿°ã¹ãããšæããŸãã
çŸåšã®ããã¯ãããåªããŠããŸãã ããã¯èšã£ãŠããç§ã¯çŠããããšã«å察ããŸã
ååãªä»£æ¿åãèŠã€ãããŸã§ããããã®ããã¯ãéæšå¥šã«ããŸããâ
ãã®ã¹ã¬ããã«ãµãã¹ã¯ã©ã€ãããŠããããããããåãåã£ãŠããŸãã
ãã®ã¡ãŒã«ã«çŽæ¥è¿ä¿¡ããGitHubã§è¡šç€ºããŠãã ãã
https://github.com/rust-lang/rust/issues/35121#issuecomment-320948013 ã
ãŸãã¯ã¹ã¬ããããã¥ãŒãããŸã
https://github.com/notifications/unsubscribe-auth/AApc0iEK3vInreO03Bt6L3EAByBHQCv9ks5sWFt3gaJpZM4JYi9D
ã
@nagisaããããšãïŒ æè¡ã¬ãã«ã§åé¡ã解決ã§ããããã§ãã
!
ãæ»ãåã®åãã©ã¡ãŒã¿ãŒãšããŠäœ¿çšã§ããããã«ãããã®ãµãã»ãããäœæããããšã¯å¯èœã§ããããïŒ ããªããå®å®ããæ©èœãæã£ãŠãããªãä»
fn foo() -> ! { ··· }
ãããŠã ?
ã䜿çšãããå Žåãéåžžã®å€æãè¡ãããšã¯ã§ããŸãã
fn foo() -> io::Result<!> { ··· }
åä»ãªåŒ·å¶ãšã¿ã€ããã©ã¡ãŒã¿ã®ããã©ã«ãã®è³ªåã¯ãã®å Žåã«åœ±é¿ããŸããïŒ
match
esã«ã€ããŠã¯ã httpsïŒ //public.etherpad-mozilla.org/p/rust-compiler-design-sprint-paris-2017-ucgãåç
§ããŠ
!
ãå®å®ãããåã«ãïŒ43061ã®ä¿®æ£ãè©Šã¿ãå¿
èŠããããŸãã
never_typeã«ã€ããŠèšåããŠããæªè§£æ±ºã®I-unsoundã®åé¡ã¯èŠåœãããªãã£ãã®ã§ãããã«ã€ããŠæ°ããåé¡ãæåºããŸããïŒïŒ47563ã [!; 0]
ã¯ç¡äººã§ãããšæ³å®ãããŠããããã§ãããåçŽãª[]
äœæã§ããŸãã
@dtolnayãçºè¡ããããŒã«è¿œå ãããŸãã
@canndrewãå
æ°ã§ããïŒ !
䜿çšéã®ãµãã»ãããå®å®ããããšãæãã§ããŸãïŒç¶²çŸ
çãªãã®ã«é¢ããã«ãŒã«ãé€ãïŒã ã§ããä»ããå Žæã®ç³žã倱ã£ãŠããŸã£ãã®ã§ããã£ã³ããªã³ãå¿
èŠã ãšæããŸãã ãã®äººã«ãªãæéã¯ãããŸããïŒ
@nikomatsakisç§ã¯ãã®ãããªããšã«åãçµãæéãèŠã€ããããšãã§ãããšç¢ºä¿¡ããŠããŸãã ããããæ£ç¢ºã«äœãããå¿ èŠããããŸããïŒ ãã®åé¡ã«é¢é£ãããã°ã ãã§ããïŒ
@varkorã¯ãæ®ãã®åé¡ãä¿®æ£ããããã«ãã§ã«PRãéããŠãããã
å¥ã®ããšã§ãããå®è¡æã«mem::uninitialized::<!>()
ãããã¯ã«ããŸããïŒçŸåšã¯UBãçºçããŸãïŒïŒ ãããšãããã®ãããªå€æŽãä»ã®ãšããæ®ãå¿
èŠããããŸããïŒ ç§ã¯å®å
šã§ãªãã³ãŒãã¬ã€ãã©ã€ã³ã®ãã®ã§äœãèµ·ãã£ãŠããã®ãã«ã€ããŠç解ããŠããŸããã
èšç»ã¯ãŸã https://github.com/rust-lang/rfcs/pull/1892ã ãšæããŸãããããªããæžããããšã«æ°ã¥ããŸããã :)
@RalfJungç¹ã«ããããããã¯ããŠãããã®ã¯ãããŸããïŒ ç§ã¯ä»ãå ãPRä»æ¥æžãããšãã§ããŸãMaybeUninit
ããŠéé£ããuninitialized
ã
@canndrewå€ãã®ãããžã§ã¯ãã3ã€ã®ãªãªãŒã¹ãã£ãã«ãã¹ãŠããµããŒãããããšèããŠããã uninitialized
ã¯å®å®çã§å©çšã§ãããããå®å®çãã£ãã«ã§ä»£æ¿åãå©çšå¯èœã«ãªã£ãããNightlyã§éæšå¥šã®èŠåã®çºè¡ãéå§ããããšããå§ãããŸãã doc-commentsã«ãããœãããªéæšå¥šã¯åé¡ãããŸããã
!
ãå®å®ãããããã®PRãäœæããŸããïŒ https ïŒ @ varkorã®PRãæ®ãã®æªè§£æ±ºã®åé¡ãä¿®æ£ãããã©ããã確èªããã®ãåŸ
ã€å¿
èŠããããŸãã
ãŸãã httpsïŒ //github.com/rust-lang/rfcs/pull/1699ã«å床ã¢ã¯ã»ã¹ããŠã !
ãšã¬ã¬ã³ããªç¹æ§ã®å®è£
ãæžãå§ããããšãã§ããããã«ããå¿
èŠããããšæããŸãã
@canndrew ïŒãã®RFCã¯åãå ¥ããããŸããã§ãããã httpsïŒ//github.com/rust-lang/rust/issues/20021ã®ææ¡ãšéåžžã«ãã䌌ãŠã
https://github.com/rust-lang/rust/issues/36479ãããããissueããããŒã«è¿œå ããå¿ èŠããããŸãã
@varkorããã¯éåžžã«äŒŒãŠããŸãã å°éäžèœã³ãŒãã®äœæ¥ã§ããã®ãããªã³ãŒãã«å°éäžèœãšããŠãã©ã°ãç«ãŠãããŠããåé¡ã«æ°ã¥ããŸãããïŒïŒ
impl fmt::Debug for ! {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
*self // unreachable!
}
}
ããã¯ããã®ãããªææ¡ãåãå ¥ããå¿ èŠãããããã§ãã
@canndrewç§ãæè¿æå±ããŠããããšã¯ãæ£åŒãªãã³ãã¬ãŒãã¯ãŸã éçºããŠããŸããããå®å®ããŠãããã®ãæ確ã«æåããããšããäžçš®ã®ãèŠçŽåé¡ãã§ãã ããã¯RFCåŸã®ã¬ããŒããšèããããšãã§ããå®å®ããŠãããã®ãšããã§ãªããã®ã®é¡èãªç¹åŸŽãç®æ¡æžãã®åœ¢ã§èŠçŽããããšããŠ
ãã®äžéšã¯ãåé¡ã®åäœã瀺ããã¹ãã±ãŒã¹ãžã®ãã€ã³ã¿ãŒã«ãªããŸãã
ãããªãã®ãæããŠã¿ãŠããããšæããŸããïŒ ããçš®ã®ãã¢ãŠãã©ã€ã³ãã奜ããªããç§ãã¡ã¯å°ãäžç·ã«ãã£ããããããšãã§ããŸã-ãŸãã¯ç§ã¯ãããã¹ã±ããããããšãè©Šã¿ãããšãã§ããŸãã
é¢é£ãã質åïŒå®å®ããåã«https://github.com/rust-lang/rust/issues/46325ã解決ããå¿ èŠããããŸããïŒ å€åããã¯åé¡ã§ã¯ãããŸããã
@nikomatsakisèŠåã®ã¿ã®åé¡ã解決ãããã®ãåŸ ããªãããšã«æ祚ããŸãã ããã¯ç¡å®³ã§ãã ãã以äžã®æ¬åœã®æžå¿µãçŸããªããã°ãç§ãã¡ã¯å ã«é²ãã§ãããå®å®ãããã¹ãã ãšæããŸãã
@canndrew ïŒ !
ãå®å®ããŠããã°ãäžå¯èœãªå®è£
ãçç¥ã§ããããšã倧ãã«å¿
èŠã«ãªããšæããŸããããã®ãããªã±ãŒã¹ãå®éã«èŠãããšã¯ãªããšæããŸãã
@nikomatsakis
ãããªãã®ãæããŠã¿ãŠããããšæããŸããïŒ ããçš®ã®ãã¢ãŠãã©ã€ã³ãã奜ããªããç§ãã¡ã¯å°ãäžç·ã«ãã£ããããããšãã§ããŸã-ãŸãã¯ç§ã¯ãããã¹ã±ããããããšãè©Šã¿ãããšãã§ããŸãã
ç§ã¯å°ãªããšããã©ãããæžãããšãã§ããŸããããããŠããªãã¯ãããããªããèããŠãããã®ã§ãããã©ããç§ã«èšãããšãã§ããŸããã ç§ã¯æ¬¡ã®æ°æ¥ã§ãããæãéããããšããŸãã
@nikomatsakisãã®ãããªãã®ïŒ
!
å®å®å!
ã¯æ¬æ Œçãªã¿ã€ãã«ãªããä»»æã®ã¿ã€ãã®äœçœ®ã§äœ¿çšã§ããããã«ãªããŸããïŒ RFC 1216ãªã©ïŒã !
ã¿ã€ãã¯ãä»ã®ã¿ã€ãã«åŒ·å¶å€æã§ããŸããäŸã«ã€ããŠã¯ã ãã ãããåæšè«ã¯ä»ã«å¶çŽã®ãªãåå€æ°ãããã©ã«ããšããŸã!
ã®ä»£ããã«()
ã resolve_trait_on_defaulted_unit
ãªã³ãã¯å»æ¢ãããŸããã ãããçºçããäŸã¯ã次ã®ãããªãã®ãããå Žåã§ãã
// We didn't specify the type of `x`. Under some circumstances, type inference
// will pick a type for us rather than erroring
let x = Deserialize::deserialize(data);
å€ãã«ãŒã«ã§ã¯ãããã¯()
ãéã·ãªã¢ã«åããŸãããæ°ããã«ãŒã«ã§ã¯ã !
ãéã·ãªã¢ã«åããŸãã
never_type
æ©èœã²ãŒãã¯å®å®ããŠããŸãããã²ãŒãã«äœ¿çšãããŠããåäœã®äžéšã¯ãæ°ããexhaustive_patterns
æ©èœã²ãŒãã®èåŸã«ãããŸãïŒä»¥äžãåç
§ïŒã
ç¡äººã¿ã€ãã®åŸ¹åºçãªãã¿ãŒã³ãããã³ã°ã äŸãã°ã
let x: Result<u32, !> = ...;
let Ok(y) = x;
ãã®ã³ãŒãã¯ã Ok(_)
ãåé§å¯èœãªãã¿ãŒã³ã§ãããšæå¥ãèšããŸãã ããã¯ã exhaustive_patterns
æ©èœã²ãŒãã䜿çšããŠä¿®æ£ã§ããŸãã ãã®åé¡ã®é²æç¶æ³ã«ã€ããŠã¯ã RFC1872ãåç
§ããŠãã ããã ãã®åäœããŸã ã²ãŒããããŠããããšã確èªãããã¹ãã±ãŒã¹ã«ã€ããŠã¯ã httpsïŒ//github.com/rust-lang/rust/tree/master/src/test/ui/feature-gate-exhaustive-patterns.rsãåç
§ããŠ
å®å®ããåã«ïŒ46325ã解決ããå¿ èŠããããŸããïŒ
ãã®ããã«ãã¹ãŠã®ã«ãŒãºãšã³ããã¯ãªãŒã³ã¢ããããã®ã¯çŽ æŽãããããšã§ãããå®éã«ã¯ãããã«ãŒã®ããã«ã¯èŠããŸããã
@canndrew
ãã®ãããªãã®ïŒ
ãããããããšãïŒ ããã¯çŽ æŽãããããšã§ãã
æ¬ èœããŠããäž»ãªãã®ã¯ã !
ãã©ã®ããã«åäœãããã瀺ããã¹ãã±ãŒã¹ãžã®ãã€ã³ã¿ã§ãã èŽè¡ã¯ãã©ã³ã°ããŒã ãŸãã¯å¯æ¥ã«ãã©ããŒããŠããä»ã®äººã
ã§ãªããã°ãªããŸãããç§ã¯ãããå®éã«ã¯ãæ±çšãã®äººã
ãã¿ãŒã²ããã«ããŠããªããšæããŸãã ããšãã°ã匷å¶ãåæ³ã§ããå ŽæããŸãã¯!
ã䜿çšã§ããå Žæã®äŸãããã€ã瀺ããããšæããŸãã ãŸãã培åºçãªãã¿ãŒã³ãããã³ã°ïŒæ©èœã²ãŒããæå¹ã«ããªãïŒãåŒãç¶ãåäœããããšã瀺ã粟巣ãèŠãããšæããŸãã ãããã¯ãªããžããªãžã®ãã€ã³ã¿ã§ããå¿
èŠããããŸãã
@canndrew
ãã®ããã«ãã¹ãŠã®ã«ãŒãºãšã³ããã¯ãªãŒã³ã¢ããããã®ã¯çŽ æŽãããããšã§ãããå®éã«ã¯ãããã«ãŒã®ããã«ã¯èŠããŸããã
ããã¯ãåäœãããã«å€æŽããæ°ããã³ãŒããæå¹ã«ããããšãæå³ããŸãïŒããšãã°ã let x: ! = ...
ã¯ãäžéšã®åŒã§ã¯åäœãç°ãªããšæããŸãïŒã å¯èœã§ããã°è§£æ±ºããã®ãæåã®ããã§ãã ãã¶ããããªããéããŠããPRã§ãããããŒããšã©ãŒã«ããããšãã§ããPRã§å®è¡ãããŠããæ¢åã®ã¯ã¬ãŒã¿ãŒãšäžç·ã«ããããŸãšããããšãã§ããŸããïŒ
@nikomatsakisããã€ãã®ãªã³ã¯ãšäŸã䜿çšããŠããã®èŠçŽã®åé¡ãå床æŽæ°ããŸããã ãŸããç³ãèš³ãããŸããããããã«å°éããã®ã«æéãããããŸãããå é±ã¯ãšãŠãå¿ããã£ãã§ãã
ãã¶ããããªããéããŠããPRã§ãããããŒããšã©ãŒã«ããããšãã§ããPRã§å®è¡ãããŠããæ¢åã®ã¯ã¬ãŒã¿ãŒãšäžç·ã«ããããŸãšããããšãã§ããŸããïŒ
çµããã
@rfcbotfcpããŒãž
ããã§èª¬æããããã«ã !
ã¿ã€ãããŸãã¯ãã®å°ãªããšãäžéšãå®å®ãããããšãææ¡ããŸãã PRã¯ãã¡ãã§ãã
ç§ã欲ããããŒã¿ã®1ã€ã¯ãã¯ã¬ãŒã¿ãŒã®å®è¡ã§ãã https://github.com/rust-lang/rust/pull/47630ããªããŒã¹ããŠãããšããã§ãïŒ
ããŒã ã¡ã³ããŒã®@nikomatsakisã¯ããããããŒãžããããšãææ¡ããŸããã 次ã®ã¹ãããã¯ãã¿ã°ä»ããããæ®ãã®ããŒã ã«ããã¬ãã¥ãŒã§ãã
çŸåšãªã¹ããããŠããæžå¿µã¯ãããŸããã
ã¬ãã¥ãŒã¢ã®éåæ°ãæ¿èªãããšïŒãããŠå察ã¯ãããŸããïŒãããã¯æçµã³ã¡ã³ãæéã«å ¥ããŸãã ãã®ããã»ã¹ã®ã©ã®æç¹ã§ãæèµ·ãããŠããªã倧ããªåé¡ãèŠã€ããå Žåã¯ã声ãäžããŠãã ããã
ã¿ã°ä»ããããããŒã ã¡ã³ããŒãç§ã«äžããããšãã§ããã³ãã³ãã«ã€ããŠã¯ããã®ããã¥ã¡ã³ããåç §ããŠãã ããã
ãããç§ãä»èŠããŠããããã€ãã®ããšïŒ
!
ãã¬ã€ããå®è£
ããããšãé©åãªå Žåã®ã¬ã€ãã©ã€ã³ãããã€ãæã€ããšã ã£ããšæããŸãã TL; DRã¯ãæåã«!
å€ãæå®ããã«ãã¬ã€ãã®ã¡ãœããã䜿çšã§ããªãå Žåã§ãåé¡ãªããšããããšã§ãããããã£ãŠã !
Clone
ãå®è£
ããŠãåé¡ãªããšæããŸãã ããããDefault
å®è£
ã¯ããã§ã¯ãããŸããã èšãæããã°ãimplãå®è£
ããããã«ç¡å·®å¥ã«panic!
ãèŠæ±ããå Žåãããã¯æªãå
åã§ãã =ïŒ@nikomatsakisæ°ãããšããã¯ã§ãã©ãŒã«ããã¯ã«ãŒã«ãå€æŽããŠãã2015ãšããã¯ã§äœ¿çšå¯èœãªã¿ã€ããšããŠ!
ãäœæã§ããŸããïŒ
@nikomatsakis
ãããå®å®ããããšããèãã¯ãæ°ããæ代ã«ã®ã¿æ€èšããå¿ èŠããããŸãã
ååïŒããªãåã®ããšã§ããïŒã¯ã¬ãŒã¿ãŒã©ã³ãè¡ã£ããšãããã©ãŒã«ããã¯ã«ãŒã«ã®å€æŽã«ãããã©ãŒã«ã¢ãŠãã¯ãããããã§ããã ãŸãããã°ããã®éãå€æŽã«ãã£ãŠåœ±é¿ãåããå¯èœæ§ã®ããã³ãŒãã«å¯ŸããŠãªã³ããè¡ã£ãŠããŸããã
次ã«ãããã§ã®èšç»ã®äžéšã¯ã
!
ãã¬ã€ããå®è£ ããããšãé©åãªå Žåã®ã¬ã€ãã©ã€ã³ãããã€ãæã€ããšã ã£ããšæããŸãã
ããã¯!
ããã¥ã¡ã³ãã«èšèŒãã
@SimonSapin
æ°ãããšããã¯ã§ãã©ãŒã«ããã¯ã«ãŒã«ãå€æŽããŠããããã§ãäœæã§ããŸããïŒ 2015幎ã®æ代ã«å©çšå¯èœãªã¿ã€ããšããŠïŒ
ã¯ã
@canndrew
ååïŒããªãåã®ããšã§ããïŒã¯ã¬ãŒã¿ãŒã©ã³ãè¡ã£ããšãããã©ãŒã«ããã¯ã«ãŒã«ã®å€æŽã«ãããã©ãŒã«ã¢ãŠãã¯ãããããã§ããã ãŸãããã°ããã®éãå€æŽã«ãã£ãŠåœ±é¿ãåããå¯èœæ§ã®ããã³ãŒãã«å¯ŸããŠãªã³ããè¡ã£ãŠããŸããã
ããã ã¯ã¬ãŒã¿ãŒã®èšãããšãèŠãŠã¿ãŸãããã ããããç§ãèšã£ãããã«ãã¯ã¬ãŒã¿ãŒã¯ç§ãã¡ã«äžéãäžããã ãã§ã-ãããŠããã¯äžçš®ã®ãéžæçå€åãã§ãã ããã§ããããªãã¯æ£ãããšæããŸããå®éã®ã³ãŒãã«å€§ããªåœ±é¿ãäžããããšãªãããããå€æŽããããšã§ãéãããããšãã§ããŸãã
TL; DRã¯ãæåã«
!
å€ãæå®ããã«ããã¬ã€ãå ã®ã¡ãœããã䜿çšã§ããªãå Žåã§ãåé¡ãã
ããã¯éåžžã®ã«ãŒã«ã§ããé©åãªæ¹æ³ã§å®è£ ã§ããå Žåã¯ãimplãè¿œå ããŸãããé©åãªæ¹æ³ã§å®è£ ããããšãããã¯ã¯é€å€ãããŸãããç¡å¹ãªããŒã¿ãååšããå Žåã¯ãexfalsoãUBãå«ãŸããŸãã
@ arielb1ã¯ãããã ãã !
ãååšããå Žåãäœããã®çç±ã§ãã®ãããªããšã«ã€ããŠæ··ä¹±ããåŸåããããããæ瀺çã«åŒã³åºã䟡å€ãããããã§ãã
å°éäžèœã³ãŒããªã©ãlibstdã®ã©ããã«å®å
šã«è¡šçŸããæ¹æ³ãšããŠææžåãããŠãããå®å
šãªã¡ãœããfn absurd(x: !) -> !
ããããšåœ¹ç«ã€ãããããŸããã ãã®ããã®RFCããã£ããšæããŸã...ãŸãã¯å°ãªããšãRFCã®åé¡ïŒ https ïŒ
@RalfJungãã®absurd
é¢æ°ã¯identity
ã ãã§ã¯ãããŸãããïŒ ãªãããã圹ã«ç«ã€ã®ã§ããïŒ
ããã¯ãåŒæ°ãåãããéåžžã«æªå®çŸ©ã®åäœã§ããunsafe fn unreachable() -> !
çµã¿èŸŒã¿é¢æ°ãšåãã§ã¯ãããŸããã
ããããããããã¯ã»ãšãã©ã§ãã ãçµäºããªãããšããæå³ã§!
ãªã¿ãŒã³ã¿ã€ãã䜿çšããŠããŸããã ïŒ absurd
ã®éåžžã®ã¿ã€ãã¯fn absurd<T>(x: !) -> T
ã§ãããRustã§ã圹ã«ç«ããªãããã§ããïŒ
ç§ã¯ããããã !
ã®ååšäžã§ã人ã
ã¯ãã®ãããªããšã«ã€ããŠæ··ä¹±ããåŸåããããã®ã«åœ¹ç«ã€ã®ã§ã¯ãªãããšèããŠããŸããã
ç§ãééã£ãåé¡ãæ±ããŠããããã§ã...ã©ããã§ãã®ãããªãexfalsoãæ©èœã«ã€ããŠã®è°è«ããããšæããŸããã ç§ãééã£ãŠããããã§ãã
fn absurd<T>(x: !) -> T
ã¯match x {}
ãšæžãããšãã§ããŸããããããŸã§èŠãããšããªããã°ããããæãä»ãã®ã¯é£ããã§ãã å°ãªããšãrustdocãšæ¬ã§ææãã䟡å€ããããŸãã
fnã°ãããŠãã
ïŒxïŒïŒïŒ-> Tã¯x {}ãšäžèŽããããã«æžãããšãã§ããŸããããããŸã§ã«èŠãããšããªãå Žåã¯ããããæãä»ãã®ã¯å°é£ã§ãã
ããã§ãããããç§ãlibstdã®ã©ããã«ã¡ãœãããææ¡ããçç±ã§ãã ããããæé«ã®å Žæãã©ãã«ãããããããŸããã
absurd
ã¯ãé«éé¢æ°ã«æž¡ãããšãã§ããããšã§ãã æ¹æ³ãèãããšããããå¿
èŠãã©ããã¯ããããŸããã wrtã§åäœããŸãã ããããçµ±äžã
fn absurd<T>(x: !) -> T
ã¯match x {}
ãšæžãããšãã§ããŸã
x
ïŒAFAIKïŒãšæžãããšãã§ããŸãã空ã®enum
ãããå Žåã«ã®ã¿ã match
å¿
èŠã§ãã
absurd(x: !) -> T
é¢æ°ã¯ãé«éé¢æ°ã«æž¡ãã®ã«åœ¹ç«ã¡ãŸãã ããšãã°ãå
ç©ããã§ãŒã³ãããšãã«ãããå¿
èŠã§ããããã®ãã¡ã®1ã€ã¯ãšã©ãŒã¿ã€ã!
ã§ãããT
ã§ãã åã®åŒã«ãããããã!
ã«åŒ·å¶ããããšãã§ããŸãT
ãšããããã§ã¯ãããŸãã!
ãšT
ãã®æã
ããªãã¯ãŸã æåã§ããå¿
èŠããããçµ±äžãããŸãã¿ã€ããå€æããŸãã
åæ§ã«ã Result
ãããªã¿ã€ãã«ã¯ã Result<T, !>
ãResult<T, E>
å€æãã.infallible()
ã¡ãœãããå¿
èŠã ãšæããŸãã
çµæã®ãããªåã«ã¯ãçµæãå€æãã.infallibleïŒïŒã¡ãœãããå¿ èŠã§ãã
çµæãž ã
ç§ã¯ãã®ãããªã¡ãœãããã¿ã€ãResult<T, !> -> T
ãæã€ããšãæåŸ
ããŠããŸããã
ç§ã¯ãã®ãããªã¡ãœãããã¿ã€ãResultãæã€ããšãæåŸ ããŠããŸãã
-> Tã
ããã¯unwrap
ãšåãã§ã¯ãããŸãããïŒ Err
ã±ãŒã¹ã«ã¯å°éã§ããªãããããããã¯ã¯æé©åãããŸãã
@AmanieuèŠç¹ã¯ããããããããã¯ããªããšããããšã§ãã ãããã¯ãªã³ãã欲ããã®ã§ãããæé©åã«é Œããšãããã¯ã€ãŸããã§ãããã ãªã³ãããªããŠãã unwrap
ãããšããªãã¡ã¯ã¿ãªã³ã°äžã«ãããã¬ã³ãè¿œå ããããããã¯ãåã³ã©ã€ãã³ãŒãã«ãªãããšãå°ãªããªããŸãã
unwrap
ã¯assert
-ãã©ã³ã¿ã€ã ãã§ãã¯ã¢ããããïŒIIRCã¯ååãå€æŽããææ¡ãããããŸããããé
ãããŸãã...æ²ããããšã«ïŒã å®è¡æãã§ãã¯ãäžèŠã§å¿
èŠãªå Žåã¯ã infallible
ã§æ瀺çã«ãªããŸãã
@rfcbotfcpãã£ã³ã»ã«
@aturonãš@pnkfelixã¯ãã§ãã¯ããã¯ã¹ã
@cramertjã®ææ¡ã¯ãã£ã³ã»ã«ãããŸããã
@rfcbotfcpããŒãž
https://internals.rust-lang.org/t/psa-tweaks-to-fcp-process/6775
ããŒã ã¡ã³ããŒ@cramertjã¯ããããããŒãžããããšãææ¡ããŸããã 次ã®ã¹ãããã¯ãã¿ã°ä»ããããæ®ãã®ããŒã ã«ããã¬ãã¥ãŒã§ãã
çŸåšãªã¹ããããŠããæžå¿µã¯ãããŸããã
ã¬ãã¥ãŒã¢ã®éåæ°ãæ¿èªãããšïŒãããŠå察ã¯ãããŸããïŒãããã¯æçµã³ã¡ã³ãæéã«å ¥ããŸãã ãã®ããã»ã¹ã®ã©ã®æç¹ã§ãæèµ·ãããŠããªã倧ããªåé¡ãèŠã€ããå Žåã¯ã声ãäžããŠãã ããã
ã¿ã°ä»ããããããŒã ã¡ã³ããŒãç§ã«äžããããšãã§ããã³ãã³ãã«ã€ããŠã¯ããã®ããã¥ã¡ã³ããåç §ããŠãã ããã
ä»æ¥ã®äŒè°ã§ããã«ã€ããŠè©±ãåã£ãã ãã©ãŒã«ããã¯ãä»å€æŽããã®ãããããšãæ°ããæ代ã«ã®ã¿å€æŽããã®ãã«ã€ããŠãç§ã¯ãŸã æ©ãã§ããŸãã ããã«ããŸããŸãªãã€ã³ãããããŸãã
å€æŽã«ããäºæ³ããã圱é¿ã¯ãããã§ãã çŸå®çã«ã¯ãããã¯ã©ã¡ãã®æ¹æ³ã§ã倧ããªéãã¯ãããŸããã ããã§
ãããŠãããã¯2ã€ã®å®éã®ååž°ãæ®ãã ãã§ãïŒoplog-0.2.0ïŒå®éã«ã¯å£ããŠããã®ã¯ãã®äŸåé¢ä¿bson-0.3.2ã§ãïŒãšrspec-1.0.0-beta.4ã§ãã ãããã¯äž¡æ¹ãšãå€ããã©ãŒã«ããã¯åäœã«äŸåããŠããŸããã幞ããªããšã«ãå®è¡æã§ã¯ãªãã³ã³ãã€ã«æã«å£ããŠããŸãã ãããã®ç®±ãä¿®æ£ããããã«PRãæåºããŸãã
ããããããã¯ãŸã æè¡çã«ã¯é倧ãªå€æŽã§ãïŒãããŠèªçºçãªå€æŽã§ãïŒã ()
ãéåžžã«äžé©åãªéžæã§ãããã³ãŒããããã«äŸåããããšã¯éåžžã«ãŸãã§ããããšãé€ããŠãåå€æ°ã®ãã©ãŒã«ããã¯ãå€æŽããå¿
èŠãããç¹å¥ãªçç±ã¯ãããŸããã ç§éã¯ãŸãããã«ã€ããŠé·ãéèŠåããŠããŸããã
ããã¯å²åŠã®åé¡ã ãšæããŸããéå»ã«ãç§ãã¡ã¯å¿ èŠã«å¿ããŠãã®ãããªå°ããªé倧ãªå€æŽãå ããŸããã ããããç»æçãªã¡ã«ããºã ãã§ããã®ã§ãæè¡çã«äœãå£ãããšãªãããã®ãããªç§»è¡ãè¡ãããã®ããåççãªæ¹æ³ãæäŸãããŸãã ååãšããŠãããã䜿çšãã䟡å€ããããããããŸããã äžæ¹ã§ãããã¯æã ãã®ãããªå€æŽãå ããããã«äœå¹ŽãåŸ ã€ããšãæå³ããã§ãããã ãããŠãã¡ãããäž¡æ¹ã®ããŒãžã§ã³ãæ°žç¶çã«ç¶æããå¿ èŠããããèšèªä»æ§ãªã©ãã¯ããã«è€éã«ãªããŸãã
å°ãåŒãè£ãããŠããŸããããã©ã³ã¹ãåããªãããååŸã«ããã€ããŠããã®ã§ãèšç»éããæ®éçã«å€ããããã«åŸåããŠããŸãã
åèŠãããããšã¯ããã£ãŠããŸããããã©ãŒã«ããã¯ã®åäœãå€æŽããããšã¯ã dyn Trait
ãcatch
ãããªãã®ãšæ¯èŒããŠãããå€ãã®ãã°ä¿®æ£ãšããŠèŠãããŸãã
ããã«ã誰ããããã«é£ã³ä¹ã£ãŠããããããã³ã¯çµå±ã®ãšããäžäœäºææ§ãå£ããŸãïŒ1.0ã«éãããšãã®å®å®æ§ã®çŽæã¯åã§ããïŒããšèšãããå Žåã 次ã«ããã®åé¡ã«é¢ããéåžžã«ææ ®æ·±ãè°è«ã¯ãå®éçãªåœ±é¿ããããããã§ãã£ããšããŠãã決å®ã軜ã ããè¡ãããªãã£ãããšã瀺ããŠããŸãã
OKãå€æŽããŸãããã
ããã§ã¯ã劥åæ¡ãšããŠãåäœãå€æŽãããããšã人ã ã«ç¥ããããšã©ãŒã«ã€ããŠåœ¹ç«ã€ã¡ã¢ãæäŸããããšæããŸããããã¯ãã£ãšãããããšæãããŸãã ã¢ã€ãã¢ã¯æ¬¡ã®ããã«ãªããŸãã
!: Foo
ããã€ãã®ç¹æ§ã®ããããããŠåœ¢è³ªãããã«å®è£
ãããŠããããšã(): Foo
ããããŠæã
ã¯ïŒæã
ã¯ãšã©ãŒå ±åã®ã³ãŒãã«ãã®äºå®ãäŒããããšãã§ããŸãïŒãã©ãŒã«ããã¯ãè¡ã£ãŠãããæã
ã¯è¿œå ããŸãè¿œå ã®ããŒããããã§æçµã³ã¡ã³ãæéãçµäºããŸããã
äžçªäžã®æçš¿ã®ä¿çäžã®ãã§ãã¯ããã¯ã¹ã¯ãŸã ãã§ãã¯ãããŠããŸãããïŒ ãã®ãªã¹ãã§åãæ¶ããããã®ã¯ãããŸããïŒ
@earthengineç§ãèŠãŠãã2ã€ã¯ç¹ã«é¢é£æ§ããããšã¯æããŸãããäžçªäžã®é ç®ã«ã€ããŠã¯ãimplã®ã»ããã«ã€ããŠã¯ãåœé¢ã¯æ±ºå®ãããŠãããšæããŸãã
åºæ¬çã«ã¯ããæå°éã®ã»ããã«ãªããŸãã
@nikomatsakisããã§èŠçŽã®åé¡ãäœæããŸããïŒ https ïŒ
!
!
ã¿ã€ãã®å€ã«äžèŽãããã¿ãŒã³ã«ããããšã«ã€ããŠæ€èšããããšã¯ãããŸããïŒ ïŒç§ã¯ãã®åé¡ãšå
ã®RFCã®åé¡ãç°¡åã«èª¿ã¹ãŸããããé¢é£ãããã®ã¯äœãèŠã€ãããŸããã§ããïŒã
ããã¯ãæœåšçã«!
ãšã©ãŒã¿ã€ãããè€åãšã©ãŒã¿ã€ããäœæããStreamFuture
ãªã©ã®ã¿ã€ãã«åœ¹ç«ã¡map_err
ã§!
ãã¿ãŒã³ã䜿çšããããšã«ãããå°æ¥ã®ããæç¹ã§ãšã©ãŒã¿ã€ããå€æŽãããå Žåã map_err
åŒã³åºãã¯ãäœãå¥ã®ããšãè¡ãå¯èœæ§ãããã®ã§ã¯ãªããã³ã³ãã€ã«ãåæ¢ããŸãã
äŸãšããŠãäžãããã
let foo: Result<String, (!, String)> = Ok("hello".to_owned());
ããã«ãããããæ確ãªèšè¿°ãå¯èœã«ãªããŸã
let bar: Result<String, String> = foo.map_err(|(!, _)| unreachable!());
ãšã©ãŒãçºçããããå¯èœæ§ã®ãã代ããã«
let bar: Result<String, String> = foo.map_err(|_| unreachable!());
ãŸãã¯ãããã«ãšã©ãŒãçºçãã«ãã
let bar: Result<String, String> = foo.map_err(|(e, _)| e);
ç·šéïŒ https ïŒ !
ãã¿ãŒã³ã®å°å
¥ãèšèŒãããŠããŸãã ããã¯çŽç²ã«match
åŒã®ã³ã³ããã¹ãã§ãããã¯ããŒãžã£ãŒ/é¢æ°ã®åŒæ°ã«äžè¬åããããã©ããã¯ããããŸããã
@ Nemo157
äœãããšãèããããšã¯ãããŸããïŒ ïŒã®å€ã«äžèŽãããã¿ãŒã³ã¿ã€ãïŒ
é¢çœãã èšç»ã¯ãã®ãããªæŠåšãçãããšã ãã ã£ããšæããŸãããã®å Žåãå°æ¥ã¿ã€ããå€æŽãããå Žåã§ããè©Šåãå®å
šã§ã¯ãªããªãããããšã©ãŒãçºçããŸãã !
ãã¿ãŒã³ã®åé¡ã¯ããããäžèŽããå Žåãããã¯è
ãäžå¯èœã§ããããšãæå³ããããšã§ããããã¯å°ãåä»ã§ãã å®è¡ããåŒãæå®ããå¿
èŠããªãããšã§ãããã説æããããšæããŸãã ããã§ãããã®ã±ãŒã¹ã¯èµ·ããåŸãªãããšãæ瀺çã«èšãæ¹æ³ããããšäŸ¿å©ãããããŸããã
å®éãå°éäžèœãªãã¿ãŒã³åŠçãæ¡åŒµããããšã¯ãããã解決ããããã®ä»£æ¿æ¹æ³ã§ããå¯èœæ§ããããŸãã ãããã¢ãŒã ãããããäžå¯èœã§ããå Žåãã¢ãŒã å ã®ã³ãŒãã¯ç¡èŠãããå¯èœæ§ããããŸãã ããããããªããæã£ãŠãããšã
fn foo() -> Result<String, String> {
let bar: Result<String, (!, String)> = Ok("hello".to_owned());
Ok(bar?)
}
ããã¯ä»æ¥ã®ããã«æ¡åŒµãããŸãïŒ_ãããæ£ããæ¡åŒµã§ãããã©ããã¯100ïŒ ç¢ºä¿¡ã§ããŸããããååã«è¿ãããã§ã_ïŒ
fn foo() -> Result<String, String> {
let bar: Result<String, (!, String)> = Ok("hello".to_owned());
Ok(match Try::into_result(bar) {
Result::Ok(e) => e,
Result::Err(e) => return Try::from_err(From::from(e)),
})
}
ãã ãã Result::Err
ãã©ã³ãã¯ã¿ã€ããã§ãã¯ããããä»æ¥çºçããthe trait bound `std::string::String: std::convert::From<(!, std::string::String)>` is not satisfied
ãšã©ãŒã¯çºçããŸããã
ããã¯RFC1872ãææ¡ããŠãããã®ãšäºææ§ããããšã¯æããŸããããæµ
ãäžèŽãå®è¡ããŠããæ瀺çãªã¢ãŒã ããããããå¿
ããã!
å€ã®æå¹æ§ã«äŸåããŠããããã§ã¯ãªããæœåšçã«ãã®ãã©ã³ããe.0
ããŸã£ãã䜿çšããªãéããé¢é£ãããã©ã³ãããå®å
šã«ãå®è¡ããŸãã
!
ã¯bool
ãããªæ£ã®åã§ãããããã¯ããŒãžã£æ§æãæ¡åŒµããŠè€æ°ã®ãã©ã³ããèš±å¯ããªãéããã¯ããŒãžã£åŒæ°ãªã¹ãã§ãã¿ãŒã³ãããã³ã°ãè¡ãããšã¯äžå¯èœã§ãã äŸãã°ã ã¯ããŒãžã£bool -> u32
ãïŒéãä»®æ³æ§æïŒ [~ |false| 23, |true| 45 ~] -> u32
ããã«èšè¿°ã§ããããã«ãããšã空ã®åããu32
ãžã®ã¯ããŒãžã£ãåçŽã«[~ ~] -> u32
ãšæžãããšãã§ããŸãã
å
ã®äŸã§ã¯ã unreachable!
䜿çšãåé¿ããããã foo.map_err(|(e, _)| e)
æ¹ã奜ãã§ããã foo.map_err(|_: (!, _)| unreachable!())
æžãããšãã§ããŸãã
!
ã¯ããžãã£ãã¿ã€ãã§ã
ããžãã£ãã¿ã€ããšã¯ã©ãããæå³ã§ããïŒ
è€æ°ã®ãã©ã³ããèš±å¯ããããã«ã¯ããŒãžã£æ§æãæ¡åŒµããã«ãã¯ããŒãžã£åŒæ°ãªã¹ãã§ãã¿ãŒã³ãããã³ã°ããããšã¯ã¡ãã£ãšäžå¯èœã§ã
åŒæ°ãªã¹ãã¯ãããšãã°ãåé§ã§ããªããµããã¿ãŒã³ããã§ã«ãµããŒãããŠããŸãã
let foo: Result<String, ((), String)> = Ok("hello".to_owned());
let bar: Result<String, String> = foo.map_err(|((), s)| s);
!
ãã¿ãŒã³ã!
ã¿ã€ãã®ãã¹ãŠã®0å€ã«äžèŽããåé§ã§ããªããã¿ãŒã³ãšèŠãªããŸããããã¯ã ()
ãã®1ã€ã®å€ãã¹ãŠã«äžèŽããåé§ã§ããªããã¿ãŒã³ãšåãã§ãã ()
ã¿ã€ãã
ç§ã¯ãã èããŸãïŒ ïŒã®ãã¹ãŠã®0å€ã«äžèŽããåé§ã§ããªããã¿ãŒã³ãšããŠã®ãã¿ãŒã³ã¿ã€ãã¯ãïŒïŒãšåãã§ãïŒïŒã¿ã€ãã®1ã€ã®å€ãã¹ãŠã«äžèŽããåé§ã§ããªããã¿ãŒã³ã§ãã
ãããã0ïŒ= 1ã§ãã;ïŒ !
ç
§åããåŸãã³ãŒããèšè¿°ããŠãæå³ããããŸãããããšãã°ãåŒæ°ã®åã(!, i32)
å Žåã |(!, x)| code_goes_here
ãšã«ãããã®ã³ãŒãã¯æ»ãã§ããã®ã§ã x
ã!
èŠçŽ ã§ããããšãéåžžã«æ確ã«ããããã«ããããã|(x, _)| match x {}
ãšæžããŸãã ãŸãã¯ãäžèšã§absurd
é¢æ°ã |(x, _)| absurd(x)
ãŸãã ãŸãã¯å€å|(x, _)| x.absurd()
ïŒ
@canndrewãäžã§æžããããã«ãã³ãŒããèšè¿°ã§ããªãå¥ã®æ§æãæ³åããããšãã§ããŸãã match
ã¯ä»»æã®æ°ã®åå²ããããããç¹ã«åå²ããªãå¯èœæ§ããããŸãããã ããã¯ããŒãžã£ã®ã±ãŒã¹ã¯1ã€ã ããªã®ã§ãæå³ã®ãããã¿ãŒã³ã¯ãäžèŽããæ¹æ³ã1ã€ã ãã®ãã¿ãŒã³ã ãã§ãã 0éãã§ã¯ãããŸããã
æ®å¿µãªãããä»ã¯impl<T> From<!> for T
è¿œå ã§ããŸããã ïŒäœãç¹å¥ãªãã®ããªãéãã From<T> for T
ãšéè€ããŸããïŒïŒããããåŸã§è¿œå ããããšã¯ã§ããŸããã ïŒ !
ãå®å®ããåŸã®ãªãªãŒã¹ãµã€ã¯ã«ã§ã¯ãäžéšã®ã¯ã¬ãŒããFrom<!> for SomeConcreteType
å®è£
ããå ŽåããããŸããïŒ
@SimonSapinè¯ãç¹ïŒ ããã¯å€ãã®ç¹ã§éåžžã«äŸ¿å©ãªæ§æèŠçŽ ã§ãããç§ã¯æ°žé ã«ããã倱ãããšãå«ããŸãã äž¡æ¹ã®ã€ã³ã¹ã¿ã³ã¹ãèš±å¯ããããã«ã1åéãã®ããã¯ãçå£ã«æ€èšããããšæããŸãã ãããã¯éè€ããå Žåã«æå³çã«äžèŽããããããæäœäžã®ççŸãã¯ãããŸããã
äžåéãã®ããã¯ãçå£ã«æ€èšããã
ãã®åŸããã®ããã¯ã¯æ°æ¥ä»¥å ã«çéžããå¿ èŠããããŸãã ïŒãŸãã¯ããŒã¿æéäžã«ããã¯ããŒããããŸããïŒ
@SimonSapinãã®ãããªããã¯ãã©ãã ãè¿
é/ç°¡åã«è¿œå ã§ããŸããïŒ From<!> for T
ãæãŠãªãã®ã¯æ¬åœã«æ®å¿µã§ãã
ãŸãã¯ã From<!> for SomeConcreteType
å®è£
ã«å¯ŸããŠèŠåãããã«åºãããšãã§ããŸãã
ããããªããããã¯ãäœã§ãããã«ããã 亀差ç¹ã«3åã®1ãããå Žåããã¬ã€ãã®ç¹æ®åã«ãã£ãŠ2ã€ã®éè€ããimplãæå¹ã«ã§ãããšæããŸããããã®ããã«ã¯ããã¬ã€ããå ¬ã«ãç¹æ®åãããå¿ èŠããããŸããïŒ
æ®å¿µãªãããå°éåéïŒ
From::from
ãdefault fn
ã«å€æŽããå¿
èŠããããŸããããã¯ãstdã®å€éšã§ã衚瀺ããããŸãã ç¹æ®åãäžå®å®ã§ããéããæšæºç¹æ§ã§ãããå®è¡ããããã©ããã¯ããããŸãããããã§ã2ã€ã®implã¯ãŸã£ããåãããšãè¡ããŸãã ã³ããŒã¬ã³ã¹ãã§ãã¯ããªãã«ããã ãã§ã¯ãã©ã®implã䜿çšãããŠããããå€æããã®ã¯å°é£ã§ããããã¯éåžžãéåžžã«äžå¥å šã§ããããã®å Žåã¯åé¡ãããŸããã ããšãã°1ã€ã®çµæãæåŸ ããŠãã³ã³ãã€ã«äžã«ãããã¯ãèµ·ããå¯èœæ§ããããŸããããããåé¿ããããšã¯ã§ããŸãã
èšãæããã°ããããããããšã«ãããã¯å°éåéã®ãããããä¿é²ãããããã¯ããã«ç°¡åã ãšæããŸãã
ãã®ãé¢ä¿ãããã¹ãŠã®å®è£ ãå°éäžèœãªå Žåã«ä»»æã®éãªããèš±å¯ããããšããèãã圢åŒåããããã®æ¢åã®RFCã¯ãããŸããïŒ æ€èšãã¹ãèå³æ·±ãã¢ãããŒãã®ããã§ãã
ç§ãç¥ã£ãŠããããšã§ã¯ãããŸããã æ¯ãè¿ã£ãŠã¿ããšãimplèªäœã¯å°éäžèœã§ã¯ãããŸããããå éšã®ã¡ãœããã¯ãã¹ãŠåŒã³åºãäžå¯èœã§ãïŒåžžã«ãåŒã³åºãå¯èœãã§ãããããé¢é£ããåãå®æ°ã¯å«ãŸããŸããïŒã ãã®ãããªããšã§ãããã³ã°ããããã¯ãããŠãããšæãããå Žåã¯ãããã«æžãããšãã§ãããšæããŸãã
åå ãšãªãå¯èœæ§ã®ããåé¡ïŒ49593ã«èšåããã ãã§ãïŒ ãã¡ã€ã³ãããªãã£ãåäžãããããã«ãåã³äžå®å®ã«ãªããŸãã
!
ãå®å®ããåŸã T: From<!>
以å€ã®ä»ã®implãè¿œå ã§ããªãã®ã§ã¯!
implãšã¯ç°ãªãããã®ãããªãã¹ãŠã®åççãªimplãåŠçããããã«åªããå¿
èŠããããŸãã
ãã®ã³ã¡ã³ãããã®ã¯ãã¹ãã¹ãïŒ
çåã«æã£ãŠããã®ã§ãããïŒïŒãžã®ãã©ãŒã«ããã¯ãå€æŽããå¿ èŠãããçç±ã®å žåçãªäŸã¯äœã§ããïŒ ã€ãŸããïŒïŒã«ãã©ãŒã«ããã¯ãç¶ããããããã§ãïŒãè¿œå ããå Žåããã®ãããªåé¡ã¯ç¢ºå®ã«åé¿ãããïŒã«ãã©ãŒã«ããã¯ããŸãã ãã©ã€ããã³ãŒãã«åœ±é¿ãäžããåå€æ°ãžã®ãã©ãŒã«ããã¯ãçºçããå Žåãããããšãèãããšãã¯æé©ã§ã¯ãããŸããïŒãã¡ããæå³ã¯ãããŸããããç§ãã¡ãèŠã€ããããã«ããªãŒã¯ãé²ãããšã¯å°é£ã§ãïŒã
ãã®å€æŽã®çµæãšããŠããã€ãã®åŸéããããŸããããããŠç§ã¯ããã«å®å šã«æºè¶³ããŠããªããšèšããªããã°ãªããŸããïŒ
!
ãã©ãŒã«ããã¯ãããã!
ãã ããã¯çŸåšã®ã¹ããŒã ã®æ¢ç¥ã®é害ã§ããã match foo { P1 => ..., P2 => return }
ãããå Žåã«çºçããŸãã æ»ãå€ã¯ãä»ã®ã¢ãŒã ãšçµ±åãããã !
åå€æ°ãžã®ãã©ãŒã«ããã¯ããçæããŸãã ä¿®æ£ããã®ã¯éåžžã«é£ããããšã蚌æãããŠããŸãã ããšãã°ã https ïŒ ãã ãããïŒãã®ç¹ã«é¢ããlang-teamãã£ã¹ã«ãã·ã§ã³ã«ããããŒãããŸããïŒ
äŒè°äžã«ãããã§ããã€ãã®ãªãã·ã§ã³ãæ€åããŸãããäž»ã«ãäžéšã®ã³ãŒããŒã±ãŒã¹ã§æ¢åã®ã³ãŒãã®ã»ãã³ãã£ã¯ã¹ãå€æŽããããããå€æŽãå ããããšã«æµæãæããŠããŸããæ°ããã«ãŒã«ã®åªããŠãããã©ããã¯æããã§ã¯ãããŸããã ããããã»ãšãã©ã®å Žåãããå®å
šãªè°è«ãã§ããããã«ãåãã¶ã€ã³ã®é·æ/çæãããäžåºŠåéããŠã¿ãã®ã¯çŽ æŽãããããšã ãšæããŸããã ãŠãŒã¹ã±ãŒã¹ãšèœãšãç©Žã®ãªã¹ããèŠããã®ã§ããã @cramertjã¯ãOk(33)
ã¯ãä»æ¥ã®ããã«ãšã©ãŒãçºçããã®ã§ã¯ãªãã Result<i32, !>
ã«ãã©ãŒã«ããã¯ããã¿ã€ããæã£ãŠããŸãã ç§ã¯ã圌ããããã®åŸã®ãã©ãŒã«ããã¯ãä¿ã€ããšãèšã£ãŠãããšæããŸãreturn
ãš()
ïŒåœŒãã¯çŽäº€ããŠãããïŒããã®ãããªå€æŽãšççŸããã ããããšé競åãäœæããããšããããŸãã ããã¯å
¬å¹³ã§ãã
Err
ãã£ãŒãããã¯ïŒïŒ40801ïŒã®èª²é¡ã¯ã次ã®ãããªãšããžã±ãŒã¹ãããããšã§ãã
let mut x = Ok(22);
x = Err(Default::default());
ããã§ã x
ã®ã¿ã€ãã¯ãæçµçã«Result<T, !>
æšæž¬ãããŸãã
!
ãã©ãŒã«ããã¯ãã©ã€ãã³ãŒãã«ã圱é¿ãäžããããã©ãããå€æã§ãããã©ããïŒãããŠããããèŠåïŒãŸãã¯ãšã©ãŒïŒïŒãè©ŠããŠã¿ãå¿
èŠããã£ãå¥ã®èšç»ãæãåºããŸãã-ããã¯éåžžã«é£ããããšãããããŸããããå®éã«å€ãã®ã±ãŒã¹@SimonSapinã®ã±ãŒã¹ïŒã
æ°çã§ãã®ãã©ãŒã«ããã¯ãå®å šã«åãé€ãããšãã§ãããã©ããã«ã€ããŠã®è°è«ããããŸããã å€ãã®ãã¯ããå£ããã®ã§ã¯ãªãããšæããŸãããè©ŠããŠã¿ã䟡å€ã¯ããã§ããããã
åèãŸã§ã«ããã®æ©èœã«ãã1.26ã§ãªã°ã¬ãã·ã§ã³ãçºçããŸããïŒïŒ49932
ïŒhttps://github.com/rust-lang/rust/issues/35121#issuecomment-368669041ã«åŸã£ãŠã©ãã«ãèšå®ããŸããïŒ
!
ãžã®åŒ·å¶ã«é¢ãããã§ãã¯ãªã¹ãé
ç®ã¯ããã®åé¡ãåç
§ããã®ã§ã¯ãªãã httpsïŒ//github.com/rust-lang/rust/issues/50350ãæããŠããå¿
èŠããã
ãããã§ããã ãæ©ãå®å®ããããå Žåãç§ã®ãšãã«ã®ãŒãåããã®ã«æé©ãªå Žæã¯ã©ãã§ããïŒ
ãããã£ãŠãå®è¡å¯èœãªè§£æ±ºçã¯ãã®ãµãã¿ã€ããšããŠç¹æ®ãªã±ãŒã¹ã®Boxã䜿çšããããšã§ãã
ç®±
2018幎7æ8æ¥ãæ¥ææ¥ã®åå8æ12åã«RalfJungã®[email protected]ã¯æ¬¡ã®ããã«æžããŠããŸãã
@remexrehttps ïŒ//github.com/remexreç§ã¯
å®å®åãå ã«æ»ãããšã«ã€ãªããåé¡ã¯ïŒ49593ã«ãããŸã
https://github.com/rust-lang/rust/issues/49593â
ããªããèšåãããã®ã§ããªãã¯ãããåãåã£ãŠããŸãããã®ã¡ãŒã«ã«çŽæ¥è¿ä¿¡ããGitHubã§è¡šç€ºããŠãã ãã
https://github.com/rust-lang/rust/issues/35121#issuecomment-403286892 ã
ãŸãã¯ã¹ã¬ããããã¥ãŒãããŸã
https://github.com/notifications/unsubscribe-auth/AEAJtcnsEaFmHrrlHhuQeVOkR8Djzt50ks5uEgVLgaJpZM4JYi9D
ã>>
ããããšãã
ãã€ãµã³
ãã®è°è«ã¯å®éã«ã¯https://github.com/rust-lang/rust/issues/49593ã«å
¥ãå¿
èŠããããŸããããã®éèŠãªéšåã¯Box::<T>::new
ã¯T: Sized
ãå¿
èŠã§ããããã®new
åŒã³åºãããT = Error
ïŒç¹æ§DSTïŒãæã£ãŠãããšæšæž¬ãããŸãã
ç¹å¥ãªå Žåã®åªé
ã以å€ã«ãç¹å¥ãªå Žåã®Box::new
ã«åé¡ã¯ãããŸããïŒ
Box::new : T -> Box<U>
where T <: U,
T: Sized
ãŸã
Box::new : T -> Box<U>
where Box<T> <: Box<U>,
T: Sized
ãŸãã !
ã®ãµã€ãºãèããå¿
èŠããããŸãã Mathemticansã¯Inf
ãããªãã®ãææ¡ããŸãããå®éã«ã¯usize::MAX
ã«ãªãããããã®ã¿ã€ãã«ã¹ããŒã¹ãå²ãåœãŠãè©Šã¿ã¯å€±æããããå°ãªããšãpanic
ãŸãã
!
ãSized
å Žåã Box::new(x as !)
ã³ã³ãã€ã«ã劚ãããã®ã¯äœããããŸããããå®éã«ã¯ã¡ã¢ãªã¢ãã«ããªããããããã¯åºæ¬çã«panic!
å¥ã®æ¹æ³ã§ãã usize::MAX
ãã€ããå²ãåœãŠãŸãã
!
ãZSTã§ããã®ã«å¯ŸããŠãç¡é/ usize::MAX
ãµã€ãºãæã€ã¹ãã§ããããšã¯ç§ã«ã¯æããã§ã¯ãªãããã§ãã
use std::mem::size_of;
enum Void {}
fn main() { println!("{}", size_of::<Void>()); }
çŸåšã¯0ã§ãã
çç±ã¯ãã¬ã³ããªã³ã°ãããããã¹ãã§èª¬æãããŸããã
bool
ïŒ2ã€ã®æå¹ãªå€=> logïŒ2ïŒ/ logïŒ2ïŒ= 1ããã
()
ïŒ1ã€ã®æå¹ãªå€=> logïŒ1ïŒ/ logïŒ2ïŒ= 0ããã
!
ïŒ0æå¹ãªå€=> logïŒ0ïŒ/ logïŒ2ïŒ= Infããã
é¢é£ããçè«ã«ç²ŸéããŠããªã人ãšããŠãç§ã¯ãçè«ã¢ãã«ã®åªé
ããè¿œããããŠå®çšæ§ãæãªãéãã log(x)/log(y)
å
¬åŒã«åºå·ããŠãããšæããŸãã ïŒå¥åãèªåã®å©çã«ã¯è³¢ãããïŒ
çŽæçã«ã¯ã !
ããŒããµã€ãºã§ããå¿
èŠãããããã§ããçç±ã¯æ¬¡ã®ãšããã§ãã
bool
ïŒåã·ã¹ãã ã«å ããŠã2ã€ã®æå¹ãªå€ãåºå¥ããããã®ã¹ããŒã¹ãå¿
èŠ=> logïŒ2ïŒ/ logïŒ2ïŒ= 1ããã()
ïŒ1ã€ã®æå¹ãªå€ãåºå¥ããããã«ã¹ããŒã¹ãå¿
èŠ=>åã·ã¹ãã 以å€ã«ã¹ããŒã¹ã¯å¿
èŠãããŸãã!
ïŒæå¹ãªå€ãåºå¥ããããã«ã¹ããŒã¹ãå¿
èŠ=>åã·ã¹ãã 以å€ã«ã¹ããŒã¹ã¯å¿
èŠãããŸãããããšãããã¯å®éã«ã¯ç¡é倧ã§ããããã¯ãïŒãé 眮ããã®ã§çã«ããªã£ãŠããŸãã ãã£ãŒã«ããæ§é äœã«å€æãããšãåºæ¬çã«æ§é äœãïŒã«å€æãããŸãã åæ§ã«ïŒc + -inf = -infïŒã ãããã£ãŠãusizeãæ±ã£ãŠããã®ã§ã0ã¯ãããè¡šãããã«å¿ èŠãªæãè¿ãå€ã§ãã ïŒrustcã§ã®å®éã®å®è£ ã§ã-infã䜿çšããŠãããšæããŸãïŒã
çŽæçã«ã¯ã
!
ããŒããµã€ãºã§ããå¿ èŠãããããã§ã
!
ã¯ããã®ã¿ã€ãã§äœæãããå€ããªãããããµã€ãºã¯ãŸã£ããå¿
èŠãããŸããã ããã¯ç¡é¢ä¿ãªè³ªåã§ãã
0æå¹ãªå€=> logïŒ0ïŒ/ logïŒ2ïŒ= Infããã
logïŒ0ïŒã¯æªå®çŸ©ã§ãã ããã¯ç¡éã§ã¯ãããŸããã
äžæ¹ã usize::MAX
ãµã€ãºãæã€ããšã¯ãç¡äººã匷å¶ããããã®åä»ãªæ¹æ³ã§ãã åæïŒ
@CryZe @varkor
ããã¯ãç§ã劥åœæ§ãæšè«ããããšããŠããæŠå¿µãšãäžèŽããŸããç§ã®çŽæã§ã¯ã !
ãããŸã£ããå¥ã®ã¬ãã«ã®ZSTããšèŠãªããããšèããŠããŸãã ïŒã€ãŸãã !
ã¯åã·ã¹ãã ã«å¯Ÿãããã®ã§ããã ()
ã¯ã¡ã¢ãªå²ãåœãŠã«å¯Ÿãããã®ã§ããïŒ
@CryZe
æ°åŒ-Inf + c == -Inf
ã¯çã«ããªã£ãŠããŸããã -Inf
ã0usize
ã«çœ®ãæãããšããã以äžä¿æãããªããªããŸãã
äžæ¹ãç®è¡æŒç®ããäžéä»ããã®å ŽåããªãŒããŒãããŒã¯usize::MAX
èšç®ããã usize::MAX
ã¯æ°åŒã«å®å
šã«é©åããŸãã
è³ã¢ãã«ïŒã¿ã€ã!
ãªããžã§ã¯ããããå Žåããããå«ãæ§é äœãå²ãåœãŠãã«ã¯ã !
ãããããã«å€§ããªæ§é äœãå¿
èŠã§ãããã€ã¡ãŒãžã§ããæ倧ã®æ§é äœãµã€ãºã¯usize::MAX
ã ãããã£ãŠãå¿
èŠãªã¹ããŒã¹ã¯ãŸã usize::MAX
ã§ãã
voidåãå«ãŸããããããã¿ã€ãã®çç±ã ãã§ã¯ãªãã "ã¯ã©ã³ã"ã®ãµã€ãºïŒ !
ããŸãã¯ãŠãŒã¶ãŒå®çŸ©enum Void {}
ïŒãšsize=0,alignment=0
ïŒ ããã¯ç§ã«ã¯ã¯ããã«æå³çã«è³¢æãªããã§ã...
@remexre
ããã¯æ©èœããªãããã§ãã äŸïŒ sizeof(Result<usize,!>) == sizeof(usize)
ã
ãããšã Result<usize, !>
ã¯!
çŽæ¥å«ãŸããŠããŸããã sizeof(Result::Ok(usize)) == 8
ã sizeof(Result::Err(!)) == 0
ãããã sizeof(Result::Err(!)) == usize::MAX
ãç§ã®ææ¡ã§ã¯Result::Err(!) :: Result<!,!>
ã§ãã
ã«ãŒã«ã¯æ¬¡ã®ããã«ãªããŸãã enum
ã®å Žåã !
ã®ãµã€ãºã¯ä»ã®ãã¹ãŠã®ãµã€ãºå€ãããå°ãããšèŠãªãããŸããã structs
å Žåãããã¯ç»ååã§ããæ倧ãµã€ãºã§ãã
çµè«ïŒ
!
ã¯DSTã§ã¯ãããŸããã DSTã¯Sized
ã¯ãããŸããããµã€ãºããªãããã§ã¯ãªãããµã€ãºæ
å ±ãé衚瀺ã«ãªã£ãŠããããã§ãã ãããã !
ç§ãã¡ã¯ããã«ã€ããŠãã¹ãŠç¥ã£ãŠããŸãã!
ãµã€ãºãèšå®ããå¿
èŠãããããã Box::new(x as !)
ã¯å°ãªããšãã³ã³ãã€ã«ã§ããããã«ããå¿
èŠããããŸããstruct
sãå«ãŸ!
ãããããããã®ããã«å¯žæ³æ±ºããããã¹ãã§ãã!
ã enum
sãå«ãŸ!
ããªã¢ã³ãã«directallyã®ãããªå€§ããããã¹ãã§ããã®ããªã¢ã³ããååšããªãå Žåãsizeof(!)==0
ãŸãã¯sizeof(!)==usize::MAX
ãããããæ€èšããå Žåãäžèšãå¯èœã«ããããã«ããã€ãã®ç¹å¥ãªç®è¡ãå°å
¥ããå¿
èŠããããŸãã
sizeof(!)==0
ïŒæ§é äœã 0 + n = 0
ïŒå¿é
ïŒãåæåã max(0,n) = n
ïŒèµ€é¢ïŒã
sizeof(!)==usize::MAX
ïŒæ§é äœã usize::MAX + n =usize::MAX
ïŒneutral_face ïŒãåæåã max(usize::MAX,n) = n
ïŒãã©ãã·ã¥ïŒã
ãã ãã usize::MAX
ã«ã¯ã¡ãªããããããŸããå®éã®ã·ã¹ãã ã§ã¯äžå¯èœãªããã unsafe
ã§ãã£ãŠãããã®ãããªãªããžã§ã¯ããæ§ç¯ããããšããè©Šã¿ãæè¡çã«é²æ¢ããŸãã
ãã ããusize :: MAXã«ã¯å©ç¹ããããŸããå®éã®ã·ã¹ãã ã§ã¯äžå¯èœãªãããå®å šã§ãªããªããžã§ã¯ãã§ãã£ãŠãããã®ãããªãªããžã§ã¯ããæ§ç¯ããããšããè©Šã¿ãæè¡çã«é²æ¢ããŸãã
ç§ãããã°ãæå³unsafe
ïŒããã³ãèš±å¯ãããŠãã*transmute::<Box<usize>, Box<!>>(Box::new(0))
ç§ã«ååŸ!
é¢ãããããã®ãµã€ãºã®ã usize::MAX
ã¯ã誰ããstd::mem::zeroed<!>()
ãå®è¡ããããšãããšãã³ã³ãã€ã©ããšã©ãŒã«ãªãå¯èœæ§ãé«ããªããšæããŸãããæ°åŠã§ã¯ãªãããã®å±éºãªã³ãŒããæžããŠãã人ã«è²¬ä»»ãè² ãããŸãäžèšã®å¥åŠãã
ãµã€ãºã_actually _ 0
!
MAX
ã§ã-INF
-saturated-to-0ã§ããªãïŒã¯ãéšåçãªåæåãåŠçããããã«å¿
èŠã§ããããšã«æ³šæããŠãã ããã https://github.com/rust-lang/rust/issues/49298#issuecomment -380844923ã«ããhttps://github.com/rust-lang/rust/pull/50622ã«å®è£
ãããŠããŸãïŒã
ãããã©ã®ããã«æ©èœããããå€æŽãããå Žåã¯ããã®ããã®æ°ããåé¡ãŸãã¯PRãäœæããŠãã ããã ããã¯å Žæã§ã¯ãããŸããã
@remexre
Box::new : T -> Box<U> where T <: U, T: Sized
Box
ã¯ïŒã»ãšãã©ïŒã©ã€ãã©ãªã¿ã€ãã§ããããã®new
ã¡ãœããã¯src/liballoc/boxed.rs
Rustæ§æã§å®çŸ©ãããŠããŸãã 説æã§ã¯ãRustã«ååšããªã<:
æŒç®åãæ³å®ããŠããŸãã ããã¯ãRustã®ãµãã¿ã€ããã©ã€ãã¿ã€ã ãã©ã¡ãŒã¿ãŒãä»ããŠã®ã¿ååšããããã§ãã ãã£ãšèªãã ãèŠãããããå ŽåïŒ
!
ä»»æã®åã«åŒ·å¶ããããšãã§ããŸãããããã¯ã©ã®ã¿ã€ãã®ãã®ããã匱ãã§ãã ïŒããšãã°ã Vec<&'static Foo>
ã¯ã©ã®'a
ã§ãVec<&'a Foo>
ã§ããã Vec<!>
ããVec<Foo>
ãžã®æé»ã®å€æã¯ãããŸããïŒhttpïŒ/ /play.rust-lang.org/?gist=82d1c1e1fc707d804a57c483a3e0198f&version=nightly&mode=debug&edition=2015ïŒ
unsafe
ã¢ãŒãã§é©åã ãšæãããšã¯äœã§ãã§ãããšããèãã ãšæããŸãããè³¢æã«è¡ããªããšUBã«çŽé¢ããå¿
èŠããããŸãã !
ã®å
¬åŒãµã€ãºãusize::MAX
å Žåãããã¯ããã®ã¿ã€ããã€ã³ã¹ã¿ã³ã¹åãããªãããã«ãŠãŒã¶ãŒã«ååã«èŠåããå¿
èŠããããŸãã
ãŸããã¢ã©ã€ã³ã¡ã³ãã«ã€ããŠãèããŠããŸããã ç¡äººã¿ã€ãã®ãµã€ãºãusize::MAX
å Žåããã®é
眮ãusize::MAX
ã«èšå®ããã®ãèªç¶ã§ãã ããã«ãããæå¹ãªãã€ã³ã¿ãnullãã€ã³ã¿ã«å¶éãããŸãã ããããå®çŸ©äžãnullãã€ã³ã¿ãŒã¯ç¡å¹ã§ããããããã®ã¿ã€ãã®æå¹ãªãã€ã³ããããããŸãããããã¯ããã®å Žåã«æé©ã§ãã
@ScottAbbey
Box::new(x as !)
åé¡ããªãããšã確èªããããã«ãã®åé¡ã«çŠç¹ãåœãŠãŠããã®ã§ããããå®å®ãããããšãã§ããŸãã ææ¡ãããæ¹æ³ã¯ã !
ãµã€ãºãæãããããšã§ãã ZSTãæšæºã®å Žåã¯ãåé¡ãªãã¯ãã§ãã ç§ã¯ããè°è«ããŠããŸããã sizeof(!)==0
ãå®è¡ã§ããããã«å®è£
ããã ãã§ãã
ãã®é 眮ãèšå®ããã®ãèªç¶ã§ã:: MAX
usize::MAX
ã¯2ã®çŽ¯ä¹ã§ã¯ãªããããæå¹ãªé
眮ã§ã¯ãããŸããã ãŸããLLVMã¯1 << 29
ãè¶
ããã¢ã©ã€ã¡ã³ãããµããŒãããŠããŸããã ãããŠã !
ããããããšã«ãã倧ããªã¢ã©ã€ã¡ã³ããæã€ã¹ãã§ã¯ãããŸããlet x: (!, i32); x.1 = 4;
ãã¹ã¿ãã¯ã®4ãã€ãã®ã¿ãåãå¿
èŠããããã®ã¬ãã€ããŸãã¯-以äžã§ã¯ãããŸããã
ç¶è¡ããå Žåã¯ããã®ãã£ã¹ã«ãã·ã§ã³ã®æ°ããã¹ã¬ãã@earthengineãäœæããŠãã ããã
ããã§çºçããåé¡ã¯ã Box::new(!)
ãBox<$0>
ã§ããã Box<Error>
äºæ³ãããããšã§ãã ååãªå泚éãããã°ã Box<$0>
ãBox<Error>
ã«åŒ·å¶å€æããå¿
èŠããããŸããããã«ãããåŸã§$0
ããã©ã«ãã§!
ãŸãã
ãã ãã $0
ã¯åå€æ°ã§ããããã匷å¶ã¯è¡ãããã $0 = Error
ååŸããŸãã
ç©äºãä¿®æ£ããããã®ããããŒãªãªãã·ã§ã³ã®1ã€ã¯ãå¶çŽ$0: Sized
ïŒãµãã¿ã€ãã«ç¶ãïŒïŒãããããšãèŠã€ããããã«ããŒèšå®ããã匷å¶ãæ¿å
¥ããããšã§ããããã«ããã Box
ãåŒãç¶ãã¿ã€ãã§åŒã³åºãããŸãã
æã
ã¯ãã§ã«æ€åºããããããã®ãããªäœãFn
ããã¯ããã®ãããªã¹ãã¬ããã§ã¯ãããŸããã®ã§ãééäžãã ãŸã éãã
ããã ãã§ãã匷å¶äžã«$0: Unsize<Y>
ã®åœ¢åŒã®çŸ©åãçºçããå Žåã Y
ã¯ééããªããµã€ãºèšå®ãããŠãããã $0
ã¯ééããªããµã€ãºèšå®ãããŠããŸããããããããŸãããšããŠæ±ãã®ã§ã¯ãªããããããOKããšããŠæ±ãããµã€ãºã®ãªã匷å¶ãç¶è¡ããŸãã
@ arielb1
ã§ã¯ãããã¯Box::new(())
ããBox<Debug>
ãžã®åŒ·å¶ãšã©ã®ããã«éãã®ã§ããããã std::error::Error
ã¯Debug
ãããªç¹æ§ã§ããã [u8]
ãããªã¿ã€ãã§ã¯ãããŸããã std::io::Error
ã¯ã¿ã€ãã§ããã Sized
ã§ãã
次ã®ãããªåé¡ã¯çºçããŸããã
use std::fmt::Debug;
fn f(x:()) -> Box<Debug> {
Box::new(x)
}
fn main() {
}
@earthengineãã®åé¡ãšã³ãŒãã®éãã¯æ¬¡ã®ãšããã§ãã
| æžããã| Box::new(!): Box<Debug>
| Box::new(()): Box<Debug>
|
| ------ | ------ | ------- |
| å®è¡æžã¿| Box::new(! as Debug): Debug
| (Box::new(()) as Box<Debug>): Debug
|
åºæ¬çã«ã !
ã¯äœã«ã§ã匷å¶å€æã§ããããã Box::new
åŒã³åºãåã«Debug
ã«åŒ·å¶å€æãããŸãã ããã¯()
ãªãã·ã§ã³ã§ã¯ãªãããã2çªç®ã®ã±ãŒã¹ã§ã¯åé¡ã¯ãããŸããã Box::new
åŸã«åŒ·å¶ãçºç
@RalfJung
ç§ã®è³ã®ã¢ãã«ã¯ãDSTã¯éçã§ã¯ååšã§ããªããšãããã®ã§ã-ãããã¯ããã€ãã®ããå
·äœçãªã¿ã€ãããæ¥ãªããã°ãªããŸããã ããã¯ãDSTããã©ã¡ãŒã¿ãŒäœçœ®ã§èš±å¯ããå Žåã«ãåœãŠã¯ãŸããŸãïŒæ»ãäœçœ®ã§ã¯ãªãå ŽåïŒã ãšã¯èšããã®ã®ãå®éã®å€ããã§ã«ãã€ã³ã¿ãŒã®åŸãã«é
眮ããããŸã§ãããã!
ã§ãã£ãŠããDSTã«åãããããšãã§ããªãã¯ãã§ãã
ããšãã°ã以äžã¯ã³ã³ãã€ã«ããªãã§ãã ããã
let v: str = !;
let v: [u8] = !;
let v: dyn Debug = !;
!
ãæ¢åã®RuståŒã«çœ®ãæããŠã³ã³ãã€ã«ããããšãã§ããªããšããçç±ã ãã§ã
ç·šé
ããã¯ïŒïŒã®ãªãã·ã§ã³ã§ã¯ãããŸãã
ã ãã誰ããçç±ã説æã§ããŸããïŒ () as dyn Debug
ãã³ã³ãã€ã«ãããªãå Žåã ! as dyn Debug
ã¯ã³ã³ãã€ã«ãããŸããããã®éãåæ§ã§ãã &() as &Debug
ã³ã³ãã€ã«ãããã®ã§ã &! as &Debug
ãåé¡ãããŸããã () as dyn Debug
ããã€ãã³ã³ãã€ã«ãããå¯èœæ§ãããå Žåãä»æ¥ã®åé¡ã¯()
ã§ç¹°ãè¿ããããããDST RFCå®è£
è
ã¯ãããåãå
¥ããå¿
èŠããããåãåé¡ã解決ããŸãã !
ã
!
ã¯ååšããããšãäžå¯èœã§ãããããäœã«ã§ã匷å¶ããŸãã ãExfalsoquodlibetãã ãããã£ãŠããã¹ãŠã®äŸãã³ã³ãã€ã«ãã
!
ãååšã§ããªããããããã¯ãDTSã¯ååšã§ããŸãããã«ãéåããŸããã :)
() as dyn Debug
ã¯ã³ã³ãã€ã«ãããŸãã
ãµã€ãºã®ãªãå³èŸºå€ã®èšç»ã¯ããããŸãããããããã³ã³ãã€ã«ã§ãããšæããŸããïŒ
éèŠãªã®ã¯ãããã!
ã«å¯ŸããŠå®è¡ããå Žåããããã³ãŒãã§ã®ã¿çºçããå¯èœæ§ãããããããµã€ãºå€æŽãããŠããªãå³èŸºå€ãå®è£
ããå¿
èŠããªããšããããšã§ãã
ãã ããããã§èãããã解決çã瀺ããŠããå¯èœæ§ããããŸãïŒ @ arielb1ãäžèšã§ææ¡ãããã®ã§ãïŒïŒã¿ãŒã²ããã¿ã€ããïŒæ¢ç¥ã®ïŒãµã€ãºã®å Žåã«ã®ã¿é©çšãããããã«!
匷å¶ãå¶éããããšã¯å¯èœã§ããïŒ ïŒ ãããè¡ãããã®é©åãªçè«ççç±ã¯ãããŸããããå®çš
ãDTSã¯ååšã§ããªãããšèšã£ããšããç§ã¯æ§æçã«æå³ããŸãã ããšãã°ãå
¥åãããããŒã«ã«å€æ°ãstr
ã«ããããšã¯ã§ããŸããã
äžæ¹ã !
ã¯ååšã§ããŸããããæå³ããããŸãã ããªãã¯æžãã
let v = exit(0);
v
æ§æçã«!
ãšå
¥åããŸãããåå ãšããŠããã€ã³ãã£ã³ã°ã¯å®è¡ãããªããããçŸå®ã®äžçã§ã¯çµäºããŸããã
ãããã£ãŠãçç±ã¯æ¬¡ã®ãšããã§ããåãåã®åŒãèšè¿°ã§ããå Žåã«ã®ã¿ã !
ãä»»æã®åã«åŒ·å¶å€æã§ããŸãã åãæ§æçã«ååšããããšããã§ããªãå Žåãããã¯èš±å¯ãããã¹ãã§ã¯ãããŸããã
ããã¯ãµã€ãºãªãã®å³èŸºå€ã«ãåœãŠã¯ãŸãããããµã€ãºãªãã®å³èŸºå€ãååŸããåã«ããµã€ãºãªãã®å³èŸºå€ã®åŠçæ¹æ³ãããããŸã§ããµã€ãºãªãã®åã«!
ã匷å¶å€æããããšã¯ã§ããŸããã ãããŠããã®æç¹ã§ã®ã¿ããã®åé¡ã«ã€ããŠèãå§ããããšãã§ããŸãïŒ1ã€ã®æçœãªè§£æ±ºçã¯ã Box::new
ããµã€ãºã®ãªãå€ãåãåãããšãèš±å¯ããããšã§ããããã§ãïŒã
ããšãã°ãå ¥åãããããŒã«ã«å€æ°ãstrã«ããããšã¯ã§ããŸããã
ããã¯çŸåšã®å®è£ ã®å¶éã«ãããŸããïŒ https ïŒ
@RalfJung
ããã¯ããã§ã¯åé¡ã§ã¯ãããŸããã
ããã§ãã Box::new(!: $0): Box<dyn fmt::Debug>
ã$0
ãåå€æ°ã§ããç¶æ³ã«ãããšä»®å®ããŸãã
次ã«ãã³ã³ãã€ã©ã¯$0: Sized
ãããªãç°¡åã«æšæž¬ã§ããŸãïŒ $0
ã¯T: Sized
ãã€ã³ããããBox::new
ã®åãã©ã¡ãŒã¿ã«çããããïŒã
åé¡ã¯ãã³ã³ãã€ã©ãBox<$0>
ãBox<dyn fmt::Debug>
ã«å€æããããã«äœ¿çšãã匷å¶ã®çš®é¡ãææ¡ããå¿
èŠãããå Žåã«çºçããŸãã ãããŒã«ã«ãPOVããã2ã€ã®è§£æ±ºçããããŸãã
CoerceUnsized
匷å¶ãããã Box<$0>: CoerceUnsized<Box<dyn fmt::Debug>>
å¿
èŠã§ãã ããã¯$0 = !
æå¹ãªããã°ã©ã ã§ãããããã©ã«ãã§ã¯ããã«ã³ã³ãã€ã«ãããŸãã$0 = dyn fmt::Debug
ãã¢ã€ãã³ãã£ãã£ã®åŒ·å¶ããããŸãã ããã¯ã $0: Sized
èŠä»¶ãšççŸããŠããŸããã³ã³ãã€ã©ãŒã¯ããããŸãããèæ
®ãããšãã«ããŸãå€ãã®ãã®ãéããªãããã«ããŸããããã¯ãããã©ãŒãã³ã¹ã®åé¡ãšãããã°ãé£ããåé¡ã®äž¡æ¹ãåŒãèµ·ããå¯èœæ§ããããããããªãæããªæ¹æ³ã§äœ¿çšãã匷å¶ãéžæããŸãïŒç¹ã«ã T: CoerceUnsized<T>
ããªããããã³ã³ãã€ã©ããªãã·ã§ã³1ãéžæãããšãéåžžã«ç°¡åã«ãã¹ã¿ãã¯ãããå¯èœæ§ããããŸãïŒããªãã·ã§ã³2ãéžæããããšã«ãªãã倱æããŸãã ç§ã¯ãããããå°ãè³¢ãããŠãªãã·ã§ã³1ãéžã¶ãšããèããæã£ãŠããŸããã
ãããã£ãŠããã®POVãããããèãããšãæ£ããèãã¯ã次ã®å Žåã«ãµã€ãºã®ãªã匷å¶ãããªã¬ãŒããããšãããããŸããã
$ 0 = dyn fmt :: Debugã§ID匷å¶ãè¡ããŸãã ããã¯ã$ 0ïŒãµã€ãºã®èŠä»¶ãšççŸããŠããŸãã
let v: str=!
èš±å¯ããå¿
èŠãããã®ã«ã let v: str;
èš±å¯ããªãçç±ã¯ã»ãšãã©ããããŸããã ç¹å®ã®åã§å€æ°ã宣èšããããšããã§ããªãå ŽåããªãïŒããããäžå¯èœãªïŒå€ãããã«ãã€ã³ãã§ããã®ã§ããããïŒ
ãµã€ãºãªãã®å³èŸºå€ãåºè·ãããªãå Žåãäžè²«ããæ¹æ³ã¯ããµã€ãºãªãã®åãžã®åŒ·å¶ãèš±å¯ããªãããšã§ããããã¯ãæ³åäžã®å Žåã§ãããµã€ãºãªãã®å³èŸºå€ãïŒããããäžæçã«ïŒäœæããããã§ãã
ãããã£ãŠãç§ã®çµè«ã¯ã Box::new(!) as Box<Error>
åé¡ã¯ã !
ã¿ã€ãã§ã¯ãªãããµã€ãºã®ãªãå³èŸºå€ã®ããããã³ã°ã®åé¡ã§ãããšããããšã§ãã !
匷å¶ã«ãŒã«ã¯æ¬¡ã®ããã«ãªããŸãã
let v: T = !
æžãããšãã§ããå Žåã«éããlet v: T
ãæžãããšãã§ããŸãã
ãã®åŸãå®éã®æå³ã¯èšèªã§è©äŸ¡ãããŸãã ç¹ã«ããµã€ãºå€æŽãããŠããªãå³èŸºå€ããããšã Box::new(! as dyn Debug)
ãããã®åã¯ãããããšèšããŸãã
ã§ã¯ãåé²ããããã«äœãã§ããã§ããããã
ãµã€ãºãªãã®åŒ·å¶ãããªã¬ãŒããæ©èœã²ãŒããã³ãŒãã«è¿œå ããŸãããµã€ãºãªãã®å³èŸºå€ããªã³ã®å Žåã¯ããã®åŒ·å¶ãè©ŠããŠãã ããããã以å€ã®å Žåã¯ã¹ãããããŠãã ããã ãããå¯äžã®å©çšå¯èœãªåŒ·å¶ã§ããå Žåããšã©ãŒã¡ãã»ãŒãžã¯ãåæ§ã®å Žåã®ããã«ããç¹æ§å¢çstr: std::marker::Sized
ãæºããããŠããŸãããã§ããå¿
èŠããããŸãã ãã
ããã¯ããã倧ããªé¢æ°ã®ããã©ãŒãã³ã¹ãæãªãããšãªãèšç®ã§ããããšã確èªããå¿ èŠããããŸãã
察åŠãããŸãïŒåçŽãªæ©èœãã§ãã¯ã
äžæ¹ããµã€ãºå€æŽãããŠããªã
èå³æ·±ãã
ãã®
fn main() {
let _:str = *"";
}
ã³ã³ãã€ã«ããŸãã
fn main() {
let v:str = *"";
}
ããªãã ããã¯!
ã¿ã€ããšã¯é¢ä¿ãããŸããã ããã«ã€ããŠåé¡ãäœæããŸããïŒ
æåŸã®ãã®ãæ¬åœã«ãã°ãªã®ãã©ããã¯ããããŸããã 2çªç®ã®äŸã¯ã³ã³ãã€ã«ãããŸãããããã¯ããµã€ãºå€æŽãããŠããªãå³èŸºå€ã®ãµããŒãããªããšãã³ã³ãã€ã©ãŒãããŒã«ã«å€æ°v
ã«å²ãåœãŠãã¹ã¿ãã¯ã¹ããŒã¹ã®éãéçã«ç¥ãããããDSTã§ããããã«ã§ããªãããã§ãã
æåã®äŸã§ã¯ã _
ãã¿ãŒã³ã¯ãïŒããŒã«ã«å€æ°ã®ãã€ã³ãã£ã³ã°ãªã©ïŒäœãã«äžèŽããã ãã§ãªããå€æ°ããŸã£ããäœæããªããšããç¹ã§ç¹å¥ã§ãã ãããã£ãŠããã®ã³ãŒãã¯let
é€ããfn main() { *""; }
ãšåãã§ãã åç
§ïŒDSTã§ããïŒãéåç
§ããŠããçµæã«å¯ŸããŠäœãããªãããšã¯åœ¹ã«ç«ã¡ãŸããããããã¯æå¹ã§ããããã«æãããç¡å¹ã§ããã¹ãã ãšç§ã¯ç¢ºä¿¡ããŠããŸããã
å³ã ããããããã¯æ¬åœã«æ··ä¹±ããŠããŸããç¹ã«æ¬¡ã®
fn main() {
let _v:str = *"";
}
ã©ã¡ããã³ã³ãã€ã«ããŸããã _
ã«ã€ããŠã®ããªãã®çè«ã§ã¯ãããã¯ãæªäœ¿çšã®ãã®ãåã«_
ã§ã¯ãªã_v
ãšåŒã¶ããšãé€ããŠãåãã§ããã¯ãã§ãã
ç§ãèŠããŠããããšããã _v
ãšv
ã®å¯äžã®éãã¯ãå
é ã®äžç·ãæªäœ¿çšã®å€ã«é¢ããèŠåãæå¶ããŠããããšã§ãã
äžæ¹ã _
å
·äœçã«ã¯ãç Žæ£ããæå³ãããã¿ãŒã³å
ã®è€æ°ã®å ŽæïŒã¿ãã«ã®è§£åãåŒæ°ãªã¹ããªã©ïŒã«è¡šç€ºãããããã«ããããã«ç¹å¥ã«åŠçãããŸããååã®è¡çªã«é¢ãããšã©ãŒã
äžæ¹ã_ã¯å ·äœçã«ã¯ãç Žæ£ããæå³ããååã«é¢ãããšã©ãŒãçºçãããããšãªãããã¿ãŒã³å ã®è€æ°ã®å ŽæïŒã¿ãã«ã®è§£åãåŒæ°ãªã¹ããªã©ïŒã«è¡šç€ºã§ããããã«ããããã«ç¹å¥ã«åŠçãããŸããè¡çªã
æ£ããã ããªããèšã£ãããšã«å ããŠã let _ = foo()
ã¯drop
ãããã«åŒã³åºãããããšã«ã€ãªãããŸããã _v
ã¯ã¹ã³ãŒãå€ã«ãªã£ããšãã«ã®ã¿ãããããããŸãïŒ v
ããã«ïŒ ïŒã
確ãã«ãããã¯ç§ãã _
ã¯ç¹å¥ã ããšããæå³ã§ãã
ãã®ãããçŸåšããµã€ãºã®ãªããã¹ãŠã®å³èŸºå€ãæåŠããããšã¯ïŒæ©èœããµã€ãºã®ãªãå³èŸºå€ãããªã³ã«ãªã£ãŠããªãéãïŒé倧ãªå€æŽã«ãªãããã«èŠããŸãããå¹æã¯ã»ãšãã©ãªããšæããŸãã
ããã§ãã !
ãããµã€ãºã®ãªãå³èŸºå€ãžã®åŒ·å¶ãçŠæ¢ããæ©èœã²ãŒããçšæããããšããå§ãããŸãã ããã¯let _:str = return;
ãããªã³ãŒããæåŠããŸãããã³ãŒãã§ããã䜿çšãã人ã¯ããªããšæããŸãã
!
ã¿ã€ããäžå®å®ã§ããéãã匷å¶ã§ããå Žæãšã§ããªãå Žæã«é倧ãªå€æŽãå ããããšãã§ããŸãã
åé¡ã¯ã httpsïŒ//github.com/rust-lang/rust/issues/49593ãä¿®æ£ããããã«DSTã«åŒ·å¶ããã«å®å®ãããå ŽåãåŸã§ãµã€ãºã®ãªãå³èŸºå€ãè¿œå ãããšãã«ãã®ãããªåŒ·å¶ã埩å ãããã®ãããšããããšã§ãã https://github.com/rust-lang/rust/issues/49593ãåã³å£ãããšãªãããããããšãã§ã
ç§ã®ä»¥åã®ææ¡ã«ã¯ãããå«ãŸããŠããŸãã ïŒ49593ã¯ããµã€ãºå€æŽãããŠããªãå³èŸºå€ã®ãããã¯ã®åé¡ã«ãªãã¯ãã§ãã
æçµçãªè§£æ±ºçã«ã€ããŠã®ç§ã®å人çãªææ¡ã¯ã Box::new
ïŒä»ã®ããã€ãã®éèŠãªã¡ãœãããå«ãŸããå ŽåããããŸãïŒã«ãµã€ãºã®ãªããã©ã¡ãŒã¿ãŒãåãå
¥ããããåæ§ã®ç¶æ³ã§ãããŸããã蚱容ããããšã§ãã
FWIWã _
ã¯ç¹å¥ãªå€æ°åã®ãããªãã®ã§ã¯ãããããäžèŽããå Žæã«ã¯äœããå€ã§ã¯ãªãå Žæã§æ©èœããŸãã
å€æ°ãã€ã³ãã£ã³ã°ã«æãè¿ãã®ã¯ref _x
ã§ãããããã§ããããã«ããåçšã®ç«¶åãåé¿ããããã«NLLãå¿
èŠã«ãªãå¯èœæ§ããããŸãã ããã¯ãšããã§åäœããŸãïŒ
// The type `str` is the type of the place being matched. `x` has type `&str`.
let ref x: str = *"foo";
// Fully equivalent to this:
let x: &str = &*"foo";
@eddyb
ããªãã¯ç§ã®äž»åŒµãç解ã§ããŸããã§ããã ç§ã®æšæž¬ã§ã¯ãRustã«ã¯çŸåšããµã€ãºå€æŽãããŠããªãå³èŸºå€ã¯ã³ãŒãã«ãŸã£ãã衚瀺ãããŸããã ãã ãã let _:str = *""
ã«è¡šç€ºãããããšãããããŸããã ãã®ãããªäŸ¡å€ã¯ããã«çããããšãã§ããŸãããã·ã³ã¿ãã£ãã¯ã¬ãã«ã§ã¯çããŠããŸãã 幜éã®ãããªãã®...
代ããã«ãããªãã®äŸã¯æè¡çã«å®å
šã«åæ³ã§ãããããã¯éèŠã§ã¯ãããŸããã str
ã¯ãµã€ãºèšå®ãããŠããŸãããã &str
ã¯ãµã€ãºèšå®ãããŠããŸãã
ãã ããlet _ïŒstr = * ""ã«è¡šç€ºãããããšãããããŸããã ãã®ãããªäŸ¡å€ã¯ããã«çããããšãã§ããŸãããã·ã³ã¿ãã£ãã¯ã¬ãã«ã§ã¯çããŠããŸãã 幜éã®ãããªãã®...
&*foo
ãããªåŒã«ãåæ§ã®ããŽãŒã¹ããããããŸãã æåã«foo
ãéåç
§ãã次ã«çµæã移åããã«çµæã®ã¢ãã¬ã¹ãååŸããŸãã ãããã£ãŠãããšãã°& { *foo }
ãšåãã§ã¯ãããŸããã
@earthengine @SimonSapinãµã€ãºå€æŽãããŠããªãå³èŸºå€ïŒãå€åŒãïŒã¯ååšããŸããã 巊蟺å€ïŒãå Žæã®åŒãïŒã®ã¿ãå®è¡ããŸãã *"foo"
ã¯å Žæã§ããããã¿ãŒã³ãããã³ã°ã«ã¯å€ã¯å¿
èŠãªããå Žæã®ã¿ãå¿
èŠã§ãã
å称ã巊蟺å€ããšãå³èŸºå€ã¯ããéã§éºç©ãšå€å°ããŸãã«ãCã§èª€è§£ãæãããããã«æªåããŠããã®ã§ã let
ã®RHSã¯ãååã«ããããããã ã巊蟺å€ãïŒå ŽæåŒïŒãã§ãã
ïŒä»£å
¥åŒã¯ãCã®ååãšã«ãŒã«ãRustã§æå³ããªãå¯äžã®å Žæã§ãïŒ
ããªãã®äŸã let x = *"foo";
ã§ã¯ãå€ã¯x
ã«ãã€ã³ãããããã«å¿
èŠã§ãã
åæ§ã«ã &*"foo"
ã¯å ŽæåŒãäœæãããããåçšããŸãããµã€ãºãªãã®å€ãäœæããå¿
èŠã¯ãããŸãããã {*"foo"}
ã¯åžžã«å€åŒã§ããããããµã€ãºãªãã®åã¯èš±å¯ãããŸããã
https://github.com/rust-lang/rust/pull/52420ã§ç§ã¯ãããæã£ã
let Ok(b): Result<B, !> = ...;
b
åäœããªããªããŸããã ããã¯æå³çãªãã®ã§ããïŒ
AFAIKã¯ã-ééãã®ãªããã¿ãŒã³ã¹ããŒãªãŒã¯è€éã§ã !
èªäœãšã¯å¥ã®æ©èœã²ãŒãããããŸãã https://github.com/rust-lang/rfcs/pull/1872ããã³https://github.com/rust-lang/rust/issues/48950ãåç
§ããŠ
@ Ericson2314å
·äœçã«ã¯ã liballoc
ã«è¿œå ããå¿
èŠãããæ©èœã¯exhaustive_patterns
ã§ãã
ããããšãïŒïŒ
å éšã«é¢ããèå³æ·±ãäŒè©±ïŒ
rust
fn make_iter() -> impl Iterator<Item=u32> {
unimplemented!() // Error: ! does not implement Iterator
}
!
ã¯ãé¢é£ããä»»æã®åã«å¯ŸããŠIterator
ãå®è£
ã§ããªãã£ãå¯èœæ§ãããããã§ãã<! as Trait>::Assoc
åæšè«å€æ°ãçæãããŸããããfn foo<T:Trait>() -> (T::Assoc, T::Assoc)
ãåãåã®2ã€ãçæããããšãä¿èšŒãããããã«ããããã«å¿
èŠã«ãªããŸããtypemap
ã¯ã¬ãŒãã¯äžå¥å
šã«ãªããŸããããªãããããããã€ãããªãããªãæ²»çããŸãããïŒ æšè«å€æ°ãšããŠããèªäœïŒ
ã¢ã€ãã ã¿ã€ããæ確ã«ããããã«ã PhandomData
!
åšãã«ã©ãããŒãäœæããã ãã§ãã
https://github.com/rust-lang/rust/issues/49593ãä¿®æ£ãããŸããã ãããã以åã®å®å®åã®åŸ©åž°ã®çç±ã§ããã 以åã®å®å®åã¬ããŒãã¯ãã¡ãã§ãã ãããããäžåºŠè©ŠããŠã¿ãŸãããïŒ
@rfcbotfcpããŒãž
rfcbotã¯ãåãåé¡ã§è€æ°ã®FCPããµããŒãããå¯èœæ§ããããšæããŸãã ãã®ã©ãŠã³ãã®å®å®åã®ããã«æ°ããåé¡ãéããŸãããã
https://github.com/rust-lang/rust/pull/50121å®å®åãå ã«æ»ãã ãã§ãªãããã©ãŒã«ããã¯ã»ãã³ãã£ã¯ã¹ãå ã«æ»ããŸããã ããã¯ç§ãã¡ãå蚪ããããã®ã§ããïŒ
åé¡ã®èª¬æã®æ®ãã®ãã§ãã¯ãããŠããªããã§ãã¯ããã¯ã¹ã¯æ¬¡ã®ãšããã§ãã
!
ã«å¯ŸããŠã©ã®ãããªç¹æ§ãå®è£ ããå¿ èŠããããŸããïŒ æåã®PRïŒ35162ã«ã¯ãOrd
ãšãã®ä»ã®ããã€ããå«ãŸããŠããŸãã ããã¯ããããT-libsã®åé¡ã§ããããããã®ã¿ã°ãåé¡ã«è¿œå ããŸãã
åŸã§implãè¿œå ã§ããŸããã ãããšãããã¯ãããã«ãŒã§ããïŒ
@SimonSapinãhttps://github.com/rust-lang/rust/issues/57012ãéããŸããã ãã®å€æŽã®äžç°ãšããŠã !
ãžã®ãã©ãŒã«ããã¯ãåã³æå¹ã«ãªãããšãæåŸ
ããŠããŸãïŒãã ããå®å®åã®åé¡ã«ã€ããŠã¯èª¬æããŸãïŒã
çžäºåç §ïŒ https ïŒ
ã©ããããæ©èœã²ãŒãã®åŸãã«æ±ºããŠå ¥åããªãããšã«ã¯ãã°/ç©ŽããããStableã§ãããåç §ããããšãã§ããŸãïŒ //github.com/rust-lang/rust/issues/33417#issuecomment -467053097
ç·šéïŒ https ïŒ //github.com/rust-lang/rust/issues/58733ã«æåº
äžã«ãªã³ã¯ãããŠããã³ãŒãäŸã«ã¿ã€ãã®äœ¿çšãè¿œå ããŸãã
trait MyTrait {
type Output;
}
impl<T> MyTrait for fn() -> T {
type Output = T;
}
type Void = <fn() -> ! as MyTrait>::Output;
fn main() {
let _a: Void;
}
ããã¯Rust1.12.0ã§ã³ã³ãã€ã«ãããŸããããã¯ã ãŸãã 1.11.0ã§ã¯ã次ã®ãšã©ãŒãçºçããŸãã
error: the trait bound `fn() -> !: MyTrait` is not satisfied [--explain E0277]
--> a.rs:12:13
|>
12 |> let _a: Void;
|> ^^^^
help: the following implementations were found:
help: <fn() -> T as MyTrait>
error: aborting due to previous error
ããã®ç¶æ ã¯ã©ãã§ããïŒ
ç§ã®ç¥ãéãã httpsïŒ //github.com/rust-lang/rust/issues/57012#issuecomment -467889706ã®èŠçŽä»¥éãã¹ããŒã¿ã¹ã¯å€§å¹ ã«å€æŽãããŠããŸããã
ããã®ç¶æ ã¯ã©ãã§ããïŒ
@hosunrise ïŒçŸåšhttps://github.com/rust-lang/rust/issues/67225ã§ãããã¯ãããŠã
ç§ã¯ããããé¢ããŠãããããããŸããããlintãã£ã¹ã«ãã·ã§ã³ïŒhttps://github.com/rust-lang/rust/issues/66173ïŒã§èšåââãããŠããç¹å®ã®åé¡ã¯ããã¹ãŠã®åæåã«!
ãã©ã³ããããå Žåãäž¡æ¹ãšã解決ã§ããããã§ããåã·ã¹ãã ïŒ
https://github.com/rust-lang/rust/issues/67225ã®OPã«èšèŒãããŠããåé¡ã«ã¯é©çšãããªãããšã«æ³šæããŠ
ç§ã¯ããããé¢ããŠãããããããŸããããlintã®è°è«ïŒïŒ66173ïŒãèšåããŠããç¹å®ã®åé¡ã¯ããã¹ãŠã®åæåã«åã·ã¹ãã ã«
!
ãã©ã³ããããå Žåãäž¡æ¹ãšã解決ã§ããããã«èŠããŸããïŒ
å®éã«ã¯ãçºçããå¯èœæ§ã®ãªãããªã¢ã³ããç¡æ°ã«ããããããã¹ãŠã®åæåãè åšã«ãããããå¯èœæ§ããããŸãããããã£ãŠãããããã¹ãŠã«èšåãã䟡å€ã¯ãããŸããã
æãåèã«ãªãã³ã¡ã³ã
@petrochenkov
!
ãå¿ããŠãåæåãèŠãŠãã ããã2ã€ã®ããªã¢ã³ããæã€åæåãããå Žåã2ã€ã®ã±ãŒã¹ã§äžèŽãããããšãã§ããŸãã
ããã¯ã2ã€ã ãã§ãªããä»»æã®nã§æ©èœããŸãã ãããã£ãŠãããªã¢ã³ãããŒãã®åæåãããå Žåã¯ãã±ãŒã¹ãªãã§äžèŽãããããšãã§ããŸãã
ãããŸã§ã¯é 調ã§ããã ãããããã¹ãããããã¿ãŒã³ã§äžèŽãããããšãããšã©ããªããèŠãŠã¿ãŸãããã ããã¯ã
Result
å ã®2ã€ã®ããªã¢ã³ãã®åæåã§ã®ãããã³ã°ã§ããå åŽã®ãã¿ãŒã³ãå€åŽã®ãã¿ãŒã³ã®å åŽã«æ¡åŒµã§ããŸãã
Foo
ããªãšãŒã·ã§ã³ã¯2ã€ãããããErr
ã«ã¯2ã€ã®ã±ãŒã¹ããããŸããResult
ãšFoo
ãç §åããããã«ãåå¥ã®matchã¹ããŒãã¡ã³ãã¯å¿ èŠãããŸããã ããã¯ãä»»æã®æ°ã®ããªã¢ã³ããæã€åæåã§æ©èœããŸã..._ãŒããé€ã_ããªããããæ©èœããªãã®ã§ããïŒ ç§ã¯ãããä¿®æ£ããããšãç¡äººã¿ã€ãã®ãç¹å¥ãªãµããŒãããè¿œå ããããšãšã¯åŒã³ãŸãããç§ã¯ãããççŸãä¿®æ£ããããšãšåŒã³ãŸãã