!
륌 ì íìŒë¡ ì¹ê²©ìí€ë rust-lang/rfcs#1216ì ì¶ì 묞ì ì
ëë€.
()
íê· https://github.com/rust-lang/rust/issues/67225íì!
ì¬êž°ì ëí WIP 구íìŽ ììµëë€. https://github.com/canndrew/rust/tree/bang_type_coerced
íì¬ ìíë old-transë¡ ë¹ëëê³ ì¬ì© ê°ë¥íì§ë§ ëª ê°ì§ í
ì€ížì ì€íšíìµëë€. ìŒë¶ í
ì€ížë if (return) {}
ì ê°ì ìœëê° ížëìì
ì€ì 충ëì ìŒìŒí€ë ë²ê·žë¡ ìžíŽ ì€íší©ëë€. ë€ë¥ž í
ì€ížë ë§í¬ ìê° ìµì íì êŽë šìŽ ììŒë©° íì ë²ê·žê° ììŽì ë³ê²œ ì¬í곌 êŽë šìŽ ìëì§ ëªšë¥Žê² ìµëë€.
íì¬ ë¡ë맵ì ë€ì곌 ê°ìµëë€.
FnOutput
, FnDiverging
ë° êŽë š í목)ìì ì¬ì©ëì§ ìë ë¶êž° í목ì ì ê±°í©ëë€.!
ë ë°í ìì¹ìì ì íìŒë¡ë§ 구묞 ë¶ìë ì ììµëë€.()
ì
ëë€.()
ê° ížë ìì íŽê²°íë ë° ì¬ì©ëìì ë ížíì± ê²œê³ ë¥Œ ë°ììí€ë ë°©ë²ì ìì볎ìžì. ìŽë¥Œ ìííë í ê°ì§ ë°©ë²ì DefaultedUnit
ëŒë ì ì íì ASTì ì¶ê°íë ê²ì
ëë€. ìŽ ì íì ()
ì²ëŒ ìëíë©° ìŽë€ ìí©ììë ()
ë¡ ë°ëì§ë§ í¹ì±ì íŽê²°í ë ê²œê³ ë¥Œ ë°ììíµëë€( ()
). ìŽ ì ê·Œ ë°©ìì 묞ì ë 구í ì 몚ë ë²ê·žë¥Œ í¬ì°©íê³ ìì íë ê²ìŽ ìŽë €ìž ê²ìŽëŒê³ ìê°í©ëë€. ìœëê° ê¹šì§ë ê²ì ë°©ì§íêž° ìíŽ ì¬ëë€ì ìœë륌 깚ëšëŠ¬ê² ë ê²ì
ëë€.ìŽ ëª©ë¡ì ì¶ê°íŽìŒ í ì¬íìŽ ììµëê¹? ì ë§ ìŽ ìŒì íê³ ìë 걎ê°ì? ê·žëŠ¬ê³ ìŽ ëžëì¹ë¥Œ ë©ìž 늬í¬ì§í ëŠ¬ë¡ ì®ê²šìŒ í©ëê¹?
Ʞ볞
()
ê° ížë ìì íŽê²°íë ë° ì¬ì©ë ë ížíì± ê²œê³ ë¥Œ ë°ììí€ë ë°©ë²ì ìì볎ìžì. ìŽë¥Œ ìííë í ê°ì§ ë°©ë²ì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://github.com/rust-lang/rfcs/pull/1637
묞ì ë !
ê° Trait
륌 구ííë ê²œì° !Trait
ë 구ííŽìŒ íë€ë ê²ì
ëë€.
묞ì ë ë§ìœ ! Traitì 구íí©ëë€. !Traitë 구ííŽìŒ í©ëë€.
ê·žë° ë€ì í¹ì± ì구 ì¬íì 묎ìíëë¡ í¹ì ìŒìŽì€ !
?
@tomaka !
ì í¹ì±ìŽ ì ì ë©ìë ë° êŽë š ì í/ìì륌 ê°ì§ ì ìêž° ë묞ì _all_ í¹ì±ì ìëìŒë¡ 구íí ì ììµëë€. ë¹ì ì ë©ìë(ì: Self
ì ì¬ì©íë ë©ìë)ë§ ìë í¹ì±ì ìëìŒë¡ 구íí ì ììµëë€.
!Trait
êŽíŽìë ëêµ°ê° !
ê° Trait
_and_ !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
)ìŽë©° ìë§ë íë ëë ë ê° ë ìì ê²ì
ëë€. ìŽê²ìŽ ì구ëë ë°ìë ëë¶ë¶ í©ë¹í ìŽì ê° ììµëë€. ìŒë°ì ìŒë¡ ë§íìë©Ž, ì§ííŽìŒ í ì¬ë¬ ê°ì§ ë°©ë²ìŽ ììŒë©° ìŽë€ ë°©ë²ì íí ì§ ëªšë¥Žë©Ž ì§íí ì ììµëë€. (ì ì¬ì ìŒë¡ ìœë륌 늬í©í ë§íì¬ ìŽë¬í ìêµ¬ê° ìŒì¢
ì "ë³Žë¥ ì묎"ë¡ ë±ë¡ë ì ìì§ë§ ê·žë ê² íë ê²ì ë³µì¡í©ëë€.)
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 ë€, ìì ëìŽë ë²ê·ž ì€ íëì ëë€.
@lfairy ìì€ , ìëš ì²Ží¬ë°ì€ì ëìŽëì§ ììì 못
From<!> for T
ë° Add<T> for !
( !
ì ì¶ë ¥ ì í ì¬ì©)ì 구íí ê³íìŽ ììµëê¹? ì ë§ ìŽìíê² êµ¬ì²Žì ìž ìì²ìŽëŒë ê²ì ìëë€. ìŽ PR ìì ë ë€ ì¬ì©íë €ê³ í©ëë€.
From<!> for T
íì€í. Add<T> for !
ë ìë§ë libs íìŽ ê²°ì í ìŒìŽì§ë§ ê°ìžì ìŒë¡ !
ë ë
ŒëŠ¬ì ìŽê³ íì€ì ìž êµ¬íìŽ ìë 몚ë í¹ì±ì 구ííŽìŒ íë€ê³ ìê°í©ëë€.
@canndrew ê°ì¬í©ëë€! ëë 몚ë ì íì íì ì íìž ì€ì¹ŒëŒì Nothing
í¹ì±ì ìµìíë¯ë¡ ê°ìŽ ëíë ì ìë ê±°ì 몚ë ê³³ìì ì¬ì©í ì ììµëë€. ê·žë¬ë impl All for !
ëë ìŽì ì ì¬í ê²ìŽ í¹í ë¶ì ì ìž í¹ì± 겜ê³ì êŽë šíì¬ Rustì ì í ìì€í
ì 믞ì¹ë ìí¥ì ìŽíŽíë €ë ìŽë§ìë íì€í ê³µê°í©ëë€.
https://github.com/rust-lang/rfcs/issues/1723#issuecomment -241595070 From<!> for T
ì ìŒêŽì± 묞ì ê° ììµëë€.
ì ë§ë€. ìŽì ëíŽ ì¡°ì¹ë¥Œ ì·šíŽìŒ í©ëë€.
í¹ì± implsê° ë€ë¥ž í¹ì± implsì ìíŽ ì¬ì ìëšì ëª ìì ìŒë¡ ëª ìí ì ìë€ë©Ž ì¢ì ê²ì ëë€. ë€ì곌 ê°ì ê²:
impl<T> From<T> for T
overridden_by<T> From<!> for T
{ ... }
impl<T> From<!> for T { ... }
ìŽê±° ì 묞í ìëëì? ížì§ : ìŽê²ìŽ 격ì impl ê·ì¹ìŽëŒê³ ìê°í©ëë€.
묎ìžëì ëí í¹ë³ì§ìì ìµëí íŒíë ê²ìŽ ê°ë¥í ëììžê°?
ìŽ ëªšë match (res: Res<A, !>) { Ok(a) /* No Err */ }
, Result
ëí í¹ì ë©ìë ë êž°ë¥ì ìí êž°ë¥ì²ëŒ ë§€ì° ê³ ìë ê²ì²ëŒ 볎ìŽë©° ë
žë ¥ê³Œ ë³µì¡ì±ì ëí ê°ì¹ê° ìë ê² ê°ìµëë€.
!
ê° @canndrew ì ì ìì© êž°ë¥ìŽëŒë ê²ì ìŽíŽíê³ ê·žë ë ê°ë°íꞰ륌 ìíì§ë§ ì²ìë¶í° ì못ë ë°©í¥ìŒë¡ ê°ê³ #12609ë ë²ê·žë ìëëë€.
@petrochenkov #12609ë Never ì íì í¹ì êž°ë¥ìŽ ìëëë€. ë¶ëª í ëë¬í ì ìë ìŒë¶ ìœë륌 ê°ì§íêž° ìí ë²ê·ž ìì ì ëë€.
@petrochenkov !
ììŽë²ëŠ¬ê³ ìŽê±°íë§ ë³Žìžì.
ë ê°ì§ ë³íìŽ ìë ìŽê±°íìŽ ìë ê²œì° ë ê°ì§ 겜ì°ì ìŒì¹ìí¬ ì ììµëë€.
enum Foo {
Flim,
Flam,
}
let foo: Foo = ...;
match foo {
Foo::Flim => ...,
Foo::Flam => ...,
}
ìŽê²ì 2ê°ê° ìë 몚ë nì ëíŽ ìëí©ëë€. ë°ëŒì ë³íìŽ ìë ìŽê±°íìŽ ìë ê²œì° ìŒìŽì€ê° ìë ìŽê±°í곌 ìŒì¹ìí¬ ì ììµëë€.
enum Void {
}
let void: Void = ...;
match void {
}
ì¬íê¹ì§ë ê·žë°ëë¡ ìëë€. íì§ë§ ì€ì²©ë íšíŽì ëíŽ ìŒì¹ìí€ë €ê³ íë©Ž ìŽë€ ìŒìŽ ë°ìíëì§ ë³Žììì€. ë€ìì Result
ëŽë¶ì ë ê°ì§ ë³í ìŽê±°íì ëí ìŒì¹ì
ëë€.
enum Foo {
Flim,
Flam,
}
let result_foo: Result<T, Foo> = ...;
match result_foo {
Ok(t) => ...,
Err(Flim) => ...,
Err(Flam) => ...,
}
ìžë¶ íšíŽ ëŽë¶ì ëŽë¶ íšíŽì íì¥í ì ììµëë€. ë ê°ì Foo
ë³íìŽ ììŒë¯ë¡ Err
ëí ë ê°ì§ 겜ì°ê° ììµëë€. Result
ë° Foo
ìì ìŒì¹ìí€êž° ìíŽ ë³ëì ìŒì¹ ë¬žìŽ íìíì§ ììµëë€. ìŽê²ì ì¬ë¬ ë³íìŽ ìë ìŽê±°íì ëíŽ ìëí©ëë€... _0 ì ìž_.
enum Void {
}
let result_void: Result<T, Void> = ...;
match result_void {
Ok(t) => ...,
// ERROR!
}
ì ìŽê²ìŽ ìëíì§ ìììŒ í©ëê¹? ëë ìŽê²ì ìì ìŽëŒê³ ë¶ë¥Žì§ ìê³ ë¬Žìž ì íì ëí "í¹ë³ ì§ì"ì ì¶ê°íë ê²ì ë¶ìŒì¹ ìì ìŽëŒê³ ë¶ëŠ ëë€.
@petrochenkov ìë§ë ë¹ì ìŽ ë§í ê²ì ì€íŽíì ê²ì ëë€. #12609 ì€ë ëìì ë Œìë ë ê°ì§ ì§ë¬žìŽ ììµëë€.
(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), ìŠ, ëë¬í ì ìë íšíŽì 볎ížëŒêž°(lint)ë¡ ë§ëë ê²ìŽ í©ëŠ¬ì ìŒ ì ììŒë©°, 거죌íì§ ìë ì íì êŽê³ììŽ íë ì€ë¥ê° ìëëë€. RFC 1445 ìë ìŽê²ìŽ ì ì ì©í ì ìëì§ì ëí ë ë§ì ìê° í¬íšëìŽ ììµëë€.
(0)ì êŽíŽì ëë ë¹ì ì ì€ëª ì ë€ì íì ìŽ ììµëë€. ìŽ ì²Žê³ê° 컎íìŒë¬ì íšíŽ ê²ì¬ 구íì ìì°ì€ëœê² ëì¬ ìê³ ì¶ê°íë ê²ë³Žë€ ë ë§ì í¹ì ìœë륌 ì ê±°íë€ë©Ž ëë ìì í êž°ì ê²ì ëë€.
귞걎 ê·žë ê³ , ëë ì¬êž°ìì (0)ì ìì íêž° ìíŽ PRì íìµëë€: https://github.com/rust-lang/rust/pull/36476
ìŽ ì²Žê³ê° 컎íìŒë¬ì íšíŽ ê²ì¬ 구íì ìì°ì€ëœê² ëì¬ ìê³ ì¶ê°íë ê²ë³Žë€ ë ë§ì í¹ì ìœë륌 ì ê±°íë€ë©Ž ëë ìì í êž°ì ê²ì ëë€.
ìŽìíê²ë ê·žë ì§ ììµëë€. ê·žë¬ë ê·žê²ì ìë§ë ì°ìí ë°©ë²ìŽ ìꞰ볎ë€ë êž°ì¡Ž ìœëì íŽí¹í ë°©ìì ìžê³µë¬ŒìŒ ê²ì ëë€.
맀í¬ë¡ì ê²œì° (1)ìŽ ìŽë €ìŽ ì€ë¥ê° ìë ê²ìŽ ì ì©íë€ê³ ìê°í©ëë€.
(1) Ʞ볞ì ìŒë¡ 컎íìŒëìŽìŒ íì§ë§ ë€ì곌 ê°ì 늰ížìì ê²œê³ ë¥Œ ì ê³µíŽìŒ íë€ê³ ìê°í©ëë€.
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
ì í(ëë ì í ìŽë¡ ì "0" ì í)곌 ëìŒíë€ê³ ìê°íë ììŽëìŽì ë°ëí©ëë€. ë ë€ ê°ì¹ë ì¬ë¡ë¥Œ ê°ì§ ìë ìì§ë§ ìë¡ ë€ë¥ž ì묌ì
ëë€.
ëŽ ìê°ì 맚 ìë ì íì ë°í ì íì ëíëŽë 몚ë 컚í ì€ížììë§ ëíë ì ììµëë€. ì륌 ë€ìŽ,
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 ë ì¢ ë¥ì 거죌í ì ìë ì í ì¬ìŽì ìŽë¬í 구ë¶ì ëì íë ê²(ëŽ ëìë ìì í ìžê³µì ìž)ì ìŽì ì 묎ìì ëê¹?
ìŽë¬í 구ë¶ìŽ ìë ë§ì ìŽì ê° ì êž°ëììµëë€. ì륌 ë€ìŽ Result<!, E>
륌 ìì±í ì ìê³ , ìŽê²ìŽ ë¶êž° íšìì ìííê² ìíž ìì©íë©Žì Result
ì ëí 몚ëë ì°ì°ì ê³ì ì¬ì©í ì ììµëë€ map
ë° map_err
.
íšìí íë¡ê·žëë°ìì ë¹ ì í( zero
)ì íšìê° ë°ííì§ ìê±°ë ê°ìŽ ì¡Žì¬íì§ ìëë€ë ì¬ì€ì ìžìœë©íë ë° ì죌 ì¬ì©ë©ëë€. bottom
ì íìŽëŒê³ íë©Ž ì í ìŽë¡ ì ìŽë€ ê°ë
ì ë§íëì§ ëª
ííì§ ììµëë€. ìŒë°ì ìŒë¡ bottom
ë 몚ë ì íì íì ì íìž ì íì ìŽëŠì
ëë€. ê·žë¬ë ê·žë° ì믞ìì !
ìë bottom
ê° ìëëë€. ê·žë¬ë ë€ì zero
ê° bottom
ì íìŽ ìë ê²ì ì í ìŽë¡ ìì ë묞 ìŒìŽ ìëëë€.
ìŠ,
!
ìEmpty
ì¬ìŽìë 귌볞ì ìž ì°šìŽê° ììµëë€.!
ì íì ë³ì륌 ì ìží ì ìì§ë§Empty
ëíŽìë ê·žë ê² í ì ììµëë€. .
ìŽê²ìŽ ìŽ RFCê° ìì íê³ ìë ê²ì
ëë€. !
ë ì íì²ëŒ ì¬ì©í ì ìë€ë©Ž ì€ì ë¡ "ì í"ìŽ ìëëë€.
@RalfJung
ìŽë¬í ê°ë
ì ì í ë
ŒëŠ¬ https://en.wikipedia.org/wiki/Linear_logic ìì ê°ì žìš ê²ì
ëë€.
ìŽ êžì ìŽì êžì ì€íê° ììŽ ìì íìµëë€. ëŽê° ê·žê²ì ì»ìŒë©Ž ìŽê²ì ì ë°ìŽíž í ê²ì ëë€.
top
ë ê°ë¥í 몚ë ë°©ë²ìŒë¡ ì¬ì©í ì ìë ê°ì ëë€.
ìëžíìŽíìì ìŽê²ì 묎ìì ì믞í©ëê¹? ê·žê²ì ìŽë€ ì íìŽ ë ì ììµëê¹? ìëíë©Ž ê·žê²ì bottom
ìŽêž° ë묞ì
ëë€.
@eddyb ì ê° ì€ì륌 íìµëë€. ìë¡ìŽ ì ë°ìŽížë¥Œ êž°ë€ë €ì£Œìžì.
í룚 ë§ì ë³í©ë ìŽ PR ì í ë¬ ëê² ê²í ì€ìž ëŽ íšíŽ ìŒì¹ PR 곌 ë§€ì° ì¬íê² ì¶©ëí©ëë€. ì£ì¡í©ëë€ . 첫 ë²ì§ž íšíŽ ìŒì¹ PR ìŽíë¡
ffs ë ìë€
@canndrew argh , ì£ì¡í©ëë€. =(ì€ëë ë¹ì ì PRì r+í ê³íìŽìëë°...
ì£ì¡í©ëë€. ì§ì§ê±°ëŠ¬ê³ ì¶ì§ë ìì§ë§ ìŽ ìŒìŽ ê³ìëê³ ììµëë€. í ë²ì ì¬ë¬ PRì ì ì§íë ê²ì í¬êž°íê³ ì§êžì 9ìë¶í° ìŽ í ê°ì§ ë³ê²œ ì¬íì ì ì©íë €ê³ ë žë ¥íê³ ììµëë€. 묞ì ì ìŒë¶ë ìê°ëì ì°šìŽëŒê³ ìê°í©ëë€. ì ê° ì¹šëì ëì ìë ëììë 몚ë ìšëŒìž ìíìŽë¯ë¡ ìŽ ë¬žì ì ëíŽ ìŽìŒêž°íêž°ê° ìŽë µìµëë€.
ììžê° ì í ìì€í ìì ë ŒëŠ¬ì ìŽê³ íìí 구ë©ìŽëŒë ì ì ê°ìí ë !륌 ì¬ì©íì¬ ë ê³µìì ìŒë¡ ììžë¥Œ ì²ëŠ¬íë ë°©í¥ìŒë¡ ì§ì§íê² ìê°í ì¬ëìŽ ìëì§ ê¶êží©ëë€.
https://is.gd/4EC1Dk 륌 ìì ìŽì ì°žì¡°ì ìŒë¡ ì¬ì©íê³ , ê·žê²ì ì§ëì¹ë©Ž ìŽë»ê² ë ê¹ì?
1) íšëì ìŒìŒí¬ ì ìì§ë§ ì€ë¥ë¥Œ ë°ííì§ ìë íšì륌 ì²ëŠ¬íê±°ë 결곌ì ì í ìëª
ìŽ ììì ìŒë¡ -> Foo
ìì -> Result<Foo,!>
2) any
결곌types would have their Error types implicitly be converted to
enum AnonMyErrWrapper { Die(!),Error}```
3) ìŽí! 거죌í ì ìë í¬êž°ê° 0ìž êŽê³ ì
ëë€. ì í ê°ì ë³ííë ë° ëë ë¹ì©ìŽ ììŒë©°, ìŽì ë²ì 곌 ížíëëë¡ ììì ë³íìŽ ì¶ê°ë ì ììµëë€.
ë¬Œë¡ ìŽì ì ììžê° ì í ìì€í ìŒë¡ íšê³Œì ìŒë¡ ë€ìŽ ì¬ë €ì§ê³ ìŽì ëíŽ ì¶ë¡ íê³ ì ì ë¶ìì ìííë ë±ìŽ ê°ë¥íë€ë ê²ì ëë€.
ëë ìŽê²ìŽ êž°ì ì ìž êŽì ìŽ ìëëŒë©Ž 컀뮀ëí° êŽì ìì ...ì¬ìíì§ ìì ê²ìŽëŒë ê²ì ìê³ ììµëë€. :)
ëí ìŽê²ì ìë§ë 믞ëì ê°ë¥í íšê³Œ ìì€í 곌 ê²¹ì¹ ê²ì ëë€.
@tupshin ìµìí ë§ì 첎조 ììŽë íêž°ì ìž ë³íì
ëë€. ëª
íì±ì ìíë€ë©Ž íŽì 륌 ë¹íì±ííê³ "결곌"륌 ìëìŒë¡ ì¬ì©íë ê²ìŽ ì¢ìµëë€. [ê·žëŠ¬ê³ btw, ìŽ ë¬žì ë ì€ì ë¡ ê·žë° ê²ì ì êž°í ì¥ìê° ìëëë€. !
ì ëììžì ë¹ì ìŽ ë¬žì 륌 ì êž°íë ê²ìŽ ìëë¯ë¡ ìŽê²ì ìì í 믞ëì ìì
ì
ëë€.]
ëë ì ìŽë ì€ìí 첎조ì ê·žê²ìŽ ìì í 믞ëì ìì ìŽëŒë ê³µì í ì§ì ììŽë ê·žê²ì 깚ëšëŠŽ ì ìë€ë ê²ì ìê³ ììµëë€. ê·žëŠ¬ê³ ì, ëë ê³íë ê²ì ë§€ì° ë§ì¡±í©ëë€! ìŽëê¹ì§ë. :)
@nikomatsakis ë³Žë¥ ì€ìž 묞ì ì êŽë šíì¬ ìŽ ë ê°ì§ë¥Œ íìží ì ììµëë€.
- #35162ì ìœë ì 늬, expr_ty륌 ížì¶íë ëì ë°í ìì¹ë¥Œ íµíŽ typeck륌 ì€ë ë ì íìŒë¡ ì¬êµ¬ì±í©ëë€.
- ì±ë¥ìì ì¬ëìŽ ìŽì§ ìë ì íì ì²ëŠ¬ íŽê²°
ëë ìŽê²ìì ë ë€ë¥ž ê· ìŽì ììí ê²ì ëë€.
- ()ì ìì¡Žíë ì¬ëë€ì ëí ê²œê³ ë¥Œ 구ííë ë°©ë²: íŽë¹ ëììŽ ë¯žëì ë³ê²œë ì ìë í¹ì± íŽë°±?
TyTuple
ì íë귞륌 ì¶ê°íì¬ ë¶êž° ì í ë³ì륌 Ʞ볞ê°ìŒë¡ ì€ì í ë€ì í¹ì± ì íìì íŽë¹ íë귞륌 íìžíì¬ ìì±ëììì ëíëŒ ê³íì
ëë€.
@canndrew
ì ë TyTupleì íë귞륌 ì¶ê°íì¬ ë¶êž° ì í ë³ì륌 Ʞ볞ê°ìŒë¡ ì€ì í ë€ì í¹ì± ì íìì íŽë¹ íë귞륌 íìžíì¬ ìì±ëììì ëíëŒ ê³íì ëë€.
í° íìž!
êžì, ìŽì©ë©Ž ì¢ì. =) ì믞ì ëìŒí ë ê°ì§ ì í( ()
vs ()
)ì ê°ë ê²ì ìœê° ë³µì¡íê² ë€ëŠ¬ì§ë§, ë ì¢ì ë°©ë²ì ìê°ëì§ ììµëë€. =( ê·žëŠ¬ê³ ì§ì ëë¶ì ìŽìšë ë§ì ìœëê° ìŽì ëë¹íŽìŒ í©ëë€.
ëŽ ë§ì TyTuple
boolì ì¶ê°íë€ë ê²ì
ëë€.
TyTuple(&'tcx Slice<Ty<'tcx>>, bool),
ìŽë ì°ëŠ¬ê° ìŽ (ëšì) ííìì í¹ì í¹ì±ì ì ííë €ê³ í ë ê²œê³ ë¥Œ ë°ìììŒìŒ íšì ëíë
ëë€. ìŽê²ì ë€ë¥ž TyDefaultedUnit
륌 ì¶ê°íë ìë ì ê·Œ ë°©ìë³Žë€ ìì í©ëë€.
í ë²ì ê²œê³ ì£Œêž° ëìë§ íŽë¹ ë¶ìžì ì ì§íë©Ž ë©ëë€.
uninitialized
/ transmute
/ MaybeUninitialized
묞ì ì êŽë šíì¬ íëª
í ì¡°ì¹ë ë€ì곌 ê°ìµëë€.
MaybeUninitialized
ìì, íì€ ëŒìŽëžë¬ëŠ¬ì mem
uninitialized
íŽë¹ ì íì ì¬ëìŽ ê±°ì£Œíë ê²ìŒë¡ ìë €ì§ ìí륌 ì¶ê°íììì€. ê·žë ì§ ììŒë©Ž ìŽê²ìŽ 믞ëì ìŽë €ìŽ ì€ë¥ê° ë ê²ìŽëŒë ë©ëªšì íšê» ê²œê³ ë¥Œ ì¬ëŠœëë€. ëì MaybeUninitialized
ì¬ì©íë ê²ìŽ ì¢ìµëë€.transmute
ì "to" ì íìŽ "from" ì íìž ê²œì°ìë§ ì¬ëìŽ ê±°ì£Œíì§ ìëë€ë íìžì ì¶ê°í©ëë€. ë§ì°¬ê°ì§ë¡ íë ì€ë¥ê° ë ê²œê³ ë¥Œ ë°ììíµëë€.ìê°?
ìì ì±ì ëí ìµê·Œ ë³ê²œ ì¬íì ëíŽìë ìŽ ì€ë ë륌 ì°žì¡°íììì€.
&!
ì ì믞ì ëíŽ ìœê°ì ë¶ìŒì¹ê° ìë ê²ìŒë¡ 볎ì
ëë€. #39151 ìŽí never_type
êž°ë¥ ê²ìŽížê° íì±íë ìíìì 맀ì¹ìì ë¬Žìž ìíë¡ ì²ëŠ¬ë©ëë€.
!
ëí ìë í¹ì± implsê° ììŒë©Ž ì ìŽë std
ìì ì ì í í¹ì±ì 구ííë ê²ìŽ ë§€ì° ëììŽ ë ê²ì
ëë€. íë ê°ì ê±°ëí ì í void::Void
ê·žê²ìŽ ìžë¶ì ìŽê³ ìë€ë ê²ì
ëë€ std
ìëš ëŽì ìê³ impl<T> From<Void> for T
ê·ž íê³ ì€ë¥ ì²ëŠ¬ ë¶ê°ë¥íë€.
ëë ì ìŽë ìê° From<!>
몚ë ì¢
ë¥ì 구ííŽìŒíë©°, Error
, Display
ë° Debug
구íëìŽìŒíë€ !
.
몚ë ì íì ëíŽ ìµìí
From<!>
ê° êµ¬íëìŽìŒ íë€ê³ ìê°í©ëë€.
ìŽê²ì ë¶ííë From<T> for T
impl곌 충ëí©ëë€.
ìŽê²ì ë¶ííë
From<T> for T
impl곌 충ëí©ëë€.
ì ìŽë 격ì impl ì 묞íê° êµ¬íë ëê¹ì§ë.
ì¢ì ì . ìžì ê°ë ìì±ëꞰ륌 ë°ëëë€.
[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
in Fn
). ê·žëì !
ì ëí Fn*
í¹ì± íšë°ëŠ¬ë¥Œ ê·žëŒìë ë¶êµ¬íê³ ëªšë ì
ë ¥ ë° ì¶ë ¥ ì íì ëíŽ ìŒë°ì ìŽëë¡ êµ¬íí ì ììµëê¹?
몚ìëê² ë€ëŠœëë€. <! as Fn>::Output
ë ëšìŒ ì íìŒë¡ íŽìëìŽìŒ íì§ ììµëê¹?
<! as Fn>::Output
ì !
, ê·žë ì§ ììµëê¹?
ìŽë¡ ì <! as Fn>::Output
ì !
<! as Fn>::Output
ìŽìŽìŒ íì§ë§ íì¬ ì í ê²ì¬êž°ë ì°ê²°ë ì íìŽ ì íí ìŒì¹íꞰ륌 ìí©ëë€: https://is.gd/4Mkxfm
@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
ê° ìžìë ëê¹ì§ ì§ì°ëë ë€ë¥ž íŽê²° ë°©ë²ìŽ ììµëê¹?
ëŽ ë§ì, ëŽê° ì ì ë§íë¯ìŽ ì€ì ë¡ !
ì íìë ë ê°ì§ ë€ë¥ž ì¢
ë¥ê° ììµëë€. íëë ê²ìŒë¥Žê³ ë€ë¥ž íëë ìŽë§ì
ëë€. ìŒë°ì ìž íêž°ë²ì ìŽë§íë ê²ì ëíëŽì§ë§ ëë¡ë ê²ìŒë¥ž íêž°ë²ìŽ íìí ìë ììµëë€.
@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
typeìŽ !
ê²ì ë¶êž°íêž° ë묞ì
ëë€. return
ííìì 결곌륌 ì¬ì©íë ìœëë return
"ìë£"ëì§ ìêž° ë묞ì ì€íí ì ììµëë€.
oO &return
ìž ì ìëì§ ëª°ëìµëë€. ë§ìŽ ìëëë° ì return
ì 죌ì륌 íì©íŽìŒ í©ëê¹?^^
ê·žë¬ë ìŽìšë ìœëì @earthengine ìì ìžìë quit_with_print
ê° ížì¶ëêž° ì ì íê°ë©ëë€. ë ë²ì§ž ìžì륌 íê°íë©Ž return
ê° ì€íëìŽ íë¡ê·žëšìŽ ì¢
ë£ë©ëë€. ìŽê²ì foo({ return; 2 })
-- foo
ë ì€íëì§ ìë ê²ê³Œ ê°ìµëë€.
@RalfJung return
ë break
ëë continue
ì ê°ì break
!
ì íì ííìì
ëë€. ì íìŽ ìì§ë§ ê·ž ì íì 묎ìžëì
ëë€.
!
ìŽ(ê°) 구íëìŽ ìŽì 1ë
ëì ìŒê° ìì
ì íê³ ììµëë€. ìì í륌 ìíŽ ë¬Žìì íŽìŒ íëì§ ìê³ ì¶ìµëë€.
íŽê²°ëì§ ìì í ê°ì§ë !
(ì: uninitialized
, ptr::read
ë° transmute
)륌 ë°íí ì ìë ëŽì¥ íšìì ëíŽ ìíí ìì
ì
ëë€. uninitialized
, ë§ì§ë§ìŒë¡ MaybeUninit
ì í곌 ê°ë¥í 믞ë &in
, &out
, &uninit
륌 ìíŽ ë ìŽì ì¬ì©ëì§ ìììŒ íë€ë í©ìê° ìë€ê³ ë€ììµëë€ Inhabited
í¹ì±ì 구ííì§ ìë ì íì ëíŽìë§ uninitialized
ì¬ì© ì€ëšì ì ìí ìŽì 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
ëŽì¥ì ìì ííë ê²ìŽ íšì¬ ë«ìµëë€.
ìì í ì°šëšêž°ë ìëì§ë§(ìë¯žë¡ ìŽ ìëëŒ ì±ë¥ìŽêž° ë묞ì) Result<T, !>
ìŽ enum ë ìŽìììì !
ì 묎ìžë륌 ì¬ì©íì§ ìê±°ë codegen ìŒì¹: https://github.com /rust-lang/rust/issues/43278
ìŽê²ì ë묎 ë§ì°í ìê°ìŽìŽì ì¬êž°ì ë¹ ëšëŠ° ê²ì ëíŽ ê±°ì ì£ì± ê°ì ëëŒì§ë§:
ë¶í ìŽ !: Trait
구í곌 êŽë šíì¬ ë ìŽë €ìŽ ì§ë¬žì ëµíë ë° ëììŽ ë ì ììµëê¹?
@ExpHP ì ë ê·žë ê² ìê°íì§ ììµëë€. ì°êŽë ì í/constê° ìê³ ì ì ìŽ ìë ë©ìëë§ ìë í¹ì±ì ëíŽ !: Trait
ìë 구íì 걎ì í ê²ìŒë¡ ìë €ì ž ììµëë€. ì°ëŠ¬ê° íê³ ì¶ìì§ ìëì§ì 묞ì ìŒ ë¿ì
ëë€. ë€ë¥ž í¹ì±ì ëí ìë 구íì ì€ì ë¡ ìë¯žê° ììµëë€. 컎íìŒë¬ê° ì°ê²°ë ì í/ììì ëíŽ ììì ê°ì ìœì
íê³ ì첎 ììì ì ì ë©ìë impls륌 ë°ëª
íŽìŒ íêž° ë묞ì
ëë€.
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 ëë ë¹ì ìŽ ë§ë€ë €ë ìì ì ìì§ ëª»í©ëë€. ìžì€íŽì€ ììŽ íìì ëíŽ ì ì ë©ìë륌 ížì¶í ì ììµëë€. !
ìì "묎ììŽë ì»ì ì ìëì§" ì¬ë¶ë ê·žê²ê³Œ êŽë šìŽ ììµëë€.
!
type ìì ì묎ê²ë ì»ì ì ììŽìŒ í ìŽì ê° ììµëë€. ë¹ì ììì ì묎ê²ë ì»ì ì ìë€ !
ì ë¹ ì ì ë©ìë ìŽì ì
ëë€,íì§ë§ !
íë¡ê·žëëšžì ìŽë€ ê²°ì ì ììíì§ ìê³ ì ë í ììë€.
ëë ê·ì¹ìŽ ì íí 1 ì íš êµ¬íìŽ ì¡Žì¬íë ìŽë€ í¹ì± (ë³Žë€ ë ë§ì ì°šìŽë¥Œ ì¶ê° í ê²ë€ ì ìž êµ¬í ë ê²ì
ëë€ êž°ìµíêž° ì¬ìŽ ìê° !
ìŽë¯ž ë²ìì ììžì).
ì°ëŠ¬ê° ì¬ì©íë 몚ë ê²ì ê·žê²ê³Œ ê°ê±°ë ë 볎ìì ìŽìŽìŒ í©ëë€(ìë implsë ì í©íì§ ìì).
@Ericson2314 ê·žê² ë¬Žìš ë»ìžì§ ìŽíŽê°
@SimonSapin "no more divergence" ê·ì¹ì panic!()
ëë loop { }
ì ì믞íì§ë§ ìŽë¯ž ë²ìì ìë v: !
ë êŽì°®ìµëë€. ìŽë¬í ìì ì ìžíë©Ž ë§ì í¹ì±ì ì ëí ê°ë¥í íšì¶ìŽ íëë§ ììµëë€. ê·ž ì í ê²ì¬. (ë€ë¥ž ì¬ëë€ì 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 }
ìíì ìŒë¡ ë§íë©Ž !
ë "ìŽêž° ìì"ì
ëë€. ìŠ, ìžìì !
ê° ìë íì ìëª
ì ê²œì° ì íí íëì 구íìŽ ììµëë€. ìŠ, 몚ë 구íìŽ ëìŒí©ëë€. ìžë¶ìì êŽì°°ë©ëë€. 몚ë ížì¶í ì ìêž° ë묞ì
ëë€.
ì€ì ë¡ ìì í륌 ë°©íŽíë ê²ì 묎ìì
ëê¹? ëšì§ mem::uninitialized
ìí©ì
ëê¹ ìëë©Ž ë€ë¥ž ê²ì
ëê¹?
@arielb1 : #40800 곌 #40801 ë ë§ì°¬ê°ì§ìž ê² ê°ìì. ìŽê²ë€ìŽ ìŽë€ ìíìžì§ ììëê¹?
ìŽì ëíŽ ìŽë€ 묞ìê° ìì±ëìê±°ë ì¬ëë€ìŽ ìŽì ëíŽ ìì±í ê³íì ëê¹? std 묞ì(#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!
륌 ì¬ì©íŽìŒ íë nightly ì íì
ëë€. ìŽê²ì ìŒë°ì ìŒë¡ ë€ì곌 ê°ìŽ ìíë©ëë€.
#[naked]
unsafe fn error() -> ! {
asm!("hlt");
std::intrinsics::unreachable();
}
@Kixunil std::intrinics::unreachable()
륌 ì¬ì©íë©Ž ìŽì ìœëê° ë¶êž°ëšì ì íí ì§ì íì¬ ë ìœê² ìíí ì ììµëë€.
@Kixunil ìì í ë¡ ìì std::mem::uninitialized
ë !
륌 ë°íí ì ìì§ë§ ë³ê²œë ì ìë ê²ì²ëŒ 볎ì
ëê¹? ëŽê° ì못 ìŽíŽíê² ìëëŒë©Ž?
ìì í ë¡ ìì
std::mem::uninitialized
ë!
륌 ë°íí ì ìì§ë§ ë³ê²œë ì ìë ê²ì²ëŒ 볎ì ëê¹? ëŽê° ì못 ìŽíŽíê² ìëëŒë©Ž?
uninitialized
ë ê²°êµ ìì í ë ìŽì ì¬ì©ëì§ ìì ê²ìŽë©° !
ì íšê» ì¬ì©íë©Ž ì€ì§ ê°ê²©ìŒë¡ ë°íìì íšë ìíê° ë ê²ìŽëŒê³ ìê°í©ëë€(ìŽ ê²œì°ìë ìí¥ì 믞ì¹ì§ ìì).
ëí std::intrinsics::unreachable
륌 libcore ìŽëê°ì ìì ííê³ unchecked_unreachable
ëë unreachable!
맀í¬ë¡ì 구ë³í ì ìë ìŽëŠì ì§ì íŽìŒ íë€ê³ ìê°í©ëë€. ëë ê·žê²ì ìíŽ RFC륌 ìì±íë €ê³ íìµëë€.
@eddyb ì, asm!()
ê° ë¶ìì íë€ë ì¬ì€ì ììŽë²ë ž ìŒë std::intrinsics::unreachable()
ë ì¬ì©í ì ììµëë€.
@tbu- ë¬Œë¡ , ëë 묎ìžë륌 ë§ëë ê²ë³Žë€ ê·žê²ì ì íží©ëë€. 묞ì ë ë¶ìì íêž° ë묞ì ìœë ë¶êž°ë¥Œ ì°ê²°í ì ìë ê²ìŒë¡ ìì íì§ ìê² íìíë ê²ìŽ ìŽë»ê²ë ë¶ê°ë¥íë€ë©Ž êž°ì¡Ž ìœëê° ììë ë¿ë§ ìëëŒ ìì í ì ìê² ëë€ë ê²ì ëë€. ëë ê·žë¬í ê²ìŽ Rust ííì ì¬ê°í íŽë¥Œ ëŒì¹ ê²ìŽëŒê³ ìê°í©ëë€(í¹í ìì ì ìŽëŒê³ ìëì€ëœê² 죌ì¥íë 죌ì ê°ë°ì륌 ê³ ë €íë©Ž). ëŽê° Rust륌 ì¬ëíë ë§íŒ Rustê° ì ì©í ìžìŽëŒë ê²ì ë€ì ìê°íê² ë§ë€ ê²ì ëë€.
@Eroc33 ëŽ ìŽíŽë ìŽë€ ì¬ëë€ì ê·žê²ì ì ìíì§ë§ íì€í ê²°ì ìŽ ìë ëšìí ì ìì ëë€. ê·žëŠ¬ê³ ëë ê·žë¬í ì ìì ë°ëí©ëë€. ìëíë©Ž ê·žê²ìŽ ìížíì±ì ê¹šê³ Rustê° 2.0ìŽ ëëë¡ í ê²ìŽêž° ë묞ì ëë€. ì§ì§íë ë°ìë ì§ì¥ìŽ ìë€ê³ ìê°í©ëë€. ì¬ëë€ìŽ ë²ê·žë¥Œ ê±±ì íë€ë©Ž 늰ížê° ë ì ì í ê²ì ëë€.
@canndrew uninitialized
ê° ë ìŽì ì¬ì©ëì§ ìì ê²ìŽëŒê³ ìê°íë ìŽì ë 묎ìì
ëê¹? ëë ê·žë° ê²ì 믿ì ì ìë€. ëë ê·žê²ìŽ ë§€ì° ì ì©íë€ê³ ìê°íë¯ë¡ ì죌 ì¢ì ë첎íìŽ ìë€ë©Ž ê·žë ê² í ìŽì ê° ììµëë€.
ë§ì§ë§ìŒë¡ intrinsics::unreachable()
ê° íì¬ì íŽí¹ë³Žë€ ë«ë€ë ë° ëìíë€ë ì ì ê±°ë ê°ì¡°íê³ ì¶ìµëë€. ìŠ, ëë 충ë¶í ë첎íìŽ ìì ëê¹ì§ ìŽë¬í íŽí¹ì êžì§íê±°ë ì¬ì©íì§ ìë ê²ì ë°ëí©ëë€.
ìŽêž°íëì§ ìì ê²ì ëí ë첎ë í©ì§í© { !, T }ì
ëë€. ë¹ì ì ëë¬ í ì ììµëë€
ptr::read::<*const !>()ing ë° êž°í ì ì¬í ë°©ë²ìŽ ë§ìŽ ììµëë€.
2017ë
8ì 8ìŒ ì€í 3ì 58ë¶, "Martin HabovÅ¡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ìŒë¡ ë§ëëë€. ì§ì§íë ë°ìë ì§ì¥ìŽ ìë€ê³ ìê°í©ëë€.
ì¬ëë€ìŽ ë²ê·žë¥Œ ê±±ì íë€ë©Ž 늰ížê° ë ì ì í ê²ì ëë€.@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-ë¶ê±Žì í 묞ì 륌 ë³Žì§ ëª»íêž° ë묞ì ìŽì ëí ìë¡ìŽ 묞ì 륌 ì ì¶íìµëë€: #47563. [!; 0]
ì ì¬ëìŽ ìŽì§ ìëë€ê³ ê°ì íë ê² ê°ì§ë§ ê°ëší []
ë§ë€ ì ììµëë€.
@dtolnay ê° ìŽì í€ëì ì¶ê°ëš
@canndrew ìê° ì !
ì¬ì©ëì íì ì§í©ìŽ ìì íëꞰ륌 ë°ëëë€(ì벜í ê·ì¹ ì ìž). íì§ë§ ì°ëŠ¬ê° ìŽëì ìëì§ì ëí ì€ë§ëŠ¬ë¥Œ ììŽë²ë žê³ ì±íŒìžìŽ íìíë€ê³ ìê°í©ëë€. ë¹ì ì ê·ž ì¬ëìŽ ë ìê°ìŽ ììµëê¹?
@nikomatsakis ìŽ ìì ì ìê°ì í ì í ì ìì
@varkorë ìŽë¯ž ëëšžì§ ë¬žì 륌 íŽê²°íêž° ìíŽ PRì ìŽìŽ
ë ë€ë¥ž ê²ìŽì§ë§: ë°íìì mem::uninitialized::<!>()
íšëì ë§ë€ê³ ì¶ìµëê¹(íì¬ UB륌 ì ë°íš)? ìëë©Ž ì§êžì ê·žë° ì¢
ë¥ì ë³ê²œ ì¬íì ê·žëë¡ ëìŽìŒ í©ëê¹? ìì íì§ ìì ìœë ê°ìŽëëŒìžì ëí ìµì ì ë³Žê° ìëëë€.
ëë ê³íìŽ ì¬ì í https://github.com/rust-lang/rfcs/pull/1892 ëŒê³ ìê°í©ëë€. :)
@RalfJung í¹ë³í ë§ë ë¶ë¶ìŽ ìëì? ëë ì¶ê° ì€ë PR륌 ìì±í ì MaybeUninit
íê³ deprecates uninitialized
.
@canndrew ë§ì íë¡ì ížê° ìž ê°ì§ ëŠŽëŠ¬ì€ ì±ëì 몚ë ì§ìíꞰ륌 ìíê³ uninitialized
ê° ìì ë²ì ìì ì¬ì© ê°ë¥íêž° ë묞ì ìì ì±ëìì êµì²Žë¥Œ ì¬ì©í ì ìê² ë íìë§ Nightlyìì ì¬ì© ì€ëš ê²œê³ ë¥Œ ëŽë³ŽëŽë ê²ìŽ ì¢ìµëë€. 묞ì 죌ìì íµí ë¶ëë¬ìŽ ë¹ì¶ì²ì êŽì°®ìµëë€.
!
ìì í륌 ìí PRì ë§ë€ììµëë€ : https://github.com/rust-lang/rust/pull/47630. ìì§ ë³í©í ì€ë¹ê° ëìëì§ ëªšë¥Žê² ìµëë€. ì°ëŠ¬ë ì ìŽë @varkor ì PRìŽ ëëšžì§ ë¯žíŽê²° 묞ì 륌 íŽê²°íëì§ íìžíêž° ìíŽ êž°ë€ë €ìŒ í©ëë€.
ëí ì¬ëë€ìŽ !
ëí ì°ìí í¹ì± impls륌 ìì±í ì ìëë¡ 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 ë ìŽì í€ëì ì¶ê°ëìŽìŒ í©ëë€.
@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 ). !
ì íì ë€ë¥ž ì íìŒë¡ ê°ì ë³íë ì ììµëë€. ì륌 ë³Žë €ë©Ž https://github.com/rust-lang/rust/tree/master/src/test/run-fail/adjust_never.rs 륌 ì°žì¡° íì ì ì¶ë ìŽì ì íëì§ ìì íì ë³ì륌 !
ëì ()
í©ëë€. 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
êž°ë¥ ê²ìŽížë¥Œ ì¬ì©íì¬ ìì í ì ììµëë€. ìŽ ë¬žì ì ëí ì§í ìí©ì RFC 1872 륌 ì°žì¡°íììì€. ìŽ ëììŽ ì¬ì í ê²ìŽížìì íìžíë í
ì€íž ìŒìŽì€ë 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ìì ì€íëë êž°ì¡Ž ë¶í구ì íšê» ìŒêŽ ì²ëŠ¬í ì ììµëê¹?
ìë£.
@rfcbot fcp ë³í©
ì¬êž°ì ì€ëª
ë ëë¡ !
ì í ëë ê·ž ìŒë¶ë¥Œ ìì í í ê²ì ì ìí©ëë€. íë³Žê° ì¬êž° ììµëë€ .
ëŽê° ìíë ë°ìŽí° ì€ íëë ë¶í구 ì€íì ëë€. ì ë https://github.com/rust-lang/rust/pull/47630(@canndrew ê° ì§êž pingì ìëµíì§ ìêž° ë묞ì)ì ëŠ¬ë² ìŽì€íë ì€ìŽë¯ë¡ íŽë¹ ë°ìŽí°ë¥Œ ì»ì ì ììµëë€.
íì @nikomatsakis ê° ìŽë¥Œ ë³í©í ê²ì ì ìíìµëë€. ë€ì ëšê³ë íê·žê° ì§ì ë ëëšžì§ íìŽ ê²í íë ê²ì ëë€.
íì¬ ëìŽë ì°ë € ì¬íìŽ ììµëë€.
곌ë°ìì ê²í ìê° ì¹ìžíê³ ë°ëíì§ ììŒë©Ž ìµì¢ ì견 ì ì¶ êž°ê°ìŽ ììë©ëë€. ìŽ íë¡ìžì€ì ìŽë ìì ììë ì êž°ëì§ ìì 죌ì 묞ì 륌 ë°ê²¬íë©Ž ìë €ì£Œìžì!
íê·žê° ì§ì ë í 구ì±ììŽ ëìê² ì€ ì ìë ëª ë ¹ì ëí ì 볎ë ìŽ ë¬žì 륌 ì°žì¡°íììì€.
ì, ë°©êž êž°ìµëë ëª ê°ì§:
!
ëí í¹ì±ì 구ííë ê²ìŽ ì ì í ìêž°ì ëí ëª ê°ì§ ì§ì¹šë í¬íšíë ê²ìŽììµëë€. TL;DRì !
ê°ì 뚌ì ì ê³µíì§ ìê³ ížë ìŽížì ë©ìë륌 ì¬ì©í ì ììŽë êŽì°®ë€ë ê²ì
ëë€ -- ê·žëì Clone
ëíŽ !
Clone
륌 구ííë ê²ì êŽì°®ë€ê³ ìê°í©ëë€. , íì§ë§ Default
구íì ê·žë ì§ ììµëë€. ë€ì ë§íŽì, implì 구ííêž° ìíŽ ë¬Žì°šë³ì ìŒë¡ panic!
륌 ì구íë€ë©Ž ê·žê²ì ëì ì§ì¡°ì
ëë€. =)@nikomatsakis ì ìëì ë첎 ê·ì¹ì ë³ê²œí ì ìì§ë§ ì¬ì í !
륌 2015 ìëì ì¬ì©í ì ìë ì íìŒë¡ ë§ë€ ì ììµëê¹?
@nikomatsakis
ì°ëŠ¬ë ìë¡ìŽ ìëìë§ ìŽê²ì ìì ííë ììŽëìŽë¥Œ ê³ ë €íŽìŒ í©ëë€.
ì§ëë²ì ì°ëŠ¬ê° ë¶í구륌 ëìì ë(ì€ë ì ìŽììµëë€) ë첎 ê·ì¹ ë³ê²œìŒë¡ ìží ìí¥ì ìë¹í ì ììµëë€. ì°ëŠ¬ë ëí íëì ë³ê²œì ìí¥ì ë°ì ì ìë ìœëì ëíŽ lintingíìµëë€.
ë짞, ì¬êž° ê³íì ìŒë¶ë
!
ëí í¹ì±ì 구ííë ê²ìŽ ì ì í ìêž°ì ëí ëª ê°ì§ ì§ì¹šë í¬íšíë ê²ìŽììµëë€.
@SimonSapin
ìë¡ìŽ ìëì ë첎 ê·ì¹ì ë³ê²œí ì ìì§ë§ ì¬ì í ! 2015 ìëì ì¬ì© ê°ë¥í ì íìŒë¡?
ì
@canndrew
ì§ëë²ì ì°ëŠ¬ê° ë¶í구륌 ëìì ë(ì€ë ì ìŽììµëë€) ë첎 ê·ì¹ ë³ê²œìŒë¡ ìží ìí¥ì ìë¹í ì ììµëë€. ì°ëŠ¬ë ëí íëì ë³ê²œì ìí¥ì ë°ì ì ìë ìœëì ëíŽ lintingíìµëë€.
ë€. ë¶íêµ¬ê° ë¬Žìì ë§íëì§ ëŽ ìë€. ê·žë¬ë ëŽê° ë§íë¯ìŽ ë¶í구ë ì°ëŠ¬ìê² ííì ë§ ì ê³µí©ëë€. ìŽê²ì ìŒì¢ ì "ì íì ë³í"ì ëë€. ê·žëë ëë ë¹ì ìŽ ì³ë€ê³ ìê°íë©° ì°ëŠ¬ë ìŒìì ìœëì í° ìí¥ì 믞ì¹ì§ ìê³ ìŽê²ì ë³ê²œíšìŒë¡ìš "ëë§ê°" ì ììµëë€.
TL;DRì
!
ê°ì 뚌ì ì ê³µíì§ ìê³ ížë ìì ë©ìë륌 ì¬ì©í ì ììŽë êŽì°®ë€ë ê²ì ëë€.
ê·žê²ì ì ìì ìž ê·ì¹ì ëë€. "ì ì ì ë°©ììŒë¡ 구í"ì íšëì ì ìžíì§ë§ ì íšíì§ ìì ë°ìŽí°ê° ìë ê²œì° "ììž" UB륌 í¬íšíë ì ìì ìž ë°©ììŒë¡ 구íí ì ìì ë implì ì¶ê°í©ëë€.
@arielb1 ì, íì§ë§ ìŽë€ ìŽì ìììžì§ ì¬ëë€ì !
ê° ìì ë ìŽì ê°ì ê²ì ëíŽ íŒëíë 겜í¥ìŽ ììŒë¯ë¡ ëª
ìì ìŒë¡ ížì¶í ê°ì¹ê° ìë ê² ê°ìµëë€.
ëë¬í ì ìë ìœë ë±ì libstd ìŽëê°ì íííë ìì í ë°©ë²ìŒë¡ 묞ìíë ìì í ë°©ë² fn absurd(x: !) -> !
ì ê°ë ê²ìŽ ëììŽ ë ê¹ì? ëë ê·žê²ì ëí RFCê° ìë€ê³ ìê°í©ëë€ ... ëë ì ìŽë RFC 묞ì : https://github.com/rust-lang/rfcs/issues/1385
@RalfJung absurd
íšìë ê·žë¥ identity
ìëê°ì? ì ì ì©íê°ì?
ìžì륌 ì¬ì©íì§ ìê³ ë§€ì° ì ìëì§ ìì ëììž unsafe fn unreachable() -> !
ëŽì¥ê³Œ ëìŒíì§ ììµëë€.
ë€, ëë¶ë¶ ê·žë ìµëë€. ëë "ì¢
ë£íì§ ìëë€"ë ì믞ìì !
ë°í ì íì ì¬ì©íê³ ìììµëë€. ( absurd
ì ìŒë°ì ìž ì íì fn absurd<T>(x: !) -> T
ìŽì§ë§ Rustììë ì ì©íì§ ìì ê² ê°ìµëë€.)
ëë ìŽê²ìŽ "ì¬ëë€ìŽ !
ê° ìë ìí©ìì ìŽì ê°ì ìŒì ëíŽ íŒëì€ë¬ìíë 겜í¥ìŽ ìë€"ë ë° ëììŽ ë ê²ìŽëŒê³ ìê°íìµëë€. "ìŽìžì" ì¶ë¡ ìŽ ë¬žì ê° ëë 묞ìê° ìŽëê°ì ììŽìŒ í©ëë€.
ëë ì못ë 묞ì 륌 ê°ì§ê³ ìë ê² ê°ìµëë€ ... ìŽëê°ìì ê·žë° "ex falso"êž°ë¥ì ëí í ë¡ ìŽ ìë€ê³ ìê°íìµëë€. ì ê° ì못 ìê³ ìë ê² ê°ìµëë€.
fn absurd<T>(x: !) -> T
ë match x {}
ë¡ ìž ì ìì§ë§ ìŽì ì 볞 ì ìŽ ìë€ë©Ž ìê°íŽ ëŽêž° ìŽë µìµëë€. ê·žê²ì ì ìŽë Rustdoc곌 ì±
ìì ì§ì í ê°ì¹ê° ììµëë€.
fn í°ë¬Žëìë
(x: !) -> Të match x {}ë¡ ìž ì ìì§ë§, ìŽì ì 볞 ì ìŽ ìë€ë©Ž ìê°íŽëŽêž°ê° ìŽë µìµëë€.
ë§ìµëë€. ê·žëì libstd ìŽëê°ì ë©ìë륌 ì ìíìµëë€. ê°ì¥ ì¢ì ì¥ìê° ìŽëìžì§ íì€íì§ ììµëë€.
absurd
ì ì¢ì ì ì ê³ ì°š íšìì ì ë¬í ì ìë€ë ê²ì
ëë€. ìŽê²ìŽ ìŽë»ê² íìíì§ íì€íì§ ììµëë€! wrt íëí©ëë€. ê·žëë íµìŒ.
fn absurd<T>(x: !) -> T
match x {}
ë ìž ì ììµëë€.
x
(AFAIK)ë¡ ìì±í ìë ììµëë€. enum
ê° ë¹ìŽ ìë 겜ì°ìë§ match
íìí©ëë€.
absurd(x: !) -> T
íšìë ê³ ì°š íšìë¡ ì ë¬íë ë° ì ì©í©ëë€. ì륌 ë€ìŽ ì 묌ì ì°ê²°í ë ìŽê²ìŽ íìíìµëë€. ê·ž ì€ íëë ì€ë¥ ì í !
ìŽê³ ë€ë¥ž íëë ì€ë¥ ì í T
ì
ëë€. !
ì íì ííììŽ T
ë¡ ê°ì ë³íë ì ìì§ë§ !
ì T
ê° íµí©ëë€ë ì믞ë ìëë¯ë¡ ëëë¡ ìëìŒë¡ ì íì ë³íí©ëë€.
ë§ì°¬ê°ì§ë¡ Result
ì ê°ì ì íìë Result<T, !>
륌 Result<T, E>
ë¡ ë³ííë .infallible()
ë©ìëê° ììŽìŒ íë€ê³ ìê°í©ëë€.
결곌 ì ì¬ ì íìë 결곌륌 ë³ííë .infallible() ë©ìëê° ììŽìŒ í©ëë€.
결곌ì ìŒë¡ .
ëë ê·žë¬í ë©ìëê° Result<T, !> -> T
ì íì ê°ì§ ê²ìŒë¡ ììíì ê²ì
ëë€.
ëë ê·žë¬í ë©ìëê° Result ì íì ê°ì§ ê²ìŒë¡ ììíì ê²ì ëë€.
-> í°.
ìŽê²ì unwrap
ì ëìŒíì§ ììµëê¹? Err
ìŒìŽì€ì ì°ê²°í ì ììŒë¯ë¡ íšëìŽ ìµì íë©ëë€.
@Amanieu ìì ì unwrap
륌 ì¬ì©íë©Ž 늬í©í°ë§ ì€ì íê±ŽìŽ ì¶ê°ëê³ íšëìŽ ë€ì ëŒìŽëž ìœëê° ëë ìŒì ì€ìŽëëë€.
unwrap
ë assert
ì ê°ìŽ ìœìµëë€. -- "ë°íì íìž ë¯žëŠ¬"(IIRCììë ìŽëŠì ë°êŸžìë ì ìë ììì§ë§ ë묎 ëŠê² ììµëë€... ì¬íê²ë). ë°íì ê²ì¬ë¥Œ ìíì§ ìê³ íìíë€ë©Ž infallible
륌 ì¬ì©íì¬ ëª
ìì ìŒë¡ ë§ë€ ì ììµëë€.
:bell: ì ì ìŽì ìµì¢ ëêž êž°ê°ì ì ìŽë€ììµëë€ . :벚:
@rfcbot fcp ì·šì
@aturon ë° @pnkfelix ë íŽë¹ ìì륌 ì ííì§ ìììµëë€.
@cramertj ì ììŽ ì·šìëììµëë€.
@rfcbot fcp ë³í©
https://internals.rust-lang.org/t/psa-tweaks-to-fcp-process/6775
íì @cramertj ê° ìŽë¥Œ ë³í©í ê²ì ì ìíìµëë€. ë€ì ëšê³ë íê·žê° ì§ì ë ëëšžì§ íìŽ ê²í íë ê²ì ëë€.
íì¬ ëìŽë ì°ë € ì¬íìŽ ììµëë€.
곌ë°ìì ê²í ìê° ì¹ìžíê³ ë°ëíì§ ììŒë©Ž ìµì¢ ì견 ì ì¶ êž°ê°ìŽ ììë©ëë€. ìŽ íë¡ìžì€ì ìŽë ìì ììë ì êž°ëì§ ìì 죌ì 묞ì 륌 ë°ê²¬íë©Ž ìë €ì£Œìžì!
íê·žê° ì§ì ë í 구ì±ììŽ ëìê² ì€ ì ìë ëª ë ¹ì ëí ì 볎ë ìŽ ë¬žì 륌 ì°žì¡°íììì€.
:bell: ì ì ìŽì ìµì¢ ëêž êž°ê°ì ì ìŽë€ììµëë€ . :벚:
ì°ëŠ¬ë ì€ë íììì ìŽì ëíŽ ë Œìíìµëë€. ì§êž íŽë°±ì ë³ê²œí ì§ ìëë©Ž ìë¡ìŽ ìëìë§ ë³ê²œí ì§ ê³ ë¯Œë©ëë€. ë€ìí í¬ìžížë¥Œ ìê°í©ëë€.
ë³ê²œì ìì íšê³Œë ììµëë€. ë°ëŒì íì€ì ìŒë¡ ìŽê²ì ìŽë 쪜ìŽë í° ì°šìŽê° ììµëë€. ì¬êž°ìì ì 첎 ë¶ìì 볌 ì ìì§ë§ ììœì ë€ì곌 ê°ìµëë€.
ê·žëŠ¬ê³ ê·žê²ì ë ê°ì ì€ì íê·ë¥Œ ëšê¹ëë€. oplog-0.2.0(ì€ì ë¡ë ì¢ ìì± bson-0.3.2ìŽ ëìŽì§)곌 rspec-1.0.0-beta.4ì ëë€. ìŽ ì¢ê²ë ë°íììŽ ìë 컎íìŒ ìê°ì ì€ëšëì§ë§ ë ë€ ìŽì ë첎 ëìì ìì¡Žíê³ ììµëë€. ìŽ ìì륌 ì늬íêž° ìíŽ PRì ì ì¶íê² ìµëë€.
ê·žë¬ë ìŽê²ì ì¬ì í ââêž°ì ì ìŒë¡ 죌ì ë³ê²œ ì¬í(ê·žëŠ¬ê³ ìë°ì ë³ê²œ ì¬í)ì
ëë€. ()
ê° ë§€ì° ì¢ì§ ìì ì íìŽê³ ìœëìì ìŽì ìì¡Žíë 겜ì°ê° ë§€ì° ë묌ë€ë ì ì ì ìžíê³ ì í ë³ìì ëí ë첎륌 ë³ê²œ íŽìŒ íë í¹ë³í ìŽì ë ììµëë€. ì°ëŠ¬ë ëí ì€ë«ëì ìŽê²ì ëíŽ ê²œê³ íŽ ììµëë€.
ì ë ìŽê²ìŽ ì² íì 묞ì ëŒê³ ìê° í©ëë€. 곌거ìë íìì ë°ëŒ ìŽì ê°ì ì¬ìí ë³ê²œì íìµëë€. ê·žë¬ë ìŽì íêž°ì ìž ë©ì»€ëìŠìŽ ì게ìŒë¯ë¡ êž°ì ì ìŒë¡ ì묎 ê²ë ìììí€ì§ ìê³ ê·žë¬í ì íì ìíí ì ìë ë³Žë€ ìì¹ì ìž ë°©ë²ì ì ê³µí©ëë€. ìì¹ì ìŒë¡ ì¬ì©íë ê²ìŽ ê°ì¹ê° ìì ì ììµëë€. ë°ë©Žì, ê·žê²ì ëëë¡ ìŽë° ë³í륌 ë§ë€êž° ìíŽ ëª ë ì êž°ë€ë €ìŒ íë€ë ê²ì ì믞í©ëë€. ë¬Œë¡ ë ë²ì ì ì구ì ìŒë¡ ì ì§íŽìŒ íë¯ë¡ ìžìŽ ââì¬ì ë±ì íšì¬ ë ë³µì¡íê² ë§ëëë€.
ìœê° ìë€ìë€íì§ë§ ê· íì ìê°íê³ ìë€ë¡ íë€ë €ì íì¬ ê³íëë¡ "ê·žë¥ ë³Žížì ìŒë¡ ë°êŸžì"ë¡ êž°ìžê³ ììµëë€.
ëŽê° íží¥ëìŽ ìë€ë ê²ì ìê³ ìì§ë§ dyn Trait
ë° catch
ë¹íŽ ë ë§ì ë²ê·ž ìì ìŒë¡ ë첎 ëìì ë³ê²œíë ê²ì ëŽ
ëë€.
ê²ë€ê° ëêµ°ê°ê° ìŽê²ì ë°ìŽë€ìŽ "ìí! Rustë ê²°êµ íì ížíì±ì 깚ëšë žìµëë€! 1.0ì ëë¬íì ë ìì ì±ì ëí ìœìì ê±°ì§ë§ìŽììµëë€!"ëŒê³ ë§íê³ ì¶ìŽí©ëë€. ê·žë° ë€ì ìŽ ë¬žì ì ëí ë§€ì° ì¬ë € ê¹ì ë Œìë 묎ìí ë§í ì€ì§ì ìž ìí¥ìŽ ìììë ë¶êµ¬íê³ ê²°ì ìŽ ê°ë³ê² ëŽë €ì§ì§ ìììì 볎ì¬ì€ëë€.
ìê² ìµëë€. ê·žë¥ ë°êŸžìê³ í©ëë€.
ë°ëŒì ííìŒë¡, ì¬ëë€ìê² íëìŽ ë³ê²œëììì ì늬ë ì€ë¥ì ëí ì ì©í ë©ëªšë¥Œ ì ê³µíê³ ì¶ìµëë€. ê·žëŽë¯íŽ 볎ì ëë€. ììŽëìŽë ë€ì곌 ê°ì ê²ì ëë€.
!: Foo
ëª ê°ì§ í¹ì±ì ëíŽ, ê·žëŠ¬ê³ í¹ì±ìŽ 구íëìŽ (): Foo
, ì°ëŠ¬ê° ìë£ ë첎륌 ì°ëŠ¬ê° ì¶ê°, (ì°ëŠ¬ë ì€ë¥ë³Žê³ ìœëìŽ ì¬ì€ì ì ì ììµëë€) ì¶ê° ë
žë.ìŽì ìµì¢ ì견 ìë Ž êž°ê°ìŽ ìë£ëììµëë€.
ìëš ê²ì묌ì ë³Žë¥ ì€ìž íìžëìŽ ìì§ ì íëì§ ìììµëê¹? ê·ž 목ë¡ì ì·šìë ê²ìŽ ììµëê¹?
@earthengine ëë ëŽê° 볞 ë ê°ì§ê° í¹ë³í êŽë šìŽ ìë€ê³ ìê°íì§ ììµëë€. ìµìì í목ì êŽíŽìë, impls ìžížì êŽíŽìë ë¹ë¶ê°ì ê²°ì ë ê² ê°ìµëë€.
Ʞ볞ì ìŒë¡ ë§€ì° ìµìíì ìžížì ëë€.
@nikomatsakis ì¬êž°ìì ììœ ë¬žì 륌 ë§ë€ììµëë€. https://github.com/rust-lang/rust/issues/48950
!
ì íì ê°ê³Œ ìŒì¹íë íšíŽì !
ë¡ ë§ëë ê²ì ëí ê³ ë €ê° ìììµëê¹? (ìŽ ë¬žì ì ìë RFC 묞ì 륌 íµíŽ ë¹ ë¥ž grepì ìííì§ë§ êŽë šì±ì ì°Ÿì§ ëª»íìµëë€.)
ì ì¬ì ìŒë¡ !
ì€ë¥ ì íìì ë³µí© ì€ë¥ ì íì ìì±íë 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://github.com/rust-lang/rfcs/pull/1872 ë€ì ìœêž° 죌ìì !
íšíŽ ëì
ì ëíŽ ìžêží©ëë€. ê·žê²ì ìì í 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
ì€ë¥ê° ë°ìíì§ ììµëë€.
RFC 1872ê° ì ìí ê²ê³Œ ížíëì§ ìëë€ê³ ìê°í©ëë€. ìì ìŒì¹ë¥Œ ìííë ëª
ìì armìŽ ìêž° ë묞ì !
ê°ì ì íšì±ì ë°ëì ìì¡Žíë ê²ì ìëë©° ì ì¬ì ìŒë¡ íŽë¹ ë¶êž°ê° 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 ê°ê³Œ ìŒì¹íë ë°ë°í ì ìë íšíŽìŒë¡ !
íšíŽì ê³ ë €í ê²ì
ëë€. ()
ë ()
ì í.
ëë ëšì§ ê³ ë €í ê²ìŽë€! íšíŽì !ì 몚ë 0 ê°ê³Œ ìŒì¹íë ë°ë°í ì ìë íšíŽì ëë€. ì í, ()곌 ëìŒí () ì íì 몚ë 1 ê°ê³Œ ìŒì¹íë ë°ë°í ì ìë íšíŽì ëë€.
êžìì, íì§ë§ 0 != 1. ;) !
ì 맀ì¹í íì ìŽë€ ìœëë ìì±íë ê²ì 묎ì믞í©ëë€ -- ì륌 ë€ìŽ ìžì ì íìŽ (!, i32)
ìŽë©Ž |(!, x)| code_goes_here
ë ê·ž ìœëê° ìŽìšë 죜ìêž° ë묞ì ìŽëŠ¬ìì ê²ì
ëë€. x
ê° !
ì ììëŒë ê²ì ë¶ëª
í íêž° ìíŽ |(x, _)| match x {}
륌 ìì±í ê²ì
ëë€. ëë ììì ì ìí absurd
íšì륌 ì¬ì©íì¬ |(x, _)| absurd(x)
. ìëë©Ž |(x, _)| x.absurd()
?
ììì @canndrewê° ìì±í ê²ê³Œ ê°ìŽ ìœë륌 ìì± íì§ ìëë¡ íë ë€ë¥ž 구묞ì ììí ì ììµëë€. match
ìë ì¬ë¬ ê°ì§ ë¶êž°ê° ììŒë¯ë¡ í¹í ë¶êž°ê° ìì ìë ììµëë€. ê·žë¬ë íŽë¡ì ë ì íí íëì 겜ì°ë¥Œ ê°ì§ë¯ë¡ ìë¯žê° ìë ì ìŒí íšíŽì ìŒì¹íë ë°©ë²ìŽ ì íí 1ê°ìž íšíŽì
ëë€. 0 ë°©ë²ìŽ ìëëë€.
ì§êžì impl<T> From<!> for T
ì¶ê°í ì ììµëë€. ( From<T> for T
ì 겹칩ëë€. ëê° ì 묞íëìŽ ìì§ ììµëê¹?) ëì€ì ì¶ê°í ìë ìì ê²ì
ëë€. ( !
ê° ìì íë í ëŠŽëŠ¬ì€ ì£Œêž°ìì ìŒë¶ í¬ë ìŽížë From<!> for SomeConcreteType
구íí ì ììµëë€.)
@SimonSapin ì¢ì ì§ì ! ìŽê²ì ë§ì ê²ë€ì ëíŽ ë§€ì° ì ì©í ë¹ë© ëžë¡ìŽë©°, ëë ììí ê·žê²ì ëìšíê² íê³ ì¶ì§ ììµëë€. ë ìžì€íŽì€ë¥Œ 몚ë íì©íë ìŒíì± íŽí¹ì ì§ì§íê² ê³ ë €í ê²ì ëë€. ê·žê²ë€ì ê²¹ì¹ë 겜ì°ì ì믞ì ìŒë¡ ìŒì¹íë¯ë¡ "ìŽììì ìŒêŽì±"ìŽ ììµëë€.
ìŒíì± íŽí¹ì ì§ì§íê² ê³ ë €í ê²ì ëë€
ê·žë° ë€ì ê·ž íŽí¹ì ììŒë¡ ë©°ì¹ ìì ì°©ë¥íŽìŒ í©ëë€. (ëë ë² í êž°ê° ëì ë°±í¬í ë©ëë€.)
@SimonSapin ê·žë¬í íŽí¹ì ìŒë§ë ë¹ ë¥Žê³ ìœê² ì¶ê°í ì ììµëê¹? From<!> for T
륌 ê°ì§ ì ìë€ë ê²ì ì ë§ ì§ìŠëë ìŒì
ëë€.
ëë From<!> for SomeConcreteType
구íì ëí ê²œê³ ë¥Œ ë¹ ë¥Žê² ëì§ ì ììµëë€.
íŽí¹ìŽ 묎ììžì§ì ë°ëŒ ë€ëŠ ëë€. êµì°šì ì ëíŽ ìž ë²ì§žê° ìë ê²œì° í¹ì± í¹í륌 íµíŽ ë ê°ì ê²¹ì¹ë implì ì¬ì©í ì ìë€ê³ ìê°í©ëë€. íì§ë§ ìŽë¥Œ ìíŽìë í¹ì±ìŽ ê³µê°ì ìŒë¡ "í¹í ê°ë¥"íŽìŒ íëì?
ë¶ííë ì 묞í:
From::from
륌 default fn
ë¡ ë³ê²œíŽìŒ std ìžë¶ìì "íì"ë©ëë€. ì 묞íê° ë¶ìì í í íì€ í¹ì±ìì ê·žë ê² íê³ ì¶ìì§ ëªšë¥Žê² ìµëë€.ì¬êž°ì ë ê°ì implsë ì íí ëìŒí ìì ì ìíí©ëë€. ë§ìœ ì°ëŠ¬ê° ìŒêŽì± ê²ì¬ë¥Œ ëë©Ž ìŽë€ implìŽ ì¬ì©ëëì§ ê²°ì íêž° ìŽë €ìž ê²ì ëë€. ìŽê²ì ìŒë°ì ìŒë¡ ë§€ì° ë¶ê±Žì íì§ë§ ìŽ ê²œì°ìë êŽì°®ìµëë€. ì륌 ë€ìŽ íëì 결곌륌 êž°ëíë 컎íìŒìì ìœê°ì íšëì ìŒìŒí¬ ì ìì§ë§ ì°ëŠ¬ë ê·ž 죌ì륌 íŽí¹í ì ììµëë€.
ë€ì ë§íŽ, ë€íì€ëœê²ë ìŽê²ìŽ ì 묞í륌 ê°ìííë ê²ë³Žë€ íšì¬ ìœë€ê³ ìê°í©ëë€.
ìŽ "êŽë šë 몚ë implsì ì°ê²°í ì ìë ê²œì° ììì 겹칚 íì©" ììŽëìŽë¥Œ ê³µìííêž° ìí êž°ì¡Ž RFCê° ììµëê¹? ê³ ë €íŽ ë³Œ ë§í í¥ë¯žë¡ìŽ ì ê·Œ ë°©ììž ê² ê°ìµëë€.
ëŽê° ìêž°ë¡ë ìëìŒ. íëíž ì첎ë impl ì첎ì ëë¬í ì ìì§ë§ ëŽë¶ ë©ìëë 몚ë ížì¶í ì ììµëë€(íì "ížì¶ ê°ë¥"íë¯ë¡ ì°ê²°ë ì íìŽë ììê° í¬íšëì§ ìì). íŽí¹ìŽ ì°šëšë ê²ìŒë¡ íëšëë©Ž ë¹ ë¥Žê² ìì±í ì ìì ê² ê°ìµëë€.
묞ì 륌 ìŒìŒí¬ ì ìë #49593 묞ì 륌 ìžêžíêž°ë§ íë©Ž ë©ëë€! ë ëì 찟Ʞ륌 ìíŽ ë€ì ë¶ìì íŽì§ëë€.
!
ìì í í T: From<!>
ìžì ì¶ê°í ì ìë implsê° ê¶êží©ëë€. ì°ëŠ¬ë ìì íëêž° ì ì ìŽë¬í 몚ë í©ëŠ¬ì ìž impls륌 ì²ëŠ¬íë €ê³ ë
žë ¥íŽìŒ í ê²ì
ëë€. ìŽë¬í ë¬ìê° ìë ìŒë°ì ìŒë¡ !
ì ëí implsì 구ë³ë©ëë€.
ìŽ ëêžì êµì°š ê²ì:
()ì ëí ëì²Žê° ë³ê²œëìŽìŒ íë ìŽì ì ëí ê³ ì ì ìž ìë 묎ììžì§ ê¶êží©ëë€. ìŠ, ê³ìíŽì ()ë¡ ë첎íì§ë§ ì¬ì í !륌 ì¶ê°íë©Ž ê·žë° ì¢ ë¥ì 묞ì 륌 íì€í íŒí ì ìê³ ë€ì ! "ëŒìŽëž" ìœëì ìí¥ì 죌ë ì í ë³ìì ëí íŽë°±ìŽ ë°ìíë 겜ì°ê° ìë€ë ì ì ê³ ë €íë©Ž ìµì ìŽ ìëëë€(ë¬Œë¡ ìëë ê·žë ì§ ìì§ë§ ë°ê²¬í ëë¡ ëì¶ì ë°©ì§íêž° ìŽë µìµëë€).
ë³ê²œì ê²°ê³Œë¡ ëª ê°ì§ íŽíìŽ ììê³ ëë ê·žê²ì ìì í ížíì§ ìë€ê³ ë§íŽìŒ í©ëë€.
!
ëëìê°ì§ë§ ì€ì ë¡ë 죜ì ìœëê° ìë ë°ìžë©ëì§ ìì ì í 맀ê°ë³ì ë묞ìŽììµëë€. ìŽê²ì íì¬ ì²Žê³ì ìë €ì§ ì€íšìŽë©° match foo { P1 => ..., P2 => return }
ê° ìì ë ë°ìí©ëë€. ë°íì ë€ë¥ž í곌 íµí©ëë " !
ì í ë³ìë¡ì íŽë°±"ì ìì±í©ëë€. ìì íêž°ê° ìë¹í ìŽë µë€ë ê²ìŽ ì
ìŠëììµëë€. ì륌 ë€ìŽ https://github.com/rust-lang/rust/issues/40801ì ì°žì¡° (ìŽ ì ì ëíŽ lang-team í ë¡ ì ìíŽ ì§ëª í©ëë€.)
íì ì€ì ì°ëŠ¬ë ì¬êž°ìì ëª ê°ì§ ìµì
ì ì² ííìµëë€. ì ë ë³ê²œíꞰ륌 êºŒë €í©ëë€. ì£Œë¡ ìŒë¶ 겜ì°ì êž°ì¡Ž ìœëì ì믞륌 ë³ê²œíê³ ì ê·ì¹ìŽ ë ëìì§ íì€íì§ ìêž° @cramertj ë ë³í ì¬ë¡ìì íŽë°±ì ëí ìŽë§ì ìžêžíìµëë€. ì륌 ë€ìŽ Ok(33)
ì íìŽ íì¬ì ê°ìŽ ì€ë¥ê° ë°ìíë ëì Result<i32, !>
ë¡ íŽë°±ë©ëë€. return
ìì ()
ë¡ íŽë°±ì ì ì§íë ê²ì ìŽë¬í ë³ê²œ(ì§êµì ìŽì§ë§)곌 ìŒì¹íì§ ììŒë©° í¥í 충ëì ìŒìŒí¬ ì ìë€ê³ ë§í ê² ê°ìµëë€. ìŽê²ì ê³µì íë€.
Err
íŒëë°±(#40801)ì 묞ì ë ë€ì곌 ê°ì 겜ì°ë ìë€ë ê²ì
ëë€.
let mut x = Ok(22);
x = Err(Default::default());
ì¬êž°ì x
ì ê¶ê·¹ì ìŒë¡ Result<T, !>
ì ì¶ë©ëë€.
!
fallbackìŽ ëŒìŽëž ìœëì "ìí¥ì ë°ì"ì§ ì¬ë¶ë¥Œ ê²°ì í ì ìëì§ íìžíê³ ìëíŽìŒ íë ë³ëì ê³íìŽ ìê°ë©ëë€. ì°ëŠ¬ê° ì€ì ë¡ ë§ì ê²œì° @SimonSapin ì 겜ì°).
ì íìì ìŽ ë첎륌 ìì í ì ê±°í ì ìëì§ì ëí ë Œìë ìììµëë€. ëë ê·žê²ìŽ ë§ì 맀í¬ë¡ë¥Œ 깚ëšëŠŽ ê²ìŽëŒê³ ìê°íì§ë§ ìëíŽ ë³Œ ê°ì¹ê° ììµëê¹?
ì°žê³ ë¡ ìŽ êž°ë¥ì 1.26ìì íê·ë¥Œ ìŒìŒìŒ°ìµëë€. #49932
(https://github.com/rust-lang/rust/issues/35121#issuecomment-368669041ì ë°ëŒ ë ìŽëž ì€ì .)
!
ë¡ì ê°ì ì ëí 첎í¬ëŠ¬ì€íž íëª©ìŽ ìŽ ë¬žì 륌 ì°žì¡°íë ëì https://github.com/rust-lang/rust/issues/50350ì ê°ëŠ¬ìŒìŒ í©ëê¹?
ìŽê²ìŽ ê°ë¥í í 빚늬 ìì íëꞰ륌 ìíë©Ž ëŽ ìëì§ë¥Œ ìŽëë¡ ë³ŽëŽë ê²ìŽ ê°ì¥ ì¢ìê¹ì?
@remexre ìì í륌 ëë늬ë 묞ì ì ëí ê°ì¥ ì¢ì ì€ëª ì https://github.com/rust-lang/rust/issues/49593ì ìë€ê³ ìê°í©ëë€.
ë°ëŒì ì€í ê°ë¥í ì룚ì
ì í¹ì ìŒìŽì€ Box륌 ë€ìì íì ì íìŒë¡ ì¬ì©íë ê²ì
ëë€.
ìì
2018ë 7ì 8ìŒ ìŒììŒ ì€ì 8:12 Ralf Jung ì늌 @github.com ìì±:
@remexre https://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
뚌ì !
ì í¬êž°ë ìŒë§ê° ëìŽìŒ íëì§ ìê°íŽìŒ í©ëë€. ìíìë 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
: ë ê°ì ì íší ê° => log(2)/log(2) = 1ë¹íž
()
: ì íší ê° 1ê° => log(1)/log(2) = 0ë¹íž
!
: 0 ì íší ê° => log(0)/log(2) = Inf ë¹íž
êŽë š ìŽë¡ ì ì íµíì§ ìì ì¬ëìŒë¡ì ëë log(x)/log(y)
ê³µìì ê³ ìíì¬ ìŽë¡ ì ìž ëªšëžì ì°ìíšì ì¶êµ¬íì¬ ì€ì ì¬ì©ì ìíŽë¥Œ ì
íë ê²ì ëŽ
ëë€. (ìŒëª
ìì ì ìŽìµì ìíŽ ë묎 ì늬íš)
ì§êŽì ìŒë¡ !
ë ë€ì곌 ê°ì ìŽì ë¡ í¬êž°ê° 0ìŽìŽìŒ í©ëë€.
bool
: ë ê°ì ì íší ê°ì 구ë¶íêž° ìí ê³µê° íì => log(2)/log(2) = ì í ìì€í
ìžì 1ë¹íž()
: íëì ì íší ê°ì 구ë¶íêž° ìíŽ ê³µë°±ìŽ íìíš => ì í ìì€í
ì ëìŽìë ê³µë°±ìŽ íìíì§ ìì!
: ì íší ê°ì 구ë¶íêž° ìíŽ ê³µë°±ìŽ íìíì§ ìì => ì í ìì€í
ì ëìŽìë ê³µë°±ìŽ íìíì§ ììì, ì€ì ë¡ë -묎íëì ëë€. ìŽë ! íë륌 êµ¬ì¡°ì²Žë¡ ë³ííë ê²ì 볞ì§ì ìŒë¡ 구조첎륌 ! ë¿ë§ ìëëŒ (c + -inf = -inf). ê·žëì ì°ëŠ¬ë usize륌 ë€ë£šê³ ìêž° ë묞ì 0ì ì°ëŠ¬ê° ê·žê²ì ëíëŽìŒ íë ê°ì¥ ê°ê¹ìŽ ê°ì ëë€. (ëŽ ìê°ì Rustcì ì€ì 구íì -infë ì¬ì©í©ëë€.)
ì§êŽì ìŒë¡
!
ë í¬êž°ê° 0ìŽìŽìŒ íë ê²ì²ëŒ 볎ì ëë€.
!
ë í¬êž°ê° ì í íìíì§ ììµëë€. íŽë¹ ì íìŒë¡ ìì±ë ê°ìŽ ìêž° ë묞ì
ëë€. êŽë š ìë ì§ë¬žì
ëë€.
0 ì íší ê° => log(0)/log(2) = Inf ë¹íž
log(0)ìŽ ì ìëì§ ìììµëë€. ê·žê²ì 묎ííì§ ììµëë€.
ë°ë©Žì usize::MAX
í¬êž°ë¥Œ ê°ë ê²ì ë¹ê±°ì£Œë¥Œ ê°ì íë ìë¡ì ìž ë°©ë²ì
ëë€. ëìíë€?
@CryZe @varkor
ê·žê²ì ëí ëŽ ì§êŽìŽ !
륌 "ìì í ë€ë¥ž ìì€ì ZST"ë¡ ë³Žê³ ì¶ìŽíë íë¹ì±ì ì¶ë¡ íë €ê³ íë ê°ë
곌 ìŒì¹í©ëë€. (ìŠ, !
ë ì í ìì€í
ì ëí ê²ìŽê³ ()
ë ë©ëªšëŠ¬ í ë¹ì ëí ê²ì
ëë€.)
@CryZe
-Inf + c == -Inf
ê³µìì ìë¯žê° ìì§ë§ -Inf
륌 0usize
ë°êŸžë©Ž ë ìŽì ì íšíì§ ììµëë€.
ë°ë©Žì ì°ì ìŽ "caped"ìž ê²œì° ëªšë ì€ë²íë¡ê° usize::MAX
ë¡ ê³ì°ëë©Ž usize::MAX
ê° ê³µìì ì벜íê² ë§ìµëë€.
ëë 몚ëž: !
ì íì ê°ì²Žê° ìë ê²œì° ìŽë¥Œ í¬íšíë 구조첎륌 í ë¹íë €ë©Ž !
ë³Žë€ ë í° êµ¬ì¡°ì²Žê° íìíì§ë§ ìŽë¯žì§ë¡ ë§ë€ ì ìë ê°ì¥ í° êµ¬ì¡°ì²Ž í¬êž°ë usize::MAX
. ë°ëŒì íìí ê³µê°ì ì¬ì í usize::MAX
ì
ëë€.
ì ê·žë¥ "íŽëší"ë¬Žíš íìŽ í¬íš ë 몚ë ì¢
ë¥ì í¬êž° (ì !
, ëë ì¬ì©ì ì ì 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
Sì í¬êž° !
ë€ë¥ž 몚ë í¬êž° ê°ë³Žë€ ì ì ê²ìŒë¡ ê°ì£Œëì§ë§ìì structs
, ê·žê²ì ìµë í¬êž°ë ì§êžê¹ì§ ìŽë¯žì§ ì ììµëë€.
ê²°ë¡ :
!
ë DSTê° ìëëë€. DSTë í¬êž°ê° ììŽìê° ìëëŒ í¬êž° ì ë³Žê° ìšê²šì ž ìêž° ë묞ì Sized
ìëëë€. ê·žë¬ë !
ëíŽ ì°ëŠ¬ë ê·žê²ì ëíŽ ëªšë ê²ì ìê³ ììµëë€.!
ë í¬êž°ë¥Œ ì¡°ì íŽìŒ íë¯ë¡ Box::new(x as !)
ë ìµìí 컎íìŒìŽ íì©ëìŽìŒ í©ëë€.struct
s í¬íš !
ë !
ìž ê²ì²ëŒ í¬êž° ì¡°ì ëìŽìŒ íê³ enum
s ë ë³íìì ì§ì !
ë¡ í¬êž° ì¡°ì ëìŽìŒ í©ëë€. íŽë¹ ë³íìŽ ì¡Žì¬íì§ ìë 겜ì°.sizeof(!)==0
ëë sizeof(!)==usize::MAX
ê³ ë €íê±°ë ìì ì¬íì íì©íêž° ìíŽ ëª ê°ì§ í¹ë³í ì°ì ì ëì
íŽìŒ í©ëë€.
sizeof(!)==0
: 구조첎ìì, 0 + n = 0
:worried:, ìŽê±°íìì, 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>
ë Vec<&'a Foo>
ì ëíŽ 'a
ìŽì§ë§ 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 í¬ìží°ë ì íšíì§ ììŒë¯ë¡ ìŽ ì íì ëí ì íší í¬ìžížì¡°ì°š ììŒë©° ìŽ ê²œì°ì ì벜í©ëë€.
@ScottAbbey
Box::new(x as !)
묞ì ê° ë°ìíì§ ìëë¡ ìŽ ë¬žì ì ì§ì€íê³ ììŒë¯ë¡ ê³ìíŽì ìì íí ì ììµëë€. ì ìë ë°©ë²ì !
ì í¬êž°ë¥Œ ì§ì íë ê²ì
ëë€. ZSTê° íì€ìŽëŒë©Ž êŽì°®ì ê²ì
ëë€. ëë ë ìŽì ë
Œìíì§ ììµëë€. sizeof(!)==0
ê° ì€íëëë¡ êµ¬ííë©Ž ë©ëë€.
ì ë ¬ì ì€ì íë ê²ì ìì°ì€ëœìµëë€. ëí use::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
륌 ì»ìµëë€.
묞ì 륌 ìì íêž° ìí í ê°ì§ íŽí¹ ìµì
ì $0: Sized
ì ìœ ì¡°ê±ŽìŽ ìë€ë ê²ì ë°ê²¬íê³ ìŽì ëí ê°ì ë³íì ìœì
íì¬ Box
ê° ì¬ì í íŽë¹ ì íìì ížì¶ëëë¡ íë ê²ì
ëë€.
ì°ëŠ¬ë ìŽë¯ž ê²ì¶ìŽ ê°ì ê²ì í Fn
ìŽ ê°ì ì€ížë ì¹íì§ ìëë¡, íìì ììµëë€. ì¬ì í 못ìꞎ.
ìŠ, ê°ì ì€í ì€ì Y
ê° íì€í í¬êž°ê° ì§ì ëì§ ìê³ $0
ê° íì€í í¬êž°ê° ì§ì ëë $0: Unsize<Y>
íìì ìë¬Žê° ë°ìíë ê²œì° ìŽë¥Œ 몚ížì±ìŒë¡ ì·šêžíì§ ë§ê³ ì€íë € ê·žê²ì "ok"ë¡ ì·šêžíê³ í¬êž°ê° ì¡°ì ëì§ ìì ê°ì ë¡ ì§ííììì€.
@arielb1
ê·žë ë€ë©Ž ìŽê²ì Box::new(())
to Box<Debug>
ê°ì íë ê²ê³Œ ìŽë»ê² ë€ëŠ
ëê¹? std::error::Error
ë [u8]
ì ê°ì ì íìŽ ìëëŒ Debug
ì ê°ì í¹ì±ì
ëë€. ë°ë©Ž 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
|
ë묞ì Ʞ볞ì ìŒë¡ !
ì묎ê²ë ê°ì í ì ììµëë€, ê·žê²ì ê°ì ë³íë©ëë€ Debug
ížì¶íêž° ì ì Box::new
. ()
ìµì
ìŽ ìëë¯ë¡ ë ë²ì§ž 겜ì°ìë 묞ì ê° ììµëë€. ê°ì ë³í ì Box::new
ìŽíì ë°ìí©ëë€.
@RalfJung
ëŽ ëë 몚ëžì DSTê° ìŒìì ì¡Žì¬í ì ìë€ë ê²ì
ëë€. 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 구íìë ìŽì ëí ì±
ìì ì žìŒ íë©°, ë°ëŒì ì°ëŠ¬ê° ê°ì§ê³ ìë ê²ê³Œ ëìŒí 묞ì 륌 íŽê²°í ê²ì
ëë€. !
.
!
ë ì¡Žì¬íë ê²ìŽ ë¶ê°ë¥íêž° ë묞ì 묎ììŽë ê°ì í©ëë€. "ìì€ íë¡ ì¿Œë늬벳". ë°ëŒì 몚ë ìì ë 컎íìŒ
!
ë ì¡Žì¬í ì ìêž° ë묞ì "DTSë ì¡Žì¬í ì ìë€"륌 ìë°íì§ë ììµëë€. :)
() as dyn Debug
컎íìŒëì§ ìì
í¬êž°ê° ì¡°ì ëì§ ìì rvalueì ëí ê³íìŽ ë¬Žììžì§ ëªšë¥Žê² ì§ë§ 컎íìŒí ì ìì ê² ê°ìµëë€.
ìì ì !
ìŽ ìì
ì ìíí ë í¬êž°ê° ì§ì ëì§ ìì rvalue륌 구íí íìê° ìë€ë ê²ì
ëë€. ìŽë 죜ì ìœëììë§ ë°ìí ì ìêž° ë묞ì
ëë€.
ê·žë¬ë ìë§ë ì¬êž°ìì ê°ë¥í íŽê²°ì±
ì ê°ëŠ¬í€ê³ ìì ê²ì
ëë€(ê·žëŠ¬ê³ ìë§ë ê·žê²ì @arielb1 ë ììì ì ìí !
ê°ì 륌 ì íí ì ììµëê¹? ? ìŽë ê² íë ë°ë ìŽë¡ ì ìž ìŽì ê° ìì§ë§ ì€ì©ì ìž ìŽì ê° ììµëë€. :D ìŠ, ìŽ ë¬žì 륌 íŽê²°íë ë° ëììŽ ë ì ììµëë€.
ëŽê° "DTSë ì¡Žì¬í ì ìë€"ëŒê³ ë§íì ë ëë êµ¬ë¬žë¡ ì ì믞í©ëë€. ì륌 ë€ìŽ, ì
ë ¥ë ì§ì ë³ìê° str
ìž ê²ì ë¶ê°ë¥í©ëë€.
ë°ë©Žì !
cannot existë ìë¯žê° ììµëë€. ë¹ì ì ìž ì ììµëë€
let v = exit(0);
컚í
ì€ížìì v
구묞ì ìŒë¡ !
ë¡ ì
ë ¥íì§ë§ ë°ìžë©ìŽ ì€íëì§ë ìì ì€ì ìžê³ìì ì¢
ë£ëì§ ììµëë€.
ìŽì ë ë€ì곌 ê°ìµëë€. ëìŒí ì íì ííìì ìì±í ì ìë 겜ì°ìë§ !
몚ë ì íì ëí ê°ì ë³íì íì©í©ëë€. ì íìŽ êµ¬ë¬žì ìŒë¡ ì¡Žì¬í ì ìë ê²œì° íì©íŽìë ì ë©ëë€.
ìŽê²ì í¬êž°ê° ì¡°ì ëì§ ìì rvalueìë ì ì©ëë¯ë¡ í¬êž°ê° ì¡°ì ëì§ ìì rvalue륌 ì²ëŠ¬íë ë°©ë²ì ì ëê¹ì§ í¬êž°ê° ì¡°ì ëì§ ìì ì íì !
륌 ê°ì íë ê²ì íì©ëì§ ììµëë€. ê·žëŠ¬ê³ ê·ž ìì ììë§ ì°ëŠ¬ë ìŽ ë¬žì ì ëíŽ ìê°íêž° ììí ì ììµëë€(í ê°ì§ ë¶ëª
í íŽê²°ì±
ì Box::new
ìŽ í¬êž°ê° ì§ì ëì§ ìì ê°ì ìì íëë¡ íì©íë ê² ê°ìµëë€).
ì륌 ë€ìŽ, strìŽ ì ë ¥ë ì§ì ë³ì륌 ê°ì§ ìë ììµëë€.
ìŽë íì¬ êµ¬íì íê³ìŒ ë¿ì ëë€. https://github.com/rust-lang/rust/issues/48055
@RalfJung
ì¬êž°ê° 묞ì ê° ìëëë€.
ë€ì Box::new(!: $0): Box<dyn fmt::Debug>
$0
ê° ì í ë³ììž ìí©ì ìë€ê³ ê°ì í©ëë€.
ìŽìŽì 컎íìŒë¬ë ë¹êµì ìœê² ì¶ë¡ í ì $0: Sized
(ìžíŽ $0
ì ì
ë ¥ íëŒë¯ží°ì ê°ìì§ Box::new
ê°ì§ê³ T: Sized
í ì°žì¡°).
묞ì ë 컎íìŒë¬ê° Box<$0>
륌 Box<dyn fmt::Debug>
ë¡ ë³ííë ë° ì¬ì©í ê°ì ì íì íì
íŽìŒ íë 겜ì°ì ë°ìí©ëë€. "ë¡ì»¬" POVìë ë ê°ì§ ì룚ì
ìŽ ììµëë€.
CoerceUnsized
ê°ììŽ ììŽìŒ Box<$0>: CoerceUnsized<Box<dyn fmt::Debug>>
í©ëë€. ìŽê²ì $0 = !
ì íší íë¡ê·žëšìŽë©° Ʞ볞ê°ì ì§ì íë©Ž íŽë¹ íë¡ê·žëšìŒë¡ 컎íìŒë©ëë€.$0 = dyn fmt::Debug
íì¬ ID ê°ì ë³íì ìíí©ëë€. ìŽë $0: Sized
ì구 ì¬í곌 ìŒì¹íì§ ììµëë€.컎íìŒë¬ë ì±ë¥ 묞ì ì ëë²ê·žíêž° ìŽë €ìŽ 묞ì 륌 몚ë ìŒìŒí¬ ì ììŒë¯ë¡ 몚ížì±ì ê³ ë €í ë ë묎 ë§ì í목ì ìŽìŽ ëꞰ륌 ìíì§ ììŒë¯ë¡ ìë¹í ìŽëŠ¬ìì ë°©ììŒë¡ ì¬ì©í ê°ì ë³íì ì íí©ëë€(í¹í, T: CoerceUnsized<T>
ê° ììŒë¯ë¡ 컎íìŒë¬ê° ìµì
1ì ì ííë©Ž ë§€ì° ìœê² "ê³ ì°©"ë ì ììŒë©° ê²°êµ ìµì
2륌 ì ííì§ë§ ì€íší©ëë€. ëë ê·žê²ì ì¡°êž ë ëëíê² ë§ë€ê³ ìµì
1ì ì ííë ììŽëìŽê°ìììµëë€.
ë°ëŒì ìŽ POVìì ìê°íë©Ž ì¬ë°ë¥ž ììŽëìŽë
$0 = dyn fmt::Debugìž ID ê°ì ë³íìŽ ììµëë€. ìŽë $0: í¬êž° ì구 ì¬í곌 ìŒì¹íì§ ììµëë€.
ëë ì ì°ëŠ¬ê° let v: str=!
íì§ë§ let v: str;
ë íì©íì§ ìììŒ íëì§ ê±°ì ì ì ììµëë€. í¹ì ì íì ë³ì륌 ì ìží ìë ìë€ë©Ž ì (ìë§ë ë¶ê°ë¥í ìë ìë) ê°ì ë°ìžë©í ì ììµëê¹?
í¬êž°ê° ì¡°ì ëì§ ìì rvalueê° ì ê³µëì§ ìì ë ìŒêŽë ë°©ë²ì í¬êž°ê° ì¡°ì ëì§ ìì ì íì ëí ê°ì 륌 íì©íì§ ìë ê²ì ëë€. ìŽë ììììë§ ë°ìíë 겜ì°ìë í¬êž°ê° ì¡°ì ëì§ ìì rvalue(ìŒìì ìŒ ì ìì)륌 ìì±íêž° ë묞ì ëë€.
ê·žëì ëŽ ê²°ë¡ ì Box::new(!) as Box<Error>
묞ì ë !
ì íìŽ ìëëŒ í¬êž°ê° ì¡°ì ëì§ ìì rvalueì ëí ì°šëš ë¬žì ëŒë ê²ì
ëë€. !
ê°ì ê·ì¹ì ë€ì곌 ê°ììŒ í©ëë€.
let v: T = !
ìž ì ìë 겜ì°ìë§let v: T
륌 ìž ì ììµëë€.
ê·žë¬ë©Ž ì€ì ìë¯žê° ìžìŽë¡ íê°ë©ëë€. í¹í, í¬êž°ê° ì¡°ì ëì§ ìì rvalueê° ìë íìë Box::new(! as dyn Debug)
ìì§ë§ ê·ž ì ìë ìëì€ëŒê³ ë§íê³ ì¶ìµëë€.
ê·žë ë€ë©Ž ììŒë¡ ëìê°êž° ìíŽ ì°ëŠ¬ë 묎ìì í ì ììµëê¹?
í¬êž°ê° ì§ì ëì§ ìì ê°ì ë³íì ížëŠ¬ê±°íë êž°ë¥ ê²ìŽížë¥Œ ìœëì ì¶ê°í©ëë€. í¬êž°ê° ì§ì ëì§ ìì rvalueê° ìŒì ž ììŒë©Ž ìŽ ê°ì ë³íì ìëíê³ , ê·žë ì§ ììŒë©Ž 걎ëëëë€. ìŽê²ìŽ ì ìŒíê² ì¬ì© ê°ë¥í ê°ì ë³íìž ê²œì° ì€ë¥ ë©ìì§ë ì ì¬í 겜ì°ì ê°ìŽ "í¹ì± ê²œê³ str: std::marker::Sized
ê° ì¶©ì¡±ëì§ ìì"ìŽìŽìŒ í©ëë€. ê·žëì
ì°ëŠ¬ë ìŽê²ìŽ ë í° êž°ë¥ìì ì±ë¥ì ë§ì¹ì§ ìê³ ê³ì°ë ì ììì íìžíŽìŒ í©ëë€.
ê°ëší êž°ë¥ ê²ì¬ë§ ìííë©Ž ë©ëë€.
ííž, í¬êž°ê° ì¡°ì ëì§ ìì rvalues ââì ëí ì 묞ì 륌 ì¶ê°íê³ ì¶ì 묞ì ì ë§í¬ë¥Œ ì¶ê°íì¬ ìŽ ë¬žì ê° ì ëë¡ íŽê²°ëìëì§ íìžíììì€.
í¥ë¯žë¡êµ°.
ìŽê²
fn main() {
let _:str = *"";
}
컎íìŒíì§ë§
fn main() {
let v:str = *"";
}
íì§ ìë€. ìŽê²ì !
ì í곌ë êŽë šìŽ ììµëë€. ìŽì ëí 묞ì 륌 ë§ë€ê¹ì?
ë§ì§ë§ìŽ ì ë§ ë²ê·žìžì§ ëªšë¥Žê² ìµëë€. ë ë²ì§ž ìì ë í¬êž°ê° ì§ì ëì§ ìì rvalue ì§ììŽ ììŒë©Ž 컎íìŒë¬ê° ë¡ì»¬ ë³ì v
ì í ë¹í ì€í ê³µê°ì ìì ì ì ìŒë¡ ìê³ ì¶ìŽíì§ë§ DSTìŽêž° ë묞ì ì ì ìêž° ë묞ì 컎íìŒëì§ ììµëë€.
첫 ë²ì§ž ììì _
íšíŽì ì§ì ë³ì ë°ìžë©ê³Œ ê°ì ìŽë€ ê²ê³Œë ìŒì¹í ë¿ë§ ìëëŒ ë³ì륌 ì í ìì±íì§ë ìëë€ë ì ìì í¹ë³í©ëë€. ë°ëŒì íŽë¹ ìœëë fn main() { *""; }
ììŽ let
í©ëë€. ì°žì¡°(DSTë í¬íš)륌 ìì°žì¡°í ë€ì 결곌ì ëíŽ ì묎 ê²ë íì§ ìë ê²ì ì ì©íì§ ìì§ë§ ì íší ê²ìŒë¡ 볎ìŽë©° ì íšíì§ ìììŒ íë€ê³ íì íì§ ììµëë€.
ì€ë¥žìªœ. ê·žë¬ë í¹í ë€ì곌 ê°ìŽ ì ë§ íŒë ì€ëœìµëë€.
fn main() {
let _v:str = *"";
}
컎íìŒíì§ë ììµëë€. _
ì ëí ë¹ì ì ìŽë¡ ìŒë¡ ìŽê²ì ì°ëŠ¬ê° ëšì§ _
ìëëŒ _v
ëŒê³ ë¶ë¥Žë ê²ì ì ìžíê³ ë ëìŒíŽìŒ í©ëë€.
ëŽê° êž°ìµíë ë°ì ë°ë¥Žë©Ž _v
ì v
ì ì ìŒí ì°šìŽì ì ì í ë°ì€ìŽ ì¬ì©ëì§ ìì ê°ì ëí ê²œê³ ë¥Œ íìíì§ ìëë€ë ê²ì
ëë€.
ë°ë©Žì _
í¹í "íêž°"륌 ì믞íë©° íšíŽ(ì: íí ìì¶ íêž°, ìžì ëª©ë¡ ë±)ìì ë ê° ìŽìì ìì¹ì ëíë ì ìëë¡ í¹ë³í ì²ëŠ¬ë©ëë€. ìŽëŠ 충ëì ëí ì€ë¥ì
ëë€.
ë°ë©Žì _ë "íêž°"륌 ì믞íë©° ìŽëŠì ëí ì€ë¥ë¥Œ ìŒìŒí€ì§ ìê³ íšíŽ(ì: íí ìží©, ìžì ëª©ë¡ ë±)ìì ë ìŽìì ìì¹ì ëíë ì ìëë¡ í¹ë³í ì²ëŠ¬ë©ëë€. 충ë.
ì³ì. ë¹ì ìŽ ë§í ê² ìžìë let _ = foo()
ë drop
ê° ìŠì ížì¶ëë ë°ë©Ž _v
ë ë²ì륌 ë²ìŽë ëë§ ìì ë©ëë€(ì v
ë ).
ì¬ì€ ìŽê²ìŽ ëŽê° " _
ë í¹ë³íë€"ë ë§ì ì믞ì
ëë€.
ë°ëŒì ìŽì ë í¬êž°ê° ì¡°ì ëì§ ìì 몚ë rvalue륌 ê±°ë¶íë ê²ì²ëŒ 볎ì ëë€("í¬êž° ì¡°ì ëì§ ìì rvalues" êž°ë¥ìŽ ìŒì ž ìì§ ìë í). ë¹ë¡ íšê³Œë 믞믞í ì§ëŒë.
ê·žë° ë€ì !
ìì í¬êž°ê° ì¡°ì ëì§ ìì rvalueë¡ì ê°ì ë³íì íì©íì§ ìë êž°ë¥ ê²ìŽížë¥Œ ì¬ì©íë ê²ìŽ ì¢ìµëë€. ìŽê²ì let _:str = return;
ì ê°ì ìœë륌 ê±°ë¶íì§ë§ ì묎ë ìœëìì ìŽë¥Œ ì¬ì©íì§ ìì ê²ìŽëŒê³ ìê°í©ëë€.
!
ì íìŽ ë¶ìì í í ê°ì ë³íí ì ìë ë¶ë¶ê³Œ ë¶ê°ë¥í ë¶ë¶ì í¬ê² ë³ê²œí ì ììµëë€.
묞ì ë https://github.com/rust-lang/rust/issues/49593 ì ìì íêž° ìíŽ DSTì ëí ê°ì ììŽ ìì ííë ê²œì° ëì€ì í¬êž°ê° ì¡°ì ëì§ ìì rvalue륌 ì¶ê°í ë ìŽë¬í ê°ì 륌 ë³µìíê³ ì¶ìµëê¹? https://github.com/rust-lang/rust/issues/49593ì ë€ì ê¹šì§ ìê³ ê·žë ê² í ì ììµëê¹?
ëŽ ìŽì ì ììë ìŽê²ìŽ í¬íšëìŽ ììµëë€. #49593 ì í¬êž°ê° ì¡°ì ëì§ ìì
ìµì¢
ì룚ì
ì ëí ê°ìžì ìž ì ìì Box::new
(ë€ë¥ž ì€ìí ë°©ë²ë í¬íšë ì ìì)ê° í¬êž°ê° ì¡°ì ëì§ ìì 맀ê°ë³ì륌 íì©íê³ ì ì¬í ìí©ìì 몚ížì±ì íì©íëë¡ íë ê²ì
ëë€.
FWIW, _
ë í¹ì ë³ì ìŽëŠ 곌 ë€ëŠ
ëë€. ê·žê²ì ìŒì¹íë ì¥ì ì ì묎 ê²ë íì§ ìë ìì í ë³ê°ì íšíŽ 구묞ì
ëë€. íšíŽ ìŒì¹ë ê°ìŽ ìë ì¥ì ìì ìë í©ëë€ .
ë³ì ë°ìžë©ì ê°ì¥ ê°ê¹ìŽ ê²ì ref _x
ìŽì§ë§, ê·žë¡ ìžíŽ 충ëíë ì°šì©ì íŒíêž° ìíŽ NLLìŽ íìí ìë ììµëë€. ìŽê²ì btwìì ìëí©ëë€.
// 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ììë íì¬ ìœëì í¬êž°ê° ì¡°ì ëì§ ìì rvalueê° ì í ëíë ì ìë€ë ê²ì
ëë€. ê·žë¬ë let _:str = *""
ëíë©ëë€. ê·žë¬í ê°ì¹ë íìê°ë ìŽì§ 못íì§ë§, íµì¬ì ìì€ììë ìŽì ììµëë€. ê·ì ê°ìê±°...
ëì ê·íì ìë êž°ì ì ìŒë¡ ìì í í©ë²ì ìŽë©° ìì ìŽ ìëëë€. str
ë í¬êž°ê° ì§ì ëì§ ììì§ë§ &str
ë í¬êž°ê° ì¡°ì ëììµëë€.
ê·žë¬ë let _:str = *""ì ëíë©ëë€. ê·žë¬í ê°ì¹ë íìê°ë ìŽì§ 못íì§ë§, íµì¬ì ìì€ììë ìŽì ììµëë€. ê·ì ê°ìê±°...
&*foo
ì ê°ì ííììë ì ì¬í "ê³ ì€íž"ê° ììµëë€. 뚌ì foo
륌 ìì°žì¡°í ë€ì ìŽëíì§ ìê³ ê²°ê³Œì 죌ì륌 ê°ì žìµëë€. ì륌 ë€ìŽ & { *foo }
ì ê°ì§ ììµëë€.
@earthengine @SimonSapin í¬êž°ê° rvalue ("ê° ííì")ê° ì¡Žì¬íì§ ììµëë€. lvalue("place ì")ë§ ìíí©ëë€. *"foo"
ë ì¥ì ìŽë©° íšíŽ ìŒì¹ìë ê°ìŽ íìíì§ ìê³ ì¥ìë§ íìí©ëë€.
"lvalue"ì "rvalue"ëŒë ìŽëŠì Cììë ì 묌ìŽê³ ë€ì ì€íŽì ìì§ê° ìì§ë§, let
ì RHSë ìŽëŠìë ë¶êµ¬íê³ "lvalue"(ì¥ì ííì)ìŽêž° ë묞ì Rustììë ëì± ê·žë ìµëë€.
(í ë¹ ííìì Rustìì C ìŽëŠê³Œ ê·ì¹ìŽ ìë¯žê° ìë ì ìŒí ê³³ì
ëë€)
ê·íì ììì 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)
ê° ëìŒí ì íì ë ê°ë¥Œ ìì±íëë¡ ë³Žì¥ íë €ë©Ž ì í ìì€í
ì ëí íì¥ ìŽ íìí©ëë€.typemap
ììê° ë¶ê±Žì íŽì§ëë€.ê·žë ê² í ê±°ë©Ž ì ì¹ë£íì§ ë§! ìì ì ì¶ë¡ ë³ìë¡?
í목 ì íì ëª
ííê² íêž° ìíŽ PhandomData
ë¡ !
죌ìì ëíŒë¥Œ ë§ëììì€.
https://github.com/rust-lang/rust/issues/49593 ìŽ ìì ëììµëë€. ìŽê²ìŽ ìì íì ìŽì ë³µê·ì ìŽì ììµëë€. ìŽì ìì í ë³Žê³ ìë ì¬êž°ì ììµëë€ . ë€ì ìëíŽë³Žì!
@rfcbot fcp ë³í©
rfcbotìŽ ëìŒí 묞ì ìì ë ìŽìì FCP륌 ì§ìí ì ìë€ê³ ìê°í©ëë€. ìŽë² ìì í ëŒìŽëì ëí ìë¡ìŽ 묞ì 륌 ìŽìŽ 볌ê¹ì?
https://github.com/rust-lang/rust/pull/50121 ìì í륌 ëë늎 ë¿ë§ ìëëŒ íŽë°± ì맚í±ë ì ê³µí©ëë€. ìŽê²ìŽ ì°ëŠ¬ê° ë€ì ì°Ÿê³ ì¶ì ê²ì ëê¹?
묞ì ì€ëª ìì ì íëì§ ìì ëëšžì§ íìžëì ë€ì곌 ê°ìµëë€.
!
ëíŽ ìŽë€ í¹ì±ì 구ííŽìŒ í©ëê¹? ìŽêž° PR #35162ìëOrd
ë° êž°í ëª ê°ì§ê° í¬íšë©ëë€. ìŽê²ì ìë§ë T-libs 묞ì ìŒ ê²ìŽë¯ë¡ íŽë¹ í귞륌 묞ì ì ì¶ê°íê³ ììµëë€.
ëì€ì impls륌 ì¶ê°í ì ììµëë€. ê·žë ì£ ? ìëë©Ž ì°šëšêž°ìžê°ì?
@SimonSapin ì€í https://github.com/rust-lang/rust/issues/57012. !
ë¡ì íŽë°±ìŽ ìŽ ë³ê²œì ìŒë¶ë¡ ë€ì íì±íë ê²ìŒë¡ ììí©ëë€. ì(ìì í 묞ì ì ëíŽ ë
ŒìíŽ ë³Žê² ìµëë€).
ìíž ì°žì¡°: https://github.com/rust-lang/rust/issues/58184
ë¶ëª í êž°ë¥ ê²ìŽíž ë€ì ì ë ¥íì§ ìë ë²ê·ž/구ë©ìŽ ììŒë©° Stableìì ì°žì¡°í ì ììµëë€. https://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;
}
ìŽê²ì https://github.com/rust-lang/rust/pull/35162 ìì 첫 ë²ì§žëŒê³ ìê°íë Rust 1.12.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ê°ê° ìë 몚ë nì ëíŽ ìëí©ëë€. ë°ëŒì ë³íìŽ ìë ìŽê±°íìŽ ìë ê²œì° ìŒìŽì€ê° ìë ìŽê±°í곌 ìŒì¹ìí¬ ì ììµëë€.
ì¬íê¹ì§ë ê·žë°ëë¡ ìëë€. íì§ë§ ì€ì²©ë íšíŽì ëíŽ ìŒì¹ìí€ë €ê³ íë©Ž ìŽë€ ìŒìŽ ë°ìíëì§ ë³Žììì€. ë€ìì
Result
ëŽë¶ì ë ê°ì§ ë³í ìŽê±°íì ëí ìŒì¹ì ëë€.ìžë¶ íšíŽ ëŽë¶ì ëŽë¶ íšíŽì íì¥í ì ììµëë€. ë ê°ì
Foo
ë³íìŽ ììŒë¯ë¡Err
ëí ë ê°ì§ 겜ì°ê° ììµëë€.Result
ë°Foo
ìì ìŒì¹ìí€êž° ìíŽ ë³ëì ìŒì¹ ë¬žìŽ íìíì§ ììµëë€. ìŽê²ì ì¬ë¬ ë³íìŽ ìë ìŽê±°íì ëíŽ ìëí©ëë€... _0 ì ìž_.ì ìŽê²ìŽ ìëíì§ ìììŒ í©ëê¹? ëë ìŽê²ì ìì ìŽëŒê³ ë¶ë¥Žì§ ìê³ ë¬Žìž ì íì ëí "í¹ë³ ì§ì"ì ì¶ê°íë ê²ì ë¶ìŒì¹ ìì ìŽëŒê³ ë¶ëŠ ëë€.