https://github.com/rust-lang/rfcs/pull/1542ã®è¿œè·¡ã®åé¡
è¡ãã«ã¯ïŒ
From
Into
ã䜿çšããããã«TryFrom
ãã©ã³ã±ããå®è£
ã®å¢çãå€æŽããŸãClone
ãå¿
èŠãšããã«å€æã倱æããå Žåã«ãå
ã®å€ã§ãšã©ãŒãäžè¬çã«åºåããæ¹æ³ã¯ãããŸããïŒå€±æãããšãããã¯ã«ãªãé¢é£ã¡ãœããã«é©åãªãšã©ãŒã¡ãã»ãŒãžã衚瀺ãããå¯èœæ§ããããŸããïŒ
ãããåå¥æ²ã«å ¥ãå¿ èŠããããã©ããã®è°è«ã¯ããããå®å®ãããšãã®ããã«ä¿çãããŠããŸãã
ãããã©ããã§ã«ããŒãããŠããå Žåã¯ãè©«ã³ããŸããããããå®å®ããŠãããšããŒã¯ããåã«äœãèŠããã§ããïŒ ããŸããŸãªãããžã§ã¯ãã§ãã®æ©èœãæ°ååå®è£ ãããšç¢ºä¿¡ããŠããã®ã§ãäžè¬çãªåå©çšå¯èœãªç¹æ§ã«ãããç§ã¯ð
次ã®ãµã€ã¯ã«ã®ããã«ãããè°è«ã®ããã«æã¡åºãããšãã§ããŸãã
ðãã®åé¡ã¯çŸåšãå®å®åã®ããã«ãµã€ã¯ã«ã®é·ãæçµã³ã¡ã³ãæéã«å ¥ã£ãŠããŸãð
å®å®åã®ãã€ã³ããšããŠãlibsããŒã ã¯ãå®å®åã®äžç°ãšããŠããããã®ç¹æ§ããã¬ãªã¥ãŒãã«è¿œå ããããšèããŠããŸãã ããã«ã¯ãã¯ã¬ãŒã¿ãŒã®å®è¡ã_å°ãªããšã_100ïŒ ã¯ãªãŒã³ã§ããå¿ èŠããããŸãããçŸåšã®è§£æ±ºã®ç¶æ ã«ããããã¬ãªã¥ãŒãã«ç¹æ§ãè¿œå ããããã®äžäœäºææ§ããããšæ¯èŒç確信ããŠããŸãã
ãããã®ç¹æ§ã®ç®çã«ã€ããŠããã€ã質åããããŸãã
std
ã®ã©ã®ã¿ã€ãã«ããããå®è£
ãããŸããïŒimpl TryFrom<T> for T
ã®ãããªå®è£
ãååŸããå¿
èŠãããã¿ã€ãã¯ã©ãã§ããïŒimpl From<U> for T
ãããå Žåãã©ã®ã¿ã€ããimpl TryFrom<U> for T
ã®ãããªå®è£
ãååŸããå¿
èŠããããŸããïŒcc @sfackler ãçŸåšã®implã®ã»ãããšããã€ãã®çè«çæ ¹æ ã«ã€ããŠãæ¡åŒµã§ããŸããïŒ
å€æã倱æããå¯èœæ§ãããå Žåãé€ããŠãäžè¬çã«ãçŽæã¯From
/ Into
ã®çŽæãšãŸã£ããåãã§ããå¿
èŠããããšæããŸãã From
ãšInto
ã®å®è£
ãæšæºã©ã€ãã©ãªã¿ã€ãã«åŸã
ã«è¿œå ããã®ãšåãããã«ã TryFrom
ãšTryInto
ã§ãåãããšãè¡ããšæããŸãã ããã§æãéèŠãªã¬ã€ãã©ã€ã³ã¯ãå€æã¯ãæšæºçã«æçœãªããã®ã§ãªããã°ãªããªããšããããšã§ããããã¿ã€ããå¥ã®ã¿ã€ãã«å€æããåççãªæ¹æ³ãè€æ°ããå Žåã TryFrom
ãŸãã¯From
ã¯æ£ãããªãå¯èœæ§ããããŸã䜿çšãããã®ã
_äžè¬çã«_ããã¹ãŠã®ã¿ã€ããimpl TryFrom<T> for T
ã§ãããšããæåã§impl From<U> for T
ãæã¡äžããå¿
èŠããããšã¯æããªãã ç¹ã«ãã©ã®ãšã©ãŒã¿ã€ããéžæããããæ確ã§ãªãããšããããããŸãã ãã ãããããã®çš®é¡ã®å®è£
ã¯ãç¹å®ã®APIãæ©èœãããããã«å®çŸ©ã§ããå®çŸ©ããå¿
èŠãããå®è£
ã§ãã ããšãã°ãRFCã§æŠèª¬ãããŠããçç±ã«ãããããªããã£ãæŽæ°åã®ããŸããŸãªçµã¿åããã«å¯ŸããŠããããã®çš®é¡ã®å®è£
ãäž¡æ¹ãšããããŸãã å¥ã®äŸãšããŠã TryFrom
/ TryInto
ã眮ãæããã¢ãããã¯ãªç¹æ§ã®1ã€ã¯ã postgres :: IntoConnectParamsã§ããããã«ã¯ã ConnectParams
ãããèªäœã«å€æããååž°çãªå®è£
ããããŸãã
äžè¬ã«ããã¹ãŠã®ã¿ã€ãã
TryFrom<T> for T
ãå®è£ ããããæåã§implFrom<U> for T
ãæã¡äžãããããå¿ èŠããããšã¯æãããŸããã
TryFrom
ã®å€æãééããªãå Žåããšã©ãŒã¿ã€ãã¯enum Void {}
ã§ããã¯ãã§ãããïŒ ïŒãŸãã¯ä»ã®ååã®åæ§ã®åæåãïŒã¡ãªã¿ã«ãããã¯ãæ±çšã®Void
ãstd
ãšå
¥åããæ£åœãªçç±ã®ããã«æããŸãã
@SimonSapinã¯ã IntoConnectParams
ã¹ã¿ã€ã«ã®APIãšãRFCã§æŠèª¬ãããŠããæŽæ°å€æã®ãŠãŒã¹ã±ãŒã¹ãç ŽããŸããããã¯ãééãã®ãªãå€æãšééãã®ãªãå€æã®ãšã©ãŒã¿ã€ããäžèŽããªãããã§ãã
@SimonSapin https://github.com/rust-lang/rfcs/pull/1216
@sfacklerãšã©ãŒã¿ã€ãïŒäŸïŒ try!
ïŒã«ãã¬ãŒã³ãªFrom
ã䜿çšããå Žåã¯éããŸãïŒ impl<T> From<!> for T
ã¯ããã®ç®çã®ããã«ååšããããšãã§ããååšããå¿
èŠããããŸãã
From
ãšInto
ã®å®è£ ãæšæºã©ã€ãã©ãªã¿ã€ãã«åŸã ã«è¿œå ããã®ãšåãããã«ãTryFrom
ãšTryInto
ã§ãåãããšãè¡ããšæããŸãã
ããã¯ãŸã èµ·ãã£ãŠããªãããã§ãã®ã§ã誰ãããã«è¿ã¥ããŠããªãã®ãã std
ã«è©²åœããã¿ã€ãããªãã®ãã¯ããããŸããã std
ã«è©²åœããã¿ã€ããããå Žåã¯ããããã®ããã€ãã®å®è£
ã確èªãããšããã§ãããã ããšãã°ã次ã®åªããå®è£
ã®ããããã§ããïŒ
impl TryFrom<u32> for char
impl TryFrom<char> for u8
impl TryFrom<Vec<u8>> for String
impl TryFrom<&[u8]> for &str
_äžè¬çã«_ããã¹ãŠã®ã¿ã€ãã
impl TryFrom<T> for T
ã§ãããšããæåã§impl From<U> for T
ãæã¡äžããå¿ èŠããããšã¯æããªãã
åé¡ã¯ã TryInto<T>
ã䜿çšããããã T
ãã¯ã¬ãŒãã«ãªãå Žåã¯ã impl TryFrom<T> for T
ãå®è£
ãããŠããããšãæåŸ
ããå¿
èŠããããšããããšã§ãã ããã¯æ®å¿µãªå¶éã§ããã From
/ Into
ã«ã¯ååšããŸããã
@SimonSapinã¯ã
IntoConnectParams
ã¹ã¿ã€ã«ã®APIãšãRFCã§æŠèª¬ãããŠããæŽæ°å€æã®ãŠãŒã¹ã±ãŒã¹ãç ŽããŸããããã¯ãééãã®ãªãå€æãšééãã®ãªãå€æã®ãšã©ãŒã¿ã€ããäžèŽããªãããã§ãã
ããã¯ãå€æå ã®ã¿ã€ãã«åºã¥ããŠãšã©ãŒã¿ã€ããäœããã®åœ¢ã§ä¿®æ£ãããããšãæå³ããŸããïŒ
TryFrom::Err
ãšTryInto::Err
ãstd::error::Error
ã«å¶éãããªãã®ã¯ãªãã§ããïŒ
std :: error :: Errorã«å¶éãããŠããŸãããïŒ
ããã«ããã Err
ã()
ã«ãªãã®ãé²ãããšãã§ããŸããããã¯ãééãã®ãªãå€æã®å®è¡å¯èœãªãšã©ãŒã¿ã€ãã§ãã
()
ããšã©ãŒã¿ã€ãã®å Žåãé¢æ°ã¯Err(())
ãè¿ãå¯èœæ§ããããŸãã ããã¯ãé¢æ°ã確å®ã«ãããã®ã§ã¯ãããŸããã 倱æããŠããæçšãªãšã©ãŒãæäŸã§ããŸããã 倱æãããããããªããã倱æããªããããããªãå€æã䜿çšããã³ãŒããæžããšããç§ã¯æè¯ã®æ¹æ³ã¯Into
ã«çžããã$ TryInto
ã䜿çšããç¹æ®åãæžãããšã ãšæããŸãã
RFC 1216ãå®è£
ããããšã !
ãééãã®ãªãå€æã«é©ãããšã©ãŒã¿ã€ãã«ãªããŸãã ç§ã¯ã TryFrom::Err
/ TryInto::Err
$ã«ãã€ã³ãããã$ Error
ãOKã§ããããšãæå³ãããšæããŸãã
From<T>
å®è£
ããããšã§TryFrom<T, Err = !>
ã®å®è£
ãåŸãããã°ïŒãã¡ããã Into
ãåæ§ã§ãïŒãç§ã¯ç¢ºãã«ãããæãã§ããŸãã
ç§ã¯ã
TryFrom::Err
/TryInto::Err
$ã«ãã€ã³ããããError
ãOKã§ããããšãæå³ãããšæããŸãã
ã¯ãããŸãã«ãã®çš®ã®ã±ãŒã¹ã«ã¯ééããªãimpl Error for ! { ... }
ããããŸãã
æŽæ°å€æã®ãŠãŒã¹ã±ãŒã¹ã§ã®åã®éãã«ã€ããŠå°ãå¿é
ããŠããŸããã !
-as-a-typeãçéžããŠå®éšããæ©äŒãåŸããããŸã§ããããå®å®ãããå¿
èŠãããããã§ãã
ç§ã®POVã§ã¯ããšã©ãŒãè¡šããã¹ãŠã®é¢é£ããã¿ã€ãã¯Error
ã§å²ãŸããŠããå¿
èŠããããŸãã æ®å¿µãªãããç§ãã¡ã¯ãã§ã«ãããªãã§1ã€ã®ã¿ã€ããæ®ããŸããïŒ FromStr::Err
ïŒä»ã®ãããªãã¯ã¿ã€ãã¯TryInto
ãšTryFrom
ã®ã¿ã§ã ack 'type Err;'
ãšack 'type Error;'
ã§ãã§ãã¯ãããŸã
æè¿è°è«ãããããã«ãlibsããŒã ã¯ã !
ã¿ã€ãã解決ããããŸã§ããããã®ç¹æ§ãå®å®ãããããšã«ãã³ãããããšã決å®ããŸããã
ããã¯ãããããã¯ãããŠããªããšæããŸãããïŒ
@sfacklerãšããŠæåãåé€ãããšã !
ã¿ã€ããšãããã®ç¹æ§ã調æ»ãããŸãã
è¿ãå°æ¥ãããã¯å®å®ããããã®å€æŽããããŸããïŒ
TryFrom :: ErrãšTryInto :: Errãstd :: error :: Errorã«å¶éãããªãã®ã¯ãªãã§ããïŒ
std::err::Error
ã¯#![no_std]
ãã«ãã«ã¯ååšããŸããã ãŸããå€ãã®å Žåããšã©ãŒã¿ã€ããå©çšå¯èœã§ãã£ãŠãã std::err::Error
ãå®è£
ããŠãã¡ãªããã¯ãããŸããã ãããã£ãŠãç§ã¯ãã®ãããªéçãæããªãããšãæã¿ãŸãã
ç§ã¯ãããèªåã®ã©ã€ãã©ãªã«å®è£
ããããšãè©Šã¿ãŸããã https://github.com/rust-lang/rfcs/pull/1542#issuecomment -206804137ã§@SimonSapinãè¡šæããæžå¿µãç¹°ãè¿ããããšæããŸãããtryããšããèšèã¯æ··ä¹±ããŠããããã try!(x.try_into());
ã¯æ··ä¹±ãæããŸããåãã¹ããŒãã¡ã³ãã§2ã€ã®ç°ãªãæ¹æ³ã䜿çšããŸããã
å€ãã®äººããã®ãããªããšãx.try_into()?;
ãšæžãã¹ãã ãšç解ããŠããŸãããç§ã¯ïŒãã¹ãŠã®è°è«ã«åºã¥ããŠïŒ ?
æ§æã䜿çšããªãããšã匷ã奜ãããªãã®æ°ã®äººã
ã®1人ã§ããªããªã...ãã¹ãŠã®è°è«ã§èšåããããã¹ãŠã®çç±ã
å人çã«ã¯ãååã«try_
ãã¬ãã£ãã¯ã¹ãå¿
èŠãšããªããã¿ãŒã³ãèŠã€ããããã«åªããã¹ãã ãšæããŸãã
ããŒãã³ã°ã«ã€ããŠã¯ç¹ã«åŒ·ãã¯æããŸããããå人çã«ã¯ãã以äžè¯ããã®ã¯èããããŸããã
Result
ãè¿ãé¢æ°ã®ãã¬ãŒããŒã«try_
ã䜿çšããããšã¯ããã§ã«åæšæºã«ãªã£ãŠããŸãã
ããããç§ã¯ïŒãã¹ãŠã®è°è«ã«åºã¥ããŠïŒããªãã®æ°ã®äººã ã®1人ã§ããããã¹ãŠã®è°è«ã§èšåãããŠãããã¹ãŠã®çç±ã®ããã«ã
?
æ§æã䜿çšããªãããšã匷ãæãã§ããŸãã
ãã®è°è«ã¯ããçµãã£ãã®ã§ã¯ãªãã§ããïŒ ã€ãŸããç§ã¯è°è«ã®ãã®åŽé¢ã«åæ
ããŸãïŒãªã人ã
ãtry!()
ããšãŠãè¿·æã ãšèšã£ãã®ãããããŸããã ?
ã¯ç®ç«ãããæ æ°ãªãšã©ãŒåŠçãå©é·ããŠããããã§ããã§ã«å®å
šã«åªãããã¯ããæã£ãŠãããã®ã®æ§æã®ç¡é§ïŒå°æ¥ãããäžè¬çãªãã®ã«ãªãããã«æ¡åŒµãããªãéãïŒã
ããããããã¯éå»ã®ããšã§ãã ?
ã¯å®å®ããŠããŠãæ¶ããããšã¯ãããŸããã ãããã£ãŠãå
šå¡ãåããã®ã䜿çšãã try!
ãšã®ååã®ç«¶åã«ã€ããŠå¿é
ããã®ããããããšãã§ããããã«ãå
šå¡ãããã«åãæ¿ããããšãã§ããŸãã
rust-lang / rfcsïŒ1542ïŒã³ã¡ã³ãïŒã§@SimonSapinã«ãã£ãŠè¡šæãããæžå¿µãç¹°ãè¿ããããšæããŸã
ç§ã¯ååã§åŒçšãããŠããã®ã§ãç§ã¯ããããã»ã©å¿é
ããŠããŸããã ç§ããã®ã³ã¡ã³ãããããšãã ?
æŒç®åã¯å°æ¥ãäžç¢ºããªææ¡ã§ããããä»ã¯ããã«ãšã©ãŸããŸãã
ãŸãããã€ã¯ã·ã§ãã£ã³ã°ãšããååã®å¥ã®ã©ãŠã³ãããããåŸè
ãããæ©ãå®å®ãããããšãéèŠã ãšæããŸãã RFCãåãå
¥ããããŠããæ°ãæãçµã¡ãããã¯#[unstable]
ã«å®è£
ãããŸããã
çµæãè¿ãé¢æ°ã®ãã¬ãŒããŒã«try_ã䜿çšããããšã¯ããã§ã«åæšæºã«ãªã£ãŠããŸãã
ããã¯ç§ããã®æ©èœã«ã€ããŠæãå¥åŠã ãšæãããšã§ãã ç§ãäœæããã»ãšãã©ã®é¢æ°ã¯Result
ãè¿ããŸããããã®ç¹æ§ãè©ŠããŠã¿ãå Žåãé€ããŠããããã®é¢æ°ã«try_
ãã¬ãã£ãã¯ã¹ãä»ããããšã¯ãããŸããã
ãŸãããããæžãããšã®å®éçãªå©ç¹ã¯èŠã€ãããŸããã§ããã
impl TryInto<X> for Y {
type Err = MyErrorType;
fn try_into(self) -> Result<X, Self::Err> { ... }
}
代ããã«ãç§ã¯ãã€ã§ããããæžãããšãã§ããæ§æäžã®ãªãŒããŒãããã¯ã¯ããã«å°ãªããªããŸãã
fn into_x(self) -> Result<X, MyErrorType> { ... }
å€æãå€ãã«ããããããã TryInto
ãŸãã¯TryFrom
ã§ãã©ã¡ãŒã¿ãŒåããããžã§ããªãã¯ã³ãŒããäœæããå¿
èŠããªãã£ããããå®çŸ©ããåã§ã®ãã¹ãŠã®äœ¿çšã«ã¯åŸè
ã®åœ¢åŒã§ååã§ãã TryInto<...>
ãŸãã¯TryFrom<...>
ã®ãã©ã¡ãŒã¿ãŒããããšãçããã圢åŒã®ããã«æããŸãã
ãŸããåžžã«Error
ãšå
¥åãããããé¢é£ãããšã©ãŒã¿ã€ãã«$ Error
ïŒ$ã§ã¯ãªãErr
ãšããååãä»ãããšããšã©ãŒãçºçãããããªãããšãããããŸããã ãã®ééãã¯ãRFCèªäœã®ãã©ããäžã«ãè¡ãããããšã«æ°ã¥ããŸããïŒ httpsïŒ//github.com/rust-lang/rfcs/pull/1542#r60139383ã ãŸãã Result
ã䜿çšããã³ãŒãã¯ã Result
ã³ã³ã¹ãã©ã¯ã¿ãŒã§ããããããã§ã«Err
ãšããååãåºç¯ã«äœ¿çšããŠããŸãã
ç¹ã«æŽæ°åã«çŠç¹ãåœãŠããåºãããããçãããããªã©ã®çšèªã䜿çšããå¥ã®ææ¡ããããŸãããããšãã°ãç§ãå®è£
ããx = try!(x.narrow());
ã§ãã çµã¿èŸŒã¿ã®æŽæ°åã§ãã®ãããªå€æãè¡ãã ãã ã£ãã®ã§ãå®éã®äœ¿çšæ³ã§ããã§ææ¡ãããæ©èœã䜿çšããã«ã¯ãææ¡ã§ååã§ããããšãããããŸããã ãŸããããã§ååãªãŠãŒã¹ã±ãŒã¹ã§ã¯ããã人éå·¥åŠçã§æ確ãªïŒIMOïŒã§ãã
ãŸãããããæžãããšã®å®éçãªå©ç¹ã¯èŠã€ãããŸããã§ãã...
ç§ã¯ããçšåºŠåæããŸãã ãã®ç¹æ§ã¯ããããã®ã䜿çšããŠå¥ã®ãã®ãäœæã§ãããããã®ããã»ã¹ã倱æããå Žåãããå Žåã«äœ¿çšããŸãããã ããããã¯ã»ãŒãã¹ãŠã®é¢æ°ã®ããã«èãããŸãã ã€ãŸãããããã®implãå¿ èŠã§ããïŒïŒ
impl TryInto<TcpStream> for SocketAddr {
type Err = io::Error;
fn try_into(self) -> Result<TcpStream, io::Error> {
TcpStream::connect(self)
}
}
impl<T> TryInto<MutexGuard<T>> for Mutex<T> {
type Err = TryLockError<MutexGuard<T>>;
fn try_into(self) -> Result<Mutex<T>, Self::Err> {
self.try_lock()
}
}
impl TryInto<process::Output> for process::Child {
type Err = io::Error;
fn try_into(self) -> Result<process::Output, io::Error> {
self.wait_with_output()
}
}
impl TryInto<String> for Vec<u8> {
type Err = FromUtf8Error;
fn try_into(self) -> Result<String, FromUtf8Error> {
String::from_utf8(self)
}
}
ãã®ç¹æ§ã¯ã»ãšãã©äžè¬çãããããã§ãã äžèšã®ãã¹ãŠã®äŸã§ã¯ã try_into
ãšåŒã¶ããããå®éã«äœãããŠããã®ããæ瀺çã«èšãæ¹ãã¯ããã«è¯ãã§ãããã
TryInto<...>
ãŸãã¯TryFrom<...>
ã®ãã©ã¡ãŒã¿ãŒããããšãçããã圢åŒã®ããã«æããŸãã
ãŸãåæããŸãã é¢æ°ã«å€ãæž¡ãåã«ãå€æãå®è¡ããŠãšã©ãŒãåŠçããªãã®ã¯ãªãã§ããïŒ
std :: err :: Errorã¯ïŒïŒ[no_std]ãã«ãã«ååšããŸããã ãŸããå€ãã®å Žåããšã©ãŒã¿ã€ãã®std :: err :: Errorãå®è£ ããŠãã䜿çšå¯èœãªå Žåã§ãã¡ãªããã¯ãããŸããã ãããã£ãŠãç§ã¯ãã®ãããªéçãæããªãããšãæã¿ãŸãã
std::error::Error
ã«å¶éãããããšã®å©ç¹ã®1ã€ã¯ãå¥ã®ãšã©ãŒã®cause()
ã®æ»ãå€ã«ãªãå¯èœæ§ãããããšã§ãã core::error::Error
ããªãçç±ã¯ããããããŸãããã調ã¹ãŠããŸããã
ãŸããç§ã¯ãã€ãErrorãšå ¥åããã®ã§ãErrorã§ã¯ãªãé¢é£ãããšã©ãŒã¿ã€ãã«Errãšããååãä»ãããšãšã©ãŒãçºçãããããªãããšãããããŸããã ãã®ééãã¯ãRFCèªäœã®ãã©ããäžã«ãè¡ãããããšã«æ°ã¥ããŸããïŒrust-lang / rfcsïŒ1542ïŒã³ã¡ã³ãïŒã ãŸããResultã䜿çšããã³ãŒãã¯ãResultã³ã³ã¹ãã©ã¯ã¿ãŒã§ãããããErrãšããååããã§ã«åºç¯å²ã«äœ¿çšããŠããŸãã
å®å®ããŠããFromStr
ããé¢é£ä»ããããåã«Err
ã䜿çšããŸãã æé«ã®ååã§ãããã©ããã«ããããããæšæºã©ã€ãã©ãªå
šäœã§äžè²«æ§ãä¿ã€ããšãéèŠã ãšæããŸãã
TryFrom
ãšTryInto
ãäžè¬çããããã©ããã«ããããããæšæºã©ã€ãã©ãªã§ãå°ãªããšãæŽæ°åéã§ã®ãã©ãŒã«ãã«å€æãæ¬åœã«èŠãããšæããŸãã ç§ã¯ããã®ããã®ã¯ã¬ãŒããæã£ãŠããŸããããŠãŒã¹ã±ãŒã¹ã¯ãããæšæºã«ããã®ã«ååã«é²ãã§ãããšæããŸãã Rustãã¢ã«ãã¡çãŸãã¯ããŒã¿çã ã£ãé ããã®ç®çã§FromPrimitive
ãšToPrimitive
ã䜿çšããããšãèŠããŠããŸããããããã®ç¹æ§ã«ã¯ããã«å€§ããªåé¡ããããŸããã
Error
ã¯ãã³ããŒã¬ã³ã¹ã®åé¡ã®ããã core
ã«ç§»åã§ããŸããã
ãŸããã³ããŒã¬ã³ã¹ã®åé¡ã«ããã Box<Error>
ã¯Error
ãå®è£
ããŠããŸãããããã¯ã Err
ã¿ã€ãããã€ã³ãããªããã1ã€ã®çç±ã§ãã
ãšã«ãããç¹æ§å®çŸ©ã§ããããã€ã³ãããå¿ èŠã¯å®éã«ã¯ãããŸãã-åŸã§ãã€ã§ãèªåã§ãã€ã³ãããããšãã§ããŸãïŒ
where T: TryInto<Foo>, T::Err: Error
ç§ã¯éåžžãããã®ã¹ã¬ããã«ã€ããŠã³ã¡ã³ãããŸããããç§ã¯ãã°ãããããåŸ
ã£ãŠããŸããããããŠäžèšã®ããã€ãã§è¡šçŸãããŠããããã«ãç§ã¯ããŒã«ãã¢ãããäœã§ãããããããŸããã ç§ã¯ãã€ã倱æããå¯èœæ§ã®ããfromç¹æ§ã欲ããã§ãã try_from
ãšåŒã°ããã³ãŒããããããšããã«ãããŸã...ãã®ç¹æ§ã¯ããã®ã¢ã€ãã¢ã_å®å
šã«_ã«ãã»ã«åããŸãã å®å®ãããµãã«äœ¿çšãããŠãã ããã
ç§ã¯ä»ã«ãããããã®ããšãæžããŸããããæ®å¿µãªãããããåé€ããŸãããç¹æ§ã®äžè²«æ§ã«ããããã®ç¹æ§ãç§ã«ãšã£ãŠå¯èœãªéãæçšã§ããããšã劚ããããŠããŸãã ããšãã°ãåºæ¬çã«ããããã®åã®éåžžã«äžè¬çãªããŒãµãŒã®ããªããã£ãåã«å¯ŸããŠããããšãŸã£ããåãç¹æ§ã®ç¹æ®ãªããŒãžã§ã³ãåå®è£ ããŸããã å¿é ããªãã§ãã ãããç§ã¯ããã«ã€ããŠæ¹ããŠæ鳎ããŸãã
ããã¯èšã£ãŠãã str :: parseã¯ãå¢çãšããŠFromStr
ãã¬ã€ããç¹æ®åããããããããã倧ããªã¡ãªãããåŸããããšæããŸããããã¯ãæ£ç¢ºã«ïŒ TryFrom<str>
ïŒæã§ç¹æ®åãããŠããŸãã
ã§ããããç§ãééã£ãŠããå Žåã¯èšæ£ããŠãã ããããã ãããããå®å®ãããŠstr::parse
ã«äœ¿çšãããšã次ã®ããã«ãªããŸãã
TryFrom<str>
ãè¿œå ããŸããããã¯ãå€æã¢ãžã¥ãŒã«ã«é©åã«å«ãŸããŠããããããäœãããã®ããããç°¡åã«ããããŸããTryFrom<str>
ãå®è£
ãã str.parse::<YourSweetDataType>()
ãç¡æã§å
¥æã§ããããã«ããŸãããŸããä»ã®try_from
ãå®è£
ããããšæããããè«çã³ãŒãã®ç·šæãåäžããŸããæåŸã«ãæœè±¡åã¯ããŠãããã³ãŒãã®åå©çšãäœãšãäœãšãããã®ãããªç¹æ§ã®æ§ãããªå©ç¹ã®1ã€ã¯ãåå¿è
ãšããã©ã³ã®äž¡æ¹ã«æäŸããã»ãã³ãã£ãã¯è³Œå
¥ã§ãã åºæ¬çã«ããããã¯ã銎æã¿ã®ããæšæºåãããåäœãåããåäžãªã©ã³ãã¹ã±ãŒããæäŸããŸãïŒãŸãã¯æäŸãå§ããŸãã Default
ã From
ã Clone
ã¯ããã®è¯ãäŸã§ãã ãããã¯ããŠãŒã¶ãŒãç¹å®ã®æäœãå®è¡ãããšãã«å°éã§ãããèšæ¶ã«æ®ãæ©èœã©ã³ãã¹ã±ãŒããæäŸãããã®åäœãšã»ãã³ãã£ã¯ã¹ã¯ãã§ã«ååã«ç解ããŠããŸãïŒäžåºŠåŠç¿ããŠãã©ãã«ã§ãé©çšã§ããŸãïŒã äŸãã°ïŒ
SomeType::default()
ã§é£çµ¡ãããŠãã ããSomeType::from(other)
ãå®è£
ãããŠããã®ã§ããããïŒããã¥ã¡ã³ãã«ã¢ã¯ã»ã¹ããªããŠããå
¥åããã ãã§ã³ã³ãã€ã«ã§ãããã©ããã確èªã§ããŸãïŒclone()
try_from
ããããŠãã ãã-ããåŸ
ã£ãŠãã ããïŒPãããã®ã¡ãœããã¯ãã¹ãŠäžè¬çã«ãªããRustãŠãŒã¶ãŒããŒã«ãããã®äžéšã«ãªããŸããããã«ãããããã¥ã¡ã³ããšã»ãã³ãã£ãã¯åäœããã§ã«å éšåãããŠãã䜿ãæ £ããæŠå¿µïŒããã³ããã¯Traitã®å¥åã§ãïŒïŒã«å°éã§ãããããè«ççãªè² æ ã軜æžãããŸãã
ãã¡ããããããã¯åžžã«äžèŽãããšã¯éããŸããããã®å ŽåãããŒã¿æ§é ãå°éåããŸããããã®ãããªç¹æ§ã¯ãããã¥ã¡ã³ããèªãã ãã from_some_thing
ãªã©ãããã¥ã¡ã³ããèªãŸãªããŠããstdãã¬ã€ãã䜿çšããããšã§ããŠãŒã¶ãŒã¯è«ççã§å
ç¢ãã€å¹ççãªæ¹æ³ã§APIãšããŒã¿æ§é ãããã²ãŒãã§ããŸãã
ããæå³ã§ã¯ãããã¯ç§ãã¡ã®éã§çŽ³å£«ã®åæã圢åŒåãããã®ã§ãããç§ãã¡ãç¹å®ã®ãªãã¿ã®ããæäœãå®è¡ããããšãããç°¡åã§ãããªãã¿ã®ãããã®ã«ããŸãã
ãããŠãããã«ã€ããŠç§ãèšããªããã°ãªããªãã®ã¯ããã ãã§ã;ïŒ
ããã¯ãééãã®ãªãæŽæ°å€æã®ãšã©ãŒã¿ã€ããšããŠ!
ã䜿çšããå¯èœæ§ã®èª¿æ»ã§ä»¥åã¯ãããã¯ãããŠããŸããã ãã®æ©èœã¯çŸåšå®è£
ãããŠãããããããã¯æãåçŽãªå Žåã§ã倱æããŸãïŒ httpsïŒ//is.gd/Ws3K7Vã
ã¡ãœããåãå€æŽããããšããŸã èããŠããŸããããããšããã®æ©èœãFCPã«çµã¿èŸŒãå¿ èŠããããŸããïŒ
@sfackler 29è¡ç®ã®ãªã¿ãŒã³ã¿ã€ããResult<u32, ()>
ããResult<u32, !>
ã«å€æŽãããšããã®éã³å Žãªã³ã¯ãæ©èœããŸãïŒ https ïŒ//is.gd/A9pWbU let Ok(x) = val;
ãèªèã§ããŸãã
@Ixrecã¯ããããã®ç¹æ§ã®äž»ãªåæ©ã¯ãCæŽæ°typedefãšã®éã®å€æã§ããã æ©èœãããã°
fn foo(x: i64) -> Result<c_long, TryFromIntError> {
x.try_into()
}
ããã¯i686ã¿ãŒã²ããã§ã¯ã³ã³ãã€ã«ãããŸãããx86_64ã¿ãŒã²ããã§ã¯ã³ã³ãã€ã«ãããŸããã
åæ§ã«ã IntoConnectParams
ã¿ã€ãã眮ãæããããšããŸãããïŒ httpsïŒ//docs.rs/postgres/0.13.4/postgres/params/trait.IntoConnectParams.htmlã æ¯åžimpl<T> TryFrom<T> for T { type Error = ! }
ãããå Žåãã©ãããã°ãããè¡ãããšãã§ããŸããïŒ ConnectParams
ã®ååž°çãªå®è£
ãå¿
èŠã§ããã !
ãšã¯ç°ãªãå
·äœçãªãšã©ãŒã¿ã€ãããããŸãã
valãErrã¿ã€ãã®å Žåã
let Ok(x) = val;
ãåé§ã§ããªããã¿ãŒã³ã§ããããšãèªèã§ããŸããã
ãã®ããã®PRãéããŠããããšã«æ³šæããŠãã ããã
æ©èœãããã°...
ããã¯ããŸãããã¯ãã§ã
fn foo(x: i64) -> Result<c_long, TryFromIntError> {
let val = x.try_into()?;
Ok(val)
}
è¿·æãª+1ã³ã¡ã³ãã«ãªããªã¹ã¯ããããŸããããã¯ã1.1ãRust 1.15ã«å°çããåŸãtry_fromãRumaãæ¯æ©Rustã«ç¶æããæåŸã®æ©èœã«ãªãããšãè¿°ã¹ãŠãããŸãã å®å®ããtry_fromã倧ãã«æåŸ ãããŠããŸãïŒ
ããå®è³ªçãªã¡ã¢ã«ã€ããŠ...
ããã¯ç§ããã®æ©èœã«ã€ããŠæãå¥åŠã ãšæãããšã§ãã ç§ãäœæããã»ãšãã©ã®é¢æ°ã¯çµæãè¿ããŸããããã®ç¹æ§ãè©ŠããŠã¿ãå Žåãé€ããŠãtry_ãã¬ãã£ãã¯ã¹ã䜿çšããŠãããã®é¢æ°ã«ååãä»ããããšã¯ãããŸããã
ããã¯è¯ã芳å¯ã§ãããtry_ãã¬ãã£ãã¯ã¹ã®çç±ã¯ãæ»ãã¿ã€ããResult
ãšããŠèå¥ããå¿
èŠãããããã§ã¯ãªããééãã®ãªãåçã®ãã®ãšåºå¥ããå¿
èŠãããããã ãšæããŸãã
ãŸããç§ã¯ãã€ãErrorãšå ¥åããã®ã§ãErrorã§ã¯ãªãé¢é£ãããšã©ãŒã¿ã€ãã«Errãšããååãä»ãããšãšã©ãŒãçºçãããããªãããšãããããŸããã ãã®ééãã¯ãRFCèªäœã®ãã©ããäžã«ãè¡ãããããšã«æ°ã¥ããŸããïŒrust-lang / rfcsïŒ1542ïŒã³ã¡ã³ãïŒã ãŸããResultã䜿çšããã³ãŒãã¯ãResultã³ã³ã¹ãã©ã¯ã¿ãŒã§ãããããErrãšããååããã§ã«åºç¯å²ã«äœ¿çšããŠããŸãã
ç§ã¯ããã«åæããŸãã ç§ãã©ã€ãã©ãªã§ééããä»ã®ã»ãšãã©ã®ãšã©ãŒã¿ã€ãã¯ããšã©ãŒããšããååã§ããããŸã§ã®ãšããããšã©ãŒãã¯Result::Err
ãæå³ããã ãã§ããã ãErrãã¯ïŒããããæå³ããŠããªãïŒäººã
ã絶ããååãééããçµæã«ãªãã®ã§ããããå®å®ãããããã§ãã
@canndrewãã¡ããäœæ¥ãè¡ãããšã¯å¯èœã§ããããã®æ©èœã®åæ©ã®å šäœçãªãã€ã³ãã¯ããããã®çš®é¡ã®ãã©ãããã©ãŒã ã®éããç°¡åã«æ£ããåŠçã§ããããã«ããããšã§ãããx86ã§ã³ã³ãã€ã«ãããARMã§ã¯ã³ã³ãã€ã«ããªãããšããã¹ããŒã¹å šäœãé¿ãããã®ã§ãã ã
$ïŒ FromStr
ïŒ$ãšã®äžè²«æ§ãä¿ã€ããã«Err
ãéžæãããšæããŸãããå®å®ããåã«Error
ã«åãæ¿ããŠããã ããã°å¹žãã§ãã
Rumaãæ¯æ©Rustã«ä¿ã€æåŸã®æ©èœ
åæ§ã«ã代æ¿ã®éã³å Žã®ããã¯ãšã³ãã¯ã TryFrom
ã«ã¢ã¯ã»ã¹ããããã«æ¯æ©å¿
èŠã§ãã æ¯æ©ã®serdeã®ãã®ã¯ç§ã®å¥œã¿ã«ã¯äžå®å®ãããã®ã§ããã«ãã¹ã¯ãªããã®ã»ããã¢ããã«ç§»ããŸããã 1.15ã§ã #[derive]
ã«æ»ããŸãã ãã®æ©èœãå®å®ããã®ãå¿åŸ
ã¡ã«ããŠããŸãïŒ
@sfacklerç³ãèš³ãããŸããããã©ããŒããŠããŸããã§ããã æŽæ°å€æã®å Žåãæ¬åœã«å¿
èŠãªã®ã¯ããã©ãããã©ãŒã ã«å¿ããŠc_ulong
ãu32
ãŸãã¯u64
ã«typedefããã®ã§ã¯ãªããäœããã®åœ¢ã§æ°ããã¿ã€ãã«ããããšã§ãã ããããã°ã TryFrom<c_ulong>
implãTryFrom<u{32,64}>
implã«å¹²æžããããšã¯ãããŸããã
çµå±ã®ãšãããç°ãªããã©ãããã©ãŒã ã§åãç°ãªãæ¹æ³ã§å®çŸ©ãããšãåžžã«ãäžæ¹ã®ãã©ãããã©ãŒã ãã³ã³ãã€ã«ããããããäžæ¹ã®ãã©ãããã©ãŒã ã¯ã³ã³ãã€ã«ããªãããšããåé¡ãçºçããŸãã çãããæ
£è¡ã®ããã«èŠããããšããµããŒãã§ããããã«ããããã«ãããã§ãªããã°å®å
šã«è«ççãªTryFrom<T> for U where U: From<T>
implãç ç²ã«ããªããã°ãªããªãã®ã¯æ®å¿µã§ãã
æŽæ°ã®ãã¥ãŒã¿ã€ãRFCãæžã蟌ãŸããããŒãžãããå®å®åããããŸã§ããã®RFCããããã¯ããããšãçå£ã«ææ¡ããŠããããã§ã¯ãããŸããã ããããå°æ¥ã®ããã«ãããå¿ã«çããŠããå¿ èŠããããŸãã
åæ§ã«ãIntoConnectParamsã¿ã€ãã眮ãæããããšããŸãããã
ããã§ã®åé¡ã¯äœã§ããïŒ TryFrom<ConnectParams>
ã«1ã€ã®ãšã©ãŒã¿ã€ãã䜿çšãã TryFrom<&'a str>
ã«å¥ã®ãšã©ãŒã¿ã€ãã䜿çšããªãã®ã¯ãªãã§ããïŒ
ç§ã¯ãæåéãäžçäžã®ãã¹ãŠã®FFIã³ãŒããç Žãããšã䞻匵ããŸããã Wrapping
ã®ãããªåæ§ã®æŽæ°ã®ãã¥ãŒã¿ã€ãã©ãããŒãååŸããããšããŠå€±æããããã人éå·¥åŠçã«å€å€§ãªã³ã¹ããããããŸãã
æšæºã©ã€ãã©ãªã«impl<T> From<!> for T
ã¯ãããŸããïŒ ããã¥ã¡ã³ãã«ã¯è¡šç€ºãããŸããããããã¯rustdocã®ãã°ã§ããå¯èœæ§ããããŸãã ããã«ãªãå Žåã¯ã TryFrom<ConnectParams>
implã®!
Error
ãå®éã«å¿
èŠãªãã®ã«å€æããæ¹æ³ã¯ãããŸããã
ã©ããã³ã°ã®ãããªåæ§ã®æŽæ°ã®ãã¥ãŒã¿ã€ãã©ãããŒãååŸããããšããŠå€±æããããã人éå·¥åŠçã«å€å€§ãªã³ã¹ããããããŸãã
èªåã®æŽæ°åãå®çŸ©ã§ãããããªãã®ãèããŠããŸããã ã©ã C ++ïŒ
trait IntLiteral: Integer {
const SUFFIX: &'static str;
const fn from_bytes(is_negative: bool, bytes: &[u8]) -> Option<Self>; // or whatever
}
impl IntLiteral for c_ulong {
const SUFFIX: &'static str = "c_ulong";
...
}
extern fn foo(x: c_ulong);
foo(123c_ulong); // use a c_ulong literal
foo(123); // infer the type of the integer
ããã¯ã»ãšãã©ã®äººéå·¥åŠçåé¡ã解決ããŸããïŒ ç§ã¯å®éã«ã¯ãC ++ã®ãŠãŒã¶ãŒå®çŸ©ãªãã©ã«ããŸãã¯æ··ä¹±ãæãæ¹æ³ã§èšèªãå€æŽããåã人ã ã«äžããäžè¬çãªæ©èœã¯å¥œãã§ã¯ãããŸãããã2ã€ã®æªã®ãã¡ã®å°ããæ¹ã«ãªãå¯èœæ§ããããšæããŸãã
æšæºã©ã€ãã©ãªã«
impl<T> From<!> for T
ã¯ãããŸããïŒ
From<T> for T
implãšç«¶åããããçŸåšã¯ãããŸããã ç§ã®ç解ã§ã¯ãimplã¹ãã·ã£ã©ã€ãŒãŒã·ã§ã³ã¯æçµçã«ãããåŠçã§ããã¯ãã§ãã
ããã¯ã2ã3幎åŸã«ã¯å ã«æ»ãã¹ããã®ã®ããã«èãããŸãã
ã¹ãã·ã£ã©ã€ãŒãŒã·ã§ã³ãš!
ã®å®å®åã®ã¿ã€ã ã©ã€ã³ã¯äœã§ããïŒ
å°éåã«ã€ããŠã¯ããããŸããã !
èªäœã®å ŽåãããããããŒãžã§ãããã©ããã¯ã»ãšãã©ã®å Žååé¡ã§ãã
@canndrewç§ã¯ããããã¹ãŠã«å®è£
ãããã¹ãã§ã¯ãªãããšã«ééããªãåæããŸãã ããã¥ã¡ã³ãã«ã¯ã_å€æãä»ããŠSelf
ãæ§ç¯ããããšãã_ãšæžãããŠããŸãããå€æãšããŠã«ãŠã³ãããããã®ã¯äœã§ããïŒ åãããšãããè¡šçŸããå¥ã®è¡šçŸã«å€æŽããããã©ãããŒãè¿œå ãŸãã¯åé€ãããããã®ã¯ã©ãã§ããïŒ ããã«ã¯ã Vec<u8> -> String
ãšMutex<T> -> MutexGuard<T>
ã®ã»ãã u32 -> char
ãš&str -> i64
ãªã©ãå«ãŸããŸãã SocketAddr -> TcpStream
ãšprocess::Child -> process::Output
ãé€å€ããŸãã
impl From<T> for U
ã¯ããããTryFrom<T, Err=!> for U
ãæå³ããã¯ãã ãšæããŸãã ããããªããšã TryFrom<T>
ããšãé¢æ°ãFrom<T>
ããšãããšãã§ããŸããã ïŒå
·äœçãªtry_from()
| try_into()
ã䜿çšãããšãééãã®ãªãå€æã¯ããããã¢ã³ããã¿ãŒã³ã«ãªããŸããããã¯å¯èœã§ããâŠã°ãããŠããã®ã§ãããªãã§ãã ããã ãïŒ
ç§ã¯implFromã®ããã«æããŸã
Uã¯ããããTryFromãæå³ããã¯ãã§ã Uã®ããã®ã
åæããŸããã
ããªãã¯ãããããããšãã§ããã§ãããããããâŠããã¯ã°ãããŠããã§ããããããã§ãã ããããªãã§ãã ããã
æœåšçãªã¯ãªããã®ãããªãªã³ãã®ããã«èãããŸãã
@BlacklightShiningåºåã¿ã€ããäžãããããšããå€æããæãããªã¿ã€ãã«å®è£ ããå¿ èŠããããšæããŸãã è€æ°ã®å€æïŒutf8 / 16/32ïŒã·ãªã¢ã«åãšãã£ã¹ãïŒãªã©ïŒãå¯èœã«ãªã次第ãåé¿ããå¿ èŠããããŸãã
ç§èŠã§ã¯ïŒ
ä»ã®ãšããã FromStr
ãå®è£
ãããã¹ãŠã®ãã®ã«TryFrom<&str>
ã®å
æ¬çãªå®è£
ãç°¡åã«æäŸã§ããŸãã
impl<'a, T: FromStr> TryFrom<&'a str> for T {
type Err = <T as FromStr>::Err;
fn try_from(s: &'a s) -> Result<T, Self::Err> {
T::from_str(s)
}
}
try_from
ãå®å®ããåã«ããã®ãããªãã®ãè¿œå ãããããå°ãªããšãããã¥ã¡ã³ãã§ãããåç
§ããããã«ããããšæããŸãã ããããªããšã TryFrom<&'a str>
ãšFromStr
ã®å®è£
ãç°ãªããšæ··ä¹±ããå¯èœæ§ããããŸãã
ç§ã¯ãããè¯ãå å«ã§ããããšã«åæããŸãããããããã¯ææ¡ãããTry-> TryFrom implãšççŸãããããããŸãããïŒ
@sfacklerã®å¯èœæ§ããããŸãã TryFrom
ã TryInto
ãããã³FromStr
ããã¹ãŠããã¥ã¡ã³ãã§çžäºã«åç
§ãããŠããã°ããŸã£ããåé¡ãããŸããããç§ã®äž»ãªé¢å¿äºã¯ã str::parse
ãã©ããã瀺ãæ¢åã®æšæºããªãããšã§ãã str::try_into
ã¯åãå€ãè¿ããŸãã
誰ãã圌ããç°ãªãå¯èœæ§ããããšæããããããªãã±ãŒã¹ã確ãã«èŠãããšãã§ããŸãããç§ã¯äººã ãåãæ¯ãèããããããã«ããããå®è£ ããã¹ãã§ãããšããããã¥ã¡ã³ãã®ãœãããªã¯ãšã¹ãã§å€§äžå€«ã§ãããã
ããšãã°ã誰ããWebãµã€ãã®Password
æ§é äœãäœæãããšããŸãã "password".parse()
ããã¹ã¯ãŒãã®æå¹æ§ããã§ãã¯ããŠããããã·ã¥ã«å€æãããšæ³å®ããå ŽåããããŸããã Password::try_from("1234abcd")
ã¯ã "1234abcd"
ããã§ã«ããŒã¿ããŒã¹ã«æ ŒçŽãããŠããããã·ã¥ã§ãããšæ³å®ããŠè©Šè¡ããŸããæ¯èŒå¯èœãªããã·ã¥ã«çŽæ¥è§£æããŸãã
parse
ã®è¡šçŸããããã¬ãã«ã®è§£æãè¡ãããããšãæå³ããã®ã«å¯Ÿãã try_from
ã¯åãªãåå€æã§ããããšãèãããšãããã¯çã«ããªã£ãŠããŸãã ãã ããå®éã«ã¯ããããã®æ©èœã®äž¡æ¹ãåãããšãå®è¡ããããšãæå³ããŠããããšãæ確ã«ããããšæããããããŸããã
èšèªããŒã ã¯å¿åãã©ã¡ãŒã¿ãŒãéæšå¥šã«ããããã«RFCãéããããšãææ¡ããŸããããçæ³çã«ã¯å¿åãã©ã¡ãŒã¿ãŒã䜿çšããæ°ããã³ãŒãã®äœæãåæ¢ããããšã«å
šå¡ãåæããŠããããã§ãã ããã念é ã«çœ®ããŠã try_from
/ try_into
ã®çœ²åãæŽæ°ããŠããã©ã¡ãŒã¿ãŒã«ååãä»ããããšãã§ããŸããïŒ ãããšãã from
/ into
ãšã®å¯Ÿç§°æ§ãç¶æããããšãããéèŠã§ããããïŒ
ãŸãããŸã æ®ã£ãŠããäž»èŠãªæªåçã®è³ªåã®èŠçŽãæžãããšã¯æçšã§ããããïŒ æ¬¡ã®ãªãªãŒã¹ãµã€ã¯ã«ã®ããã«ãããå®å®ãããããšã決å®ã§ããããšãæ¬åœã«æãã§ããŸãã ç§ãèšã£ãããã«ãããã¯ç§ããã䜿ãå¯äžã®æ®ãã®å€ã®æ©èœã§ãã ïŒ}
@jimmycuadra確ãã«ããã§ãïŒ ããã€ãã®ãã©ã¡ãŒã¿åãè¿œå ããŠPRãéä¿¡ãããã§ããïŒ
çŸç¶ã«ã€ããŠã¯ãçãããªãã®ã¯ãããã¹ããã©ããã ãã ãšæããŸãã
impl<T, U> TryFrom<U> for T
where T: From<U>
{
type Error = !;
fn try_from(u: U) -> Result<T, !> {
Ok(T::from(u))
}
}
ããã«ãããããçšåºŠã®å¯Ÿç§°æ§ãè¿œå ãããŸãããå€æãããã®ã«å¯ŸããŠåäžã®ãšã©ãŒã¿ã€ãããªããªããããå€ãã®å ŽåãåŠçãå°ãé¢åã«ãªããŸãã
ã¿ã€ããšã©ãŒ= ïŒ;
!
ã«é¢ãããã¹ãŠã®æªæ±ºå®ã®ãã®ã«ã€ããŠæ±ºå®ãããçµæãèæ
®ã«å
¥ããå¥ã®RFCã§ãããè¡ãããšããå§ãããŸãã
@sfackler FromStr
ã«ã€ããŠãèšåããããšãèæ
®ã«å
¥ããããšãéèŠã ãšæããŸãã FromStr
ã®å®è£
è
ã«å¯ŸããŠåæ§ã®å®è£
ãè¡ãå¿
èŠããããŸããããããšãåºå¥ã§ããããã«ããå¿
èŠããããŸããããããšãåãã§ããå¿
èŠã¯ãªããåãã§ããå¿
èŠãããããšãææžåããå¿
èŠããããŸããïŒ
TryFrom<str>
ãšFromStr
ã¯æ©èœçã«åäžã§ããå¿
èŠããããããã¥ã¡ã³ãã§ã¯ã2ã€ã®å®è£
ãåäžã§ããããšãæå³ãããŠããããšãæ確ã«ããå¿
èŠããããšæããŸãã äžæ¹ãå®è£
ãããšãå°ãªããšãstr::parse
ã®äœ¿çšãèš±å¯ãããšããç¹ã§ãããäžæ¹ãæäŸãããã¯ãã§ãã RustãæåããTryFrom
ãæã£ãŠãããšãããã FromStr
ã¯å¿
èŠãªãã£ãã§ãããã ãã®ãããæ°ããã³ãŒãã®æšå¥šãã©ãŒã ãšããŠTryFrom<str>
ãææžåããŸãã
ãã®å Žåã @ jimmycuadraã¯ã parse
TryFrom
䜿çšããŠããã FromStr
-> TryFrom
ã®ãã©ã³ã±ããimplãé
眮ããå¿
èŠããããŸãã
str::parse
ãTryFrom
ã®èŠ³ç¹ããå®è£
ããããã«å€æŽããå Žåãå
·äœçãªåã®FromStr
ã®ä»ã®å®è£
ãåæ§ã«å€æŽããå¿
èŠããããŸãïŒã€ãŸãããã®ãªã¹ãã®ãã¹ãŠã®å®è£
è
ïŒ ïŒhttpsïŒ//doc.rust-lang.org/stable/std/str/trait.FromStr.htmlïŒïŒ FromStr
ã®ããã¥ã¡ã³ããæŽæ°ããŠã代ããã«TryFrom
ã䜿çšããããšãææ¡ããå¿
èŠããããŸããïŒ FromStr
ã®çŸåšã®å
·äœçãªå®è£
ã§ã¯ãããã¥ã¡ã³ããTryFrom
ããŒãžã§ã³ã«ç§»åããå¿
èŠããããŸããïŒ
äžäœäºææ§ã®ããã«ã FromStr
ãå€æŽããããšã¯ã§ããªããšæããŸãããïŒ
$ïŒ$ TryFrom<&str>
FromStr
ãåé€ããããšã¯ãRust2.0ã§ééããªãèŠããŠããã¹ãããšã§ãã
ã¯ãããã®æ©èœãå®å®ããããåé¡ãå ±åãã2.0-breakage-wishlistã®ã¿ã°ãä»ããŸãã
ãŸããèæ
®ãã¹ãããšã®1ã€ã¯ã$ TryFrom<String>
String
ã«parse_into
ã¡ãœãããè¿œå ããããšã§ãã ã¿ã€ããå
éšçã«String
ãæ ŒçŽããŠããããããã§ãæ€èšŒãå¿
èŠãªå Žåã¯ãäž¡æ¹ã«TryFrom
ãå®è£
ããããšããããããŸãã
implãæ®ãå Žå
åé¡ã¯ãæ©èœãå®å®ããåŸããã®æ©èœãå®å®ãããã®ãé£ããã人ã ãäž¡æ¹ã«implãæäŸããããšã ãšæããŸãã
å®è£
ãåççã§ããå Žåããã§ã«T : From<U>
ãæã£ãŠãããšã$ U : TryFrom<T>
ãå€æŽã®ãæãããªAPIããŒã«ãã«ããŽãªã«å
¥ãããããšæããŸãã
ããã¯ãå°ãªããšãT : TryFrom<T>
ãšError = !
ãå¿
èŠã§ããããšãæå³ããŸãããééãã®ãªãFrom
ã®ããŒãžã§ã³ã¯æããã«ãããããåªããŠããŸãã
IMOã¯ã From
ãTryFrom
ã®å®è£
ãæäŸãããã TryFrom
ãFrom
ã®å®è£
ãæäŸããããæ確ã«åºå¥ããŠããŸããã
ãªããªããäžæ¹ã§ã¯T::from(val)
ãã¡ããã©T::try_from(val).unwrap()
ãšèŠãªãããšãã§ããä»æ¹ã§ã¯T::try_from(val)
ãã¡ããã©Ok(T::from(val))
ãšèŠãªãããšãã§ããããã§ãã ã©ã¡ããè¯ãã§ããïŒ ããããªãã
T::from(val)
ã¯T::try_from(val).unwrap()
ãšèŠãªãããšãã§ããŸã
ç§ã¯ããã«åæããŸããã From
ã®å®è£
ããããã¯ã«ãªãããšã¯ãããŸããã éã®æ¹æ³ã ããçã«ããªã£ãŠããŸãã
@clarcharr Fromã¯æ
ãŠãå¿
èŠããªãããããªãã·ã§ã³ã¯$ TryFrom<Error=!>
ãŸãã¯ãã®éã®èŠ³ç¹ããFrom
ã§ãã ãã ããã From
ãå®è£
ããå¿
èŠããããŸããã§ã¯ãªããã TryFrom
ãtype Error = !
ã§å®è£
ããå¿
èŠããããŸãããšããéåžžã®ã¢ããã€ã¹ã¯å¿
èŠãããŸããã
ãããå®å®ãããããã®åããåŸãæ¹æ³ã¯ãããŸããïŒ 1.18ãããŒã¿çã«å ¥ãåã«æéãäžè¶³ããŠããŸãã @sfacklerïŒ
@rfcbotfcpããŒãž
ããŒã ã¡ã³ããŒã®@sfacklerã¯ããããããŒãžããããšãææ¡ããŸããã 次ã®ã¹ãããã¯ãã¿ã°ä»ããããæ®ãã®ããŒã ã«ããã¬ãã¥ãŒã§ãã
çŸåšãªã¹ããããŠããæžå¿µã¯ãããŸããã
ãããã®ã¬ãã¥ãŒã¢ãåæã«éãããšãããã¯æçµã³ã¡ã³ãæéã«å ¥ããŸãã ãã®ããã»ã¹ã®ã©ã®æç¹ã§ãæèµ·ãããŠããªã倧ããªåé¡ãèŠã€ããå Žåã¯ã声ãäžããŠãã ããã
ã¿ã°ä»ããããããŒã ã¡ã³ããŒãç§ã«äžããããšãã§ããã³ãã³ãã«ã€ããŠã¯ããã®ããã¥ã¡ã³ããåç §ããŠãã ããã
@sfackler ïŒãã§ãã¯ã€ã³ããã ãã§ã !
ãšå
æ¬çå®è£
ã«é¢ããããŸããŸãªæžå¿µã«å¯Ÿå¿ã§ããŸããïŒ ããã«ã€ããŠã¯libsããŒãã£ã³ã°ã§è©±ãåã£ããšæããŸãããããã§èŠçŽãå
¥æããŠãããšåœ¹ã«ç«ã¡ãŸãã
@aturonããã«ã€ããŠã®æåŸã®è°è«ã¯ã impl From<T> for U
ãimpl TryFrom<T> for U
ãæäŸããã¹ããã©ããçåã«æã£ãŠãã@sfacklerã§ãããããã§TryFrom::Error = !
ã
@briansmithã¯ãneverã¿ã€ãã«é¢ããæªè§£æ±ºã®è³ªåã解決ããããããããå¥ã®RFCã«ãããšãã決å®ãææ¡ããŸããã
ãããå®å®ãããããšã®äž»ãªåé¡ã¯ãäžäœäºææ§ãå£ããã«ãã®ãããªå€æŽãè¡ãããšãã§ããªããšããããšã§ã¯ãããŸãããïŒ ãããšãããã®å€æŽãé²ããªãããã®è§£æ±ºçã§ããïŒ
ç§ã¯ãçŸåšã®implã®ã»ããã¯åãå ¥ããããªããšæããŸãã ç§ã¯ãããã®ç«å Žã®ã©ã¡ãããç解ããããšãã§ããŸããïŒ
TryFrom
ã¯ããã©ãŒã«ãã«ã³ã³ããŒãžã§ã³ã®ã¿ã察象ãšããŠããããã u8 -> u128
ãusize -> usize
ãªã©ã¯ãããŸãããTryFrom
ã¯_all_å€æã察象ãšããŠããããã®äžéšã¯ééããªããç¡äººã®TryFrom::Error
ã¿ã€ãã§ããããããçŸåšãã³ã³ãã€ã©ãi32 -> i32
å€æã®ãã§ãã¯ã³ãŒããæ¿å
¥ãããšããå¥åŠãªãã€ããªããç¶æ
ã«ãããŸããã String -> String
å€æãè¡ãããšã¯ã§ããŸããã
ãšã©ãŒã¿ã€ããšããŠã®!
ã«å¯Ÿããå察æèŠã¯äœã§ããïŒ ç°¡åãªã¹ãã ã§æ°ä»ããã®ã¯ããå€æããããã®ã®ãšã©ãŒã¿ã€ãã1ã€ã§ã¯ãªããªã£ããããå€ãã®å ŽåãåŠçãå°ãé¢åã«ãªãããšããããšã ãã§ããããç§ã¯åæããŸãããããã§ãããªãã¯ããªããäœããã£ãŠãäžè¬çãªæèã§ã«ã¹ã¿ã ãšã©ãŒã¿ã€ãã§äœãã«ã¹ã¿ã ãæž¡ããããšä»®å®ããªããã°ãªããªãã®ã§ã
ãããå®å®ãããããšã®äž»ãªåé¡ã¯ãäžäœäºææ§ãå£ããã«ãã®ãããªå€æŽãè¡ãããšãã§ããªããšããããšã§ã¯ãããŸãããïŒ ãããšãããã®å€æŽãé²ããªãããã®è§£æ±ºçã§ããïŒ
From
ãå®è£
ãããŠãããšãã«ã TryFrom
ã®äžè¬çãªå®è£
ãè¿œå ããã®ã¯ç±å¿ããããšæããŸãã From
ã®å®è£
ãããå Žåããšã©ãŒãçæã§ããªãTryFrom
ã®å®è£
ãããããšã¯æå³çã«ã¯æ£ããã§ããããã®æäŸãããå®è£
ãå®éã«åœ¹ç«ã€ãšã¯æããŸãããååã«äžè¬çãªããŒãºã§ãããããããã©ã«ãã§æäŸããå¿
èŠããããŸãã 誰ããäœããã®çç±ã§ãã®ã¿ã€ãã®åäœãæ¬åœã«å¿
èŠãšããŠããå Žåãããã¯ãã£ã1ã€ã®ç°¡åãªå®è£
ã§ãã
ééãã®ãªãå€æã«from
try_from
ã䜿çšããããšãããå Žåã®äŸãããã°ãç§ã¯ç¢ºãã«èããå€ããããšãã§ããŸãã
å察æèŠã¯äœã§ããïŒ ãšã©ãŒã¿ã€ããšããŠïŒ
!
ã¯ãå®å®åããæ°ãæå
ã§ãã è¿ãå°æ¥ã«TryFrom
ãå®å®ããããã impl<T, U> TryFrom<U> for T where T: From<U>
ã䜿çšãããã®ãããããéžæããŠãã ããã
ããã§ç¹æ§ãšã€ãªã¢ã¹ïŒrust-lang / rfcsïŒ1733ïŒã䜿çšããããšãæ€èšããŸãããïŒ ãããçå°ãããã From<T>
ãTryFrom<T, Error=!>
ã«ãšã€ãªã¢ã¹ããŠã2ã€ã®ç¹æ§ãåãã«ããããšãã§ããŸãã
@lfairyæ®å¿µãªããã From
ã®ãŠãŒã¶ãŒimpl
ãå£ããŠããŸããŸãã
@glaebhoerlããããã®éãã§ãð¥ãã®RFCã®åæ©ä»ãã®ã»ã¯ã·ã§ã³ã§ã¯ã impl
ã®ãšã€ãªã¢ã·ã³ã°ã«ã€ããŠèšåããŠããŸãããå®éã®ææ¡ã§ã¯ãããã¯èš±å¯ãããŠããŸããã
ïŒããã§ãªãã£ããšããŠããã¡ãœããã®ååãªã©ã¯ç°ãªããŸãïŒ
ããã¯2.0ã®ãŠã£ãã·ã¥ãªã¹ãã®äžã«å ¥ãå¯èœæ§ããããŸãããããã«ãããããããäœãå£ããã«èµ·ããããšã¯ãããŸããã
ãŸããIRCã§ããã«ã€ããŠçŽ æŽãããäŒè©±ãããŠããã@sfacklerã«æè¬ããŸãã ç©äºãå°ãé ã®äžã«çœ®ããåŸãããã§ç§ã¯çµãããŸããã
è¿ãå°æ¥ã«
TryFrom
ãå®å®ãããããimpl<T, U> TryFrom<U> for T where T: From<U>
ã䜿çšãããã®ãããããéžæããŠãã ããã
ããã§ã®äžå¿çãªåé¡ã¯ãééãã®ãªãå€æãç¹æ§ã«å±ãããã©ããã ãšæããŸãã RFCã§ã®ééãã®ãªãå€æã®ãããªãã®ããäžè¬çãªäœ¿çšïŒäžèŠåœ¹ã«ç«ããªãT:From<T>
ãããæ¹æ³ã«é¡äŒŒïŒã®ããã«ããããã¯æ©èœãããšæããŸãã ãããèãããšãç§ãæãæãã§ããã®ã¯ããã¹ãŠã®åå®è£
è
ãimpl TryFrom<MyType> for MyType
ã«ãªããšäºæ³ãããäžçãé¿ãããã¹ãŠã®From
implãTryFrom
implã«ãªãã¯ãã§ãã ïŒãŸãã¯ããã°ãæäŸããªãããã«åŸã§ãã°ãæåºããŠãã ãããïŒ
ã§ã¯ã !
ãå®å®ãããããšãªãããã©ã³ã±ããimplã䜿çšã§ããŸããïŒ ã©ã€ãã©ãªã«ã¯ãã§ã«!
ã®ãããªã¿ã€ãïŒ std::string::ParseError
ãªã©ïŒãããã®ã§ãæ¹æ³ããããšæããŸãã ïŒ "ãã®åæåã¯å°ãåä»ã§ããå®éã«ã¯ååšããŸããã "ïŒ
ãããã©ã®ããã«æ©èœãããã®ã¹ã±ããïŒ
core::convert::Infallible
ã¯ã std::string::ParseError
ãšãŸã£ããåãããã«å®è£
ãããŠããŸãã ïŒãã¶ããåŸè
ãåè
ã®ã¿ã€ããšã€ãªã¢ã¹ã«å€æŽããããšããã§ããŸããïŒimpl<T> From<Infallible> for T
ã¯ã ?
ã§ä»»æã®ãšã©ãŒã¿ã€ããšäºææ§ãããããã«ããŸãïŒåŸã§c_foo
ã®ãã®ãåç
§ããŠãã ããïŒError
ã¿ã€ããšããŠInfallible
ã䜿çšããŸãtype Infallible = !;
ãæ€èšããŠãã ãããããå ·äœåããã®ã«åœ¹ç«ã€ãªããç§ã¯ãããããPRãããããšãå¿é¡ããŸãã
c_foo
ã«ã€ããŠïŒäžèšã¯åŒãç¶ã次ã®ãããªã³ãŒããèš±å¯ããŸãïŒ
fn foo(x: c_int) -> Result<i32, TryFromIntError> { Ok(x.try_into()?) }
ãã ãããšã©ãŒã¿ã€ããç°ãªãããããã®ãããªã³ãŒãã¯ç§»æ€æ§ã®ããããããã¬ã³ãã«ãªããŸãã
fn foo(x: c_int) -> Result<i32, TryFromIntError> { x.try_into() }
å人çã«ã¯ã c_int
ãã¿ã€ããšã€ãªã¢ã¹ã§ããéããããã«ãªãŒãããããã¬ã³ãããã®ã§ããã®éãã«ã€ããŠã¯å¿é
ããŠããŸããã
fn foo(x: c_int) -> i32 { x }
ãããŠãäžè¬çã«ããã¬ã€ãã®é¢é£ããã¿ã€ããç°ãªãimplã«å¯ŸããŠåãã§ããããšãæåŸ
ããã³ãŒãã¯ãã³ãŒãã®èãã®ããã«æããŸãã TryFrom
ãã From
ãäžè¬åããããšèªã¿ãŸããã ç®æšããæŽæ°ãµãã»ããéã®ããè¯ãå€æãã§ããå ŽåïŒããã䟿å©ã ãšæããŸãïŒããåžžã«åããšã©ãŒã¿ã€ããã¯è«ççã§ããã代ããã«std::num
ã§ã¿ãŒã²ããã«ããããã®ãããããnum::cast::NumCast
ã®ãããªãã®ãæåŸ
ããŸãboost::numeric_cast
ïŒã
ïŒäœè«ã§ãããFCPããŒãžã§#[repr(transparent)]
ã䜿çšãããšã c_foo
åããã¥ãŒã¿ã€ãã«ãªãå¯èœæ§ãããããã®æç¹ã§ãããã®å€æã®äžè²«æ§ãé«ãŸããŸããFromïŒTryFrom implsã¯ãC "char <= short <ãã³ãŒãåã§ããŸãã = int <= long "ã«ãŒã«ãããã³ãããã«æšæºã§å¿
èŠãªæå°ãµã€ãºïŒ c_int:From<i16>
ãc_long:TryFrom<i64>
ãªã©ïŒãäžèšã®å€æã¯ããã¹ãŠã§i32:TryFrom<c_int>
ã«ãªããŸããåžžã«åãError
ã¿ã€ãã®ãã©ãããã©ãŒã ã§ãããåââé¡ã¯è§£æ±ºããŸããïŒ
ããã®åæåã¯å°ãåä»ã§ããå®éã«ã¯ååšããŸããããã«ã€ããŠ
ãšã©ãŒã¿ã€ããåãªãåäœã§ã¯ãªãçç±ã¯ãããŸããïŒ äŒè©±ã§ãšã©ãŒãçºçããªãã®ã«ããªãç¬èªã®ParseErroræ§é äœãæ°ã«ããå¿ èŠãããã®ã§ããããã
@sunjay ()
ã¯ããããã¯çºçããå¯èœæ§ããããŸãããçºçãããšãã«éç¥ããèå³æ·±ãããšã¯äœããããŸãããã®åã·ã¹ãã è¡šçŸã§ãã ç¡äººåïŒ !
ãstd::string::ParseError
ãªã©ïŒã¯éã§ãåã·ã¹ãã ãããã®ç¶æ³ã¯æ±ºããŠèµ·ããåŸãªãã®ã§ã察åŠããå¿
èŠã¯ãããŸããããšèšããŸãã
@jimmycuadra
ééãã®ãªãå€æã®ããã«fromã®ä»£ããã«try_fromã䜿çšããããšãããå Žåã®äŸãããã°ãç§ã¯ç¢ºãã«ç§ã®èããå€ããããšãã§ããŸãã
@scottmcm
ããã§ã®äžå¿çãªåé¡ã¯ãééãã®ãªãå€æãç¹æ§ã«å±ãããã©ããã ãšæããŸãã
ç§ã®ãŠãŒã¹ã±ãŒã¹ã¯æ¬¡ã®ãšããã§ããå€ãboolãnumericããŸãã¯stringã§ããæ§æãã¡ã€ã«åœ¢åŒãšãããŒãåæåããªã¢ã³ããŸãã¯æååã§ãããªãã©ã«æ§æå€ãæžã蟌ãããã®ãã¯ãããããŸãã äŸãã°ïŒ
let cfg = config![
BoolOpt::SomeCfgKey => true,
"SomeOtherCfgKey" => 77,
];
ç°¡åã«èšããšããã¯ãã¯æçµçã«($k, $v).into()
åŒã³åºãã®ãªã¹ãã«æ¡åŒµãããŸãã æååããŒã®å€æããã§ãã¯ããŠãæå¹ãªæ§æãªãã·ã§ã³ã«ååãä»ããããŠããããšã確èªããããšæããŸããã€ãŸãã TryFrom<(String, ???)>
ãå®è£
ãããã¯ãã($k, $v).try_into()
ã䜿çšããããã«å€æŽããŸãã ãã¯ãããã¹ãŠã®å€æã«äœ¿çšããåäžã®ã¡ãœããåããªãå Žåãããããã¹ãŠè¡ãã®ã¯é£ãããªããŸãã
ïŒbellïŒäžèšã®ã¬ãã¥ãŒã«ãããšãããã¯çŸåšãæçµã³ã¡ã³ãæéã«å ¥ã£ãŠããŸãã ïŒãã«ïŒ
ç§ã¯å®éã«æ¬¡ã®ã¢ã€ãã¢ãæ¬åœã«å¥œãã§ãïŒ
impl<U: TryFrom<T, Error=!>> From<T> for U {
fn from(val: T) -> U {
val.unwrap()
}
}
TryFrom<Error=!>
ã欲ãã人ã¯èª°ã§ããããå®è£
ã§ããŸãããå¿
èŠã«å¿ããŠFrom
ãå®è£
ããããšãã§ããŸãã ãããããæçµçã«From
ãå»æ¢ããããšã¯ã§ããŸãããããããå¿
èŠã¯ãããŸããã
空ã®åæåã䜿çšãã@scottmcmã®èšç»ã¯ãç§ã«ã¯çŽ æŽããããšæããŸãã
@ Ericson2314ããªããæžããïŒ
ãšã©ãŒã¿ã€ãã«ãã¬ãŒã³ãª
From
ã䜿çšããå Žåã¯éããŸãïŒäŸïŒtry!
ïŒïŒimpl<T> From<!> for T
ã¯ããã®ç®çã®ããã«ååšããããšãã§ããååšããå¿ èŠããããŸãã
ããã¯å®éã«ã¯ã©ã®ããã«æ©èœããŸããïŒ æ¬¡ã®ãããªé¢æ°ãäœæããããšããŠãããšããŸãã
fn myfn<P: TryInto<MyType>>(p: P) -> Result<(), MyError>
ãã¡ãããããæ©èœããªãããšãé€ããŠã TryInto
Error=
ãæå®ããå¿
èŠããããŸãã ããããç§ã¯ããã«ã©ã®ã¿ã€ããæžãã¹ãã§ããïŒ MyError
ã¯åœããåã®ããã§ããã MyType
ããã©ã³ã±ããTryFrom
implã§äœ¿çšããããšã¯ã§ããŸããã
次ã®ããšãææ¡ããŠããŸããïŒ
fn myfn<E: Into<MyError>, P: TryInto<MyType, Error=E>>(p: P) -> Result<(), MyError>
ããã¯ããªãåé·ã«æããŸãã
åãã¿ã€ãã§ãšã©ãŒã¿ã€ããç°ãªãè€æ°ã®ãééãã®ãªããå€æãå¿ èŠãªå Žåããããã©ã®ããã«æ©èœãããã«ã€ããŠã®ããäžè¬çãªè³ªåããããŸãã
ãã¶ãã TryFrom
ã®å®çŸ©ã次ã®ããã«å€æŽããå¿
èŠããããŸãã
pub trait TryFrom<T, E>: Sized {
type Error: Into<E>;
fn try_from(t: T) -> Result<Self, E>;
}
次ã®ããã«æ瀺çãªååãä»ããããšãªãããšã©ãŒãMyError
ã«å€æã§ããããã«å¶éã§ããŸãã
fn myfn<P: TryInto<MyType>>(p: P) -> Result<(), MyError> where MyError: From<P::Error>
ããã¯ãŸã å°ãåé·ã§ãããå®éã«ã¯é¢æ°ãããŸãåŒã³åºãããã®å¶çŽãè¿°ã¹ãŠããŸãïŒéã³å ŽïŒ
ç·šéïŒ Into
ã®From
ã®å
æ¬çãªå®è£
ããªãããã P::Error: Into<MyError>
ã®ãããªããªã¢ã³ããè©ŠããŠã¿ããšãå®éã«ã¯?
$ã§ã¯æ©èœããŸããã ããªãã瀺ããããã«TryFrom
ãå€æŽãããšãåãåé¡ãçºçããããšãäºæ³ãããŸãã
ããã§æçµã³ã¡ã³ãæéãçµäºããŸããã
@jethrogbãããããªãã¯1幎åããç§ãåŒçšããã®ã§ãå°ãèããªããã°ãªããŸããã§ããã @ Nemo157ã¯çµ¶å¯Ÿã«æ£ããã§ãããããŠããã¯åççãªããã§ãã
!
ã®ç¹å®ã®ã±ãŒã¹ã§ã¯ãå
æ¬çimplãå¿
èŠã§ããããããå¥ã®ãã®ãšéè€ããŠããããšãæãåºããŸãã äž¡æ¹ã®å®è£
ãå®è£
ã«åæããŠããã®ã§ãããã¯åä»ãªéè€ã§ã---æªå®çŸ©ã®åäœ/ãããã³ãŒãã
å¥ã®åé¡ããã®ããã«é¢ããã³ã¡ã³ãïŒ https ïŒ//github.com/rust-lang/rust/pull/41904#issuecomment -300908910
libsããŒã ã®èª°ããscottmcmã®ã¢ã€ãã¢ã«ã€ããŠèããŠããŸããïŒ ããã¯ç§ã«ãšã£ãŠçŽ æŽãããã¢ãããŒãã®ããã«æããŸãããããŠç§ã¯å¥ã®ãªãªãŒã¹ãµã€ã¯ã«ãéããåŸããã®æ©èœãåé²ããç¶ããããšæããŸãã
libsããŒã ã¯ãæ°é±éåã«ããã«ã€ããŠåã³è©±ããŸããïŒãããæžãã®ãé ããŠãã¿ãŸããïŒïŒ ãã®æ©èœã«é¢ããåé¡ã®åå ã¯ãäž»ã«FFIã®ã±ãŒã¹ããããã®ç¹æ§ã®ä»ã®ãŠãŒã¹ã±ãŒã¹ã«å®éã«ã¯é©åããªãããšã§ãããšããçµè«ã«éããŸãããããã¯ãããŸããŸãªãšã€ãªã¢ã¹ãä»ããŠå ·äœçãªã¿ã€ãã§åŒã³åºããšããç¹ã§ç¬ç¹ã§ããã¿ãŒã²ããã«åºã¥ããŠããŸãã
ãããã£ãŠãåºæ¬çãªã¢ã¯ã·ã§ã³ãã©ã³ã¯ã impl<T, U> TryFrom<T> for U where U: From<T>
ãè¿œå ããééãã®ãªãæŽæ°å€æã®æ瀺çãªimplãåé€ããããšã§ãã FFIã®ãŠãŒã¹ã±ãŒã¹ãåŠçããããã«ãå¥ã®APIãäœæããŸãã
!
ã§ã®ãããã¯ãåé¿ããããã«åãšã€ãªã¢ã¹ã䜿çšããããšã¯ãèå³æ·±ããã®ã§ãã ç§ã®å¯äžã®æžå¿µã¯ã !
ãéåžžã®ç¡äººã¿ã€ãããããç¹å¥ãã§ããããšã€ãªã¢ã¹ãç¡äººåæåãã!
ã«äº€æãããšãã«ç Žæããå¯èœæ§ããããã©ããã§ãã
æŽæ°åã®ãåå¥ã®APIãã®PRãéããŸããïŒ https ïŒ//github.com/rust-lang/rust/pull/42456
å€æãå€ãã«ããããããã
TryInto
ãŸãã¯TryFrom
ã§ãã©ã¡ãŒã¿ãŒåããããžã§ããªãã¯ã³ãŒããäœæããå¿ èŠããªãã£ããããå®çŸ©ããåã§ã®ãã¹ãŠã®äœ¿çšã«ã¯åŸè ã®åœ¢åŒã§ååã§ããTryInto<...>
ãŸãã¯TryFrom<...>
ã®ãã©ã¡ãŒã¿ãŒããããšãçããã圢åŒã®ããã«æããŸãã
掟çãã¬ã€ãã®äžéšãšããŠå®å®ãããTryFrom
ã䜿çšããã€ããã§ããã derive
ãã¯ãã®äžéšãšããŠäžéšã®ã¿ã€ãã§ã¢ãããã¯çµã¿èŸŒã¿ã¡ãœãããåŒã³åºãã®ã¯æ¬åœã«å¥åŠã§ãã
ããã¯åé€ããªãã§ãã ããã
TryIntoãŸãã¯TryFromã«ãã£ãŠãã©ã¡ãŒã¿ãŒåããããžã§ããªãã¯ã³ãŒããäœæããå¿ èŠã¯ãããŸããã§ãã
ããã ãšããŠããããã§TryInto
ãšTryFrom
ã®æçšæ§ã倧å¹
ã«äœäžãããšã¯æããŸããã ç§ã¯Into
ãšFrom
ããäžè¬çã§ãªãã³ã³ããã¹ãã®è³ãæã§äœ¿çšããŠããŸãã impl
ã®æšæºã©ã€ãã©ãªç¹æ§ãè¿œå ãããšãã¢ãããã¯ãªåºæã®å€ææ¹æ³ã®æãããã¯ããã«ãéåžžãã§ãæåŸ
ããããŠããããã«æããŸãã
TryIntoãŸãã¯TryFromã«ãã£ãŠãã©ã¡ãŒã¿ãŒåããããžã§ããªãã¯ã³ãŒããäœæããå¿ èŠã¯ãããŸããã§ãã
ç§ã®ãããžã§ã¯ãã®1ã€ããïŒ
pub fn put_str_lossy<C, S> (&self, s: S)
where C: TryInto<ascii::Char>,
S: IntoIterator<Item = C>
{
for c in s.into_iter() {
self.put_char(match c.try_into() {
Ok(c) => c,
Err(_) => ascii::QUESTION_MARK,
});
}
}
ãããã®ç¹æ§ã®å®è£ ã¯ç¹å®ã®æ³åŸã«åŸãããšãæåŸ ãããŸããïŒ ããšãã°ãAãBã«ãBãAã«å€æã§ããå Žåãå€æãæåãããšãã«å転å¯èœã§ããå¿ èŠããããŸããïŒïŒ
#![feature(try_from)]
use std::convert::{TryFrom, TryInto};
fn invertible<'a, A, B, E>(a: &'a A) -> Result<(), E>
where A: 'a + TryFrom<&'a B>,
A: PartialEq,
B: 'a + TryFrom<&'a A>,
E: From<<A as TryFrom<&'a B>>::Error>,
E: From<<B as TryFrom<&'a A>>::Error>,
{
let b = B::try_from(a)?;
let a2 = A::try_from(&b)?;
assert!(a == &a2);
Ok(())
}
ç·šéïŒs / reflexive / invertible /
@briansmith From
ãã©ã®ããã«æ©èœããããèãããšããã®æ¹æ³ã§ã¯å転ã§ããªããšæããŸãã
use std::collections::BinaryHeap;
fn main() {
let a = vec![1, 2];
let b = BinaryHeap::from(a.clone());
let c = Vec::from(b);
assert_ne!(a, c);
}
ã ããç§ã¯ãã®ç¹æ§ã®çŸåšã®å®è£
ã«ã€ããŠçåã«æã£ãŠããŸãã ïŒ43127ïŒïŒ43064ãåç
§ïŒã§åºãŠããããã«ããããçŽç²ã«å®è£
ãi / u128ã䜿çšããŠãããããã©ããã¯ããããŸããããTryIntoã®åŒã³åºãã¯ã€ã³ã©ã€ã³åãããŠããªãããã§ãã ããã¯ããŸãæé©ã§ã¯ãªãããŒãã³ã¹ãã®æœè±¡åã®ç²Ÿç¥ã§ã¯ãããŸããã ããšãã°ã <u32>::try_into<u64>()
ã䜿çšãããšãæçµçãªã¢ã»ã³ããªã§åçŽãªç¬Šå·æ¡åŒµã«æé©åããå¿
èŠããããŸãïŒãã©ãããã©ãŒã ã64ãããã®å ŽåïŒãã代ããã«é¢æ°åŒã³åºããçºçããŸãã
ç¹æ§ã®å®è£ ããã¹ãŠã®æŽæ°åã§åãã§ãªããã°ãªããªããšããèŠä»¶ã¯ãããŸããïŒ
ïŒ42456ã«ãããšãæŽæ°åã«çŽæ¥impl TryFrom
ããªãå¯èœæ§ããããŸããããã®ãNumCastããã¬ã€ãïŒïŒ43127ã«åãæ¿ããå¿
èŠãããïŒãã©ã®ããã«èŠãããã¯ãŸã äœæäžã§ãã
æçµçã«å¥ã®ç¹æ§ã«ç§»è¡ãããã©ããã«é¢ä¿ãªãããããã®å€æã¯çŸåšlibcoreã«å®è£
ãããŠãããlibcoreã§äœ¿çšã§ããŸãã ãã¹ãŠã®æŽæ°å€æã«u128
/ i128
ã䜿çšããã®ã¯ããœãŒã¹ã³ãŒããåçŽåããããã ãšæããŸãã 代ããã«ããœãŒã¹ã¿ã€ããå®å
ãããåºããçããã«å¿ããŠãç°ãªãã³ãŒãã䜿çšããå¿
èŠããããŸãã ïŒããããã #[cfg(target_pointer_width = "64")]
ãš#[cfg(target_pointer_width = "32")]
ãš#[cfg(target_pointer_width = "16")]
ã«åºã¥ãããŸããŸãªãã¯ãåŒã³åºãã䜿çšããŸããïŒ
泚æïŒããããããã¯è§£é€ããã®ã«ããã»ã©å€ãã¯å¿ èŠãããŸããïŒ ããªãããããæãã§ãããªãã @ sfacklerã®èŠçŽãèŠãŠãç§ãŸãã¯ä»ã®libsããŒã ã¡ã³ããŒã«ã¬ã€ãã³ã¹ãæ±ããŠé æ ®ãªãpingããŠãã ããã
匷æã¿ã€ããäžå®å®ã«ãªãããã®åé¿çãšããŠ@scottmcmã®ã¢ã€ãã¢ã䜿çšã§ãããšããlibsããŒã ããã®è³åãããããšã«æ°ã¥ããŠããŸããã§ããã åé¿çã䜿çšããŠãPRã«åãçµã¿ã @ sfacklerãèšåããå€æŽãå ããããšãã§ããŸãã
çŽ æŽããããããããšã@jimmycuadraïŒ
ãã®è°è«ã®ã»ãšãã©ã¯ãæŽæ°åã«TryFrom
ãå®è£
ããããšãäžå¿ã«å±éããŠããããã§ãã ç§ã®æèŠã§ã¯ã TryFrom
ãå®å®ãããã©ããã¯ããããã®ã¿ã€ãã®ããã ãã§ã¯ãããŸããã
&[T; N]
ã®TryFrom<&[T]>
ãªã©ããããã®ç¹æ§ããæ©æµãåããä»ã®ãã¡ããšããå€æããããŸãã ç§ã¯æè¿ããããæ£ç¢ºã«å®è£
ããããã®PRãæåºããŸããïŒ httpsïŒ//github.com/rust-lang/rust/pull/44764ã
ãã®ãããªå€æã¯ã TryFrom
ãå®å®ãããããã«ç§ã«ãšã£ãŠååã«éèŠã§ãã
ïŒ44174ãããŒãžãããããšã§ãããã¯ãããã¯è§£é€ããããšæããŸãã
ãã®PRã¯ã$ TryFrom<&str>
ãå®è£
ãããã¹ãŠã®åã®FromStr
ã®èªåå®è£
ãåé€ããŸãããããã¯ãåã·ã¹ãã ãçŸåšãç¹æ®åãããŠããŠããããããµããŒãã§ããªãããã§ãã ãã®æ©èœãå®å®ãããšã FromStr
ãšparse
ã¯å»æ¢ããã TryFrom<&str>
ãštry_into
ãåªå
ãããŸãã 2ã€ã®éã®æ«å®çãªäºææ§ã倱ãããã®ã¯æ®å¿µã§ããäžæçãªã¢ã€ãã¢ãããå Žåã¯ã声ãäžããŠãã ããã
ãã以äžå€æŽãå ããå¿
èŠããªããlibsããŒã ã®èª°ããå®å®åã®ããã«ãããéä¿¡å·ã«ããå Žåãå®å®åPRãšPRãå®è¡ããŠã FromStr
/ parse
ãéæšå¥šã«ããããšãã§ããŸãã
FromStr / parseãéæšå¥šã«ããPRã
代æ¿åãStableã§å©çšå¯èœã«ãªããŸã§ïŒãŸãã¯https://github.com/rust-lang/rust/issues/30785ãå®è£ ããããŸã§ïŒãéæšå¥šã®èŠåãNightlyã«è¿œå ããªãã§ãã ãããããã«ããããã€ã§ã3ã€ã®ãªãªãŒã¹ãã£ãã«ãã¹ãŠã§èŠåãªãã§ã¯ã¬ãŒããã«ãã
åç
§ã«ãã£ãŠé»åã¡ãŒã«éç¥ãçæãããªããããä»ã®PRãèŠéããŸããã ç¹å®ã®impl From<Infallible> for TryFromIntError
ãããããšã«æ°ã¥ããŸããã è°è«ããããã«ãããã¯impl<T> From<Infallible> for T
ã§ããã¹ãã§ã¯ãããŸãããïŒ
@jethrogbæ®å¿µãªãããããã¯impl<T> From<T> for T
ãšç«¶åãããããå®è¡ã§ããŸããïŒäº€å·®ç¹ãååŸããããŸã§ã¯ïŒ-ãããŠ!
ã䜿çšããŠãæ©èœããŸããïŒã
@scottmcmãããã¡ããã
亀差ç¹ã®å®è£ ã¯å¿ èŠãªããšæããŸããïŒ ããã¯åãªãå°éåéã§ã¯ãããŸãããïŒ
ç§ã¯ä»ã®ã³ã¡ã³ããèªãã§ããŸãããã TryFrom
ã¯ä»ç§ã®ããã«å£ããŠããŸãïŒä»¥åã¯ããŸããããŸããïŒã
rustcããŒãžã§ã³ïŒ
rustc 1.22.0-nightly (d6d711dd8 2017-10-10)
binary: rustc
commit-hash: d6d711dd8f7ad5885294b8e1f0009a23dc1f8b1f
commit-date: 2017-10-10
host: x86_64-unknown-linux-gnu
release: 1.22.0-nightly
LLVM version: 4.0
rustãæå¥ãèšãé¢é£ã³ãŒãã»ã¯ã·ã§ã³ã¯ããã«ãããŸãïŒ https ïŒ//github.com/fschutt/printpdf/blob/master/src/types/plugins/graphics/two_dimension/image.rs#L29 -L39ããã³httpsïŒ// github .com / fschutt / printpdf / blob / master / src / types / plugins / graphics / xobject.rsïŒL170 -L200-æ°é±éåã«æ£åžžã«ã³ã³ãã€ã«ããããããã©ã€ãã©ãªã«ã¯ãŸã ããã«ããã¹ããããžããããŸãã
ãã ããææ°ã®ãã€ããªãŒãã«ãã§ã¯ã TryFrom
ãå£ããŠããããã§ãã
error[E0119]: conflicting implementations of trait `std::convert::TryFrom<_>` for type `types::plugins::graphics::two_dimensional::image::Image`:
--> src/types/plugins/graphics/two_dimensional/image.rs:29:1
|
29 | / impl<T: ImageDecoder> TryFrom<T> for Image {
30 | | type Error = image::ImageError;
31 | | fn try_from(image: T)
32 | | -> std::result::Result<Self, Self::Error>
... |
38 | | }
39 | | }
| |_^
|
= note: conflicting implementation in crate `core`
error[E0119]: conflicting implementations of trait `std::convert::TryFrom<_>` for type `types::plugins::graphics::xobject::ImageXObject`:
--> src/types/plugins/graphics/xobject.rs:170:1
|
170 | / impl<T: image::ImageDecoder> TryFrom<T> for ImageXObject {
171 | | type Error = image::ImageError;
172 | | fn try_from(mut image: T)
173 | | -> std::result::Result<Self, Self::Error>
... |
199 | | }
200 | | }
| |_^
|
= note: conflicting implementation in crate `core`
error: aborting due to 2 previous errors
error: Could not compile `printpdf`.
ãããã£ãŠãããããããã¯ã¯ã¬ãŒãcore
ã«éè€ããå®è£
ãæã£ãŠããŸãã 誰ããããã調ã¹ãããšãã§ããã°ãããã¯çŽ æŽãããããšã§ããããããšãã
@fschutt競åããimplã¯ããããimpl<T, U> TryFrom<T> for U where U: From<T>
ã§ã httpsïŒ//github.com/rust-lang/rust/pull/44174ã«è¿œå ãããŠããŸãã T: ImageDecoder
ãšImage: From<T>
ã®äž¡æ¹ã®ãããªT
ãååšããå¯èœæ§ããããŸãã
ãããæ©èœã²ãŒããé¢ããããã«ãŸã å¿ èŠãªãã®ã¯ãããŸããïŒ
https://github.com/rust-lang/rust/issues/35121ãæåã«å®å®ããå Žåã https ïŒ//github.com/rust-lang/rust/pull/ã§å°å
¥ãããInfallible
ã¿ã€ããåé€ã§ããŸãã 44174ãããŠä»£ããã«!
ã䜿çšããŠãã ããã ãããèŠä»¶ãšèŠãªããããã©ããã¯ããããŸããã
ããã§ã®äž»ãªãããã«ãŒã¯ãŸã æŽæ°åã ãšæããŸãã æŽæ°åhttps://github.com/rust-lang/rust/pull/42456#issuecomment-326159595ã«åå¥ã®Cast
ãã¬ã€ãã䜿çšãããã移æ€æ§ã®lintïŒ41619ãæåã«å®è¡ããŸãã
ã ããç§ã¯AsRef<str>
TryFrom
ãå®è£
ããåæåãæã£ãŠããŸããããããã¯æ°ã¶æåã«å£ããŸããã æ¯æ©çºçãããã°ã§ãæéã®çµéãšãšãã«è§£æ¶ããããšæããŸããããããã§ã¯ãªãããã§ãã ããã¯TryFrom
ã§ãµããŒããããŠãããã¿ãŒã³ã§ã¯ãªããªããŸãããïŒ
impl<S: AsRef<str>> TryFrom<S> for MyEnum {
type Error = &'static str;
fn try_from(string: S) -> Result<Self, Self::Error> {
// Impl here
}
}
...
&str
ãšString
ã®äž¡æ¹ããå€æããããã®ä»ã®ãªãã·ã§ã³ã¯ãããŸããïŒ
@kybishopã¯MyEnum
ãFromStr
$ãå®è£
ããŸããïŒ ãããããªãã®ç Žæã®åå ãããããŸããã
@nvzqzã¯ããã§ã¯ãããŸããããããäžè¬åããããœãªã¥ãŒã·ã§ã³ã§ãããããRust IRCçµç±ã§TryFrom
ã䜿çšããããšããå§ãããŸããã TryFrom
ã¯ãæ°ãæåã«æ¯æ©é倧ãªå€æŽãçºçãããŸã§ãæåã¯ããŸãæ©èœããŠããŸããã
ç·šéïŒ FromStr
ã®å®è£
ã«åãæ¿ããå¿
èŠããããšããããšã§ããããããšã_did_ impl FromStr
ã®å Žåãç ŽæãåŒãèµ·ããå¯èœæ§ããããšããããšã§ããïŒ
ç·šé2ïŒãããå®å šãªå®è£ ã§ãã奜å¥å¿æºçãªäººã®ããã«çããŠã·ã³ãã«ã§ãïŒ https ïŒ//gist.github.com/kybishop/2fa9e9d32728167bed5b1bc0b9becd97
@kybishopã¯ã &str
AsRef<str>
ã®å®è£
ãå¿
èŠãªç¹å¥ãªçç±ããããŸããïŒ
@sfacklerç§ã¯ã &str
ãšString
ã®äž¡æ¹ããã®å€æãå¯èœã§ãããšããå°è±¡ãåããŸããããç§ã¯ãŸã Rustã®åå¿è
ãªã®ã§ã AsRef<str>
ã®æ£ç¢ºãªæ¹æ³ã誀解ããŠããå¯èœæ§ããããŸãã &str
ããªãã«ããŠã AsRef
ã&str
ã§èš±å¯ãããŠããªãããšãèš±å¯ããŠãããã©ããã確èªããŸãã
@kybishop https://github.com/rust-lang/rust/issues/33417#issuecomment -335815206ãšåãã§ãã³ã³ãã€ã©ã®ãšã©ãŒã¡ãã»ãŒãžã«ããããã«ãããã¯impl<T, U> std::convert::TryFrom<U> for T where T: std::convert::From<U>
implãšã®å®éã®ç«¶åã§ãã libcoreã«è¿œå ãããŸããã
äž¡æ¹ãå®è£
ããã¿ã€ãT
ïŒããããããŠã³ã¹ããªãŒã ã¯ã¬ãŒãå
ïŒãååšããå¯èœæ§ããããŸãFrom<MyEnum>
ãšAsRef<str>
MyEnum: From<T>
ããããŸã ã ãã®å Žåãäž¡æ¹ã®implãé©çšããããããäž¡æ¹ã®implãäžç·ã«ååšããããšã¯èš±å¯ãããŸããã
@SimonSapinã¯ç解ããŸããã ã§ã¯ã &str
ãš&String
ã®äž¡æ¹ããå€æããã人ã®ããã®ãªãã·ã§ã³ã¯äœã§ããïŒ äž¡æ¹ã«TryFrom
ãå®è£
ããå¿
èŠããããŸããïŒ
ç·šéïŒç§ã¯äœåãªä»äºãé£ã¹ãŠã String
.as_ref()
ãåŒã³åºãããšãã§ãããšæããŸãã 次ã«ã str
ã«å¯ŸããŠåäžã®TryFrom
implãäœæã§ããŸãã
ã¯ãã MyEnum
ãFrom<&str>
ãŸãã¯From<String>
ãå®è£
ããŠããªãéãã2ã€ã®å®è£
ïŒãããããäžæ¹ãä»æ¹ã«åºã¥ããŠããïŒãæ©èœããã¯ãã§ãã
@kybishop String
ã¯Deref<str>
$ãå®è£
ãããããåæšè«ã«ããã TryFrom
implã«æž¡ããšãã«&String
ã&str
ã«åŒ·å¶å€æã§ããããã«ããå¿
èŠããããŸãã as_ref
é»è©±ããå¿
èŠããããšã¯éããŸããã
誰ããããã®ç°¡åãªäŸãæ¢ããŠãããªãïŒ https ïŒ//play.rust-lang.org/ïŒgist = bfc3de0696cbee0ed9640a3f60b33f5bïŒversion = nightly
https://github.com/rust-lang/rust/pull/47630ã!
ãå®å®ãããããšããŠããã®ã§ãPRãInfallible
ã!
ã«çœ®ãæããæ欲ã¯ãããŸããïŒ ïŒ
åŸãã¹ãããè¯ãã«ãŒãã¯ããšã€ãªã¢ã¹ãäœæããããšã§ãã è¡šçŸåãç¶æããé©å¿èšèªæ©èœã䜿çšããŸãã
type Infallible = !;
é£ã³èŸŒãã§ãã ããã @ scottmcmã䜿çšããŠããŸãã
ãã ããããã«ããããã®æ©èœïŒ TryInto
/ TryFrom
ïŒãå¥ã®äžå®å®ãªæ©èœïŒ never_type
$ïŒã«äŸåãããšããäœåãªãªãŒããŒããããè¿œå ãããŸãã
ãŸãã Infallible
ã«ã¯ãåãäœæã§ããªãçç±ã«é¢ããããå€ãã®æ
å ±/ã»ãã³ãã£ã¯ã¹ãæäŸãããšããå©ç¹ããããŸãã ç§ã¯ä»èªåèªèº«ã«æèŠãæã£ãŠããŸãã
!
ãååãªèªåœã¿ã€ãã«ããŠã Result<_, !>
ããééãã®ãªãçµæããŸãã¯ãïŒæåéãïŒæ±ºããŠèª€ãã®ãªãçµæããšããŠçŽæçã«èªã¿åããããã«ããããšæããŸãã ãšã€ãªã¢ã¹ã䜿çšãããšïŒå¥ã®ã¿ã€ããæ°ã«ããªãã§ãã ããïŒïŒãå°ãåé·ã«æããŸããã¿ã€ãã·ã°ããã£ãèªã¿åããšãã«ãå°ãªããšãäžæçãªäžæåæ¢ãçºçããããšãããããŸãããåŸ
ã£ãŠãã ãããããã¯!
ãšã©ãéãã®ã§ããã ïŒã ãã¡ãããYMMVã
@jdahlstromç§ã¯å®å šã«åæããŸãã ããããã°ã©ãŠã³ããã¥ã«ãŒã¹ãã§èŠªãã¿ããããã®ã«ãªãããã«ãRustããã¯ãŸãã¯ããã³ã³ã§ããã玹ä»ããå¿ èŠããããŸãã
ãã®APIã®RFCãæåºãããŠãã2幎ã«ãªããŸãã
ã @ briansmith ïŒå®å®åPRãé²è¡äžã§ããã
ç·šéïŒãŸãã¯å€åç§ã¯ããŸãã«ãç²ããŠããŸã...
!
ã¿ã€ãã®å®å®åã®PRããªã³ã¯ããŸããã
!
å®å®åPRãããŒãžãããã°ãããªã®ã§ã$ convert::Infallible
ã!
ã«çœ®ãæããããã®PRãæåºããŸããïŒïŒ49038
https://github.com/rust-lang/rust/pull/49038ãããŒãžãããŸãã ãããå®å®åã®æåŸã®é»å®³èŠå ã ã£ããšæããŸããæªè§£æ±ºã®åé¡ãèŠéããå Žåã¯ãç¥ãããã ããã
@rfcbotfcpããŒãž
https://github.com/rust-lang/rust/issues/33417#issuecomment -302817297ã§å¥ã®FCPããã§ã«å®äºããŠãããããrfcbotãå¿çããŠããŸããã
ããŒããåæ€èšããå¿
èŠãããããã€ãã®å®è£
ããããŸãã impl<T, U> TryFrom<U> for T where T: From<U>
ãã§ããã®ã§ã type Error = !
TryFrom
ã®æ®ãã®implã¯ã From
ã®implã«çœ®ãæããããåé€ãããããã©ãŒã«ãã«ã«ããå¿
èŠããããŸãïŒãšã©ãŒã¿ã€ããç¡äººã¿ã€ãã«å€æŽããŸãïŒã
ãã®å Žåãç§ãèŠã€ããããšãã§ããã®ã¯usize
ãŸãã¯isize
ã§ãã 察å¿ããFrom
implã¯ããã©ãŒã«ããªãã£ãã¿ãŒã²ãããã€ã³ã¿ã®ãµã€ãºã«äŸåãããããååšããªããšæããŸãã å®éã TryFrom
implã¯ãã¿ãŒã²ããããšã«ç°ãªãæ¹æ³ã§çæãããŸããhttps ïŒ//github.com/rust-lang/rust/blob/1.24.1/src/libcore/num/mod.rs#L3103-L3179ããããããæºåž¯æ§ã®å±éºã§ãã
ã¿ãŒã²ããããšã«çæãç°ãªããŸã
æ確ã«ããããã«ïŒåãimpl
target_pointer_width
ã®ç°ãªãã¡ãœããæ¬äœã¯åé¡ãããŸããïŒãããŠããããå¿
èŠã§ãïŒããç°ãªãAPIïŒãšã©ãŒã¿ã€ãïŒã¯ããã§ã¯ãããŸããã
å®å®åPRïŒïŒ49305ã ããã§ã®è°è«ã®åŸããã®PRã¯ã usize
ãŸãã¯isize
ãå«ãããã€ãã®TryFrom
implãåé€ããŸããããã¯ãããããå®è£
ãã2ã€ã®ç°ãªãæ¹æ³ã®ã©ã¡ããã決å®ããŠããªãããã§ãã ïŒãã¡ããã1ã€ããæãŠãŸãããïŒ
ãããã®ããã®å°çšã®è¿œè·¡åé¡ïŒ https ïŒ//github.com/rust-lang/rust/issues/49415
TryFrom
ã¯ãæ©èœã²ãŒãã£ã³ã°ãªãã§rustc 1.27.0-nightly (ac3c2288f 2018-04-18)
ã§å®å
šã«æ©èœããŸãããã rustc 1.27.0-nightly (66363b288 2018-04-28)
ã§ã³ã³ãã€ã«ãããšå£ããŸããã
éå»10æ¥éããã®æ©èœã®å®å®åã«åŸéããããŸãããïŒ
@kjetilkjekaãã®æ©èœã¯æè¿å®å®ããŠããŸããïŒïŒ50121ã
ïŒå®å®åãå ã«æ»ããããããåéããŸãïŒ
@kjetilkjeka TryFrom
ã®å®å®åã¯ã !
TryFrom<U, Error=!> for T where T: From<U>
ã®å®å®åãšãšãã«ã httpsïŒ//github.com/rust-lang/rust/pull/50121ã§å
ã«æ»ãããŸããã TryFrom<U, Error=!> for T where T: From<U>
implã !
ã¿ã€ãã¯ã httpsïŒ//github.com/rust-lang/rust/issues/49593ã®ããã«äžå®å®ã«ãªããŸããã
説æããŠãããŠããããšãã ããã¯ãã³ã³ãã€ã©ã®å匷å¶ã«å¯Ÿããããã€ãã®å€æŽã§ããã®æ©èœãæ¬è³ªçã«ãããã¯ãããããšãæå³ããŸããïŒ ã©ã®ãããªå€æŽãå¿ èŠãã説æããåé¡ãèŠã€ãããŸããããã®æç¹ã§å€æŽã®å€§ããã¯ããã£ãŠããŸããïŒ
TryFrom
ç¹æ§èªäœãããã³!
ãå«ãŸãªãimplãå
ã«é²ããŠå®å®åã§ããã !
ãå«ãimplã®å®å®åã延æããããšãã§ããªãã£ãæ ¹æ¬çãªçç±ã¯ãããŸããïŒ !
ã®å¯èœãªå®å®åã®åŸãŸã§ïŒ
https://github.com/rust-lang/rust/pull/49305#issuecomment -376293243ã¯ãèããããããŸããŸãªç¹æ§ã®å®è£ ãåé¡ããŠããŸãã
@joshtriplettç§ãç解ããŠããéããç¹ã«impl<T, U> TryFrom<T> for U where U: From<T> { type Err = !; }
ã¯ã TryFrom
ããã§ã«å®å®ããŠããå Žåãè¿œå ããäžäœäºææ§ããããŸããã
@SimonSapin
è¿œå ããã®ã«äžäœäºææ§ããªãã®ã¯ãªãã§ããïŒ
ïŒãããŠãç§ãã¡ã¯æ¬åœã«ãã©ã³ã±ããimplãå¿ èŠã§ããïŒïŒ
è¿œå ããã®ã«äžäœäºææ§ããªãã®ã¯ãªãã§ããïŒ
TryFrom
ãå®å®ããŠãã!
ãå®å®ãããŸã§ã®éã TryFrom
ãæåã§å®è£
ã§ããå¯èœæ§ããããããäžäœäºææ§ã¯ãªããšæããŸãã å
æ¬çå®è£
ãè¿œå ãããå Žåãæåå®è£
ãšç«¶åããããšã«ãªããŸãã
ïŒãããŠãç§ãã¡ã¯æ¬åœã«ãã©ã³ã±ããimplãå¿ èŠã§ããïŒïŒ
TryFrom
ãè¶
ãããžã§ããªãã¯ã³ãŒããæžãå Žåããã©ã³ã±ããimplã¯æ¬åœã«çã«ããªã£ãŠãããšæããŸãã T
ã«å€æãããå¯èœæ§ã®ãããã¹ãŠã®ã¿ã€ããåç
§ããå Žåãã»ãšãã©ã®å Žåã確å®ã«T
ã«å€æã§ãããã¹ãŠã®ã¿ã€ããå«ããå¿
èŠããããŸãã å¥ã®æ¹æ³ãšããŠã From
ãå®è£
ãããã¹ãŠã®ã¿ã€ãã«å¯ŸããŠTryFrom
ãå®è£
ããããã«å
šå¡ã«èŠæ±ããç¹æ®åãåŸ
ã£ãŠããå
æ¬çå®è£
ãäœæããããšãèããããŸãã Result
ããžã§ããªãã¯ã«ããããã«$ Err
ãäœã§ããããšããåé¡ããŸã ãããŸãã !
ã¯ãå€æã®äžå¯è¬¬æ§ãè¡šçŸããããã°ã©ã ã§åŒ·å¶ããããã®åªããæ¹æ³ã®ããã«æãããããŸãããã°åŸ
ã€äŸ¡å€ããããŸãã
å æ¬çå®è£ ãæäŸãããã®éã«ããŸããŸãªæ°å€å€æãå®å®ãããããã®ç¹æ®åãå©çšå¯èœã«ãªããŸã§ããã€ã§ãåŸ ã€ããšãã§ããŸãã
Rustã§æŽæ°å€æãæ £äŸçã«è¡ãæ¹æ³ã«ã€ããŠå©ããæ±ããŠãã人ã ã®æèã§ããããã«å¯ŸããããŸããŸãªèŠæ±ãèŠãŠããŸããããããŠä»æ¥ããšã©ãŒæ€åºã䜿çšããŠu64ãu32ã«å€æããæ¹æ³ãå ·äœçã«èããŠãã人ã«åºããããŸããã
ç§ã¯ãå°éåã«ãã£ãŠãäºåŸã«ãã©ã³ã±ããimplãéæ³ã®ããã«è¿œå ã§ãããšã¯ç¢ºä¿¡ããŠããŸããã çŸåšã®ææ¡ã«ã€ããŠã®ç§ã®ç解ã¯ãç¹æ§ã¯ç¹æ®åããããšãéžæããå¿ èŠããããšããããšã§ããããã¯ãæ¢åã®ç¹æ§ã«å¯ŸããŠè¡ãã«ã¯äžäœäºææ§ããªãå¯èœæ§ããããŸãã
ãããå®å®ãããšãã¯ãã€ã§ãïŒ_ãé¡ã_åå¥æ²ã«TryFrom
ãšTryInto
ãè¿œå ããŠãã ããã
@SergioBenitezãã°ããã®éãNightlyã§ãããè¡ããŸããããæ®å¿µãªãããç¬èªã®TryFrom
ãŸãã¯TryInto
ã®ç¹æ§ãå®çŸ©ããã¯ã¬ãŒãã®é倧ãªå€æŽã§ããïŒ std
ã§äœ¿çšããå ŽåïŒ
std libsããŒã ãããã§åŠã¶ã¹ãæèšã¯ããã¬ãªã¥ãŒãã«è¿œå ãããç¹æ§ãããå Žåã¯ããããå®è£ ããããããã«è¿œå ããå®å®åãåŸ ããªãããšã§ãã
ãã ãã TryFrom
ãšTryInto
ã®å Žåã解決çã¯2018幎çã®åå¥æ²ãå€ããããšã§ãã ããã¯ä»¥åã«éå
¬åŒã«è°è«ãããŸãããããã¡ã€ã«ãããŠããªãã£ãã®ã§ã httpsïŒ//github.com/rust-lang/rust/issues/51418ãéããŸããã
åæ§ã®åé¡ã«å¯Ÿããäžè¬çãªè§£æ±ºçãæ¡åŒµã®ããã«å®è£
ãããŸãã
https://github.com/rust-lang/rust/issues/48919ã®ã¡ãœãããããã«ããäžå®å®
æ¡åŒµã¡ãœããã¯ãå®å®ããã³ãŒããè¡çªãããšãã«èŠåãçºè¡ããŸãã
æ°ããçšèªãè¿œå ããŠãåæ§ã®ããšãã§ããããã§ãã
ãã¬ãªã¥ãŒãïŒ
2018幎6æ7æ¥æšææ¥ãåå11æ47å[email protected]ã¯æ¬¡ã®ããã«æžããŠããŸãã
@SergioBenitezhttps ïŒ//github.com/SergioBenitez
ãã°ããã®éæ¯æ©ããããŠæ®å¿µãªããããã¯æšæ ã«ãšã£ãŠå£æ» çãªå€åã§ãã
ç¬èªã®TryFromãŸãã¯TryIntoãã¬ã€ããå®çŸ©ããŸãïŒstdäžã«äœ¿çšããããïŒ
1ã€ã¯äžå®å®ã§ãïŒãååã«å ã«æ»ããŸãããstd libsããŒã ã®ããã«ããã§åŠã¶ã¹ãæèšã¯ã
ãã¬ãªã¥ãŒãã«è¿œå ãããç¹æ§ããããŸãã
å®è£ ããããšããã«ãå®å®åãåŸ ããªãã§ãã ããããã ããTryFromãšTryIntoã®å Žåã解決çã¯ç°ãªããã®ã«ããããšã§ãã
2018幎çã®ãã¬ãªã¥ãŒãã ããã¯ä»¥åã«éå ¬åŒã«è°è«ãããŸããã
æåºãããŠããªãã£ãã®ã§ãïŒ51418ãéããŸãã
https://github.com/rust-lang/rust/issues/51418 ãâ
ãã®ã¹ã¬ããã«ãµãã¹ã¯ã©ã€ãããŠããããããããåãåã£ãŠããŸãã
ãã®ã¡ãŒã«ã«çŽæ¥è¿ä¿¡ããGitHubã§è¡šç€ºããŠãã ãã
https://github.com/rust-lang/rust/issues/33417#issuecomment-395525170 ã
ãŸãã¯ã¹ã¬ããããã¥ãŒãããŸã
https://github.com/notifications/unsubscribe-auth/AAC2lNbHvgBjWBk48-1UO311-LuUY5lPks5t6XUvgaJpZM4IXpys
ã
ãã®å Žåãè¡çªããã®ã¯ç¹æ§èªäœïŒãã¬ãªã¥ãŒãå ã®ã¢ã€ãã ã®ååïŒã§ã¯ãªãããã®ç¹æ§ã«ãã£ãŠã¹ã³ãŒãã«æã¡èŸŒãŸããã¡ãœããã§ãã ãã¶ããç§ãã¡ãã§ããåæ§ã®åŸ®èª¿æŽããŸã ããã€ããããããããŸããããããã¯ãã£ãšåŸ®åŠã§ãã
@SimonSapin TryFrom / TryIntoå®å®åã®çŸåšã®èšç»ã¯äœã§ããïŒ 4æ29æ¥ã«å ã«æ»ããã以å€ã«å ·äœçãªãã®ã¯èŠã€ãããŸããã§ããã
@nayatoããèªäœãhttps://github.com/rust-lang/rust/ã§ãããã¯ãããŠããã決ããŠã¿ã€ãããªãhttps://github.com/rust-lang/rust/issues/35121ãå®å®åããããšã§ãããã¯ãããŸãçºè¡/ 49593ã
@SimonSapinneverã¿ã€ãã¯ããã§ã®ã¿äœ¿çšãããŸãã ãã®å®è£
ãªãã§TryFrom
ãå®å®ãããå®å®ããªããšãã«çéžãããããšã¯ã§ããŸããïŒ TryFrom
ã¯ã Try
ãšåçã§ããããšãé€ãã°ãéåžžã«éèŠãªã€ã³ã¿ãŒãã§ã€ã¹ã§ãã
æ®å¿µãªããéããŸãã ç¹æ§ãå®å®ããcrates.ioã©ã€ãã©ãªãããšãã°TryFrom<Foo> for Bar
ãå®è£
ããæ©äŒãããããã®äžæ¹ã§From<Foo> for Bar
ãããå Žåããã®ãã©ã³ã±ããimplãè¿œå ããããšã¯é倧ãªå€æŽã«ãªããŸãããªãŒããŒã©ããããŸãã
ãããŸã§ã®æ±ºå®ã¯ããã®æ¹æ³ã§$ïŒ TryFrom
ãFrom
ãšãäºææ§ããããããã«ããããšã¯ãå®å®åããããã¯ããã®ã«ååéèŠã§ãããšãããã®ã§ããã
ããããçŽ æŽã§æããªèãïŒ
ãã®éã«rustcãError<_, !>
ã®ããªã¬ãŒãšãªãåžžæãªã³ã®ãšã©ãŒãªã³ããååŸãããŠãŒã¶ãŒã©ã³ãã§ã®implãé²ããåŸã§impl
ãè¿œå ã§ããããã«ããå Žåã¯ã©ããªããŸããïŒ
ãŸãã¯ãä»»æã®ãšã©ãŒã¿ã€ãã®äžå®å®ãªimpl<T: From<U>, U> TryFrom<U> for T
ã ãã¬ã€ãã€ã³ãã«ã¯äžå®å®ã«ãªãå¯èœæ§ããããŸããïŒ
@jethrogbããã
ãããneverã¿ã€ãã§ãããã¯ãããçç±ãå®å šã«ç解ããŠããã®ãã©ããã¯ããããŸãããããããRustã«éèŠãªã¡ã«ããºã ãæ¬ ããŠããããšã瀺åããŠããŸãã å°æ¥ã®å®çŸ©ã®ããã«æãŸããå®è£ ãäºçŽããæ¹æ³ãããã¯ãã§ãã ããããããã®ã¡ã«ããºã ã¯äžå®å®ã«ãããããªãã®ã§ãããçæ³çã«ã¯ãéæšæºã®ã¯ã¬ãŒãã§ã䜿çšã§ããã¡ã«ããºã ã§ãã ãã®åé¡ã«å¯ŸããŠææ¡ããã解決çãç¥ã£ãŠãã人ã¯ããŸããïŒ
ãã®implã®ããã«ãããã¯ãããŸãïŒ
impl<T, U> TryFrom<U> for T where T: From<U> {
type Error = !;
fn try_from(value: U) -> Result<Self, Self::Error> {
Ok(T::from(value))
}
}
@ rust-lang / libsãããã¯ã解é€ããããã«ãneverã¿ã€ãã§ã¯ãªãenum Infallible {}
ã«æ»ãããšã«ã€ããŠã©ãæããŸããïŒ
ç§ã¯å人çã«enum Infalliable {}
ãæã£ãŠããŠãåŸã§ãããtype Infalliable = !
ã«å€æŽããŠãããŸããŸããã
æšæ¥ã®libsããªã¢ãŒãžäŒè°ã§ããã«ã€ããŠè©±ãåããŸããããå®å®ååŸã«ãã®ãããªå€æŽã倧äžå€«ãã©ããããŸãã¯æœåšçãªç Žæã®ããã«ãã®ã¢ã€ãã¢ããã§ã«æåŠãããã©ããããŸãã¯ãã®ç Žæãã©ããªãããæãåºããŸããã§ããã
ç§ãã¡ãèŠããŠããã®ã¯ããã®ãããªçœ®æã1ã€ããå®è¡ã§ããªããšããããšã§ãã2ã€ã®ããå®å®ããæšæºã©ã€ãã©ãªã®ç©ºã®åæåïŒå¥ã
ã®ã¿ã€ãïŒãåŸã§åãã¿ã€ãã«ãªããšãäž¡æ¹ã«impl
ãå«ãŸããã¯ã¬ãŒããå£ããŸãã implããªãŒããŒã©ããïŒãŸãã¯åäžïŒã«ãªããšã ããšãã°ã impl From<std::convert::Invallible> for MyError
ãšimpl From<std::string::ParseError> for MyError
ã§ãã
ã¡ãªã¿ã«ã std::string::ParseError
ããããŸããããã¯ãç§ãç¥ãéãã1.30.0æšæºã©ã€ãã©ãªã®å¯äžã®ç©ºã®åæåã§ãã ãããã£ãŠããã®èšç»ã«ä»ã®åé¡ããªããšç¢ºä¿¡ã§ããå Žåã¯ã次ã®ããšãã§ããŸãã
string::ParseError
ãconvert::Infallible
ã«ç§»åããŸãpub use
ãŸãã¯pub type
ã䜿çšããŠãå€ãå Žæã«åãšã¯ã¹ããŒãããŸãïŒããã«ããéãã¯ãããŸããïŒïŒTryFrom
ãã©ã³ã±ããã€ã³ããªã¡ã³ãã§äœ¿çšããŸãstring::ParseError
ãšconvert::Infallible
ã®äž¡æ¹ã$ïŒ type _ = !
ã«çœ®ãæãã䜿çšãããå Žæã§çŽæ¥!
ã䜿çšããŸããTryFrom
ãã¬ãŒã¹ãã«ããŒç¹æ§ãèªåã®ã¯ã¬ãŒãã«è¿œå ããŸããããRFCãšå®å®åã®åãçµã¿ã®æå³ãå®å
šã«ç解ããŠããªãã£ãã®ã§ã From
ã®ãã©ã³ã±ããTryFrom
ã«é©ããŠããŸãã From
ãšInfallible
/ !
ã®ãšã©ãŒã¿ã€ãã¯ãããã劚ããŠãããã®ã§ããïŒ å®å®ããæšæºTryFrom
ãšå
æ¬çTryInto
ç¹æ§ã確ç«ããåŸããããã®äºæ¬¡çãªç®æšã¯ãããŸãããïŒ ã€ãŸãã From
ããTryFrom
$ãžã®äžæïŒç®çã¯å®å
šã«ã¯ç解ããŠããŸããïŒããªããŠãããããå¿
èŠãšãããã¹ãŠã®ã¯ã¬ãŒããè¿œå ãããªããã°ã解çŽçã¯äœããªããŸãããïŒç¬èªã®TryFrom
ïŒ
TryFrom
ãFrom
ã®å
æ¬çå®è£
ãªãã§åºè·ãããå Žåã®æãããªåé¡ã¯ãã¯ã¬ãŒããåãã¿ã€ãã«å¯ŸããŠTryFrom
ãšFrom
ãå®è£
ããå¯èœæ§ãããããšã§ãïŒããããæ£ç¢ºã«ãã©ã³ã±ããimplã¯ãããŸããïŒããã©ã³ã±ããimplãlibstdã«è¿œå ããããšå£ããŸãã
èããŠã¿ããšãå°éåã«ãã倧ããªå€åã§ã¯ãªãã§ããããã
ããŒããæãããªããšãæ¬ ããŠããå Žåã¯ãããäžåºŠèš±ããŠãã ããã ãããã®1ã5幎ã®RFC /远跡ãªããã»ã€ãšã»ãŒåãããã«ãããžãã¯ã®é²è¡ãç解ããããã«å®è¡äžã®FAQã»ã¯ã·ã§ã³ãå¿
èŠã§ãã ã¬ã€ãã³ã¹ããééãã®ãªãå€æã«å¯ŸããŠã®ã¿From
ãå®è£
ããééãã®ãªãå€æã«å¯ŸããŠã®ã¿TryFrom
ãå®è£
ããå Žåã¯ã©ããªããŸããïŒ ããã¯ãæšæºã§ãããåºè·ããæšæ ã調æŽããããšãžã®ããå°ãªãéå£ãæäŸããªãããåæ§ã®å®çšçãªæçµçµæãäžããŸãããïŒ
ã¯ãã @ glandiumãèšã£ãããã«ãç¹æ§ããã§ã«å®å®ããåŸã«ãã©ã³ã±ããimplãè¿œå ããããšã¯ãé倧ãªå€æŽã§ãã å®å®åã¯ãŸã æºåãã§ããŠãããããšã«ãããã®çš®ã®äº€å·®ç¹ãèš±å¯ãããã©ããã¯æããã§ã¯ãããŸããïŒãå³å¯ã«ããå ·äœçãªãæ¹æ³ã ãã§ã¯ãããŸããïŒã
å£ããŠããŸããããªããã°ã©ã ãæžããªããšããã¬ã€ãã³ã¹ïŒããã¥ã¡ã³ãïŒïŒãæäŸããããšã¯ãå£ããå€æŽãæ£åœåããã®ã«ååã§ã¯ãããŸããã ç Žæã¯ééããªãçºçããŸãã
https://github.com/rust-lang/rust/issues/33417#issuecomment -423073898ã§æŠèª¬ãããŠããèšç»ãå®è¡ãéå§ããã«ã¯ãäœãå¿ èŠã§ããïŒ å©ããããã«äœãã§ããã§ããããïŒ
ããã¯å°ããããããäœæ¥ã§ããã誰ãããã®è¿œè·¡ã®åé¡ãšhttps://github.com/rust-lang/rust/issues/35121ã調ã¹ãŠããã®èšç»ã«åé¡ããããã©ããã確èªã§ããã°åœ¹ã«ç«ã¡ãŸããç¹ã«ã以åã®ãªãªãŒã¹ã§åæåãå®å®ããåŸã«enum Infallible
ãtype Infallible = !;
ã«çœ®ãæããããšã¯ãé倧ãªå€æŽã«ãªãå¯èœæ§ããããã©ããã«ã€ããŠã以åã«è°è«ããå¿ããŠããŸããã
Infallible
åæåã¯ãç¹æ§ãšãšãã«å®å®åããå¿
èŠããããŸããïŒ äžå®å®ãªç¶æ
ã«ä¿ãããŠãããšã誰ãååãä»ããããšãã§ããªãã®ã§ãåŸã§!
ãšäº€æããŠãåé¡ãããŸãããïŒ
@seanmonstarãããã <u16 as TryFrom<u8>>::Error
ã䜿çšããŠåç
§ã§ããå®å®ããååãšèŠãªãããŸãã ç®æè
ïŒ
// src/lib.rs
#![feature(staged_api)]
#![stable(since = "1.0.0", feature = "a")]
#[stable(since = "1.0.0", feature = "a")]
pub trait T1 {
#[stable(since = "1.0.0", feature = "a")]
type A;
}
#[unstable(issue = "12345", feature = "b")]
pub struct E;
#[stable(since = "1.0.0", feature = "a")]
impl T1 for u8 {
type A = E;
}
// src/bin/b.rs
extern crate a;
trait T3 {}
impl T3 for <u8 as a::T1>::A {}
impl T3 for a::E {}
fn main() {}
æåã®T3implã¯ãšã©ãŒãåŒãèµ·ãããŸããã 2çªç®ã®T3implã®ã¿ããE0658ã®ãäžå®å®ãªã©ã€ãã©ãªæ©èœã®äœ¿çšããšã©ãŒãåŒãèµ·ãããŸãã
ããã¯âŠâŠãããŒãåãŸããããã«é Œãã ã> _ <
ç§ã¯å人çã«ããšã¯ã¹ããŒããããŠããªãã¢ãžã¥ãŒã«ã§åãå ¬éãããšããããªãã¯ã䜿çšããŠãååã®ãªãåãè¿ããŸããããªããèšã£ãããšã誰ãããã£ãå Žåãããã¯ç Žæãæå³ããŸãããç§ã®æ°æã¡ã¯ãæ¥ãã¹ãããšãã§ãããèæ ®ããŸãããååã®ãªãã¿ã€ããå£ãããã«èª¿æŽããŸãã
ç§ã¯å人çã«ãlibstdå ã®ãããã®å®éã«ã¯æ±ºããŠãªãåæåã®ãã¹ãŠãåãã§ããããšã確èªããŠããããããã¿ã€ããšã€ãªã¢ã¹ã«å€æŽããããšãæ°ã«ããŸããïŒ ãããå®å®ãããšãã ç§ã«ã¯åççãªããã§ãã
ãã®ãã¹ãŠã®æ±ºããŠåã®æ··ä¹±ãšã¯é¢ä¿ãªããéCopy
åã§ã®ãã©ãŒã«ãã«å€æã®èšèšäžã®éžæã¯äœã§ããïŒ å€±æããå Žåã«åãæ»ãããšãã§ããããã«ãæå®ãããå
¥åãããããããªãããã«æ³šæããå¿
èŠããããŸãã
ããšãã°ã String::from_utf8
ã䜿çšãããšããšã©ãŒã¿ã€ãã«ææãããŠããå
¥åVec<u8>
ãå«ãŸããŠããããšããããããããè¿ãããšãã§ããŸãã
// some invalid bytes, in a vector
let sparkle_heart = vec![0, 159, 146, 150];
match String::from_utf8(sparkle_heart) {
Ok(string) => {
// owned String binding in this scope
let _: String = string;
},
Err(err) => {
let vec: Vec<u8> = err.into_bytes(); // we got the owned vec back !
assert_eq!(vec, vec![0, 159, 146, 150]);
},
};
ãããã£ãŠã String: TryFrom<Vec<u8>>
ã®å®è£
ãååŸããå Žåã <String as TryFrom<Vec<u8>>>::Error
ã¯FromUtf8Error
ã§ãããšäºæ³ãããŸããïŒ
ã¯ãããšã©ãŒã¿ã€ãã§å
¥åå€ããæ»ããããšã¯æå¹ãªãªãã·ã§ã³ã§ãã impl<'a> TryFrom<&'a Foo> for Bar
ã§åç
§ããããšã¯å¥ã§ãã
ãã ãããã®ç¹å®ã®äŸã§ã¯ã TryFrom
implãé©åãã©ããã¯ããããŸããã UTF-8ã¯ãUnicodeãžã®ãã€ãã®å¯èœãªãã³ãŒãã®1ã€ã«ãããã from_utf8
ã¯ãã®ååã«ãããåæ ããŠããŸãã
ããã¯å°ããããããäœæ¥ã§ããã誰ãããã®è¿œè·¡ã®åé¡ãšïŒ35121ã調ã¹ãŠã以åã«èª¬æãããã以éå¿ããŠããŸã£ããã®èšç»ã«åé¡ããããã©ãããç¹ã«
enum Infallible
ã眮ãæããããšãã§ãããã©ããã確èªã§ããã°åœ¹ç«ã¡ãŸãã以åã®ãªãªãŒã¹ã§åæåãå®å®ããŠããåŸã®type Infallible = !;
ã¯ãé倧ãªå€æŽã«ãªãå¯èœæ§ããããŸãã
ä»å·ãŸãã¯ïŒ35121ã§ææãããå
·äœçãªåé¡ã¯ãããŸããã§ããã !
ãäœããã®åœ¢ã§ç¹å¥ã§ãããæå¶ãããŠããªãã¿ã€ãã§ã¯ãªãå¯èœæ§ã«ã€ããŠ1ã€ã®æžå¿µããããŸããã ããããPRã«ã¯æžå¿µã¯ãªããã³ãŒãã¬ãã¥ãŒã®ã³ã¡ã³ããããåæåãå®å®ããå¯èœæ§ããã£ãããšã¯æããã§ãïŒããã¯æ±ºããŠèµ·ãããŸããã§ãããïŒã ãããç§ãèŠã€ãããã®ãžã®ãªã³ã¯ã§ãã
ãªãªãžãã«ã³ã³ã»ãã
1ã€ã®æœè±¡çãªæžå¿µ
libããŒã ããã®ãŽãŒãµã€ã³
ã«ç¶ãïŒ
!
ãå®å®ãããšãã®ãã©ã³ã±ããã€ã³ãã®ã¡ã¢ã§ã¯ã
ããã¯ããŸãããã§ããããïŒ
impl<T, U> TryFrom<U> for T
where U: Into<T> {
type Err = !;
fn try_from(u: U) -> Result<Self, !> { Ok(u.into()) }
}
impl<T, U> TryInto<U> for T
where U: TryFrom<T> {
type Err = U::Err;
fn try_into(self) -> Result<U, !> { U::try_from(self) }
}
ãã®ããã«ããŠããã¹ãŠã®ééãã®ãªãå€æïŒ From
ãšInto
䜿çšïŒã¯ã察å¿ããTryFrom
ãšTryInto
implãååŸããŸããããã§ã Err
ã¯!
ã§ãã From
implããšã«Into
implãååŸããã®ãšåãããã«ã TryFrom
implããšã«$ TryInto
implãååŸããŸãã
ãã®ããã«ãimplãèšè¿°ãããå Žåã¯ã From
ã Into
ã TryFrom
ã TryInto
ã®é ã«è©ŠããŠã¿ãŠãã ããããããã®ããããããã·ããªãªã§æ©èœããŸãã ãééãã®ãªãå€æãå¿
èŠãªå Žåã¯From
ãŸãã¯Into
ïŒã³ããŒã¬ã³ã¹ã«ãŒã«ã«åºã¥ãïŒã䜿çšããééãã®ãªãå€æãå¿
èŠãªå Žåã¯TryFrom
ãŸãã¯TryInto
ã䜿çšããŸãïŒã³ããŒã¬ã³ã¹ã«ãŒã«ã«åºã¥ãïŒã å¶çŽãå¿
èŠãªå Žåã¯ããã©ãŒã«ãã«ã³ã³ããŒãžã§ã³ãåŠçã§ãããã©ããã«åºã¥ããŠã TryInto
ãŸãã¯Into
ãéžæã§ããŸãã TryInto
ã¯ãã¹ãŠã®ã³ã³ããŒãžã§ã³ã§ããã Into
ã¯ãã¹ãŠééãã®ãªãã³ã³ããŒãžã§ã³ã§ãã
次ã«ã impl From<T>
ãŸãã¯impl Into<T>
ã䜿çšããããã®ãã³ãã䜿çšããŠã impl TryFrom<T, Err = !>
ãŸãã¯impl TryInto<T, Err = !>
ã«å¯ŸããŠãªã³ãããããšãã§ããŸãã
ç§ãã¡ã¯ãã§ã«ãããã®äž¡æ¹ã®å®è£ ãæã£ãŠããŸãïŒ
https://doc.rust-lang.org/1.31.0/std/convert/trait.TryFrom.html#impl -TryFromïŒ
3CUïŒ
3E
https://doc.rust-lang.org/1.31.0/std/convert/trait.TryInto.html#impl -TryIntoïŒ
3CUïŒ
3E
ããããããã¯è¡šç€ºãããŸããã§ããïŒä»ã®å®è£ ãå€ããããšããã¥ã¡ã³ããä¹±éã«ãªããŸãïŒã å€ããŠããããŸãã
impl<T, U> TryFrom<U> for T where    T: From<U>,
ã«
impl<T, U> TryFrom<U> for T where    U: Into<T>,
ããã«ãããå³å¯ã«å€ãã®å®è£
ãå¯èœã«ãªããäžè²«æ§ã®çç±ã§Into
ããå®è£
ã§ããªã人ã眰ããããšã¯ãªãããã TryFrom
ãšFrom
ã®èªåå®è£
ãååŸã§ããŸãã Into
ã®å
æ¬çimplã®ãããä»åè©çã«é©çšãããŸãã
è©ŠããŠãã³ã³ãã€ã«ããããã©ããã確èªãããã«ãªã¯ãšã¹ããéä¿¡ããŸããïŒ
ã¯ãããã£ãŠã¿ããã§ãã
From<U> for T
ãå®è£
ã§ããªããã Into<T> for U
ãšTryFrom<U> for T
ã¯å®è£
ã§ããå Žåã¯ãããŸããïŒ
ã¯ããäŸãã°
use other_crate::OtherType;
struct MyType;
// this impl will fail to compile
impl From<MyType> for OtherType {
fn from(my_type: MyType) -> OtherType {
// impl details that don't matter
}
}
// this impl will not fail to compile
impl Into<OtherType> for MyType {
fn into(self) -> OtherType {
// impl details that don't matter
}
}
ããã¯å€ç«ããã«ãŒã«ã«ãããã®ã§ãã
TryFrom
ãšFrom
ã¯ãå€ç«ããã«ãŒã«ã«é¢ããŠã¯åãã§ãããåæ§ã«ã TryInto
ãšInto
ã¯ãå€ç«ããã«ãŒã«ã«é¢ããŠåãã§ãã
@KrishnaSannasiããªãã®äŸã¯ã³ã³ãã€ã«ãããŸãããã®éã³å Žã®äŸãèŠãŠãã ãã
ææ°ã®ã³ããŒã¬ã³ã¹ã«ãŒã«ã¯ãã®RFCã«èšè¿°ãããŠãããäž¡æ¹ã®å®è£ ãèš±å¯ããå¿ èŠããããšæããŸãã
struct MyType<T>(T);
impl<T> From<MyType<T>> for (T,) {
fn from(my_type: MyType<T>) -> Self {
unimplemented!()
}
}
impl<T> Into<(T,)> for MyType<T> {
fn into(self) -> (T,) {
unimplemented!()
}
}
éã³å Ž
ãããããã§ãããæ±çšãã©ã¡ãŒã¿ãŒãè¿œå ãããšããã«å€±æããŸãã åimplãåå¥ã«ã³ã³ãã€ã«ããããšãããšã From
ã¯ã³ã³ãã€ã«ã«å€±æããŸããã Into
ã¯ã³ã³ãã€ã«ãããŸãã
ãã®å€æŽãå¿
èŠãªãã1ã€ã®çç±ã¯ãçŸåšã Into
implãèšè¿°ããå Žåããããèšè¿°ããã TryInto
implãèªåçã«ååŸã§ããªãããã§ãã From
ããã³TryFrom
ãšççŸããŠãããããããã¯æªãèšèšã ãšæããŸãã
TryFrom<U> for T
ãInto<T> for U
ããèªå掟çãããããã From<U> for T
ãå®è£
ã§ããªãå Žåããããã©ããããã£ãšå°ããŠããŸãã ããã¯ç§ã«ã¯ç¡æå³ã«æããŸãã
Into
ããTryInto
ã®ãã©ã³ã±ããimplãå¿
èŠãªããšã¯ç¢ºãã«ç解ããŠããŸãããæ®å¿µãªãããåã·ã¹ãã ã§ã¯ãä»ã®From
ããTryFrom
ãšç«¶åããããããã®ãããªãã©ã³ã±ããimplã¯çŸåšèš±å¯ãããŠããŸããã From
ããInto
ãŸã§ã®ãã©ã³ã±ããã€ã³ãïŒãŸãã¯ãå°ãªããšããããã¯ç§ã®ç解ã§ãïŒã
ãããã®ãŠãŒã¹ã±ãŒã¹ã¯ãRFC @ kjetilkjekaãªã³ã¯ãä¿®æ£ããã¯ãã ã£ããã®ãšãŸã£ããåãã§ãããšç§ã¯ããªã確信ããŠããŸãã ãããå®è£
ãããåŸã¯ã Into
ãå®è£
ã§ãããã From
ã¯å®è£
ã§ããªãå Žåã¯ãããŸããã
@scottjmaddox Into
ãTryInto
$ãæå³ããã®ãšåããããã Into
ãTryFrom
$ãæå³ããå¿
èŠã¯ãããŸããã ãŸãã From
ãšInto
ã¯æå³çã«åçã§ããããã¯ãç¹æ§ã·ã¹ãã ã§ãããè¡šçŸã§ããªããããšãã£ãŠããããæå³ããããã§ã¯ãããŸããã
TryFrom<U> for T
ã¯Into<T> for U
ããèªå掟çãããŸãããwhere From<U> for T
ã¯å®è£ ã§ããŸããã
ç¡æå³ã§ãã å®ç§ãªäžçã§ã¯ãåºå¥ããªããã¿ã€ãéã§å€æããç¹æ§ã¯1ã€ã ãã§ãããã·ã¹ãã ã®å¶éã«ããã2ã€ã«ãªããŸããã å®å®æ§ãä¿èšŒãããŠãããããããã¯å€æŽãããŸããããããã2ã€ã®ç¹æ§ãåãæŠå¿µãšããŠæ±ãããããã移åããããšãã§ããŸãã
@clarcharrãã®å Žåã§ãã Into
ãTryInto
ãæå³ãã TryFrom
ãTryInto
ãçŽæ¥æå³ããããã«ããæ¹æ³ã¯ãããŸããã implsã¯ç«¶åããŸãã Into
ã¯TryInto
ãæå³ãã TryFrom
ã¯TryInto
$ãæå³ããŸãã ç§ãææ¡ããæ¹æ³ã¯ãéæ¥çã§ã¯ãããŸãããããããã§ãããã
ãã®å€æŽã®äž»ãªçç±ãããã«èšèŒãããã«ãªã¯ãšã¹ãã«ã³ã¡ã³ãããŸãã
ããã¯äžèšã®çç±ã»ã©éèŠã§ã¯ãããŸãããããã®implã䜿çšãããšããã¹ãŠã®ééãã®ãªãå€æã«èª€ãã®ãã察å¿ç©ãå«ãŸããããã«ãªããŸããããã§ã誀ãã®ããããŒãžã§ã³ã®Err
ã¿ã€ãã¯!
ã§ãã
æ確ã«ããããã«ãç§ã¯ãããã®4ã€ã®å®è£ ãå¿ èŠã§ã
From
Into
$ãæå³ããŸãïŒå®å®æ§ã®ããïŒTryFrom
TryInto
ãæå³ãã TryInto
TryFrom
ãæå³ããŸãïŒæå³çã«åçã§ããããïŒFrom
TryFrom
$ãæå³ããŸãInto
TryInto
$ãæå³ããŸãããããçŽæ¥çã«è¡ããããéæ¥çã«è¡ããããã¯é¢ä¿ãããŸããã
ãŸãã¯ã TryInto
ããšã€ãªã¢ã¹ã«ããããšãã§ããŸãã
trait TryInto<T> = where T: TryFrom<Self>;
ãããå®éã«æ©èœãããã©ããã¯ããããŸããããååã«åçŽãªããã§ãã
into
ã¡ãœããã¯ã©ãã§å®çŸ©ãããŸããïŒ
@clarcharr @SimonSapinãèšã£ãããã«ãintoã¡ãœããã¯ã©ãã§å®çŸ©ãããŸããã ãã¬ã€ããšã€ãªã¢ã¹ã¯ãããŸããã ããã¯å¥ã®RFCã§ããå¿ èŠããããŸãã ãããŠããã®RFCã§ããããããã¯ããå¿ èŠããããŸãããããã¯æãŸãããããŸããã
@KrishnaSannasi From => Into
From => TryFrom
TryFrom => TryInto
4 Into => TryInto
From
ãå®è£
ãããã¹ãŠã®ãã®ãTryInto
ã«å¯ŸããŠ2ã€ã®ç«¶åããimplããããŸãïŒ1ã€ã¯From => Into => TryInto
ããããã1ã€ã¯From => TryFrom => TryInto
ããïŒã
From => Into
ãšTryFrom => TryInto
ã¯ã©ã¡ããéèŠã§ããããã Into => TryInto
ãç ç²ã«ããå¿
èŠããããŸãã ãŸãã¯ãå°ãªããšãããã¯ç§ã®ç解ã§ãã
ãããç§ã¯TryInto
ãšã€ãªã¢ã¹ãé©åã«åºãŠãããšã¯æããªãã£ãã®ã§ãç§ãç¡èŠããŠãã ãã> <
@scottjmaddoxã®èšãããšã«åæããŸãã
@scottjmaddox
èãããã誀解ã解æ¶ããããã«ã From
auto impls TryFrom
ãåé€ãã Into
auto impls TryFrom
ã«çœ®ãæããŠããŸãã
çŸåšãFrom => IntoãFrom => TryFromãTryFrom => TryIntoãããã³Into => TryIntoã®4ã€ãã¹ãŠã䜿çšããããšã¯ã§ããŸããã
ããã¯èª€ãã§ããææ¡ãããå®è£ ãèŠãŠãã ããã
ããã§ãïŒ
From
-> Into
-> TryFrom
-> TryInto
From
èªåå®è£
Into
Into
èªåå®è£
TryFrom
TryFrom
èªåå®è£
TryInto
ã²ããŠã¯ãä»åè©ã®èªåå®è£
ã«ããã
From
TryFrom
$ãæå³ããŸãïŒ From
èªåã¯Into
ãæå³ãã Into
TryFrom
æå³ããããïŒ
Into
TryInto
$ãæå³ããŸãïŒ Into
èªåã¯TryFrom
ãæå³ãã TryFrom
TryInto
æå³ããããïŒ
ããããã«1ã¬ãã«ã®éæ¥åç
§ããããŸãïŒããã§åé¡ãªããšæããŸãïŒ
ã ããç§ã®æ¡ä»¶ã¯ãã¹ãŠæºããããŸããã
ç§ãã¡ã¯ãã¹ãŠãæã€ããšãã§ããŸã
Impl | éæ¥åç
§ã®ã¬ãã«
----------------------- | -------------------
From
Into
$ãæå³ããŸã| éæ¥åç
§ãªã
TryFrom
TryInto
$ãæå³ããŸã| éæ¥åç
§ãªã
From
TryFrom
$ãæå³ããŸã| 1ã¬ãã«ã®éæ¥åç
§
Into
TryInto
$ãæå³ããŸã| 1ã¬ãã«ã®éæ¥åç
§
From
-> Into
-> TryInto
-> TryFrom
åäœããŸãããäžè²«æ§ãç¶æããããšæããŸããå
ã®ããŒãžã§ã³ïŒäžèšãåç
§ïŒã¯ããã®ããŒãžã§ã³ãããäžè²«æ§ããããŸãã
çšèªã«é¢ãã泚æ:(ç§ããããã䜿çšããå ŽåïŒ
->
ã¯èªåå®è£
ãæå³ããŸã
auto implã¯ãã§å
¥åãããå®éã®implãåç
§ããŸãã
ã¯ãç§ããã®implãæã£ãŠããå Žåãç§ããã®implãååŸããããšãæå³ããŸã
ãŸãããã«ãªã¯ãšã¹ããäœæãããã¹ãŠã®ãã¹ãã«åæ Œããããšã«ã泚æããŠãã ãããã€ãŸããããžãã¯ã«ç©Žããªããããããã¯å¯èœã§ãã ãã®åäœãå¿ èŠãã©ãããè°è«ããå¿ èŠããããŸãã äžè²«æ§ãä¿ã€ããã ãšæããŸãïŒããã¯éåžžã«éèŠã§ãïŒã
@KrishnaSannasiãããä»ç§ã¯ããªãã®ãã€ã³ããèŠãã ã¯ããããã¯çã«ããªã£ãŠããŸããææ¡ãããå€æŽãåé¡ãã©ã®ããã«è§£æ±ºããæãŸããåäœãæäŸããããããããŸããã 培åºçãªèª¬æããããšãããããŸãïŒ
ç·šéïŒããããŸãããããã...ç§ã¯ãŸã çŸåšã®ãã©ã³ã±ããimplãååã§ãªãçç±ãç解ããŠããŸããã ããããã Into
ãå®è£
ã§ãããã From
ã¯å®è£
ã§ããªãå ŽåããããŸããïŒ ããã§ãã TryFrom
ãèªåå°åºããããšã¯å¯èœã§ããïŒ
ç·šé2 ïŒããŠãç§ã¯æ»ã£ãŠãå€ç«ããã«ãŒã«ãFrom
ã®å®è£
ãã©ã®ããã«é²ãããšãã§ãããã«ã€ããŠã®ããªãã®èª¬æãèªã¿ãŸããã ä»ã§ã¯ãã¹ãŠãçã«ããªã£ãŠããŸãã ç§ã¯ãã®å€æŽãå
šé¢çã«æ¯æããŸãã å€ç«ããã«ãŒã«ãéåžžã«å€ãã®æå³ããªãçµæãããããããšã¯ãŸã å°ãã€ã©ã€ã©ããŸãããããã§ã¯ãããä¿®æ£ããã€ããã¯ãªãã®ã§ãç©äºãæ倧éã«æŽ»çšããããšã¯çã«ããªã£ãŠããŸãã
https://github.com/rust-lang/rust/issues/49593ãä¿®æ£ããã never_type
ãå®å®åã®åè£ã«ãªã£ãã®ã§ã@ rust-lang / libsã®èª°ããããã§FCPãéå§ããçšæããããŸããïŒããäžåºŠïŒ
ãã®æ©èœã¯ãå®å®åã®ããã«ãã§ã«FCPãééããŠããŸãã ïŒææ¡ã»å®æïŒããš10æ¥éã®ã³ã¡ã³ãæéã¯å¿ èŠãªããšæããŸãã
neverã¿ã€ãã®å®å®åPRãå°çãããã TryFrom
/ TryInto
ã®ïŒæ°ããïŒå®å®åPRãäœæããããã§rfcbotã䜿çšããŠãããŒã ã¡ã³ããŒã«ç¢ºå®ã«è¡šç€ºãããããšãã§ããŸãã
FromStringError
ã®ãããªæ¢åã®ç©ºã®åæåãå®å®åãšäžŠè¡ããŠ!
ã®ãšã€ãªã¢ã¹ã«å€æŽããããšã¯å¯èœã§ããããïŒ
@clarcharrã¯ãã ç¹æ§ã¯äžè²«æ§ãæå³ããããããããå®è¡ã§ããã®ã¯1ã€ã®ã¿ã€ãã®ã¿ã§ãã 幞ãã std::string::ParseError
ãããããŸããã ïŒããããhttpsïŒ//github.com/rust-lang/rust/pull/55148ã§impl FromString for PathBuf
ã®æ°ããã¿ã€ããè¿œå ãã代ããã«äœ¿çšããçç±ã§ããïŒ
ãã ããããã¯TryFrom
/ TryInto
ãšã¯é¢ä¿ãããŸããã ããã¯https://github.com/rust-lang/rust/issues/49691/ https://github.com/rust-lang/rust/issues/57012ã®ãããã¯ã§ãããåããªãªãŒã¹ãµã€ã¯ã«ã§çºçããå¿
èŠãããããã§ãã !
ã®å®å®åãšããŠã
@SimonSapinãããå®å®ããåã«ããã«ãªã¯ãšã¹ãïŒïŒ56796ïŒãããŒãžããããšã¯å¯èœã§ããããïŒ
確ãã«ãç§ã¯ãããåé¡ã®èª¬æã«è¿œå ããã®ã§ãç§ãã¡ã¯éã«è¿·ãããšã¯ãããŸããã
ããããšãïŒ
ãããå®å®çã«çµ±åã§ããŸããïŒ ããã¯ãCloudABIã®argdataã®äŸåé¢ä¿ã§ãã
@mcandreã¯ãã ããã¯çŸåšhttps://github.com/rust-lang/rust/issues/57012ã§åŸ
æ©ããŠãããæè¿ãããã¯ã解é€ãããŸããã TryFrom
ãRust1.33ãŸãã¯1.34ã§æåããããšãæåŸ
ããŠããŸãã
ç§ã¯ãããåŸ ã€ã®ã«ããããããŠããŠãïŒã€ãã«ïŒèªç±ãªæéããããŸãã ãããæšé²ããããã«ç§ãã§ããã³ãŒããããã¥ã¡ã³ãã¿ã€ãã®ãã®ãããã°ãç§ã¯ãã©ã³ãã£ã¢ã§æ¯æŽããŸãã
@icefoxençŸæç¹ã§ã§ããæåã®ããšã¯ããããã®ç¹æ§ã®ããã¥ã¡ã³ãã«é¢ãããã£ãŒãããã¯ïŒããã³å€æŽïŒãæäŸããããšã ãšæããŸãã çŸåšã From
ããã³Into
ã®ç¹æ§ãšæ¯èŒããŠãããããå°ãäžè¶³ããŠããããšãããããŸãã
ããã¥ã¡ã³ãã«åãçµãã§ããŸãã ãã€ããŒãªããŒããã³ãïŒ assert_eq!(some_value, std::num::TryFromIntError(()));
ã«ãããã ãã ãã TryFromIntError
ã«ã¯ã³ã³ã¹ãã©ã¯ã¿ãŒãšãããªãã¯ãã£ãŒã«ãããªããããã€ã³ã¹ã¿ã³ã¹ãäœæã§ããŸããã ç¶è¡ããæ¹æ³ã«ã€ããŠäœãã¢ããã€ã¹ã¯ãããŸããïŒ ä»ã®ãšããç§ã¯assert!(some_value_result.is_err());
ããã£ãŠããŸãã
ãããééã£ãå Žæã§ããå Žåã¯ç³ãèš³ãããŸããããTryFromIntErrorã®ããã¥ã¡ã³ãã«èª€ããããããã§ããå®éã«ã¯ã³ãŒãããªãã®ã«impl Debug for TryFromIntError
ãšè¡šç€ºãããŸãã ã³ã³ãã€ã©ã¯ãTryFromã®äœ¿çšããçµæãã¢ã³ã©ããããããšãããšãçŸåšãšã©ãŒãçæããŸãã
ããã«fmt::Debug
implãããããšãæå³ããŸããïŒ
@ marco9999
#[derive(Debug, Copy, Clone, PartialEq, Eq)]
pub struct TryFromIntError(());
#[derive(Debug)]
å±æ§ããããŸãã
ããŒããã¯ãããããŸã...äœããæ£ããæ©èœããŠããŸãããïŒ
error[E0599]: no method named `unwrap` found for type `std::result::Result<usize, <T as std::convert::TryInto<usize>>::Error>` in the current scope
--> src\types\b8_memory_mapper.rs:67:51
|
67 | let address: usize = T::try_into(address).unwrap();
| ^^^^^^
|
= note: the method `unwrap` exists but the following trait bounds were not satisfied:
`<T as std::convert::TryInto<usize>>::Error : std::fmt::Debug`
@ marco9999ããããäžè¬çãªå¶çŽããããŸããã TryFromIntError
ã¯äžéšã®ã¿ã€ãã§ã®ã¿äœ¿çšãããŸãããTã¯æ¬¡ã®ããããã«ãªããŸãã
fn foo<T: TryInto<u8>>(x: T) -> u8
where
<T as TryInto<u8>>::Error: Debug,
{
x.try_into().unwrap()
}
ãšã«ãããããã¯å°ã話é¡ããå€ããŠããŸããã¿ããªããããªããã IRCã¯ããããã®è³ªåãããã®ã«é©ããå ŽæãããããŸããã
assert_eq!(some_value, std::num::TryFromIntError(()));
ããã
@icefoxen TryFromIntError
ã«é¢é£ä»ããããæçšãªå€ããªãããããã®ãããªã¢ãµãŒã·ã§ã³ã«ã¯ããŸã䟡å€ããªãããã§ãã Result<_, TryFromIntError>
ãããããããErr
ã®å Žåãä»ã«äŸ¡å€ã¯ãããŸããã
assert!(some_value_result.is_err());
ããã¯ç§ã«ã¯åççãªããã§ãã
çžäºåç §ïŒ https ïŒ//github.com/rust-lang/rust/pull/58302
@glaebhoerlã«æè¬ããŸãã
ããããã³ã°ãã°ãä¿®æ£ãããããïŒhttps://github.com/rust-lang/rust/issues/49593ïŒæ±ºããŠã¿ã€ããå®å®ããªãããšãæåŸ ããŠããŸããSoon®https ïŒ//github.com/rust-lang/ rust / issues / 57012ãããŠããã®ãããã¯ã解é€ããŸãã ãã ããæ°ããåé¡ïŒhttps://github.com/rust-lang/rust/issues/57012#issuecomment-460740678ïŒãçºçããŠãããå¥ã®åé¡ïŒhttps://github.comïŒã«ã€ããŠãã³ã³ã»ã³ãµã¹ããããŸããã / rust-lang / rust / issues / 57012ïŒissuecomment-449098855ïŒã
å
é±ã®libsããŒãã£ã³ã°ã§ãç§ã¯åã³ã¢ã€ãã¢ãæã¡åºããŸããã TryFrom
ãå®å®ãããããã«ã httpsïŒ //github.com/rust-lang/rust/issues/33417#issuecomment-299124605ã§@scottmcmã«ãã£ãŠæåã«ææ¡ããããšæããŸãã TryFrom
ãšTryInto
ã¯ãneveråãªãã§ã代ããã«ç©ºã®åæåãæã¡ãåŸã§!
ã®ãšã€ãªã¢ã¹ã«ããããšãã§ããŸãã
ååããã«ã€ããŠè©±ãåã£ããšãïŒhttps://github.com/rust-lang/rust/issues/33417#issuecomment-423069246ïŒãååãããè¡ããªãã£ãçç±ãæãåºããŸããã§ããã
å
é±ã @ dtolnayã¯åé¡ãæãåºãããŸããã !
ãå®å
šãªåã«ãªãåã«ãé¢æ°ã®returnåã®ä»£ããã«ãããã決ããŠè¿ãããªãããšã瀺ãããã«ãã§ã«äœ¿çšã§ããŸãã ããã«ã¯ãé¢æ°ãã€ã³ã¿åãå«ãŸããŸãã ãããã£ãŠã httpsïŒ//github.com/rust-lang/rust/pull/58302ããã®ãµã€ã¯ã«ã«å°éãããšä»®å®ãããšããã®ãããªã³ãŒãã¯Rust1.34.0ã§æå¹ã«ãªããŸãã
use std::convert::Infallible;
trait MyTrait {}
impl MyTrait for fn() -> ! {}
impl MyTrait for fn() -> Infallible {}
fn() -> !
ãšfn() -> Infallible
ã¯2ã€ã®ç°ãªãïŒãã€ã³ã¿ãŒïŒã¿ã€ãã§ããããã2ã€ã®implã¯ãªãŒããŒã©ããããŸããã ãããã空ã®åæåãpub type Infallible = !;
åãšã€ãªã¢ã¹ã«çœ®ãæãããšïŒ !
ãå®å
šãªåã«ãªããšïŒã2ã€ã®implããªãŒããŒã©ãããå§ããäžèšã®ãããªã³ãŒããå£ããŸãã
ãããã£ãŠãåæåããšã€ãªã¢ã¹ã«å€æŽããããšã¯ãé倧ãªå€æŽã«ãªããŸãã ååãšããŠãæšæºã©ã€ãã©ãªã§ã¯èš±å¯ããŸãããããã®å Žåã次ã®ããã«æããŸããã
ãã®è°è«ã«åºã¥ããŠã httpsïŒ//github.com/rust-lang/rust/pull/58302ãéä¿¡ããŸãããããã¯çŸåšæçµã³ã¡ã³ãæéäžã§ãã
@kennytmãã§ã«å®å®çã§!
ãåç
§ããããšã¯ã§ããŸãããïŒ ããšãã°ã次ã®ããšãèæ
®ããŠãã ããã
trait MyTrait {
type Output;
}
impl<T> MyTrait for fn() -> T {
type Output = T;
}
type Void = <fn() -> ! as MyTrait>::Output;
ãããè¡ã£ãåŸã Void
ã¯!
ã¿ã€ããåç
§ããŸãã
ããã¯ãã°ã®ããã«èŠããŸããã€ãŸããå®å®æ§ã®ä¿èšŒã¯ãã°ã«ãŸã§åã³ãŸããã å°ãªããšãïŒ57012ãããŒãžããããŸã§ãneveråïŒ !
ïŒãä»»æã®å®¹éã®åãšããŠäœ¿çšããããšã¯äŸç¶ãšããŠäžå®å®ã§ãã
ã©ãããã°ããã¥ã¡ã³ããæäŒãããšãã§ããŸããïŒ :-)
ããã httpsïŒ//github.com/rust-lang/rust/pull/58015ãäžéžãããšæããŸãããããŸã äžéžããŠããŸããâŠããã§è©±ãåããŸãããã
TryFrom
ãã¬ã€ãã«ã¯ãåŒæ°ãæ¶è²»ããã«å€æã§ãããã©ããããã§ãã¯ããã¡ãœããããããŸããïŒ
fn check(value: &T) -> bool
æ¶è²»ãããªãäžå¯èœãªå€æãåŠçãã1ã€ã®æ¹æ³ã¯ãæ¶è²»ãããå€æäžå¯èœãªå€ãé¢é£ãããšã©ãŒãšãšãã«è¿ãããšã§ãã
ãã£ãšãããã¯https://github.com/rust-lang/rust/pull/58302ã«ãã£ãŠéããããŠããã¯ãã§ãã éäŒããŸããã
@ o01egéæ¶è²»çãªå€æãè¡ãäžè¬çãªæ¹æ³ã¯ãããšãã°$ïŒ$ 1 $ïŒ$ã®ä»£ããã«TryFrom<Foo>
TryFrom<&'_ Foo>
ãå®è£
ããããšã§ãã
åŸ ã£ãŠãã ãã...ããã¯ãå®å®ããæšææ¥ã«çéžãããŸã§å®éã«éããã¹ãã§ã¯ãããŸããããïŒ
ããããæ©èœãå®å®ãããPRããã¹ã¿ãŒã«å°éãããšãã«ã远跡ã®åé¡ãã¯ããŒãºããŸãã
ããããéåžžãå®å®åãŸãã¯åé€ãmaster
ãã©ã³ãã«å°éãããšãã«ã远跡ã®åé¡ãéããŸãã ãã®åŸã远跡ãããã®ã¯äœãæ®ã£ãŠããŸããã ïŒæ°ããå ±åããããã°ãçºçããªãéããåå¥ã«åŠçããŸããïŒ
远跡ã®åé¡ã¯ãããããå®å®ãããPRã«ãã£ãŠéããããŸãã ãªãªãŒã¹ãµã€ã¯ã«ã«ãã£ãŠã¯ãå®å®çããªãªãŒã¹ããããŸã§ã«æ倧12é±éãããå ŽåããããŸãã
ãšã£ãã çããã説æããŠãããŠããããšãïŒ :)
@gregdegruyã¯ãRustã®ããŒãžã§ã³ã1.34以éã«æŽæ°ããŸãã
æãåèã«ãªãã³ã¡ã³ã
!
ãååãªèªåœã¿ã€ãã«ããŠãResult<_, !>
ããééãã®ãªãçµæããŸãã¯ãïŒæåéãïŒæ±ºããŠèª€ãã®ãªãçµæããšããŠçŽæçã«èªã¿åããããã«ããããšæããŸãã ãšã€ãªã¢ã¹ã䜿çšãããšïŒå¥ã®ã¿ã€ããæ°ã«ããªãã§ãã ããïŒïŒãå°ãåé·ã«æããŸããã¿ã€ãã·ã°ããã£ãèªã¿åããšãã«ãå°ãªããšãäžæçãªäžæåæ¢ãçºçããããšãããããŸãããåŸ ã£ãŠãã ãããããã¯!
ãšã©ãéãã®ã§ããã ïŒã ãã¡ãããYMMVã