rust-lang / rfcsïŒ243ããã³rust-lang / rfcsïŒ1859ã®è¿œè·¡ã®åé¡ã
å®è£ äžã®æžå¿µïŒ
?
ãšã»ãŒåçã§ãããªãã¬ãŒã¿try!
- ïŒ31954try { ... }
åŒ-httpsïŒ//github.com/rust-lang/rust/issues/39849do catch { ... }
æ§æã®è³ªåã解決ããŸãtry { .. }
ãšããŠè§£æ±ºã-https ïŒ//github.com/rust-lang/rust/issues/50412try { expr? }?
çŸåšãã©ããã«æ瀺çãªå泚éãå¿
èŠã§ãïŒãTry
ç¹æ§ã®èšèšã解決ããïŒhttps://github.com/rust-lang/rfcs/pull/1859ïŒCarrier
代ããã«ïŒæ°ããTry
ãã¬ã€ããå®è£
ããããã䜿çšããããã«?
ãå€æããŸãïŒhttps://github.com/rust-lang/rust/pull / 42275ïŒOption
ãªã©ã®implãšãé©åãªãã¹ããã¡ããªãŒãè¿œå ããŸãïŒhttps://github.com/rust-lang/rust/pull/42526ïŒtry
ãäºçŽtry{}catch
ïŒãŸãã¯ä»ã®åŸç¶ã®IDïŒããããã¯ããŠãå°æ¥ã®ããã«ãã¶ã€ã³ã¹ããŒã¹ãéãããŸãŸã«ãã代ããã«match
ããããããšãè¡ãæ¹æ³ã人ã
ã«ç€ºããŸãä»éããRFCã¯ãã©ãã«ä»ãã®return / breakã«åºã¥ãè±ç³ã«ã€ããŠèª¬æããŠããŸããããããååŸããŠããŸããããããšãã³ã³ãã€ã©ã§?
ãšcatch
ã«ç¹å¥ãªåŠçããããŸããïŒ
ç·šéïŒã©ãã«ä»ãã®return / breakã¯ã ?
ãcatch
ãš
ã©ãã«ä»ãã®è¿å/äŒæ©ã¯ãçŽç²ã«èª¬æãç®çãšããŠããŸãã
3æ56 PMã§éã2016幎2æ5æ¥ã«ã¯ããžã§ããµã³ã»ãªãŒã [email protected]
æžããŸããïŒ
ä»éããRFCã¯ãã©ãã«ä»ãã®ãªã¿ãŒã³/ãã¬ãŒã¯ã«åºã¥ãè±ç³ã«ã€ããŠèª¬æããŠããŸãã
ç§ãã¡ããããæã«å ¥ããŠããŸããããããšãç¹å¥ãªæ²»çããããŸããïŒ ãããŠ
ã³ã³ãã€ã©ããã£ããããŸããïŒâ
ãã®ã¡ãŒã«ã«çŽæ¥è¿ä¿¡ããããGitHubã§è¡šç€ºããŠãã ãã
https://github.com/rust-lang/rust/issues/31436#issuecomment-180551605 ã
å®å®åããåã«è§£æ±ºããªããã°ãªããªããã1ã€ã®æªè§£æ±ºã®è³ªåã¯ã Into
impl
ãåŸããªããã°ãªããªãå¥çŽã¯ã©ãããã¹ããããŸãã¯Into
ã䜿çšããã®ã«é©åãªç¹æ§ã§ãããã©ããã§ããããã§ã®ãšã©ãŒã¢ãããã£ã¹ãã«ã€ããŠã ïŒããããããã¯å¥ã®ãã§ãã¯ãªã¹ãé
ç®ã§ããå¿
èŠããããŸããïŒïŒ
@reem
ã©ãã«ä»ãã®return / breakã¯åªããã¢ã€ãã¢ã ãšæããŸã...ããããå¥ã®RFCãéããŸãã
ããŠãã ããïŒ
Carrier
ç¹æ§ã«ã€ããŠãRFCããã»ã¹ã®åæã«æžãæ»ãããã®ãããªç¹æ§ã®èŠç¹ã®äŸã次ã«ç€ºããŸãã
https://gist.github.com/thepowersgang/f0de63db1746114266d3
ããã¯è§£æäžã«ã©ã®ããã«æ±ãããŸããïŒ
struct catch {
a: u8
}
fn main() {
let b = 10;
catch { a: b } // struct literal or catch expression with type ascription inside?
}
@petrochenkovãããšãå®çŸ©ã¯æ§æ解æã«åœ±é¿ãäžããããšã¯ã§ããŸããã§ãããã {
ããã®å Žåã¯:
åŸã®2çªç®ã®ããŒã¯ã³ã«åºã¥ããŠãå
èªã¿ã«ãŒã«ããŸã ãããšæããŸããæ§é äœãªãã©ã«ãšããŠè§£æãããŸãã
ãŸã
let c1 = catch { a: 10 };
let c2 = catch { ..c1 }; // <--
struct catch {}
let c3 = catch {}; // <--
+ https://github.com/rust-lang/rfcs/issues/306 ifïŒwhenïŒïŒimplementedã
æ§é äœãªãã©ã«ä»¥å€ã«ç«¶åã¯ãªãããã§ãã
äžèšã®äŸãèãããšãç§ã¯ïŒãã€ãã®ããã«ïŒæãåçŽãªè§£æ±ºçãæ±ããŠããŸã-åžžã«åŒã®äœçœ®ã®catch {
ãcatch
ãããã¯ã®éå§ãšããŠæ±ããŸãã ãšã«ãã誰ã圌ãã®æ§é ãcatch
ãšã¯åŒã³ãŸããã
catch
代ããã«ããŒã¯ãŒãã䜿çšããæ¹ãç°¡åã§ãã
ããã¯ããŒã¯ãŒããªã¹ãã§ãïŒ http ïŒ
@blussãããç§ã¯ãããã®ã©ããçŽ æŽããããã®ã§ã¯ãªãããšãèªããŸã... override
ã¯è¿ãå¯äžã®ãã®ã®ããã§ãã ãŸãã¯ã do
䜿çšããããšãã§ããŸãã ãŸãã¯çµã¿åããã§ãããããã«çŽ æŽããããã®ã¯èŠã€ãããŸããã do catch
ïŒ
do
ã¯ãIMOã«è¿ããšæãããå¯äžã®ãã®ã§ãã æ¥é èŸãšããŠdo
ãä»ããããŒã¯ãŒãã¹ãŒãã¯å°ãäžèŠåã§ãèšèªã®ä»ã®éšåãšã¯ç°ãªããŸããïŒ while let
ãããŒã¯ãŒãã¹ãŒãã§ããïŒ ããªããããã«æ
£ããŠãããšããããã¯ä»å€§äžå€«ã ãšæããŸãã
try!
ã䜿çšããããã®ããŒã?
?
ã移æ€ããŠã代ããã«try!
ã䜿çšããããšã¯ã§ããŸãããïŒ ããã«ããããããã°æãªã©ã Result
ãªã¿ãŒã³ãã¹ãååŸãããŠãŒã¹ã±ãŒã¹ãå¯èœã«ãªããŸãã try!
ããã¯ããªãç°¡åã§ãããã¡ã€ã«ã®å
é ïŒãŸãã¯lib / main.rsïŒã§ãã¯ãããªãŒããŒã©ã€ãããã ãã§ãã
macro_rules! try {
($expr:expr) => (match $expr {
Result::Ok(val) => val,
Result::Err(err) => {
panic!("Error occured: {:?}", err)
}
})
}
Result
ãªã¿ãŒã³ãã¹ã§æåã«åºçŸããtry!
ããå§ãŸããããã¯ã¹ã¿ãã¯ãã¬ãŒã¹ãååŸããŸãã å®éã return Err(sth)
代ããã«ãšã©ãŒãçºèŠããå Žåã«try!(Err(sth))
å®è¡ãããšãå®å
šãªã¹ã¿ãã¯ãã¬ãŒã¹ãååŸããããšããã§ããŸãã
ãããããã®ããªãã¯ãå®è£
ããŠããªã人ã
ã«ãã£ãŠæžãããå€åœã®ã©ã€ãã©ãªããããã°ãããšãããã§ãŒã³ã®ã©ããã§try!
䜿çšæ³ã«äŸåããŸãã ãããŠä»ãã©ã€ãã©ãªãããŒãã³ãŒããããåäœã§?
æŒç®åã䜿çšããŠããå Žåãã¹ã¿ãã¯ãã¬ãŒã¹ãååŸããããšã¯ã»ãšãã©äžå¯èœã«ãªããŸãã
try!
ããªãŒããŒã©ã€ããããšã ?
æŒç®åã«ã圱é¿ããã®ã§äŸ¿å©ã§ãã
åŸã§ãã¯ãã·ã¹ãã ãããå€ãã®æ©èœãååŸãããšããããã¯ã«ãªãããšãããããŸãïŒ ç¹å®ã®ã¿ã€ãã®ã¿ã
ãã®ææ¡ã§RFCãå¿ èŠãªå Žåã¯ããç¥ãããã ããã
çæ³çã«ã¯ã try!
ããªãŒããŒã©ã€ãããæ©èœã«äŸåããã®ã§ã¯ãªãã ?
æ¡åŒµããŠã¹ã¿ãã¯ãã¬ãŒã¹ãµããŒããçŽæ¥æäŸããããšãã§ããŸãã ãã®åŸãããã¯ã©ãã§ãåäœããŸãã
ã¹ã¿ãã¯ãã¬ãŒã¹ã¯ã»ãã®äžäŸã§ãïŒéåžžã«äŸ¿å©ãªãã®ã§ãããç§ã«ã¯æããŸãïŒã
ãã£ãªã¢ç¹æ§ãæ©èœããããã«äœãããŠããå Žåãããããããã¯ãã®ãããªæ¡åŒµãã«ããŒããããšãã§ããŸããïŒ
2016幎2æ7æ¥ååŸ4æ14åãã©ãã»ã«ãžã§ã³ã¹ãã³[email protected]
æžããŸããïŒ
çæ³çã«ã¯ïŒ ã¹ã¿ãã¯ãã¬ãŒã¹ã®ãµããŒããçŽæ¥æäŸããããã«æ¡åŒµããããšãã§ããŸããã
tryïŒããªãŒããŒã©ã€ãããæ©èœã«äŸåããã®ã§ã¯ãªãã ãã®åŸãããã¯ããŸãããã§ããã
ã©ãã«ã§ããâ
ãã®ã¡ãŒã«ã«çŽæ¥è¿ä¿¡ããããGitHubã§è¡šç€ºããŠãã ãã
https://github.com/rust-lang/rust/issues/31436#issuecomment-181118499 ã
æšæž¬ãããã¯ãããŸããããããã€ãã®åé¡ã¯ãããŸãããããŸããããšæããŸãã
Result<V,E>
å€ãè¿ãã³ãŒããããéåžžã®ã±ãŒã¹ãèããŠã¿ãŸãããã ããã§ã Carrier
ãã¬ã€ãã®è€æ°ã®å®è£
ãå
±åã§ããããã«ããå¿
èŠããããŸãã E0119ã«ééããªãããã«ããã«ã¯ããã¹ãŠã®å®è£
ãã¹ã³ãŒãå€ã«ããå¿
èŠãããïŒãããããããã©ã«ãã§ã¯ã€ã³ããŒããããªãããŸããŸãªç¹æ§ãä»ããŠïŒã ?
æŒç®åã䜿çšããå ŽåããŠãŒã¶ãŒã¯åžæãããã®ãã€ã³ããŒãããå¿
èŠããããŸãå®è£
ã
ããã«ã¯ããããã°ããããªã人ã§ãã ?
ã䜿çšãããšãã«ãåžæããç¹æ§ã®å®è£
ãã€ã³ããŒãããå¿
èŠããããŸããäºåå®çŸ©ãããããã©ã«ãã®ãªãã·ã§ã³ã¯ãããŸããã
ãã¹ãŠã®ã¿ã€ããç¯å²å€ã§ããResult<V,E>
ã«å¯ŸããŠã«ã¹ã¿ã Carrier
å®è£
ãå®è¡ãããå Žåã¯ãããããE0117ãåé¡ã«ãªãå¯èœæ§ããããããlibstdã¯ãã§ã«Carrier
å®è£
ã»ãããæäŸããå¿
èŠããããŸããæã䜿çšãããŠãããŠãŒã¹ã±ãŒã¹ã®panic!
ingã®å®è£
ããããããã以äžïŒã
ãã¯ããä»ããŠãªãŒããŒã©ã€ãããå¯èœæ§ããããšãå
ã®å®è£
è
ã«è¿œå ã®è² æ
ããããããšãªããæè»æ§ãåäžããŸãïŒåžæããå®è£
ãã€ã³ããŒãããå¿
èŠã¯ãããŸããïŒã ããããrustã«ã¯ãããŸã§ãã¯ãããŒã¹ã®æŒç®åããªãã£ãããšããããŠcatch { ... }
ãæ©èœããã¯ãã®å Žåãå°ãªããšãè¿œå ã®èšèªé
ç®ããªããã°ããã¯ããä»ããŠ?
ãå®è£
ããããšã¯äžå¯èœã§ããããšãããããŸããïŒ return_to_catch
ã throw
ãRFC 243ã§äœ¿çšãããŠããparamã§break
ãšã©ãã«ä»ããããŠããŸãïŒã
éåžžã«å°éã®ã³ãŒããå€æŽããã ãã§ãã§ããã°ãã¡ã€ã«ã®å
é ã§ã Err
ãªã¿ãŒã³ãã¹ã䜿çšããŠResult
ã¹ã¿ãã¯ãã¬ãŒã¹ãååŸã§ããããã«ããã»ããã¢ããã¯åé¡ãããŸããã ãã®ãœãªã¥ãŒã·ã§ã³ã¯ã Err
ã¿ã€ããå®è£
ãããæ¹æ³ãšå Žæã«é¢ä¿ãªãæ©èœããå¿
èŠããããŸãã
ãã€ã¯ã·ã§ãã£ã³ã°ã«ãã£ã€ã ãå
¥ããã ãã§ãã catch in { ... }
ã¯ããªãããŸãæµããŸãã
catch! { ... }
ã¯å¥ã®ããã¯ã³ã³ãããã®éžæè¢ã§ãã
ãŸããããã«ãã£ãŠäœããå€ãããšã¯æããŸããããã¿ã€ãã®åž°å±ã$i:ident : $t:ty
å£ããã®ãšåãããã«ã $i:ident ?
ãåãå
¥ããŠãããã«ãã¢ãŒã ãã¯ããå£ããŠããŸãããšã«æ³šæããŠãã ããã
äžäœäºææ§ãããéããªãã§ãã ããã catch
åŸã«{
ç¶ãå Žåã¯ãããŒã¯ãŒããšããŠæ±ããŸãïŒããããåŒã®äœçœ®ã®ã¿ã§ãããäºææ§ã«é¢ããŠå€§ããå€åãããã©ããã¯ããããŸããïŒã
ãŸããæ§é äœãªãã©ã«ãå«ãŸãªãããã€ãã®èããããåé¡ãæ³åããããšãã§ããŸãïŒäŸïŒ let catch = true; if catch {}
ïŒã ããããç§ã¯ãã£ãšéãæ§æããããã€ããŒãªé倧ãªå€æŽã奜ã¿ãŸãã
ãšã«ãããæ°ããããŒã¯ãŒããè¿œå ããããã®ã¯ãããŸããã§ãããïŒ æ°ããæ§æã®ããã«ãããçš®ã®from __future__
ãªããã€ã³ãæäŸããããšãã§ããŸãã ãŸãã¯ãã³ãã³ãã©ã€ã³/Cargo.tomlã§Rustèšèªã®ããŒãžã§ã³çªå·ãæå®ããŸãã
é·æçã«ã¯ããã§ã«äºçŽãããŠããããŒã¯ãŒãã®ã¿ãåŠçã§ãããã©ããã¯éåžžã«çãããã§ãã ã³ã³ããã¹ãã«å¿ããŠãããŒã¯ãŒãã«ãããã3ã€ã®ç°ãªãæå³ãæãããããããŸããã
åæããã ããã¯ããããç»å Žããæåã®RFCã§ããããŸããïŒhttps://github.com/rust-lang/rfcs/pull/1444ã¯å¥ã®äŸã§ãïŒã ãããæåŸã§ã¯ãªããšæããŸãã ïŒhttps://github.com/rust-lang/rfcs/pull/1210ã®default
ããç§ãæ¯æããŠããRFCã§ã¯ãããŸããããïŒè¿œå ããæ¹æ³ãèŠã€ããå¿
èŠããããšæããŸãããã¹ãŠã®æ°ããã±ãŒã¹ã®ææ³ãã¢ãããã¯ã«ããã¯ããæ¹æ³ãç解ããããšããã®ã§ã¯ãªããç¥ã«æ£çŽãªããŒã¯ãŒãã
1.0ããåã®ããã€ãã®ããŒã¯ãŒããäºçŽããªããšããè°è«å šäœããèšèªã«äºææ§ãæãããŠïŒããããæ瀺çã«ãªããã€ã³ããããšã«ãã£ãŠïŒæ°ããããŒã¯ãŒããåŸæ¹ã«è¿œå ããæ¹æ³ã確å®ã«å°å ¥ãããšããããšã§ã¯ãªãã£ãã®ã§ãæå³ããããŸããã§ãããïŒ ä»ã¯ããææã ãšæããŸãã
@japaricå€ãPRã埩掻ãããŠãããåŒãç¶ãããšã«èå³ããããŸããïŒ
@aturonç§ã®å®è£
ã¯ã try!(foo)
ãšåãæ¹æ³ã§foo?
ãåçŽã«è±ç³ããŸããã ãŸããã¡ãœãããšé¢æ°ã®åŒã³åºãã§ã®ã¿æ©èœããŸãããã€ãŸãã foo.bar()?
ãšbaz()?
æ©èœããŸããã quux?
ãš(quux)?
ã¯æ©èœããŸããã ããã¯æåã®å®è£
ã§å€§äžå€«ã§ããããïŒ
@japaricã¡ãœãããšé¢æ°åŒã³åºãã«å¶éããçç±ã¯äœã§ããïŒ äžè¬çãªæ¥å°ŸèŸæŒç®åãšããŠè§£æããæ¹ãç°¡åã§ã¯ãªãã§ããããã
ã¡ãœãããšé¢æ°åŒã³åºãã«å¶éããçç±ã¯äœã§ãããïŒ
?
æ¡åŒµããã¹ãããïŒç§ã«ãšã£ãŠïŒæãç°¡åãªæ¹æ³
äžè¬çãªæ¥å°ŸèŸæŒç®åãšããŠè§£æããæ¹ãç°¡åã§ã¯ãªãã§ããããã
å€å
@japaric ïŒ @eddybã瀺åããŠããããã«ïŒå®å
šãªæ¥å°ŸèŸæŒç®åã«äžè¬åããã®ã¯ããããè¯ãããš?
ãçéžãããåŸã§catch
è¿œå ããã®
@aturonäºè§£ããŸããã誰ãç§ã«åãŠãªãå Žåã¯ãæ¥é±ãŸã§ã«PostfixããŒãžã§ã³ã調ã¹ãŸã:-)ã
ïŒ31954ã§ç§ã®PRããªããŒã¹/æŽæ°ããŸãã:-)
ã¹ã¿ãã¯ãã¬ãŒã¹ãæäŸããããã®ãµããŒãã¯ã©ãã§ããïŒ ããã¯èšç»ãããŠããŸããïŒ
ç§ã¯+1ã®ç·ã«ãªãã®ã¯å«ãã§ãããã¹ã¿ãã¯ãã¬ãŒã¹ã¯ãéå»ã®ç§ã®æéã®ããªãã®éšåãç¯çŽããŸããã ãã¶ããããã°ãã«ãã§ããããŠãšã©ãŒãã¹ã«ã¶ã€ãã£ããšããïŒ ãªãã¬ãŒã¿ãŒã¯ãã¡ã€ã«/è¡ãçµæã®Vecã«è¿œå ã§ããŸããïŒ ãã¶ããVecããããã°å°çšã§ããå¯èœæ§ããããŸããïŒ
ãããŠãããã¯å ¬éããããããšã©ãŒã®èª¬æã®äžéšã«å€ããå¯èœæ§ããããŸã...
Option<Result<T, E>>
è¿ãã€ãã¬ãŒã¿å
ã§try!
/ ?
ã䜿çšããããšããç¶æ³ã«ééãç¶ããŸãã æ®å¿µãªãããããã¯çŸåšå®éã«ã¯æ©èœããŸããã ããããµããŒãããããã«ãã£ãªã¢ç¹æ§ãéè² è·ã«ãªãå¯èœæ§ãããã®ã§ããããããããšãããäžè¬çãªFrom
ã«å
¥ãã®ã§ããããïŒ
@hexsel Result<>
ã¿ã€ãããããã°ã§åœä»€ãã€ã³ã¿ã®vecãéã¶ããšãæ¬åœã«æãã§ããŸããïŒ ããã«è¿œå ããŸãã ããããã°ãDWARFæ
å ±ã䜿çšããŠèªã¿åãå¯èœãªã¹ã¿ãã¯ãã¬ãŒã¹ãæ§ç¯ã§ããŸãã
@mitsuhikoããããã©ãããã°Result
ãäœæããŠãã¿ãŒã³ãããã³ã°ã§ããŸããïŒ ããã¯_ã¡ããã©_ enum
atmã§ãã
Option
ã©ããã³ã°ã«ã€ããŠã¯ã Some(catch {...})
ãå¿
èŠã ãšæããŸãã
çŸåšãç§ã®ç¿æ
£ã¯ä»ãã£ãŠããtry!(Err(bla))
ã®ä»£ããã«return Err()
ç§ã¯1ã€ã§ãªã³åŸã«ãã©ã€ãã¯ããç¡å¹ã«ããããšãã§ããŸãããã«ããã®ãããã¯ãããã¯ãã¬ãŒã¹ãååŸããããã§ãã ããã¯ç§ã«ãšã£ãŠã¯ããŸãæ©èœããŸãããç§ãæ±ãã³ãŒãã¯éåžžã«äœã¬ãã«ã§ãããã»ãšãã©ã®å Žåãšã©ãŒãçºçããŸãã Result
ãè¿ãå€éšã³ãŒãã䜿çšããå Žåã§ãã ?
ãåé¿ããå¿
èŠããããŸãã
@eddybã¯ãä»ã®æ¹æ³ã§æäœããå¿ èŠãããããšã«å ããŠãé衚瀺ã®å€ãéã¶ããã®èšèªãµããŒããå¿ èŠã«ãªããŸãã ä»ã®æ¹æ³ã§ã§ããã®ããšæã£ãŠããã®ã§ãããã©ããããããã®ãããããŸããã ä»ã®å¯äžã®æ¹æ³ã¯ãè¿œå ã®ããŒã¿ãå«ããããšãã§ããæšæºåããããšã©ãŒããã¯ã¹ã§ããããããã¯ã¹åããããšã©ãŒãæã€å¿ èŠã¯ãªããã»ãšãã©ã®äººã¯ãããè¡ããŸããã
@mitsuhiko Error
ãã¬ã€ããšTLSã®æ°ããïŒããã©ã«ãã®ïŒã¡ãœãããèããããšãã§ããŸãã
åŸè
ã¯æã
æ¶æ¯å€ã«ãã£ãŠäœ¿çšãããŸãã
@eddybã¯ãçµæãèå¥ã§ããããã¯ã¹åããå¿ èŠãããå Žåã«ã®ã¿æ©èœããŸããããããªããšãã¹ã¿ãã¯ãäžã«ç§»åãããšãã«ã¡ã¢ãªå ã移åããŸãã
@mitsuhiko TLSïŒ å®éã«ã¯ããšã©ãŒãå€ã§æ¯èŒã§ããå¿ èŠããããŸãã
ãŸãã¯ãã¿ã€ãïŒ From
å
¥åãšåºåããªã³ã¯ããïŒã ãã§ããã¹ã¿ãã¯ãã¬ãŒã¹ãå¿
èŠãªåæãšã©ãŒã®æ°ãåæã«äŒæããå¿
èŠããããŸããïŒ
ããåçŽãªãœãªã¥ãŒã·ã§ã³ãæ©èœããå Žåãå人çã«Result
åºæã®ã³ã³ãã€ã©ããã¯ãè¿œå ããããšã«ã¯å察ã§ãã
@eddybãšã©ãŒã¯ã¹ã¿ãã¯ãäžåãã«æž¡ããŸãã å¿ èŠãªã®ã¯ãçºä¿¡å ã ãã§ãªãããã¹ãŠã®ã¹ã¿ãã¯ã¬ãã«ã§ã®EIPã§ãã ãŸãããšã©ãŒã¯aïŒçŸåšæ¯èŒã§ãããbïŒæ¯èŒãçãããããšãã£ãŠãåããšã©ãŒã§ãããšã¯éããŸããã
ã¹ã¿ãã¯ãã¬ãŒã¹ãå¿ èŠãªåæãšã©ãŒã®æ°ãåæã«äŒæããå¿ èŠããããŸã
ãšã©ãŒã¯ãã¹ãŠãã£ãããããå¥ã®ãšã©ãŒãšããŠåã¹ããŒãããŸãã
ããåçŽãªãœãªã¥ãŒã·ã§ã³ãæ©èœããå Žåãå人çã«çµæåºæã®ã³ã³ãã€ã©ããã¯ãè¿œå ããããšã«ã¯å察ã§ãã
ããåçŽãªãœãªã¥ãŒã·ã§ã³ãã©ã®ããã«æ©èœãããã¯ããããŸããããäœãã足ããªãå¯èœæ§ããããŸãã
?
ããšã«åœä»€ãã€ã³ã¿ãä¿åããããããšã©ãŒã¿ã€ããšé¢é£ä»ããããšãã§ããŸãã
ããšã©ãŒã¯ãã¹ãŠãã£ãããããå¥ã®ãšã©ãŒãšããŠåã¹ããŒãããŸãããã ãããããã®æ
å ±ãResult
ã«é ãããŠããå Žåãã©ã®ããã«ãã®æ
å ±ãä¿åããŸããïŒ
ããããçµæã«é ãããŠããå Žåããã®æ å ±ãã©ã®ããã«ä¿åããŸããïŒ
ãã®æ å ±ãçµæã«ä¿åããå¿ èŠã¯ãããŸããã ãã ããä¿åããå¿ èŠãããã®ã¯ãé害ã®åå ã®äžæã®IDã§ãããããçžäºã«é¢é£ä»ããããšãã§ããŸãã ãŸãããšã©ãŒãã¬ã€ãã¯åãªããã¬ã€ãã§ãããã¹ãã¬ãŒãžããªãããã代ããã«çµæã«ä¿åã§ããŸãã åœä»€ãã€ã³ã¿vecèªäœã¯ãçµæã«æ ŒçŽããå¿ èŠã¯ãªããTLSã«éä¿¡ãããå¯èœæ§ããããŸãã
1ã€ã®æ¹æ³ã¯ãçµæfailure_id(&self)
ã¡ãœãã
çµæãã¹ã¿ãã¯ãäžåãã«ééãããšãã«ãã³ã³ãã€ã©ãééããã¹ã¿ãã¯ãã¬ãŒã ãèšé²ããåœä»€ãæ¿å ¥ããå¿ èŠããããããããã«ã¯èšèªãµããŒããå¿ èŠã«ãªããŸãã ãããã£ãŠãçµæã®æ»ãå€ã¯ããããã°ãã«ãã§ã¯ç°ãªã£ãŠèŠããŸãã
ãã³ã³ãã€ã©ã¯ããã©ãŒã«ã¹ã«ãŒããã¹ã¿ãã¯ãã¬ãŒã ãèšé²ããåœä»€ãæ¿å
¥ããŸãã-ãããã ?
ã¯æ瀺çã§ãããããã¯äŸå€ã®ãããªãã®ã§ã¯ãããŸããããŸãã¯ãééãã?
èšé²ããã®ã¯å¥œãã§ã¯ãããŸãããïŒ
ãšã«ãããæåã§ãšã©ãŒã解åããŠããErr
ã«æ»ããšããã®IDã¯ã©ã®ããã«ä¿æãããŸããïŒ
ããããŠããšã©ãŒç¹æ§ã¯åãªãç¹æ§ã§ãããã¹ãã¬ãŒãžããªãããã代ããã«çµæã«æ ŒçŽãããå¯èœæ§ããããŸãã
ããã«ã¯ããªã¢ã³ãããããŸãã Error
ãã¬ã€ãã®å®è£
ã¯ãã³ã³ãã€ã©ã§ç¹æ®ãªã±ãŒã¹ã䜿çšããŠåã«æŽæ°ãã£ãŒã«ããè¿œå ããåãäœæãããšIDãçæãããã³ããŒ/ãããããããšrefcountãå¹æçã«ã€ã³ã¯ãªã¡ã³ã/ãã¯ãªã¡ã³ãããŸãïŒ Result::unwrap
ã䜿çšãããŠããªãå Žåã¯ãæçµçã«TLSã®ãå®è¡äžã®ãšã©ãŒã»ããããããããã¯ãªã¢ããŸãïŒã
ããããããã¯Copy
ç¹æ§ãšççŸããŸãã ã€ãŸãã ?
ãŸãã¯ä»ã®ç¹å®ã®ãŠãŒã¶ãŒã¢ã¯ã·ã§ã³ã«ãã£ãŠããªã¬ãŒãããªãç¹å¥ãªåäœãResult
ã«è¿œå ãããšã Copy
äžå€æ¡ä»¶ãç¡å¹ã«ãªãå¯èœæ§ããããŸãã
ç·šéïŒãã®æç¹ã§ãããã«Rc<ErrorTrace>
ãåã蟌ãã æ¹ãããã§ãããã
EDIT2 ïŒç§ãèšã£ãŠããããšã§ããã catch
é¢é£ãããšã©ãŒãã¬ãŒã¹ãã¯ãªã¢ã§ããŸãã
EDIT3 ïŒå®éãããããæã«ã以äžã®ããè¯ã説æãåç
§ããŠãã ããã
ãã³ã³ãã€ã©ã¯ããã©ãŒã«ã¹ã«ãŒããã¹ã¿ãã¯ãã¬ãŒã ãèšé²ããåœä»€ãæ¿å ¥ããŸãã-ãããïŒ æ瀺çã§ããããã¯äŸå€ã®ãããªãã®ã§ã¯ãããŸããããŸãã¯ããªãã¯ïŒã ããèšé²ããã®ã奜ãã§ã¯ãããŸãããïŒ ééããïŒ
?
䜿çšããªããã¬ãŒã ãå€ããããããããã¯æ©èœããŸããã èšããŸã§ããªãããã¹ãŠã®äººã?
ã ãã§ãšã©ãŒãåŠçããããã§ã¯ãããŸããã
ãšã«ãããæåã§ãšã©ãŒã解åããŠããErrã«æ»ããšããã®IDã¯ã©ã®ããã«ä¿æãããŸããïŒ
ãã®ãããã³ã³ãã€ã©ã®ãµããŒããå¿ èŠã«ãªããŸãã ã³ã³ãã€ã©ãŒã¯ãçµæã§ããããŒã«ã«å€æ°ã远跡ããå¿ èŠããããåã©ããã®ããã«çµæIDãå ã«äŒæããã®ãæåã§ãã ãããéæ³ãããå Žåã¯ãæäœã®ãµãã»ããã«å¶éãããå¯èœæ§ããããŸãã
?
䜿çšããªããã¬ãŒã ãå€ããããããããã¯æ©èœããŸããã èšããŸã§ããªãããã¹ãŠã®äººã?
ã ãã§ãšã©ãŒãåŠçããããã§ã¯ãããŸããã
ããŠã Result
ãè¿ãããšã¯ãè€æ°ã®ãªã¿ãŒã³ãã¹ãæã€è€éãªé¢æ°ã§çŽæ¥ç¹æ®ãªã±ãŒã¹ã«ãªã£ãŠããããšãããããŸããïŒãã®ãã¡ã®ããã€ãã¯?
ããã®æ©æãªã¿ãŒã³ã§ãïŒã
ãããéæ³ãããå Žåã¯ãæäœã®ãµãã»ããã«å¶éãããå¯èœæ§ããããŸãã
ãŸãã¯å®å
šã«æ瀺çã«ããŸããã ã³ã³ãã€ã©ã«ãã£ãŠéæ³ã®ããã«è¿œè·¡ããå¿
èŠãããé?
åã©ããã³ã°ã®äŸã¯ãããŸããïŒ
@eddybãšã©ãŒãæåã§åŠçããäžè¬çãªã±ãŒã¹ã¯ããµãã»ãããåŠçããIoErrorã§ãã
loop {
match establish_connection() {
Ok(conn) => { ... },
Err(err) => {
if err.kind() == io::ErrorKind::ConnectionRefused {
continue;
} else {
return Err(err);
}
}
}
}
@mitsuhiko次ã«ãIDãio::Error
å
ã«ä¿æããããšã¯ééããªãæ©èœããŸãã
èŠçŽãããšãTLSã®Vec<Option<Trace>>
ãã¹ããŒã¹æŽæ°ããããã¯struct ErrorId(usize)
ã§ããŒèšå®ããã3ã€ã®langã¢ã€ãã ã§ã¢ã¯ã»ã¹ãããŸãã
fn trace_new(Location) -> ErrorId
ã const
ãšã©ãŒå€ãäœæããå Žåfn trace_return(ErrorId, Location)
ãé¢æ°_declared_ãã-> Result<...>
ãšããŠæ»ãçŽåïŒã€ãŸãããã®_happens_ãResult
åã§äœ¿çšããããšããæ»ãå€ã®ãžã§ããªãã¯é¢æ°ã§ã¯ãããŸããïŒfn trace_destroy(ErrorId)
ããšã©ãŒå€ãããããããå Žåå€æãMIRã§å®è¡ãããå Žåã Location
ã¯ããšã©ãŒå€ã®æ§ç¯ãŸãã¯Lvalue::Return
ãžã®æžã蟌ã¿ã®ãããããããªã¬ãŒããåœä»€ã®Span
ããèšç®ã§ããŸããããã¯ãã¯ããã«ä¿¡é Œæ§ãé«ããªããŸããåœä»€ãã€ã³ã¿IMOãããïŒãšã«ããLLVMã§ãããååŸããç°¡åãªæ¹æ³ã¯ãããŸãããç¹å®ã®ãã©ãããã©ãŒã ããšã«ã€ã³ã©ã€ã³asm
ãçºè¡ããå¿
èŠããããŸãïŒã
@eddyb
ããã¯ãã€ããªãµã€ãºã®èšæºæã«ã€ãªãããŸãããïŒ
@ arielb1ãããã°ã¢ãŒãã§ã¯ãdebuginfoããã€ããªãè¥å€§åãããå Žåã«ã®ã¿å®è¡ããŸããdebuginfoãå·§åŠã«åå©çšããããšãã§ããŸã_shrug_ã
@eddybãã®å Žåã®å Žæã¯äœã§ããïŒ IPãèªãã®ãé£ããã®ã¯äœãããããªãã ãã¡ãããã¿ãŒã²ããããšã«ã«ã¹ã¿ã JSãå¿ èŠã§ãããããã¯ããã»ã©é£ããããšã§ã¯ãããŸããã
@mitsuhikoããã¯ããªãŒããŒãããŒãã§ãã¯ããã®ä»ã®ã³ã³ãã€ã©ãçºãããããã¯ã«äœ¿çšããã®ãšåãæ
å ±ã§ããå¯èœæ§ããããŸãã core::panicking::panic
åç
§ããŠãã ããã
ã¹ã¿ãã¯ãã»ã©ããŠããã®ã«ããªãããã»ã©å€ãã®ã¹ã¿ãã¯æ
å ±ãError
/ Result
ããã¯ããã®ã§ããïŒ ã¹ã¿ãã¯ããŸã ããéã«ã³ãŒããå®è¡ããªãã®ã¯ãªãã§ããïŒ ããšãã°ãã¹ã¿ãã¯ã®ãã¹äžã®å€æ°ã«é¢å¿ãããå Žåã¯ã©ããªããŸããïŒ Err
ãåŒã³åºããããšãã«ããŠãŒã¶ãŒãã«ã¹ã¿ã ã³ãŒããå®è¡ã§ããããã«ããã ãã§ããããšãã°ãéžæãããããã¬ãŒãåŒã³åºãããšãã§ããŸãã ããã¯ãïŒãªãŒããŒã©ã€ãå¯èœãªïŒãã¯ãã§ããããã«try!
ãã§ã«æäŸããŠãããã®ã§ãã æãç°¡åãªæ¹æ³ã¯ãé©åãªãã©ã¡ãŒã¿ã§ããã°ã©ã ãéå§ããå Žåã«ã¹ã¿ãã¯ãåºåããErr
å Žåã«ãããã¯ãèµ·ããããšã§ãã
try
ã䜿çšãããšã Err
å Žåã«å¿
èŠãªããšããã¹ãŠå®è¡ã§ããŸãããŸãããã¯ãã¯ã¬ãŒãå
šäœããªãŒããŒã©ã€ããããããšã©ãŒã®åçŸãå°é£ãªå Žåãããã©ãŒãã³ã¹ãéèŠãªã³ãŒãã«è§Šããªãããã«ã¹ã³ãŒããèšå®ãããã§ããŸããããã©ãŒãã³ã¹ã¯ãªãã£ã«ã«ãªã³ãŒããããããå®è¡ããå¿
èŠããããŸãã
å®éã®æ å ±ã¯ç Žå£ããããããèç©ããã人工ã¹ã¿ãã¯ã«æ å ±ã®äžéšãä¿åããå¿ èŠã¯ãããŸããã ãã¯ãã®ãªãŒããŒã©ã€ãæ¹æ³ã¯ãã¹ãŠã次ã®æ¹æ³ã§æ¹åã§ããŸãã
?
ãåæ§ã®æ¹æ³ã§ãªãŒããŒã©ã€ãã§ããŸããæãç°¡åãªæ¹æ³ã¯ã ?
ãtry!
ç ç³ãšããŠå®çŸ©ããããšã§ããç¹ã«ãã¯ã¬ãŒãã®å¢çã§çºçããªããšã©ãŒããã£ããããããã«å¿
èŠã§ããäžèšã®ç§ã®ã³ã¡ã³ãã§æŠèª¬ãããŠããŸãã@ est31ã¹ã¿ãã¯ã¯ããããã¯ã®ããã«_èªåçã«_ãå·»ãæ»ããããŸãããããã¯ãæ©æãªã¿ãŒã³ã®ããã®æ§æç³è¡£ã§ãã
ã¯ãããã¬ãŒã¯ãã€ã³ããèšå®ã§ããåºå®åã®ç©ºã®é¢æ°ã®åŒã³åºããã³ã³ãã€ã©ãŒã«æ¿å
¥ãããããšãã§ããŸããããã¯éåžžã«ç°¡åã§ãïŒãŸãã call dump(data)
ãªã©ã®æ
å ±ããããŸããããã§dump
ãšdata
ã¯ããããã¬ãŒãèŠãããšãã§ããåŒæ°ã§ãïŒã
@eddyb空ã®é¢æ°ã§ã¯ãããšãã°ã倧èŠæš¡ãªãããã€ã¡ã³ãã§ããã€ãã®ãã«ããªã¢ããããã°ã€ã³ã¹ã¿ã³ã¹ãä¿æããŠãšã©ãŒããã°ã«è¡šç€ºããããã©ããã確èªããæ»ã£ãŠä¿®æ£ãããªã©ã®ãŠãŒã¹ã±ãŒã¹ã¯èš±å¯ãããªããšæããŸãã åå¿çãããç©æ¥µçã§ããããšãæãŸããããšã¯ç解ããŠããŸããããã¹ãŠãäºæž¬ããã®ã¯ç°¡åã§ã¯ãããŸãã
@hexselããã§ãããã®ããã Result::unwrap
ãŸãã¯æ°ããignore
ã¡ãœããïŒãŸãã¯åžžã«ãšã©ãŒãããããããå Žåã§ãïŒããã¬ãŒã¹ãstderrã«ãã³ãããTLSããŒã¹ã®ã¡ãœããã奜ã¿ãŸãã
@eddyb TLSã®ããŒã¿æ§é ã®ãããªã¹ã¿ãã¯ã«ãåœä»€ãã€ã³ã¿ãŒãŸãã¯å€ãã掟çãããã®ãè¿œå ãããšãåºæ¬çã«ãå®éã®ã¹ã¿ãã¯ã®å°ããªããŒãžã§ã³ãåæ§ç¯ãããŸãã ãªã¿ãŒã³ã¯ã¹ã¿ãã¯ã1ãšã³ããªæžãããŸãã ãããã£ãŠãã¹ã¿ãã¯ã®_unwind_éšåãè¿ããšãã«ãããè¡ããšãRAMå
ã®ä»ã®å Žæã§éå®ããŒãžã§ã³ããã«ãããŸãã ãããããã¢ã³ã¯ã€ã³ããã¯ãåæ³çãªããªã¿ãŒã³ããçããåäœã®ééã£ãçšèªã§ããããã¹ãŠã®ã³ãŒãã?
ãŸãã¯try!
ãå®è¡ããæåŸã«ã€ã³ã¿ãŒã»ããããå Žåãæçµçµæã¯åãã§ãã rustããšã©ãŒäŒæãèªååããªãã®ã¯çŽ æŽãããããšã§ããJavaãthrows
ããŒã¯ãŒãã®åŸã«ââãã¹ãŠã®äŸå€ããªã¹ãããå¿
èŠãããæ¹æ³ãæ¬åœã«æ°ã«å
¥ããŸãããrustã¯ãããæ¹åããã®ã«é©ããŠããŸãã
@hexselããªãŒããŒã©ã€ãããïŒ try!
ã§ãã§ã«ååšããŠããããïŒããŒã¹ã®ã¢ãããŒãã§ã¯ããããå¯èœã«ãªããŸããä»»æã®ã³ãŒããå®è¡ããŠãä»»æã®ãã°ã·ã¹ãã ã«ãã°ãèšé²ã§ããŸãã ãã ããè€æ°ã®try
ãã¹ã¿ãã¯ãäŒæãããšãã«åããšã©ãŒããã£ããããå Žåã¯ããéè€ããæ€åºããå¿
èŠããããŸãã
@ est31 try!
ãªãŒããŒã©ã€ãã¯ãç¬èªã®ã³ãŒãã§ã®ã¿æ©èœããŸãïŒæåéããã¯ãã€ã³ããŒãã·ã£ããŠã€ã³ã°ã§ãïŒãã匱ãlangã¢ã€ãã ãã®ããã«å¥ã®ãã®ã«ããå¿
èŠããããŸãã
@ est31ããã¯å®éã«ã¯æ£ãããããŸããïŒå·»ãæ»ãã«ã€ããŠïŒã Result
移åããå¿
èŠããªãããããã¬ãŒã¹ãšå®éã®ã¹ã¿ãã¯ã¯å¿
ãããé¢ä¿ããããŸãããå
ã®ããã¯ãã¬ãŒã¹ã§äžæããå¿
èŠã¯ãããŸããã暪ã«ãã
ãŸãããã€ããªãæé©åãããŠããå Žåãããã¯ãã¬ãŒã¹ã®ã»ãšãã©ããªããªãããããã°æ
å ±ããªãå Žåã¯ã Location
ãå³å¯ã«åªããŠããŸãã ãã¹ãŠã®ãœãŒã¹æ
å ±ããã¯ããŒãºããœãŒã¹è£œåã®éçºè
ãç
§åã§ããã©ã³ãã ãªããã·ã¥ã«çœ®ãæããé£èªåãã©ã°ã€ã³ãå®è¡ããããšãã§ããŸãã
ãããã¬ãŒã¯äŸ¿å©ã§ãïŒäœè«ã§ããã lldb
ã®ããã¯ãªãŒã³ãªããã¯ãã¬ãŒã¹åºåã倧奜ãã§ãïŒããäžèœè¬ã§ã¯ãããŸããããããã¯ã«é¢ããæ
å ±ããã§ã«åºåããŠããã®ã§ã次ã®ãããªæããããåŸãããšãã§ããŸããã©ãããã®ã
ããã«ã€ããŠ- {Option,Result}::unwrap
è¿œå ã®ååŒæ°ããããããã©ã«ãã§é¢æ°ãåŒã³åºãããå Žæã«äŸåããåã«ãªãããããããã®ãããã¯ãçºçãããããªåã·ã¹ãã ã¬ãã«ã®ããªãã¯ã«ã€ããŠããã€ãèããŸãããã䟿å©ãªäœçœ®æ
å ±ã
å€ã®ãã©ã¡ãŒã¿åãé²ãã§ããã®ã§ãããã¯ãŸã ãªãã·ã§ã³ãããããŸããããããã ãã§ã¯ãããŸããã Result
ãã¬ãŒã¹ãå®å
šã«åŽäžãããã¯ãããŸããã代ããã«ã_å®è£
å¯èœãª_ã¢ãã«ãèŠã€ããããšããŠããŸãã
try!
ãªãŒããŒã©ã€ãããããšã¯ãç¬èªã®ã¯ã¬ãŒãå
ã«å«ãŸããŠããããããŸã£ãã解決çã§ã¯ãããŸããã ããã¯ããããã°ã®çµéšãšããŠã¯åãå
¥ããããŸããã ç§ã¯ãã§ã«çŸåšã®try!
ã«å¯ŸåŠããããšããŠãããããããè©ŠããŸããã ç¹ã«ãå€ãã®ç®±ãé¢ä¿ããŠããŠãã¹ã¿ãã¯ãééããéäžã§ãšã©ãŒãè€æ°åå€æãããå Žåããšã©ãŒã®çºçå Žæãšãã®çç±ãç¹å®ããããšã¯ã»ãŒäžå¯èœã§ãã ãã®ãããªãã³ããšã€ãã解決çã§ããå Žåã倧èŠæš¡ãªRustãããžã§ã¯ãã®äžè¬çãªãšã©ãŒåŠçãåæ€èšããå¿
èŠããããŸãã
@eddybã§ã¯ããã¡ã€ã«åãé¢æ°åãè¡çªå·ãåçªå·ããã®ãã¯ãã«ã«æåéãåã蟌ããšããææ¡ã¯ãããŸããïŒ ç¹ã«ãã®æ å ±ã¯ãã§ã«DWARFã§ã¯ããã«åŠçå¯èœãªåœ¢åŒã§å«ãŸããŠãããããããã¯éåžžã«ç¡é§ã«æããŸãã ãŸããDWARFã䜿çšãããšãåãããã»ã¹ãããªãå®äŸ¡ã«æ¬çªç°å¢ã§äœ¿çšã§ããŸããããã®çš®ã®äœçœ®æ å ±ã¯éåžžã«ç¡é§ã§ããããããªãªãŒã¹ãã€ããªãå®è¡ããããšã¯ã§ããŸããã
DWARFæ å ±ãããå€§å¹ ã«ç¡é§ã«ãªãã®ã¯ãªãã§ããïŒ ãã¡ã€ã«åã¯éè€æé€ãããx64ã§ã¯å šäœã3ãã€ã³ã¿ãŒã®ãµã€ãºã«ãªããŸãã
@mitsuhikoã ããåºæ¬çã«ãããªãã¯äžè¬çãªæ¹åæ§ã«åæããŸãããããã®æè¡çãªè©³çŽ°ã«ã¯åæããŸãããïŒ
DWARFæ å ±ãäžè¬çãªRustAPIã«å ¬éããã®ã¯ã©ã®ãããç°¡åã§ããïŒ
@eddybã¯ãDWARFæ å ±ããªãªãŒã¹ãã€ããªã«å«ãŸããŠããããåå¥ã®ãã¡ã€ã«ã«å«ãŸããŠããããã§ãã ãããã£ãŠãã·ã³ãã«ãµãŒããŒã«ãããã°ãã¡ã€ã«ãé 眮ããåé€ããããã€ããªããŠãŒã¶ãŒã«éä¿¡ã§ããŸãã
@mitsuhikoãããããã¯ç§ãæ³å®ããŠãããã®ãšã¯ãŸã£ããç°ãªãã¢ãããŒãã§ãã Rustã¯çŸåšãã®atmãAFAIKããµããŒãããŠããŸãããããµããŒãããå¿ èŠãããããšã«åæããŸãã
ãªãªãŒã¹ãã€ããªããããã°ããç®çã§ãã«ãã·ã¹ãã ã«ãã£ãŠçæãããã©ã³ãã ãªèå¥åãšæ¯èŒããŠãåœä»€ãã€ã³ã¿ã¯å®éã«ããã»ã©æçšã ãšæããŸããïŒ
ç§ã®çµéšã§ã¯ãã€ã³ã©ã€ã³ãããã¬ãŒã§ã¯ãæ瀺çãªèªå·±/çžäºååž°ãšéåžžã«å€§ããªé¢æ°ãé€ããŠãã¹ã¿ãã¯ãã¬ãŒã¹ã®å€ããå埩ããã®ã«èŠåŽããŠããŸãã
ã¯ãã try!
ã¯æšæ ã«å«ãŸããŠããŸãã é¢æ°ãã€ã³ã¿ãªã©ãã©ã€ãã©ãªã³ãŒãã«æž¡ããŠããé¢æ°ã«ãšã©ãŒãããå Žåã§ããtryã¢ãããŒãã¯æ©èœããŸãã 䜿çšããã¯ã¬ãŒãã«å
éšãšã©ãŒãŸãã¯ãã°ãããå Žåãè¿ãããErr
ã®æ
å ±ã圹ã«ç«ããªãå Žåã¯ãæ¢ã«ãããã°ããããã«ãã®ãœãŒã¹ã³ãŒããå¿
èŠã«ãªãããšããããŸãã ã¹ã¿ãã¯ãã¬ãŒã¹ã¯ãã³ãŒãã«ã¢ã¯ã»ã¹ã§ããå Žåã«ã®ã¿åœ¹ç«ã€ãããã¯ããŒãºããœãŒã¹ã©ã€ãã©ãªïŒã³ãŒããå€æŽã§ããªãïŒã¯ãäœããã®æ¹æ³ã§ãµããŒããééããå¿
èŠããããŸãã
åã«äž¡æ¹ã®ã¢ãããŒããæå¹ã«ããŠãéçºè ã«ãããã«æé©ãªãã®ã決å®ãããã®ã¯ã©ãã§ããïŒ ç§ã¯ãTLSããŒã¹ã®ã¢ãããŒãã«å©ç¹ããªãããšãåŠå®ããŸããã
tryã¢ãã«ã¯éåžžã«ç°¡åã«å®è£
ã§ãã ?
ãtry
ã«ãã·ã¥ã¬ãŒããã ãã§ã catch
ãå
¥ã£ãå Žåã¯ãè¿œå ã®èšèªæ¡åŒµã®ã¿ãå¿
èŠã§ãïŒããŒãã³ãŒããããåäœå
ã«ãã®åäœãè¿œå ããŸãïŒãšã«ãã?
ïŒ
@eddyb ããªãªãŒã¹ãã€ããªããããã°ããç®çã§ãã«ãã·ã¹ãã ã«ãã£ãŠçæãããã©ã³ãã ãªèå¥åãšæ¯èŒããŠãåœä»€ãã€ã³ã¿ã¯å®éã«
ããããäžè¬çãªãã€ãã£ããã€ããªã®ãããã°ã®ä»çµã¿ã§ãã ç§ãã¡ïŒSentryïŒã¯ãçŸæç¹ã§ã¯ã»ãŒå®å šã«iOSãµããŒãã«äœ¿çšããŠããŸãã ã¯ã©ãã·ã¥ãã³ããååŸããllvm-symbolizerã䜿çšããŠã¢ãã¬ã¹ãå®éã®ã·ã³ãã«ã«è§£æ±ºããŸãã
@mitsuhikoãã§ã«libbacktrace
åã蟌ãã§ããã®ã§ãããã䜿ã£ãŠãœãŒã¹ã®å Žæãžã®ã³ãŒããã€ã³ã¿ã解決ã§ããã®ã§ãç§ã¯å®å
šã«å察ããŠããããã§ã¯ãããŸããã
@eddybããã ãããã¯ã³ãŒããèŠããšããã§ãã ãããå®éã«Rustã³ãŒãã§äœ¿çšã§ããAPIã§ãããšããããããã¯çŽ æŽãããããšã§ãã ãããããã«ããã€ãã®å Žæã§åœ¹ç«ã€ããšãããããŸãã
ããã«ã€ããŠ-{OptionãResult} :: unwrapã«è¿œå ã®ååŒæ°ããããããã©ã«ãã§é¢æ°ãåŒã³åºãããå Žæã«äŸåããåã«ãªãããããããã®ãããã¯ãçºçãããããªåã·ã¹ãã ã¬ãã«ã®ããªãã¯ã«ã€ããŠããã€ãèããŸãããã䟿å©ãªäœçœ®æ å ±ããããŸãã
@glaebhoerlãã¡ããå€åããã¯å®éã«è¿œæ±ãã䟡å€ããããŸããïŒ å°ãªããšãããã€ãã®äžå®å®ãªå®éšãšããŠã
@eddybããããªãã ããããæåã«ããã«é¢äžããããã€ãã®GHCerãšãããè°è«ãã䟡å€ããããŸããç§ã¯ããã«ã€ããŠãã ééãããšãã«èããŠãã¡ããã©ä»ãªã³ã¯ãã°ãŒã°ã«ã§æ€çŽ¢ããŸããã ãŸããRustã«ã¯ãGHCã®ããã«å®éã®æé»çãªãã©ã¡ãŒã¿ãŒã¯ãããŸããã ããã©ã«ãã®ã¿ã€ããã©ã¡ãŒã¿ã代ããã«æ©èœãããã©ããã¯èå³æ·±ã質åã§ãïŒããããç§ãããå€ãã®ããšãèãã質åã§ãïŒã
èããŠã¿ãŠãã ããã rustc
ãç¹æ®ãªã±ãŒã¹ã«å€æããŠErr
ãäœæãããã€ããŒãã䜿çšããŠfn(TypeId, *mut ())
é¢æ°ãåŒã³åºããŠããè¿ãããã«ãããšäŸ¿å©ã§ãã ã ãã€ããŒãã«åºã¥ããŠãšã©ãŒããã£ã«ã¿ãªã³ã°ããã察象ã®ãšã©ãŒãæ€åºãããå Žåã«ãããã¬ãŒã«ãã©ãããããç¹å®ã®çš®é¡ã®ãšã©ãŒã®ããã¯ãã¬ãŒã¹ããã£ããã£ãããªã©ã®åºæ¬çãªäœæ¥ããå§ããã«ã¯ãããã§ååã§ãã
PR 33389ã¯ã Carrier
ç¹æ§ã®å®éšçãµããŒããè¿œå ããŸãã ããã¯å
ã®RFCã®äžéšã§ã¯ãªãã£ããããFCPã«ç§»è¡ããåã«ç¹ã«ç¶¿å¯ãªèª¿æ»ãšè°è«ãè¡ãå¿
èŠããããŸãïŒæ®ãã®?
æŒç®åã«ã€ããŠã¯FCPãšã¯å¥ã«ããå¿
èŠããããŸãïŒã 詳现ã«ã€ããŠã¯ããã®ãã£ã¹ã«ãã·ã§ã³ã¹ã¬ãããåç
§ããŠãã ããã
?
ãOption
ã«æ¡åŒµããããšã«å察ã§ãã
RFCã®è¡šçŸã¯ã ?
æŒç®åããšã©ãŒ/ãäŸå€ãã®äŒæã«é¢ãããã®ã§ãããšããäºå®ã«ã€ããŠããªãæ確ã§ãã
Option
ã䜿çšããŠãšã©ãŒãå ±åããã®ã¯ééã£ãããŒã«ã§ãã None
ãè¿ãããšã¯ãæåããããã°ã©ã ã®éåžžã®ã¯ãŒã¯ãããŒã®äžéšã§ããã Err
ãè¿ãããšã¯ãåžžã«ãšã©ãŒã瀺ããŸãã
ãšã©ãŒåŠçã®äžéšã®é åãæ¹åãããå ŽåïŒã¹ã¿ãã¯ãã¬ãŒã¹ãè¿œå ãããªã©ïŒã Option
?
ãå®è£
ãããšãå€æŽãã?
ãé€å€ããå¿
èŠããããŸãã ã
@tomakaãã£ã¹ã«ãã·ã§ã³ã¹ã¬ããã§ãã£ã¹ã«ãã·ã§ã³ãç¶ããããšãã§ãããªãã®ç°è°ããã§ã«èŠçŽããŸããïŒç§ã¯å人çã«GHã«é¢ããé·ãè°è«ãããªãæ±ãã«ãããšæããŸãããããŠãã®ç¹å®ã®ç¹ã«ã€ããŠã®è°è«ãä»ã®å°æ¥ã®ç¹ãèµ·ããåŸã質åããåé¢ã§ããããšãçŽ æŽãããã§ãããã
@eddybã¯ããã ãç§ã¯æé»ã®ã³ãŒã«ã¹ã¿ãã¯GHCæ©èœã®ãªãªãŒã¹çã®ããã¥ã¡ã³ãå ã«è¿°ã¹ãŸããã
ãã°ããã®éãããã§æŽæ°ã¯ãããŸããã ãããåé²ãããããã«åããŠãã人ã¯ããŸããïŒ OPã®æ®ãã®ã¿ã¹ã¯ã¯ãŸã æ£ç¢ºã§ããïŒ ããã§äœãE-help-wantedã¯ãããŸããïŒ
æå³ã®ããRustçšã®Sentryã¯ã©ã€ã¢ã³ããäœæã§ãããã©ãããå é±æ«ã«éãã ã ã»ãšãã©ã®ãšã©ãŒåŠçã¯å®éã«ã¯ãããã¯ã§ã¯ãªãçµæã«åºã¥ããŠãããããããã®æçšæ§ã¯ããããå®å šã«æŸæ£ããããšã決å®ããæç¹ã«å€§å¹ ã«å¶éãããŠããããšã«æ°ä»ããŸããã
ãšã©ãŒå ±åã·ã¹ãã ãçµ±åããããã®äŸãšããŠãcrates.ioã³ãŒãããŒã¹ã«ã¢ã¯ã»ã¹ããŸããã ããã«ããããã®RFCã«æ»ããŸãããçµæãæž¡ãããããŸããŸãªã¹ã¿ãã¯ãã¬ãŒã¹ã«å€æããããšãã«ãäœããã®æ¹æ³ã§åœä»€ãã€ã³ã¿ãŒãèšé²ã§ããªãéããé©åãªãšã©ãŒã¬ããŒããååŸããããšã¯äžå¯èœã ãšæããŸãã ç§ã¯ãã§ã«ããããããŒã«ã«ã®è€éãªããžãã¯é害ããããã°ããã ãã®å€§ããªèŠçã§ããããšã«æ°ã¥ããŸãããæè¿ã§ã¯ããšã©ãŒã®åå ã§ãããš_èãã_ãããã¯ãè¿œå ããããšã«é Œã£ãŠããŸãã
æ®å¿µãªãããçŸåšãçµæã®åäœãå€§å¹ ã«å€æŽããã«IPãèšé²ããæ¹æ³ãããããŸããã ä»ã®èª°ãã以åã«ãã®ã¢ã€ãã¢ãããã£ãããšããããŸããïŒ
ããã«ã€ããŠã¯ã@ rust-lang / langããŒãã£ã³ã°ã§è©±ãåã£ãŠããŸããã æãã€ããããã€ãã®ããšïŒ
ãŸãã ?
ãã§ããã ãæ©ãå®å®ããã®ãèŠãããšã«æ確ãªé¢å¿ããããŸãã ããããç§ãã¡ã®ã»ãšãã©ã¯ã Result
ã ãã§ãªãOption
�
åäœããããšãæãã§ãããšæããŸãïŒãã ãã bool
ã§ã¯ãªãããã§ãããææ¡ãããŠããŸãïŒã å®å®åã«é¢ãã1ã€ã®æžå¿µã¯ã Result
以å€ã®ã¿ã€ãã®äœ¿çšãèš±å¯ãããããªç¹æ§ãæäŸããã«å®å®åããå ŽåãåŸã§è¿œå ããããã®äžäœäºææ§ããªãããšã§ãã
ããšãã°ãç§èªèº«ã次ã®ãããªã³ãŒããå®æçã«èšè¿°ããŠããŸãã
let v: Vec<_> = try!(foo.iter().map(|x| x.to_result()).collect());
ããã§ã try!
ã䜿çšããŠã collect
ãResult<Vec<_>, _>
ãè¿ãããšãæåŸ
ããŠããããšãåæšè«ã«éç¥ããŠããŸãã ?
ã䜿çšããå Žåããã®æšè«ã¯å°æ¥å€±æããå¯èœæ§ããããŸãã
ãã ãã以åã®è°è«ã§ã¯ãããããçš®é¡ã®ããã£ãªã¢ãç¹æ§ã®ãã现ããç¹ãè°è«ããããã«ä¿®æ£RFCãå¿
èŠã§ãããšå€æããŸããã æããã«ããã®RFCã¯ã§ããã ãæ©ãäœæããå¿
èŠããããŸããããã®è°è«ã®?
é²è¡ããããã¯ããããªãã®ã§ãã
@nrcã®å®è£
ãæ¡çšãããã¬ã€ããäžå®å®ã«ããŠResult
ãšããã€ãã®ãã©ã€ããŒããããŒã¿ã€ãã«å¯ŸããŠã®ã¿å®è£
ããå Žåã ?
ã®ã¿ãäœæããªãããæšè«ãæå¶ããå¿
èŠããããšèããããŸããã Result
?
䜿çšã§ããŸãã
æåŸã®ãã€ã³ãïŒ Option
å€ã«?
ã䜿çšããå Žåãé¢æ°ã®æ»ãå€ã®åãOption
ã§ããå¿
èŠããããŸãïŒäŸã§ã¯ãããŸããïŒã Result<T,()>
ïŒã å€ãã®å Žåã宣èšãããæ»ãå€ã®åããæçµçã«ã©ã®åãå¿
èŠããæšæž¬ã§ããããããããæšè«ã®å¶éã«åœ¹ç«ã€ããšã«æ³šæããã®ã¯èå³æ·±ãããšã§ãã
çžäºå€æãæãŸãªãçç±ã¯ã x
ãæŽæ°åã®å Žåã§ããCãif x
èš±å¯ããæ¹æ³ã«äŒŒããã«ãŒã¹ããžãã¯ã«ã€ãªããå¯èœæ§ãé«ãããã§ãã ã€ãŸãã Option<T>
ãå€ã瀺ãã None
ããã®å€ã®ãã¡ã€ã³ã®äžéšã§ããå ŽåïŒå¿
èŠã«å¿ããŠïŒã Result<>
ã¯ïŒéåžžïŒé¢æ°ã®å€±æãè¡šããŸããæåããããã«ã¯ã None
ãé¢æ°ã®ãšã©ãŒãçããããšæãããããšãæå³ãããšä»®å®ããŸãïŒãããŠäžçš®ã®æ£æçãªæ
£ç¿ã®ããã«ïŒã ãããããã®è°è«ã¯RFCãåŸ
ã€ããšãã§ãããšç§ã¯æããŸãã
çžäºå€æãæãŸãªãçç±ã¯ã
x
ãæŽæ°åã®å Žåã§ããCãif x
èš±å¯ããæ¹æ³ã«äŒŒããã«ãŒã¹ããžãã¯ã«ã€ãªããå¯èœæ§ãé«ãããã§ãã ã€ãŸããOption<T>
ãå€ã瀺ããNone
ããã®å€ã®å®çŸ©åã®äžéšã§ãããResult<>
ãïŒéåžžã¯ïŒé¢æ°ã®å€±æãè¡šãå Žåæåããããã«ãNone
ãé¢æ°ããšã©ãŒã«ãªãã¯ãã§ããããšãæå³ãããšä»®å®ãããšãçãããããã«èŠããŸãïŒãããŠäžçš®ã®æ£æçãªæ £ç¿ã®ããã«ïŒã ãããããã®è°è«ã¯RFCãåŸ ã€ããšãã§ãããšç§ã¯æããŸãã
ç§ã¯ããã«å¿ããåæããŸãã
æã¶ãè£æ£ã«åæãããã1ã€ã®è³ªåã¯ã From
ç¹æ§ã®impl
ãåŸãã¹ãå¥çŽïŒãŸãã¯Err
ã¢ãããã£ã¹ãã«äœ¿çšããããšã«ãªã£ãç¹æ§ïŒãæ確ã«ããããšã§ããã ïŒã
@glaebhoerl
æã¶ãè£æ£ã«åæãããã1ã€ã®è³ªåã¯ãFromç¹æ§ïŒãŸãã¯Err-upcastingã«äœ¿çšããç¹æ§ïŒãåŸãå¿ èŠããããšããå¥çŽãæ確ã«ããããšã§ããã
確ãã«ã ç§ã®èšæ¶ããªãã¬ãã·ã¥ããŠãçŠæ¢ãããã¹ãã ãšæãããšã®ããã€ãã®äŸããå§ããŠããããŸããïŒ ãããšããããªããèããŠããæ³åã ãã§ããïŒ ç§ã¯ãã®ãããªãæ³åŸãã«èŠæããŠããããšãèªããªããã°ãªããŸããã äžã€ã«ã¯ã圌ãã¯å®éã«ã¯ç¡èŠãããåŸåããããŸã-人ã ã¯ãæå³ãããå¶éãè¶ ããŠããŠããç®çã«åã£ããšãã«å®éã®è¡åãå©çšããŸãã ã€ãŸãããã1ã€ã®è³ªåã«ã€ãªãããŸããæ³åŸãããå Žåãããããäœãã«äœ¿çšããã§ããããã æé©åïŒ ïŒããããç§ã«ã¯ããããããªãããã§ããïŒ
ã¡ãªã¿ã«ã catch
åŒã®ç¶æ
ã¯ã©ããªã£ãŠããŸããïŒ ãããã¯å®è£
ãããŠããŸããïŒ
æ²ããããšã«ãããŸãã:(
2016幎7æ26æ¥ç«ææ¥06:41:44 AM -0700ã«ãAlexanderBulaevã¯æ¬¡ã®ããã«æžããŠããŸãã
ã¡ãªã¿ã«ã
catch
åŒã®ç¶æ ã¯ã©ããªã£ãŠããŸããïŒ ãããã¯å®è£ ãããŠããŸããïŒã¹ã¬ãããäœæããããããããåãåã£ãŠããŸãã
ãã®ã¡ãŒã«ã«çŽæ¥è¿ä¿¡ããããGitHubã§è¡šç€ºããŠãã ããã
https://github.com/rust-lang/rust/issues/31436#issuecomment -235270663
ããããããªãã¯ãããå®è£ ããããšãèšç»ãã¹ãã§ããïŒ åãå ¥ããããŠãããå®è£ ãããŠããªãRFCã»ã©æ°ã®ãããããšã¯ãããŸãã...
ccïŒ35056
åèãŸã§ã«ã httpsïŒ//github.com/rust-lang/rfcs/pull/1450 ïŒåæåããªã¢ã³ãã®ã¿ã€ãïŒã¯ã Carrier
å®è£
ããããã€ãã®èå³æ·±ãæ¹æ³ãéããŸãã ããšãã°ã次ã®ãããªãã®ã§ãã
trait Carrier {
type Success: CarrierSuccess;
type Error: CarrierError;
}
trait CarrierSuccess {
type Value;
fn into_value(self) -> Self::Value;
}
// (could really use some HKT...)
trait CarrierError<Equivalent: CarrierError> {
fn convert_error(self) -> Equivalent;
}
impl<T, E> Carrier for Result<T, E>
{
type Success = Result::Ok<T, E>;
type Error = Result::Err<T, E>;
}
impl<T, E> CarrierSuccess for Result::Ok<T, E> {
type Value = T;
fn into_value(self) -> Self::Value {
self.0
}
}
impl<T, E1, E2> CarrierError<Result::Err<T, E2>> for Result::Err<T, E1>
where E2: From<E1>,
{
fn convert_error(self) -> Result::Err<T, E2> {
Err(self.into())
}
}
impl<T> Carrier for Option<T>
{
type Success = Option::Some<T>;
type Error = None;
}
impl<T> CarrierSuccess for Option::Some<T> {
type Value = T;
fn into_value(self) -> Self::Value {
self.0
}
}
impl<T> CarrierError<Option::None> for Option::None {
fn convert_error(self) -> Option::None {
self
}
}
fn main() {
let value = match might_be_err() {
ok @ Carrier::Success => ok.into_value(),
err @ Carrier::Error => return err.convert_error(),
}
}
https://github.com/rust-lang/rust/pull/35056#issuecomment-240129923ããããã€ãã®èããã¯ãã¹ãã¹ããããã£ãã ãã§ãã ãã®PRã¯ããããŒã¿ã€ãã®Carrier
ç¹æ§ãå°å
¥ããŸãã ãã®æå³ã¯ä¿è·ããããšã§ãããç¹ã«ãåæšè«ãšã®çžäºäœçšãå®å®ãããããšãªãã ?
ãå®å®ããããã£ãã®ã§ãã ç¹æ§ãšãããŒã¿ã€ãã®ãã®çµã¿åããã¯ãå®å
šã«ä¿å®çã§ããããã«èŠããŸããã
次ã«ã Carrier
ã«ã€ããŠèª¬æããRFCãäœæããããã«åãããŠèšèšãå€æŽããŠãå
šäœçãªåœ¢ç¶ã«æºè¶³ããå Žåã«ã®ã¿å®å®åããïŒãŸãã¯Carrier
åé€ããïŒãšããã¢ã€ãã¢
ããŠãããå°ãææ©çã«èšãã°ã Carrier
ç¹æ§ãæ¡çšããå Žåããã£ãªã¢éã®çžäºå€æãçŠæ¢ããããšæããŸãïŒãã®ç¹æ§ã¯åºæ¬çã«Result
ãšã®éã§å€æããæ¹æ³ã§ãïŒ ?
ãOption
ã«é©çšãããšãçŽæçã«ãfnãOption
è¿ãå Žåã¯åé¡ãããŸããã ?
ãResult<T,E>
ã«é©çšããå ŽåãfnãResult<U,F>
è¿ãå Žåã¯åé¡ãããŸãããããã§E: Into<F>
; ãããã ?
ãOption
ããfnãResult<..>
è¿ãå Žåãããã¯åé¡ãããŸããã
ãšã¯ããããã®çš®ã®ã«ãŒã«ãä»æ¥ã®åã·ã¹ãã ã§è¡šçŸããã®ã¯é£ããã§ãã æãæçœãªåºçºç¹ã¯ãHKTã®ãããªãã®ã§ãïŒãã¡ãããå®éã«ã¯ãããŸããããä»ã¯ç¡èŠããŸãããïŒã ããããããã¯æããã«å®ç§ã§ã¯ãããŸããã ããã䜿çšããå Žåã Result
ã¯Carrier
å®è£
ã§ããããã Carrier
ã®Self
ãã©ã¡ãŒã¿ãŒã®çš®é¡ã¯type -> type -> type
ã§ãããšæ³å®ãããŸãã ã ããã«ããã Self<T,E> -> Self<U,F>
ãããªè¡šçŸãå¯èœã«ãªããŸãã ãã ãã type -> type
çš®é¡ã®Option
ã¯å¿
ãããé©çšãããŸããïŒãã¡ãããããã¯ãã¹ãŠãæ¡çšããHKTã·ã¹ãã ã®çš®é¡ã«ãã£ãŠç°ãªããŸãããç§ãã¡ãæ¡çšãããšã¯æããŸããã ãäžè¬çãªã¿ã€ãã®ã©ã ãããŸã§ãã£ãšè¡ããŸãïŒã ããã«æ¥µç«¯ãªã®ã¯ã bool
ãããªã¿ã€ããããããŸããïŒboolã«Carrier
ãå®è£
ããããªãã®ã§ãããæ°ããã¿ã€ãã«Carrier
ãå®è£
ããããšæã人ããããããããŸããã 'd boolïŒã
ç§ãèããã®ã¯ã ?
ã®åä»ãèŠåèªäœãç¹å¥ã§ããå¯èœæ§ããããšããããšã§ããããšãã°ã ?
Foo<..>
ã¯_some_ã®åç®åCarrier
ç¹æ§ãšäžèŽããŸãããå²ãã§ããfnã®æ»ãå€ã®åãFoo<..>
ãŸãã ãããã£ãŠãåºæ¬çã«Foo
ãæ°ããåãã©ã¡ãŒã¿ãŒã䜿çšããŠ?
ãé©çšãããŠããã¿ã€ãããå²ãã§ããfnã®ã¿ã€ããããããªãå Žåãæ°ããçš®é¡ã®ç¹æ§çŸ©åãè¿œå ããã«ãã®å¶çŽãé©çšã§ããªãããšã§ãã ããã¯ãŸããããªãã¢ãããã¯ã§ãã :)ããããããã¯ããŸãããã§ãããã
ç§ãæã£ãŠãããã1ã€ã®èãã¯ã Carrier
ç¹æ§ãåèãããããããªããšããããšExpr: Carrier<Return>
ããã§ã Expr
�
ãé©çšãããã¿ã€ãã§ããã Return
ã¯ç°å¢ã®ã¿ã€ãã§ãã ããšãã°ããããã次ã®ããã«ãªããŸãã
trait Carrier<Target> {
type Ok;
fn is_ok(&self) -> bool; // if true, represents the "ok-like" variant
fn unwrap_into_ok(self) -> Self::Ok; // may panic if not ok
fn unwrap_into_error(self) -> Target; // may panic if not error
}
次ã«ã expr?
次ã®ããã«è±ç³ããŸãã
let val = expr;
if Carrier::is_ok(&val) {
val.unwrap_into_ok()
} else {
return val.unwrap_into_error();
}
ããã§ã®äž»ãªéãã¯ã Target
ã¯_error_ã¿ã€ãã§ã¯ãªããæ°ããResult
ã¿ã€ãã«ãªãããšã§ãã ãããã£ãŠãããšãã°ã次ã®implãè¿œå ã§ããŸãã
impl<T,U,E,F> Carrier<Result<U,F>> for Result<T,E>
where E: Into<F>
{
type Ok = T;
fn is_ok(&self) -> bool { self.is_ok() }
fn unwrap_into_ok(self) -> Self::Ok { self.unwrap() }
fn unwrap_into_error(self) -> { Err(F::from(self.unwrap_err())) }
}
ãããŠã次ã®ããã«è¿œå ããŸãã
impl<T> Carrier<Option<T>> for Option<T> {
type Ok = T;
fn is_ok(&self) -> bool { self.is_some() }
fn unwrap_into_ok(self) -> Self::Ok { self.unwrap() }
fn unwrap_into_error(self) -> { debug_assert!(self.is_none()); None }
}
ãããŠæåŸã«ã次ã®ããã«ããŒã«å€ãå®è£ ã§ããŸãã
struct MyBool(bool);
impl<T> Carrier<MyBool> for MyBool {
type Ok = ();
fn is_ok(&self) -> bool { self.0 }
fn unwrap_into_ok(self) -> Self::Ok { debug_assert!(self.0); () }
fn unwrap_into_error(self) -> { debug_assert!(!self.0); self }
}
çŸåšããã®ããŒãžã§ã³ã¯ããæè»ã§ãã ããšãã°ã次ã®ããã«Result
ãè¿œå ããããšã§ã impl
Option
å€éã®çžäºå€æãResult
å€æã§ããããã«ããããšãã§ããŸãã
impl<T> Carrier<Result<T,()>> for Option<T> { ... }
ããããã¡ãããããããå¿ èŠã¯ãããŸããïŒãããŠããããå¿ èŠããããŸããïŒã
@Stebalien
åèãŸã§ã«ãrust-lang / rfcsïŒ1450ïŒåæåããªã¢ã³ãã®ã¿ã€ãïŒã¯ãCarrierãå®è£ ããããã€ãã®èå³æ·±ãæ¹æ³ãéããŸã
æžããã°ããã®ã¢ã€ãã¢ãæžããŠãããšãã«ãåæåããªã¢ã³ãã®åãçšæãããããç©äºã«ã©ã®ããã«åœ±é¿ããããèããŠããŸããã
?
ã䜿çšããã³ãŒããèšè¿°ããŠããããšã«æ°ä»ããã®ã¯ããthrowãããŒã¯ãŒãããªãã®ã¯å°ãé¢åã ãšããããšã§ããç¹ã«ã Err(foo)?
ãèšè¿°ããå Žåãã³ã³ãã€ã©ãŒã¯ããããŸããã tãããè¿ãããããšã_ç¥ã£ãŠãã_ã®ã§ã return Err(foo)
ãšæžãå¿
èŠããããŸãã ããã¯å€§äžå€«ã§ãããèªåã§æžããªããšinto()
ã³ã³ããŒãžã§ã³ã¯åŸãããŸããã
ããã¯ã次ã®ãããªå Žåã«çºçããŸãã
let value = if something_or_other() { foo } else { return Err(bar) };
ããããã1ã€è¿œå ããå¿
èŠããããŸãã implãåæšè«ã«åœ±é¿ãäžããããšãèš±å¯ãããšããäºå®ã¯ãfnãResult<..>
è¿ãã³ã³ããã¹ãã§ã¯ã foo.iter().map().collect()?
æå³ããŸããããã¯ãå泚éãå¿
èŠãªãããšãããã£ãŠããå Žåã¯ã fnã®æ»ãå€ã®åã¯Result
ã1ã€ã®implã®ã¿ãïŒå°ãªããšãããŒã«ã«ã§ïŒé©çšãããå¯èœæ§ããããŸãã
ããããããŠãç§ã®Carrier
ç¹æ§ã®å°ãè¯ãããŒãžã§ã³ã¯ãããã次ã®ããã«ãªããŸãïŒ
trait Carrier<Target> {
type Ok;
fn into_carrier(self) -> Result<Self::Ok, Target>;
}
次ã®ããã«å®è£ ããŸãã
impl<T,U,E,F> Carrier<Result<U,F>> for Result<T,E>
where E: Into<F>
{
type Ok = T;
fn into_carrier(self) -> Result<T, Result<U,F>> {
match self { Ok(v) => Ok(v), Err(e) => Err(e.into()) }
}
}
ãããŠã expr?
ã¯æ¬¡ã®ãããªã³ãŒããçæããŸãã
match Carrier::into_carrier(expr) {
Ok(v) => v,
Err(e) => return e,
}
ãã¡ãããããã®æ¬ ç¹ïŒãŸãã¯å©ç¹...ïŒã¯ã Into
å€æãimplã«ããã·ã¥ãããããšã§ããã€ãŸããæå³ã®ãããšãã«äººã
ããããã䜿çšããªãå¯èœæ§ããããŸãã ãã ããïŒç¹å®ã®ã¿ã€ãã®ïŒæãŸãããªãå Žåã¯ãããããç¡å¹ã«ã§ããããšãæå³ããŸãã
@nikomatsakis IMOãç¹æ§ã¯IntoCarrier
ããå¿
èŠãããã IntoCarrier::into_carrier
ã¯ããã®ãããªçµæãåå©çšãã代ããã«ã Carrier
ïŒæ°ããåæåïŒãè¿ãå¿
èŠããããŸãã ããã¯ïŒ
enum Carrier<C, R> {
Continue(C),
Return(R),
}
trait IntoCarrier<Return> {
type Continue;
fn into_carrier(self) -> Carrier<Self::Continue, Return>;
}
@Stebalien確ãã«ã倧äžå€«ããã§ãã
langããŒã ããŒãã£ã³ã°ã§ã®è°è«ïŒããã³?
ãªãã¬ãŒã¿ãŒã®ã¿ã®FCPã®å¯èœæ§ïŒã«æåããŸãã ä»åŸæ°æ¥ä»¥å
ã«ãããçš®ã®äžæçãªãã£ãªã¢ç¹æ§ãFCPã«çéžãããå¿
èŠããããšæããŸãã
ãã£ãªã¢ã®ç¹æ§ã«ã€ããŠè©±ãåãããã«ãrust-lang / rfcsïŒ1718ãéããŸããã
ããªããããèããŠãããªããããèããŠãã ããïŒ ?
æŒç®åã¯ãå
·äœçã«ã¯æçµã³ã¡ã³ãæéã«å
¥ã£ãŠããŸãã ãã®è°è«ã¯ããããã8æ18æ¥ã«å§ãŸã£ããã®ãªãªãŒã¹ãµã€ã¯ã«ã®éç¶ããŸãã ?
æŒç®åãå®å®ãããåŸåããããŸãã
ãã£ãªã¢ç¹æ§ã«é¢ããŠã¯ãäžæçãªããŒãžã§ã³ãïŒ35777ã«äžéžããŸãããããã«ãããåæšè«ãšã®æãŸãããªãçžäºäœçšãé²ãããšã§ãã©ã¡ãã®æ¹æ³ã§ãèªç±ã«æ±ºå®ã§ããããã«ãªããŸãã
@ rust-lang / langã¡ã³ããŒã¯ãåæã瀺ãããã«ååã確èªããŠãã ããã æžå¿µãå察æèŠãã³ã¡ã³ãã«æ®ããŠãã ããã ãã®ä»ãã³ã¡ã³ããæ®ããŠãã ããã ããããšãïŒ
tokioããŒã¹ã®ã©ã€ãã©ãªãand_then
ãå€çšããããšã«ãªãã®ã§ã¯ãªãããšæããŸãã ããã¯ã foo().?bar()
ãfoo().and_then(move |v| v.bar())
çç¥åœ¢ã«ããŠãçµæãšå
ç©ãåãè¡šèšã䜿çšã§ããããã«ããããã®1ã€ã®åŒæ°ã«ãªããŸãã
æ確ã«ããããã«ããã®FCPã¯question_markæ©èœãã£ããã§ã¯ãããŸãããæ£ããã§ããïŒ ãã®å·ã®ã¿ã€ãã«ã¯ããã®1ã€ã®å·ã§ãããã®æ©èœã®äž¡æ¹ã远跡ããããšãæå³ããŸãã
@seanmonstaråŸè
ã¯ãŸã å®è£
ãããŠããªãã®ã§ãããã§ãã ãããããFCPãåãå
¥ããããå Žåãããã¯catch
ã远跡ããããã«å€æŽãããŸãã
æ確ã«ããããã«ããã®FCPã¯question_markæ©èœã«é¢ãããã®ã§ããããã£ããã§ã¯ãããŸããã ãã®å·ã®ã¿ã€ãã«ã¯ããã®1ã€ã®å·ã§ãããã®æ©èœã®äž¡æ¹ã远跡ããããšãæå³ããŸãã
ã¯ãã question_mark
æ©èœã ãã§ãã
https://github.com/rust-lang/rfcs/issues/1718#issuecomment-241764523ã§ãã©ããŒã¢ããã?
"ãã€ã³ãçŸåšã®ç¶ç¶"ã«äžè¬åããããšãã§ããŸããã map_err(From::from)
ã®äžéš?
å°ãã ããã€ã³ããããããããäœããŸãïŒ/ã çµæã«From
ã€ã³ã¹ã¿ã³ã¹ããã¹ãŠè¿œå ãããšãã»ãã³ãã£ã¯ã¹ã¯v? => from(v.bind(current-continuation))
ãªãå¯èœæ§ããããŸãã
ãã®å
éšã¹ã¬ããã§ã¯ã ?
ã®çžå¯Ÿçãªã¡ãªããã«ã€ããŠå€ãã®è°è«ããããŸããã
https://internals.rust-lang.org/t/the-operator-will-be-harmful-to-rust/3882/
ä»ã詳现ãªèŠçŽãããæéããããŸããã ç§ã®èšæ¶ã§ã¯ãã³ã¡ã³ãã¯?
ããšã©ãŒã«æ³šæãåŒãã®ã«ååã«èŠãããã©ãããšããåé¡ã«çŠç¹ãåãããŠããŸãããããããè°è«ã®ä»ã®åŽé¢ãèŠèœãšããŠããŸãã ä»ã®èª°ããèŠçŽããæéãããã°ãããã¯çŽ æŽãããããšã§ãïŒ
ç§ã¯ä»¥åã«ã³ã¡ã³ãããããšããªããããã¯é
ããããããããŸãããã@ haulethã@ããªã³ã¯ãããã£ã¹ã«ãã·ã§ã³ã§ææããããã«ã ?
æŒç®åãé衚瀺ã®æ»ãã¹ããŒãã¡ã³ããšããŠäœ¿çšãããŠããå Žåããæ··ä¹±ãæããŸãããã³ãã¿ãã¹ã
try!
䜿çšãããšããã¯ãã§ãããå®è¡ã§ãããããã©ããã«ãªã¿ãŒã³ãããå¯èœæ§ãããããšã¯æãã?
ãé衚瀺ã®return
ãšããŠäœ¿çšãããšãé¢æ°ããå€ãè¿ãæ¹æ³ã¯3ã€ãããŸãã
?
@CryZeãèšã£ãããã«ãç§ã¯ããã奜ãã§ãïŒ
ãã®ããã«ãããã¯èª°ã«ã§ããªãã¿ãããããšã©ãŒãæåŸãŸã§ãã€ãããŠã³ããŠåŠçã§ããæé»ã®ãªã¿ãŒã³ã¯ãããŸããã ãããã£ãŠã倧ãŸãã«æ¬¡ã®ããã«ãªããŸãã
a = tryïŒïŒxïŒ.yïŒ.zïŒ;
ããã¯ãã³ãŒããããç°¡æœã«ããã®ã«åœ¹ç«ã¡ããªã¿ãŒã³ãé ããŸããã ãŸãã coffeescript
ãªã©ã®ä»ã®èšèªã§ãããªãã¿ã§ãã
?
é¢æ°ã¬ãã«ã§ã¯ãªãåŒã¬ãã«ã§è§£æ±ºãããšãå
ç©ã«ã©ã®ãããªåœ±é¿ããããŸããïŒ ä»ã®ãã¹ãŠã®ãŠãŒã¹ã±ãŒã¹ã§ã¯ãç§ã«ãšã£ãŠã¯åé¡ãªãããã§ãã
@CryZeãèšã£ãããã«ãç§ã¯ããã奜ãã§ãïŒ
ãã®ããã«ãããã¯èª°ã«ã§ããªãã¿ãããããšã©ãŒãæåŸãŸã§ãã€ãããŠã³ããŠåŠçã§ããæé»ã®ãªã¿ãŒã³ã¯ãããŸããã ãããã£ãŠã倧ãŸãã«æ¬¡ã®ããã«ãªããŸãã
a = tryïŒïŒxïŒ.yïŒ.zïŒ;
ç§ã¯ãããä»®å®ããŸããã å®ç§ãªè§£æ±ºçã«ãªããšæããŸãã
tryïŒã䜿çšãããšããã¯ãã§ãããå®è¡ã§ãããããã©ããã«ãªã¿ãŒã³ãããå¯èœæ§ãããããšã¯æããã§ããã
Rustã§ãã¯ããã©ã®ããã«æ©èœããããç¥ã£ãŠããã®ã§ãããã¯æããã§ãã ?
ãå®å®ããåºãæ®åããRustã®ãã¹ãŠã®ã€ã³ããã§èª¬æããããšãããã¯ãŸã£ããåãã«ãªããŸãã
@conradkleinespel
é¢æ°ããå€ãè¿ãæ¹æ³ã¯3ã€ãããŸãã
- æé»ã®ãªã¿ãŒã³
Rustã«ã¯ãæé»ã®ãªã¿ãŒã³ãã¯ãªããå€ã«è©äŸ¡ãããåŒããããŸãã ããã¯éèŠãªéãã§ãã
if foo {
5
}
7
Rustã«ãæé»ã®ãªã¿ãŒã³ããããå Žåããã®ã³ãŒãã¯ã³ã³ãã€ã«ãããŸãã ããããããã§ã¯ãããŸããã return 5
ãå¿
èŠã§ãã
äžåºŠã¯ãŸã£ããåãã«ãªãã®ã¯ã©ãã§ããïŒ ã¯å®å®ããŠããŠåºãæ®åããŠãããRustã®ãã¹ãŠã®ã€ã³ããã§èª¬æãããŠããŸãã
ãããã©ã®ããã«èŠãããã®äŸã«ã€ããŠã¯ã httpsïŒ//github.com/rust-lang/book/pull/134
tryïŒã䜿çšãããšããã¯ãã§ãããå®è¡ã§ãããããã©ããã«ãªã¿ãŒã³ãããå¯èœæ§ãããããšã¯æããã§ããã
Rustã§ãã¯ããã©ã®ããã«æ©èœããããç¥ã£ãŠããã®ã§ãããã¯æããã§ãã äžåºŠã¯ãŸã£ããåãã«ãªãã®ã¯ã©ãã§ããïŒ ã¯å®å®ããŠããŠåºãæ®åããŠãããRustã®ãã¹ãŠã®ã€ã³ããã§èª¬æãããŠããŸãã
ç§ãç¥ã£ãŠããã©ã®èšèªã§ããããã¯ããã¯ãããã§ãã©ãŽã³ã«ãªã£ãŠãã ããããæå³ããäœããèµ·ããå¯èœæ§ãããããšãæå³ããŸãã ã€ãŸãããRustãã®éšåãé€ããŠãããã¯ãã®åäœã«ç²ŸéããŠããããããšèšãæããŸãã
@hauleth
a = tryïŒïŒxïŒ.yïŒ.zïŒ;
ç§ã¯ãããä»®å®ããŸããã å®ç§ãªè§£æ±ºçã«ãªããšæããŸãã
ç§ã¯åŒ·ãå察ããŸãã try!
ã§ã®ã¿æ©èœããå€éšã§ã¯æ©èœããªãéæ³ã®ã·ã³ãã«ã衚瀺ãããŸãã
@hauleth
a = tryïŒïŒxïŒ.yïŒ.zïŒ;
ç§ã¯ãããä»®å®ããŸããã å®ç§ãªè§£æ±ºçã«ãªããšæããŸãã
ç§ã¯åŒ·ãå察ããŸãã ããªãã¯è©ŠããŠã¿ãŠã®ã¿æ©èœããéæ³ã®ã·ã³ãã«ãæã«å ¥ããã§ãããïŒ å€ã§ã¯ãããŸããã
?
ãtry!
ã®ã¿æ©èœããã¯ãã ãšã¯èšã£ãŠããŸããã ç§ãèšã£ãŠããã®ã¯ã ?
ã¯ãããŒã¿ãã¹ããªãŒã ã«ããã·ã¥ããçºçãããšããã«ãšã©ãŒãè¿ããã€ãæŒç®åã®ããã«æ©èœããã¯ãã ãšããããšã§ãã ãã®å Žåã try!
ã¯å¿
èŠãããŸããããçŸåšäœ¿çšãããŠããã®ãšåãã³ã³ããã¹ãã§äœ¿çšã§ããŸãã
@steveklabnik Rustã¯æé»çã«è¿ãããèšèªã ãšæããŸããããªãã®äŸã§ã¯ã 5
ã¯æé»çã«è¿ãããŸãã
fn test() -> i32 {
5
}
ããã§ã¯ã 5
ãæé»çã«è¿ãããŸããã return 5;
ãšã¯å¯Ÿç
§çã«ãäŸã§ã¯å¿
èŠã«ãªããŸãã ããã«ãããå€ãè¿ã2ã€ã®ç°ãªãæ¹æ³ãå¯èœã«ãªããŸãã Rustã«ã€ããŠã¯å°ãæ··ä¹±ããŸãã 3åã®1ãè¿œå ããŠããIMOã¯åœ¹ã«ç«ã¡ãŸããã
ããã§ã¯ãªãã ããã¯ãåŒãå ·äœçã«ã¯é¢æ°æ¬äœã®çµæã§ãã ãæé»ã®ãªã¿ãŒã³ããšã¯ãã©ãããã§ãæé»çã«æ»ãããšãã§ããããšãæå³ããŸãããããã§ã¯ãããŸããã äžèšã®ç§ã®ã³ãŒããµã³ãã«ã®ããã«ãããããæé»ã®ãªã¿ãŒã³ããšåŒã¶ä»ã®åŒããŒã¹ã®èšèªã¯ãããŸããã
@steveklabnikããããŸãããããã説æããããã«æéãå²ããŠãããŠããããšãïŒ+1ïŒ
倧äžå€«ã ããŒïŒ ç§ã¯ããªããã©ãããæ¥ãŠããã®ããå®å
šã«èŠãããšãã§ããŸããããã¯äººã
ããã°ãã°ééã£ãæ¹æ³ã§äœ¿ã2ã€ã®ç°ãªããã®ã§ãã ãæé»ã®ãªã¿ãŒã³ããšã¯ããœãŒã¹å
ã®ã©ãã§ã;
ãªãã®ãŸãŸã«ããŠããªã¿ãŒã³ããããšãã§ãããšäººã
ãæ³å®ããŠããã®ãèŠãããšããããŸãã
@hauleth ïŒ ãã®å ŽåãæŒç®åã¯and_thenã®ã·ã³ã¿ãã¯ã¹ã·ã¥ã¬ãŒã«ãªããŸãã ããããã°ãããå€ãã®å Žåã«ããã䜿çšããããšãã§ããè¿åãèŠéãã®ã¯é£ããããšã§ã¯ãããŸããã ããã¯ãä»ã®ãã¹ãŠã®èšèªãè¡ãããšã§ããããŸããïŒ ãªãã¬ãŒã¿ãŒã ãã³ã®ïŒ çŸåšã®å®è£ ã®æŒç®åã¯ãä»ã®ãã¹ãŠã®èšèªãè¡ãããšã®æ£å察ã§ãã ãŸããand_thenã¯æ©èœçãªã¢ãããŒãã§ãããæ確ãªå¶åŸ¡ãããŒãããããããšã«ããæšå¥šãããŸãã ã ããäœãã ãïŒ and_thenã®æ§æç³è¡£æ§æã䜿çšããŠãçŸåšã®è©Šè¡ãç¶æããŸãã æ瀺çã«ãã¢ã³ã©ããããŠè¿ããããã«ãæ»ãå€ãããèŠãããããïŒ æŒç®åãããæè»ã«ãªããŸãïŒãã¿ãŒã³ãããã³ã°ãªã©ã®ãªã¿ãŒã³ã®ãªãå Žåã«äœ¿çšã§ããããïŒã
ÅukaszNiemier
[email protected]
WiadomoÅÄnapisana przezã¯ãªã¹ããã¡ãŒSERR [email protected] O godz dniu 2016幎2æ9æ¥ãã¯ãã 21:05ïŒ
@hauleth https://github.com/hauleth ïŒ ãã®å ŽåãæŒç®åã¯and_thenã®ã·ã³ã¿ãã¯ã¹ã·ã¥ã¬ãŒã«ãªããŸãã ããããã°ãããå€ãã®å Žåã«ããã䜿çšããããšãã§ããè¿åãèŠéãã®ã¯é£ããããšã§ã¯ãããŸããã ããã¯ãä»ã®ãã¹ãŠã®èšèªãè¡ãããšã§ããããŸããïŒ ãªãã¬ãŒã¿ãŒã ãã³ã®ïŒ çŸåšã®å®è£ ã®æŒç®åã¯ãä»ã®ãã¹ãŠã®èšèªãè¡ãããšã®æ£å察ã§ãã ãŸããand_thenã¯æ©èœçãªã¢ãããŒãã§ãããæ確ãªå¶åŸ¡ãããŒãããããããšã«ããæšå¥šãããŸãã ã ããäœãã ãïŒ and_thenã®æ§æç³è¡£æ§æã䜿çšããŠãçŸåšã®è©Šè¡ãç¶æããŸãã æ瀺çã«ãã¢ã³ã©ããããŠè¿ããããã«ãæ»ãå€ãããèŠãããããïŒ æŒç®åãããæè»ã«ãªããŸãïŒãã¿ãŒã³ãããã³ã°ãªã©ã®ãªã¿ãŒã³ã®ãªãå Žåã«äœ¿çšã§ããããïŒã
â
ããªããèšåãããã®ã§ããªãã¯ãããåãåã£ãŠããŸãã
ãã®ã¡ãŒã«ã«çŽæ¥è¿ä¿¡ããããGitHub https://github.com/rust-lang/rust/issues/31436#issuecomment -244461722ã§è¡šç€ºããããã¹ã¬ããhttps://github.com/notifications/unsubscribe-auth/ããã¥ãŒãããŸã
ãããŠãRustãªããžããªã®ãã«ãªã¯ãšã¹ãã§äœæ¥ãããšããç§ã¯å®éã«ïŒã䜿çšããã³ãŒãã§äœæ¥ããå¿ èŠããããŸããã æŒç®åã§ãããå®éãããã¯ç§ã«ãšã£ãŠèªã¿ããããæ¬åœã«å·ã€ããŸãã éåžžã«é ãããŠããŠïŒç²Ÿç¥çã«ã¯ãè³å ã§ãã£ã«ã¿ãŒã§é€å»ãããã®ã¯åãªããã€ãºã§ããããïŒãç§ã¯ãããããèŠèœãšããŠããŸããã ãããŠãããã¯ããªãæãã§ãã
ç§ãã¡ã¯ããæé»ã®åŸ©åž°ããšåŒã@steveklabnikã®ã§ãæã ã¯ãããŸããå¯äžã®ãã®ã
@haulethãããšãRubyã®ç§ã®äœå¹Žã«ãããã£ãŠãæé»ã®ãªã¿ãŒã³ãšåŒã°ãã人ã®ããšã¯èããããšããããŸããã ç§ã¯ãŸã ããã«ã€ããŠèããã®ã¯ééã£ãæ¹æ³ã ãšäž»åŒµããŸãã
ç§ã¯ããã€ãã®ãããžã§ã¯ãã§?
ãŸããããäž»ã«æ¥å°ŸèŸã®äœçœ®ã«ããããã try!
ãããåªå
ããŸããã äžè¬çã«ã¯ããæ¬ç©ã®ãéã³ãŒãã¯ããªãå
¥ãResult
ã§ãã¢ããã main
ããææèããŒã以å€ã§ã¯ããããé¢ããããšã¯ãããŸããã ãããŠããã®ãããªã³ãŒãã¯åžžã«ãšã©ãŒãäŒæããããšãæåŸ
ãããŠããŸãã ã»ãšãã©ã®å Žåãã©ã®åŒããšã©ãŒãçæããŠãããã¯é¢ä¿ãããŸããããããã¯ãã¹ãŠã¹ã¿ãã¯ã«éãè¿ãããã ãã§ãããã³ãŒãã®ã¡ã€ã³ããžãã¯ãèªãã§ãããšãã«ãããèŠãããããŸããã
?
ã«é¢ããç§ã®äž»ãªæžå¿µã¯ãã¡ãœãããã¯ããååšããå Žåãåãå©ç¹ïŒæ¥å°ŸèŸã®äœçœ®ïŒãååŸã§ããããšã§ãã ããããçŸåšã®å®åŒåãå®å®ãããããšã«ãã£ãŠããšã©ãŒåŠçã®å°æ¥ã®è¡šçŸåãå¶éããŠãããšããä»ã®æžå¿µããããŸã-çŸåšã®Result
å€æã¯ãRustã§ã®ãšã©ãŒåŠçãç§ãæãã»ã©äººéå·¥åŠçã«ããã®ã«ååã§ã¯ãããŸããã Rustãšã©ãŒåŠçã§ã¯ãä¿®æ£ãé£ãããšæãããããã€ãã®èšèšãã¹ããã§ã«çºçããŠãããããã«ãããããã«æ·±ãæãäžããããå¯èœæ§ããããŸãã å
·äœçãªèšŒæ ã¯ãããŸãããã
ç§ã¯ãããäœåºŠãæžããããšããããŸããã ?
ãšãã£ãªã¢ç¹æ§ã®å¯èœæ§ã倧奜ãã§ãã 1ã€ã®ãããžã§ã¯ãã?
å®å
šã«äœ¿çšããããã«å€æãããšããã try!
ãšè€éãããå€ãã®ããšãå¯èœã«ãªããŸããïŒç¹ã«ãã§ãŒã³ã«é¢ããŠïŒã ç§ã¯ãŸããä»ã®ããã€ãã®ãããžã§ã¯ããèŠãŠããããã?
ã©ã®ããã«æ©èœãããã確èªããŸããããå
šäœãšããŠã¯åé¡ã¯çºçããŠããŸããã
ãã®ããã Carrier
ãšããããé©åãªååã®ç¹æ§ã«åºã¥ããŠã ?
å®å®åã«å€§ããª+1ãäžããŸããããã¯ãä»ã®è°è«ã§åãäžããä»ã®ããã€ãã®ã±ãŒã¹ãçæ³çã«ã«ããŒããŠããŸãã
ç§ã®äž»ãªé¢å¿äºã¯ïŒ ã¡ãœãããã¯ããååšããå Žåã¯ãã¡ãœãããã¯ãã§ãåãå©ç¹ïŒæ¥å°ŸèŸã®äœçœ®ïŒãåŸãããšãã§ãããšããããšã§ãã
å€åããã«ã¯RFCãå¿ èŠã§ããïŒ ã»ãšãã©ã®äººã¯ïŒã®æ©èœãæ°ã«å ¥ã£ãŠããããã§ãããïŒã¯å¥œãã§ã¯ãããŸããã èªäœã
å€åããã«ã¯RFCãå¿ èŠã§ããïŒ ã»ãšãã©ã®äººã¯ïŒã®æ©èœãæ°ã«å ¥ã£ãŠããããã§ãããïŒã¯å¥œãã§ã¯ãããŸããã èªäœã
ããã«ã€ããŠå€ãã®è°è«ãããRFCããããŸãã ãŸããããªãããã®ãã»ãšãã©ã®äººããã©ãããåŸãŠããã®ãããããŸããã ãã¡ããããã®å·ã®åå è
ããã®ãã®ã§ããå Žåãå®å®åã¯ããŒã ã®ããã©ã«ãã®ã¢ã¯ã·ã§ã³ã§ãããããå察ãã人ãå¢ããã§ãããã
?
ã¯ãRFCãããŒãžãããåã«å€§ãã«è°è«ãããŠããããµããŒã¿ãŒãšããŠãå®å®åãè°è«ããããšãã«åãããšãããªããã°ãªããªãã®ã¯ã¡ãã£ãšç²ããŸãã
ãšã«ãããããã«@mitsuhikoã®ææ ã®+1ãå ¥ããŸãã
ããã«ã€ããŠã¯å€ãã®è°è«ãããRFCããããŸãã ãŸããããªãããã®ãã»ãšãã©ã®äººããã©ãããåŸãŠããã®ãããããŸããã ãã¡ããããã®å·ã®åå è ããã®ãã®ã§ããå Žåãå®å®åã¯ãã§ã«ããŒã ã®ããã©ã«ãã®ã¢ã¯ã·ã§ã³ã§ãããããããå€ãã®äººã ãå察ããŠããã®ãç®ã«ããã§ãããã
ç³ãèš³ãããŸããããç§ã®ã³ã¡ã³ãã¯çãããŸããã func1().try!().func2().try!()
ãªã©ãããçš®ã®ãã¡ãœãããã¯ããã®RFCãäœæããããšã«ã€ããŠèšåããŠããŸããïŒç§ãç¥ãéããããã¯çŸåšäžå¯èœã§ãïŒã
å人çã«ç§ã¯å¥œãã§ããïŒ æŒç®åã§ããã @ brsonãšåãæžå¿µäºé ãå ±æããŠããŸãããã®æ©èœãå®å®ãããåã«ã代æ¿æ¡ãæ€èšããããšãã@nikomatsakisããªã³ã¯ããå éšã¹ã¬ãããç¹°ãè¿ããããšããŠãããã®æ©èœã«ã€ããŠã¯ç¢ºãã«ããã€ãã®è«äºããããŸãã ãã ããå®è¡å¯èœãªä»£æ¿æ段ããªãå Žåã¯ãå®å®åãæãçã«ããªã£ãŠããŸãã
æ©èœãå®å šã«å®è£ ããã«å®å®åããã®ã¯ææå°æ©ã®ããã§ãããã®å Žåãcatch {..}åŒã§ãã
ç§ã¯ä»¥åã«ãã®æ©èœã«ã€ããŠæžå¿µãè¡šæããŸããããããã§ãæªãèãã ãšæããŸãã æ¥å°ŸèŸã®æ¡ä»¶ä»ãæ»ãæŒç®åãæã€ããšã¯ãä»ã®ããã°ã©ãã³ã°èšèªãšã¯ç°ãªããRustããã§ã«æ¡åŒµãããè€éãã®äºç®ãè¶ ããŠæŒãé²ããŠãããšæããŸãã
@mcpherrinm代ããã«ãä»ã®èšèªã§ã¯ããšã©ãŒåŠçã®åŒã³åºãããšã«å·»ãæ»ããã¹ãé ãããŠããŸãã operator()
ããæ¡ä»¶ä»ãæ»ãæŒç®åããšåŒã³ãŸããïŒ
è€éãã®äºç®ã«é¢ããŠã¯ãå°ãªããšãããªããäžæºãèšã£ãŠããéšåã¯ãæ§æçã«try!
ãšã¯ç°ãªããŸãã
try!
å察ããè°è«ã¯ã ?
ã ããèªã¿ããããªãéãã³ãŒãã§ããïŒ
ãããããªããããšã©ãŒäŒæã®èªååããŸã£ããè¡ããªãã以å€ã®æ·±å»ãªä»£æ¿æ¡ããããã©ããã«åæããŸãã
劥åæ¡ã®ææ¡ïŒ https ïŒ
åãå ¥ãããããã£ã³ã¹ã¯ãªããããããŸãããããšã«ãããã£ãŠã¿ãŸãã
@keeperofdakeysã®ãã¡ãœãããã¯ããã«é¢ããã¢ã€ãã¢ã奜ã?
æ§æãåãå
¥ããã¹ãã§ã¯ãªããšæããŸã-èªã¿ãããã ?
èªäœã¯äœãèšããŸããã 代ããã«ããã¡ãœãããã¯ããã䜿çšããŠ?
ã®åäœãäžè¬åããæ©èœãå¿
èŠã§ãã
a.some_macro!(b);
// could be syntax sugar for
some_macro!(a, b);
a.try!();
// could be syntax sugar for
try!(a);
ãã®ããã«ãåäœãäœã§ããããæ確ã«ãªããç°¡åã«é£éã§ããããã«ãªããŸãã
result.try!()
ãããªã¡ãœãããã¯ãã¯ãèšèªã®äººéå·¥åŠã«å¯Ÿããããäžè¬çãªæ¹åã®ããã§ãããæ°ãã?
æŒç®åãããã¢ãããã¯ã§ã¯ãªããšæããŸãã
@brson
ããããçŸåšã®å®åŒåãå®å®ãããããšã«ãã£ãŠããšã©ãŒåŠçã®å°æ¥ã®è¡šçŸåãå¶éããŠãããšããä»ã®æžå¿µããããŸã-çŸåšã®çµæå€æã¯ãRustã§ã®ãšã©ãŒåŠçãç§ãæãã»ã©äººéå·¥åŠçã«ããã®ã«ååã§ã¯ãããŸãã
ããã¯èå³æ·±ãç¹ã§ãã ããã«çŠç¹ãåœãŠãæéãè²»ãã䟡å€ãããã§ãããïŒããããããªããšç§ã¯å°ããã£ããããããšãã§ããŸãïŒã ããã§ãã£ãšããŸããããããšã«åæããŸãã Carrier
ç¹æ§ã®ææ¡ãããèšèšïŒhttps://github.com/rust-lang/rfcs/issues/1718ãåç
§ïŒã¯ãç©äºãããæè»ã«ãããããç¹ã«ç¹æ®åãšçµã¿åããããšãããã§åœ¹ç«ã€å¯èœæ§ããããŸãã
ã¡ãœãããã¯ããèšèªã®åªããæ¡åŒµã«ãªããšã¯æ¬åœã«æããŸããã
macro_rules!
ãã¯ãã¯çŸåšã解æŸé¢æ°ãšåæ§ã®æ¹æ³ã§å®£èšãããŠãããæ°ããã€ã³ããŒãã·ã¹ãã ãæ¡çšããããšããã«é¡äŒŒããããã«ãªããŸãã ã€ãŸãããããã¯ãããã¬ãã«ã®ã¢ã€ãã ã®ããã«å®£èšããããããã¬ãã«ã®ã¢ã€ãã ã®ããã«åŒã³åºããããŸããªããããã¬ãã«ã®ã¢ã€ãã ã®ããã«ã€ã³ããŒãããããšããããšã§ãã
ããã¯ã¡ãœããã®ä»çµã¿ã§ã¯ãããŸããã ã¡ãœããã«ã¯æ¬¡ã®ããããã£ããããŸãã
impl
ãããã¯å
ã§å®£èšããå¿
èŠããããŸããimpl
ãããã¯ãé¢é£ä»ããããŠããã¿ã€ã/ç¹æ§ã§ã€ã³ããŒããããŸãããã¯ãã¯ã¿ã€ããã§ãã¯ã®åã«å±éããããããç§ãç¥ãéããã¡ãœããæ§æã䜿çšãããã¯ãã«ã¯ãããã®ããããã£ã®ããããåœãŠã¯ãŸããŸããã ãã¡ãããã¡ãœããæ§æã䜿çšãããã¯ãããç¡æããã¯ããšåãæ¹æ³ã§ãã£ã¹ãããããã³ã€ã³ããŒãããããšãã§ããŸããããã®éãã«ãããéåžžã«çŽããããæ©èœã«ãªããšæããŸãã
ãããã®çç±ããããã¡ãœãããã¯ããããã€ãçŸãããããããªããšãã信念ã§?
ãé
ãããã®ã¯è¯ãéžæã§ã¯ãªããšæããŸãã
ããã«ãããã€ãã®ã³ã³ã¹ãã©ã¯ããéåžžã«åºã䜿çšãããŠããããã¯ãããç ç³ã«ææ Œããå¿
èŠãããã»ã©éèŠãªã©ã€ã³ããããšæããŸãã for
ã«ãŒãã¯è¯ãäŸã§ãã ?
åäœã¯ãRustã®ãšã©ãŒåŠçã¹ããŒãªãŒã«äžå¯æ¬ ã§ããããã¯ãã§ã¯ãªããã¡ãŒã¹ãã¯ã©ã¹ã®ã·ã¥ã¬ãŒã§ããããšãé©åã ãšæããŸãã
@ hauleth ã @ CryZe
?
ã¯and_then
æŒç®åã§ããã¹ãã ãšããææ¡ã«çããããã«ãããã¯æ¡åŒµé¢æ°ãå€çšããŠãããããKotlinïŒç§ã¯coffeescriptã«ç²ŸéããŠããŸããïŒã®ãããªèšèªã§ããŸãæ©èœããŸããããã³ã§ãšãŠãç°¡åã§ãã åºæ¬çã«ã and_then
ã»ãšãã©ã®çšéã¯maybe_i.and_then(|i| i.foo())
ã§ã¯ãªãã maybe_i.and_then(|i| Foo::foo(i))
ãåè
ã¯maybe_i?.foo()
ãšããŠè¡šçŸã§ããŸãããåŸè
ã¯è¡šçŸã§ããŸããã Foo::foo(maybe_i?, maybe_j?)
ãmaybe_i.and_then(|i| maybe_j.and_then(|j| Foo::foo(i, j)))
Foo::foo(maybe_i?, maybe_j?)
å€ãããšèšãããšãã§ããŸãããããã¯ããšã©ãŒãšè©äŸ¡ãããæåã®?
ãããããããšããã³ãæ©æã«æ»ããšèšããããããã«æ··ä¹±ããŸãã ãã ããããã¯ééããªããã匷åã§ãã
@Stebalienåãå
¥ããããRFCã§ã¯ã catch { Foo::foo(maybe_i?, maybe_j?) }
ã¯ããªããæãããšãããŸãã
@eddybè¯ãç¹ã ãããããããã¯ééããªããã£ãšåŒ·åã ããããçãããšãã§ãããšæããŸãã ããã¯ãæé»çãªãã£ãã/æ瀺çãªè©Šè¡ãšæ瀺çãªãã£ãã/æé»çãªè©Šè¡ã«åž°çããŸãã
let x: i32 = try Foo::foo(a?.b?.c()?));
let y: Result<i32, _> = Foo::foo(a?.b?.c()?);
察ïŒ
let x: i32 = Foo::foo(a?.b?.c()?);
let y: Result<i32, _> = catch Foo::foo(a?.b?.c()?);
ïŒã¢ãžã¥ãæ§æïŒ
@Stebalienå¥ã®äŸïŒ Foo
ãé¢æ°bar
ã«æž¡ãããå Žåãããªãã®ææ¡ã§æ¬¡ã®ããšãè¡ãå¿
èŠããããŸãã
bar(Foo::foo(a?.b?.c()?)?)
ããã¯ããªããèããŠããããšã§ããïŒ äœåãªæ³šæ?
ããããªãbar
ãªãã ããResult
ã®ä»£ããã«Foo
ã
@eddybããããã 泚ïŒç§ã¯å®éã«ãããææ¡ããŠããŸããïŒ ?
ããã€ãæŒç®åãšããŠäœ¿çšããããšã¯ã Foo::foo(bar?)
ã±ãŒã¹ãåŠçããæ¹æ³ããªããã°ããã³ã§ã¯ç¹ã«æçšã§ã¯ãªããšç§ã¯äž»åŒµããŠããŸãã
ç§ã¯ã¡ãœãããã¯ãã®ã¢ã€ãã¢ãå«ãã§ãããç§ããã以äžåŒ·ãå察ããèšèªæ©èœãèããããšãã§ããªãããšã«æ³šæããŠãã ããã ãããã¯ã³ã³ãã€ã©ãŒã®ãã§ãŒãºãææ§ã«ããèšèªã«æ¬åœã«éåžžã«æ ¹æ¬çãªå€æŽãå ããªãéããããããååšããŠé©ãããšã®ãªãæ¯ãèããããæ¹æ³ã¯ãããŸããã ãŸãããããã¯è³¢æã«è§£æããã®ãé£ãããã»ãŒç¢ºå®ã«äžäœäºææ§ããããŸããã
@Stebalien ããã€ãæŒç®åFoo::foo(bar?)
?
ãšããŠFoo::foo(try!(bar))
ããã³bar(Foo::foo(a?.b?.c()?)?)
ïŒ Foo::foo : fn(Result<_, _>) -> Result<_, _>
ä»®å®ïŒïŒ bar(try!(Foo::foo(a?.b?.c()?)))
ã
@haulethç§ã®ãã€ã³ãã¯ãFoo::foo(bar?)?
ãbar?.foo()?
ããã_ã¯ããã«_äžè¬çã§ãããšããããš?
ããã®ã±ãŒã¹ããµããŒãããå¿
èŠããããŸãïŒãŸãã¯ä»ã®æ©èœãå°å
¥ããå¿
èŠããããŸãïŒã ç§ã¯ããããæ¹æ³ãä»®å®ãããã®æ¹æ³ãå°ãªããšãåä»ã§ããããšã瀺ããŠããŸããã ?
èŠç¹ã¯ã try!(foo(try!(bar(try!(baz())))))
ïŒæ¬åŒ§ã®2åïŒïŒãæžããªãããã«ããããšã§ãã éåžžããããtry!(baz()?.bar()?.foo())
ãšããŠæžãçŽãããšã¯ã§ããŸããã
ããããããªãã¯ãã€ã§ãããããšãã§ããŸãïŒ
try!(baz().and_then(bar).and_then(foo))
ÅukaszNiemier
[email protected]
WiadomoÅÄnapisana przezã¹ãã£ãŒãã³ã»ã¢ã¬ã³[email protected] O godz dniu 2016幎5æ9æ¥ãã¯ãã 15:39ïŒ
@haulethhttps ïŒ//github.com/haulethç§ã®ãã€ã³ãã¯Foo :: fooïŒbarïŒïŒïŒ barïŒ.fooïŒïŒãããã¯ããã«äžè¬çã§ããïŒ ãã³ã§ã ãããã£ãŠã圹ã«ç«ã€ããã«ãïŒ ãã®ã±ãŒã¹ããµããŒãããå¿ èŠããããŸãïŒãŸãã¯ä»ã®æ©èœãå°å ¥ããå¿ èŠããããŸãïŒã ç§ã¯ããããæ¹æ³ãä»®å®ãããã®æ¹æ³ãå°ãªããšãåä»ã§ããããšã瀺ããŠããŸããã ïŒã®å šäœã®ãã€ã³ã tryïŒïŒfooïŒtryïŒïŒbarïŒtryïŒïŒbazïŒïŒïŒïŒïŒïŒïŒïŒ2xæ¬åŒ§ïŒïŒ;ã®èšè¿°ãåé¿ã§ããããã«ããããšã§ãã éåžžããããtryïŒïŒbazïŒïŒ?. barïŒïŒ?. fooïŒïŒïŒãšããŠæžãçŽãããšã¯ã§ããŸããã
â
ããªããèšåãããã®ã§ããªãã¯ãããåãåã£ãŠããŸãã
ãã®ã¡ãŒã«ã«çŽæ¥è¿ä¿¡ããããGitHub https://github.com/rust-lang/rust/issues/31436#issuecomment -244749275ã§è¡šç€ºããããã¹ã¬ããhttps://github.com/notifications/unsubscribe-auth/ããã¥ãŒãããŸã
å°ãé¢é£ããã¡ã¢ãšããŠãïŒ-æ©èœã¯äž»ã«ãã«ããŒã«ãã£ãŠäœ¿çšãããŠããããã§ãããããã£ãŠãçµæãã©ãããããã«ããŒãæ§ç¯ããç°¡åãªæ¹æ³ãæäŸããããšã§ãïŒ-æ©èœã®å¿
èŠæ§ãåé¿ã§ããå¯èœæ§ããããŸãã
https://github.com/colin-kiegel/rust-derive-builder/issues/25
ã¡ãœãããã¯ãã®ã¢ã€ãã¢@nrcãš@withoutboatsã«ã€ããŠèããŠãããŠããããšããããããæ©èœããªãããã€ãã®å ·äœçãªçç±ãèãã®ã¯è¯ãããšã§ãã
@nielsle ?
ããäž»ã«ããã«ããŒã«ãã£ãŠäœ¿çšãããŠãããšèšãã®ã¯æ£ç¢ºã§ã¯ãªããšæããŸãã ãã«ããŒã¯ã軜éã®æ¥å°ŸèŸæŒç®åã®å©ç¹ãå®éã«çºæ®ããããšæãäŸã§ããããã¹ãŠã®ã³ã³ããã¹ãã§try!
ããã?
æ¹ã奜ãã§ãã
@nielsleå
ç©ã«é¢ããŠãç§ã¯ããšããšåæ§ã®çç±ã§å¿é
ããŠããŸããã ããããããã«ã€ããŠèããåŸãç§ã¯async
/ await
ããã®æèã§ã®?
å¿
èŠæ§ã«åã£ãŠä»£ãããšæããŸãã ãããã¯å®éã«ã¯ããªãçŽäº€ããŠããŸãã (await future)?.bar()
ãããªããšãè¡ãããšãã§ããŸãã
ïŒããŒã¯ãŒãawait
代ããã«ãµãã£ãã¯ã¹æŒç®åã䜿çšãããšã芪ãäžèŠã«ãªãå ŽåããããŸãããŸãã¯ãæ
éã«èª¿æŽãããåªå
é äœã§ååãªå ŽåããããŸããïŒ
å®å®ããåã«ãããã€ãã®ããã¥ã¡ã³ããäœæããŠã»ãããšæããŸãã åèæç®ã調ã¹ãŸããããèšåãèŠã€ãããŸããã§ããã ãã®æ©èœãã©ãã«ææžåããå¿ èŠããããŸããïŒ
ãã£ã³ã¹ããããŸãã®ã§ã圌ãã¯å®å®åãããããšã¯ãããŸãããªãã°ãããã¯æéã®ç¡é§ã«ãªããŸããç§ã¯äžè¬çã«ææžåããããšãåé¿ããäžå®å®ãªæ©èœã@steveklabnikç¥ã£@cbreedenã 以åã«ããã¥ã¡ã³ãäœæã®å®å®åããããã¯ããããšããããã©ããã¯ããããŸããã
@solsonããã§ããããã¯ãããããããæã¡åºãå Žæã§ã¯ãããŸããã§ãã-ãŸãã¯å°ãªããšãå®å®åã®è³ªåã«é¢é£ããã¹ãã§ã¯ãããŸããã æ©èœã®å®å®åã決å®ã§ããç¶æ³ãæ³åããŠãããšæããŸãããå®å®ããrustcã«ãªãªãŒã¹ããåã«ããã¥ã¡ã³ããå¿ èŠã§ãã ããã¥ã¡ã³ããšæ©èœã®å®å®åããã³ãªãªãŒã¹ã®çµ±åã«é¢é£ããRFCãããããããã®ããã»ã¹ãå®å®ããã®ãåŸ ã€ã ãã§ãïŒãã¡ãããæåã«é©åãªããã¥ã¡ã³ãããªãããã§ã¯ãããŸããïŒã
ãã®RFCã®éèŠãªéšåã¯ã try!
ããã«æ©èœããåŒã®å³åŽã«ãããã®ãçšæããããšã ãšæããŸããããã«ããããtryãã®é 次/é£é䜿çšæ³ã®èªã¿åããèªã¿ããããªãããcatchãã䜿çšã§ããããã«ãªããŸãã ã ããšããšç§ã¯æ§æãšããŠ?
ã䜿çšãã100ïŒ
ã®ãµããŒã¿ãŒ?
ã䜿çšããŠããããã€ãã®ïŒã¯ãªãŒã³ãªïŒïŒã³ãŒãã«åºããããŸãããããã«ãããç°¡åãªäŸããå€ã§?
ã¯éåžžã«èŠèœãšãããã¡ã§ãã ããã§ããæ°ããè©Šè¡ãã®æ§æãšããŠ?
ã䜿çšããããšã¯å€§ããªééãã§ããå¯èœæ§ããããšç§ã¯ä¿¡ããŠããŸãã
ãããã£ãŠãæ§æãšããŠ?
ãŸãã¯ä»ã®èšå·ã䜿çšããããšã«ã€ããŠã®ãã£ãŒãããã¯ãåŸãããã«ãïŒãã©ãŒã©ã ã§ã®éç¥ãšãšãã«ïŒçµäºããåã«_æ祚ãè¡ã_ããšããå§ãããŸãã ã ããé·ãé¢æ°ã§ã®äœ¿çšäŸã䜿çšããã®ãæé©ã§ãã ?
ååãå€æŽããŠãä»ã«äœãå€æŽããªãããšããå§ãããããšã ããèããŠããããšã«æ³šæããŠãã ããã äžè«èª¿æ»ã§ã¯ã ?!
ïŒãŸãã¯??
ïŒã®ããã«éå»ã«ãããã¢ããããå¯èœæ§ã®ããä»ã®ååããŸãã¯ãuseïŒvsãuse more thanoncharacterãã®ãããªååããªã¹ãã§ããŸãã
ãšããã§ã ?
ãªãããšããä»ã®èšèªã®ãªãã·ã§ã³ã¿ã€ããšåãæ§æã§ããããããããå«ã人ã
ãæºè¶³ãããå¯èœæ§ããããŸãã ãããŠããããrustOptionã¿ã€ãã®ãªãã·ã§ã³æ§æã«ããã人ã ïŒããã¯ç§ãå
±æããæžå¿µã§ã¯ãããŸãããïŒã
ããã«ããã®ãããªäžè«èª¿æ»ã§ã¯ãéåžžã¯RFCããã»ã¹ã«åå ããŠããªã人ã
ã«é£çµ¡ã§ãããšæããŸãã éåžžãããã¯å¿
èŠãªããããããŸãããã try!
=> ?
ã¯ãRustã³ãŒããæžãããèªãã ããã人ã«ãšã£ãŠéåžžã«å€§ããªå€æŽã§ãã
PSïŒ
ç§ãææ
¢ããèŠæšãããŸããŸãªããªãšãŒã·ã§ã³ã§äžã«æ°ã«å
¥ã£æ©èœä»ãïŒãïŒãããïŒããã??ãïŒä»¥äžããã£ãå Žåãç§ã¯ç¥ããŸãããŠã ãŸãã ?
ååã?!
ã«å€æŽããããã®RFCãããããã®è°è«ã«ãªãã€ã¬ã¯ããããŸããã
ç³ãèš³ãããŸãããããã§ã«é·ãé²è¡äžã®è°è«ãåéããå¯èœæ§ã«ã€ããŠïŒsmiley_cat:ã
ïŒ expr???
ã¯ãããŸãã«ãªãããããªãã·ã§ã³ã«?
ãå°å
¥ããå Žåã¯ã ??
ã¯äžé©åã§ããããšã«æ³šæããŠãã ããïŒ
?
ã¯éåžžã«èŠèœãšãããã¡ã§ã
ããã§äœã«ã€ããŠè©±ãåã£ãŠããŸããïŒ å®å
šã«åŒ·èª¿è¡šç€ºãããŠããªãã³ãŒãïŒ å®æçã«åŒ·èª¿è¡šç€ºãããã³ãŒããã©ãŠãžã³ã°ïŒ
ãŸãã¯ãé¢æ°ã§?
ãç©æ¥µçã«æ¢ããŠããŸããïŒ
ãšãã£ã¿ãŒã§1ã€ã®?
ãéžæãããšããã¡ã€ã«å
ã®ä»ã®?
ãæããé»è²ã®èæ¯ã§åŒ·èª¿è¡šç€ºãããæ€çŽ¢æ©èœãæ©èœãããããæåŸã®?
ã衚瀺ãããŸãããç§ã«ãšã£ãŠå°é£ããããããã®ãšããŠã
ä»ã®å Žåã«ã€ããŠã¯ã ??
ãŸãã¯?!
ã§çµãããããã匷調衚瀺ããããšã§ããã解決ããããšæããŸãã
@dathinab .tryïŒïŒïŒãäœãããã£ãšè¯ããšæããŸãããããã¯ãã¯ãã«UFCSãå¿ èŠãšããŸãã
let namespace = namespace_opt.ok_or(Error::NoEntry).try!();
ããããã°èŠéãããšã¯ãããŸãããã .unwrap()
ãããå
¥åãç°¡åã§ã¯ãªãã«ããŠãåããããç°¡åã§ãã
@eddyb ïŒéåžžã®ãã€ã©ã€ããããã³ãŒãã«ã€ããŠã§ãïŒäŸïŒgithubïŒã ããšãã°ãã³ãŒãããŒã¹ãèªã¿åãå Žåã ç§ã®èŠ³ç¹ãããããšã ?
ãç°¡åã«èŠèœãšããªãããã«åŒ·åãªåŒ·èª¿è¡šç€ºãå¿
èŠãªå Žåã¯ãäžçš®ã®ééããæããŸããããã«ãããå¥ã®ãªã¿ãŒã³ãã¹ïŒ/ catch to catchïŒãå°å
¥ãããå€æ°ã®ã¿ã€ããResult<T>
ããå€æŽãããå¯èœæ§ããããŸãã T
@CryZe ïŒç§ã¯ããªãã«åæããŸãããè¿ãå°æ¥ãããåŸãããšãã§ãããšã¯æããŸããã ãããŠã .try!()
ããå°ãçããã®ãæã£ãŠããããšãããã»ã©æªãã¯ãããŸããã
@CryZeç§ããã®æ§æã奜ãã§ããã @ withoutboatsã¯ãã¡ãœãããã¯ããèšèªãå·ã€ããå¯èœæ§ãããããã€ãã®ç¢ºããªçç±ã«ã€ããŠèšåããŸããã
äžæ¹ãã¡ãœãããã¯ãã衚瀺ãããå Žåããããã?
ããŸãæ©èœãããšã¯æããŸããã
ç§ã¯æ¬è³ªçã«ãã®å°ç« ã«2ã€ã®æåã䜿çšããããšã«å察ããŠããŸããããäŸã調ã¹ããšããã ?
ã衚瀺ãããªããªã£ãå€æŽã¯èŠã€ãããŸããã§ããã
ãããåãã§ãã éåžžã®èšèªãšããã°ã©ãã³ã°èšèªã®äž¡æ¹ã§ãäžè¬ã«èšå·ã¯æ§é åã«å€ã䜿çšããããããããã¯äœããã®ããŒã¯ãŒãã§ããå¿ èŠããããšæããŸãã
@CryZe ïŒãã¶ã?try
ãããªãã®ã¯äžçš®ã®ããŒã¯ãŒãã§ãããã ããããæ£çŽãªãšãããç§ã¯ããã奜ãã§ã¯ãããŸããïŒ ?try
ïŒã
@eddyb
æ€çŽ¢æ©èœãåäœããŸã
?
ãæ€çŽ¢ãããšèª€æ€ç¥ãçºçããŸãããããŒãžã§ã³ãé·ããšèª€æ€ç¥ãçºçããå¯èœæ§ããããŸãã
æ¢ããŠãã ïŒ èª€æ€ç¥ãçºçããŸãããé·ãããŒãžã§ã³ã§ã¯çºçããªãå¯èœæ§ããããŸãã
æ§æãã€ã©ã€ã¿ãŒããããå éšçã«åŠçããããšãæåŸ ããŠããŸãïŒèª€æ€ç¥ãåé¿ããŸãïŒã å®éã®ãšããã圌ãã¯ããªã³ãžïŒè¡çªå·ã®é£ïŒã«äœããã®åœ¢ã®ããªã¿ãŒã³ãããããªããããŒã«ãŒãæ¿å ¥ããããšããã§ããŸãã
äŸãã°ã
ãããŒãããã¯ééããªã倧ãã«åœ¹ç«ã¡ãŸãã ããããããªãã¯æ¬åœã«ããªãã確èªããå¿
èŠããããŸã
ãšãã£ã¿ãŒãé©åã«æ§æããŸããããã¯åžžã«è¡ãããšã¯ã§ããŸããïŒ
ããšãã°ãGitHubã§ïŒã
2016-09-15 23:52 GMT + 02ïŒ00ã¹ãã£ãŒãã³ã¢ã¬ã³[email protected] ïŒ
äŸãã°ã
[ç»åïŒç»é¢-2016-09-15-175131]
https://cloud.githubusercontent.com/assets/310393/18568833/1deed796-7b6d-11e6-99af-75f0d7ddd778.pngâ
ããªããèšåãããã®ã§ããªãã¯ãããåãåã£ãŠããŸãã
ãã®ã¡ãŒã«ã«çŽæ¥è¿ä¿¡ããGitHubã§è¡šç€ºããŠãã ãã
https://github.com/rust-lang/rust/issues/31436#issuecomment -247465972ã
ãŸãã¯ã¹ã¬ããããã¥ãŒãããŸã
https://github.com/notifications/unsubscribe-auth/ABYmbjyrt07NXKMUdmlBfaciRZq7uBVEks5qqb4sgaJpZM4HUm_-
ã
@CryZeGitHubããªãŒãã³ãœãŒã¹ã®ã·ã³ã¿ãã¯ã¹ãã€ã©ã€ãã䜿çšããŠãããšç¢ºä¿¡ããŠããŸãã ããããåœãŠãããšãã§ããŸã:-)ã
äžè¬ã«ãRustãããžã§ã¯ãã§ã¯ãå¯èŠæ§ã«é¢ããæžå¿µã®ãã©ã³ã¹ããšãããã«ãRustã®æ§æãã€ã©ã€ã¿ãŒã?
ã§èŠèªæ§ã®é«ãã¹ã¿ã€ã«ã䜿çšããããšãæšå¥šããããšããå§ãããŸãã
?
ãããã§ã§ããæåã®éžæã ãšæããŸãããããŠãããªã§ã¯ããªãé »ç¹ã«äœ¿çšããŠããŸãã
å
ã®åæ©ã«æ»ã£ãŠã try!(...)
ã¯éªéã«ãªãããšã©ãŒã®æµããç¡èŠããŠããããŒãã¹ãèªãã®ãé£ãããªããŸãã ããã¯ãåŸæ¥ã®èšèªã®ç®ã«èŠããªãäŸå€ãšæ¯èŒããŠæ¬ ç¹ã§ãã ?
ãããè€éãªããŒã¯ãŒãã«æ¡åŒµãããšãåãæ¬ ç¹ããããŸãã
äžæ¹ã ?
ã䜿çšãããšããšã©ãŒã®æµããæ°ã«ããªãå Žåã¯ç¡èŠããŠãããã¯ã°ã©ãŠã³ãã«ãã§ãŒãã€ã³ãããããšãã§ããŸãã ãããŠããšã©ãŒã®æµããæ¬åœã«æ°ã«ãããŠãããšãã§ãã ?
ãªã衚瀺ãããŸãã ?
æãã匷調ããããšã¯ç§ã«ãšã£ãŠããå¿
èŠã§ã¯ãããŸãããããããä»ã®äººã
ãå©ãããªããããã¯çŽ æŽãããããšã§ãã ããã¯ãç®ã«èŠããªãäŸå€ãštry!
äž¡æ¹ãæ¹åãããã®ã§ãã
?!
ãããªäºçŽ°ãªå€§ããã®å°ç« ã«åãæ¿ããŠããç§ã¯ãŸã£ãã圹ã«ç«ã¡ãŸãããããšã©ãŒåŠçã³ãŒãã®èªã¿åããšæžã蟌ã¿ããããã«æªåããŸãã
å¿ã®ããã£ãæåŸã®ã³ã¡ã³ãæéïŒããã³ä»¥åã®å éšã¹ã¬ããïŒãã¿ããªã«æè¬ããŸãã ãããŸã§ã§å€ãRFCã«ã€ããŠè©±ããŠããããšãèãããšãå®å®åã«é¢ããè°è«ãéåžžã«æŽ»çºã§ããããšã«é©ããããããšã¯ãããŸããã
æåã«è¿œããããŸãããã@ rust-lang / langããŒã ã¯ã Result
ã¿ã€ãã®å€ã«é©çšããããšãã«ã ?
æŒç®åãå®å®ãããããšã決å®ããŸããã catch
æ©èœãå®å®ããŠããªãããšã«æ³šæããŠãã ããïŒå®éããŸã å®è£
ãããŠããŸããïŒã åæ§ã«ã ?
ãOption
ãããªã¿ã€ãã«æ¡åŒµããæ段ã§ãããããããããã£ãªã¢ç¹æ§ãã¯ã RFCåã®è°è«æ®µéã«ãããŸãã ãã ããçŸåšã®å®è£
ã§ã¯ãåŸã§Carrier
ãã¬ã€ããè¿œå
8æ22æ¥ã«FCPãéå§ãããŠããè¡ãããè°è«ãèŠçŽããããã«å°ãæéããããããšæããŸãã ãããã®ããŒãã®å€ãã¯ãå ã®RFCã¹ã¬ããã§ãçºçããŸããã ã¹ã¬ãããèªãããšã«èå³ãããå Žåã¯ããã®ã¹ã¬ããã®FCPã³ã¡ã³ããšèŠçŽã³ã¡ã³ããäŒè©±ã詳现ã«ã«ããŒããããšããŸãã å Žåã«ãã£ãŠã¯ããã®ã¹ã¬ããã®å¯Ÿå¿ããã³ã¡ã³ãããã詳现ãªå Žåã¯ãå ã®ã¹ã¬ããã®ã³ã¡ã³ãã«ãªã³ã¯ããŸãã
?
æŒç®åã®ã¹ã³ãŒãã¯ãçŸåšã®é¢æ°ã§ã¯ãªããçŸåšã®åŒã§ããå¿
èŠããããŸãã
ãšã©ãŒãçºçãããšãä»æ¥ã®try!
ãã¯ãã¯ããã®ãšã©ãŒãåŒã³åºãå
ã®é¢æ°ã«ç¡æ¡ä»¶ã«äŒæããŸãïŒã€ãŸãããšã©ãŒãšãšãã«return
ãå®è¡ããŸãïŒã çŸåšèšèšãããŠããããã«ã ?
æŒç®åã¯ãã®åäŸã«åŸããŸããããŠãŒã¶ãŒãããéå®ãããã¹ã³ãŒããæå®ã§ããããã«ããcatch
ããŒã¯ãŒãããµããŒãããããšãç®çãšããŠããŸãã ããã¯ãããšãã°ã x.and_then(|b| foo(b))
ãcatch { foo(x?) }
ãšæžãããšãã§ããããšãæå³ããŸãã察ç
§çã«ãæè¿ã®ããã€ãã®èšèªã§ã¯ã ?
æŒç®åã䜿çšããŠã and_then
é¡äŒŒãããã®ãæå³ããŠããŸãã
æçµçã«ã catch
ãå®è£
ããããšãããã¯ããã©ã«ãã®åé¡ã«ãªããŸãã ãŸããRustã®?
ã¯ãããã©ã«ãã®ãé¢æ°ã®ãã¬ãŒã¯ã¢ãŠããïŒã«ã¹ã¿ãã€ãºãªãã·ã§ã³ä»ãïŒãããé©åã§ãããšèããçç±ãããã€ããããŸãã
try!
ãã¯ãã¯ãéåžžã«äŸ¿å©ãªããã©ã«ããšããŠäœåºŠã蚌æãããŠããŸãã ?
ã¯ã try!
代ããã«ãªãããšãç®çãšããŠãããããåãããã«åäœããã®ã¯åœç¶ã§ãã?
ã¯ãäž»ã«çµæã®äŒæã«äœ¿çšãããŸããããã¯ãäŸå€ã«é¡äŒŒããŠããŸãã ãã¹ãŠã®äŸå€ã·ã¹ãã ã¯ãããã©ã«ãã§çŸåšã®é¢æ°ããåŒã³åºãå
ã«ãšã©ãŒãäŒæããŸãïŒSwiftã®ããã«ãããããããã«ããŒã¯ãŒããå¿
èŠãšããã·ã¹ãã ã§ãïŒã?
ã¯ãnullå€ãŸãã¯ãªãã·ã§ã³ã¿ã€ããšé¢ä¿ããããŸãã?
æŒç®åã¯ãäžèšã®ã·ããªãªã§ïŒç¹ã«ã catch
ãšçµã¿åãããŠïŒåŒãç¶ã䜿çšã§ããŸããã_main_ãŠãŒã¹ã±ãŒã¹ã§ã¯ãããŸãããand_then
å€ãã®äœ¿çšã¯ãã¡ãœããè¡šèšã䜿çšããŠãæ©èœããŸããã ããã€ãã®äºæž¬ãããå°æ¥ã®äœ¿çšïŒfuturesãªã©ïŒã¯ããããã®å Žåãasync-awaitå€æã«å«ãŸããå¯èœæ§ãŸã?
ã¯ãèŠã€ããã®ãé£ãããããå¶åŸ¡ãããŒãèŠãé ããŸãã
ããããæžå¿µã¯ã ?
æŒç®åãèŠèœãšããããããšã§ãã ããã¯æããã«ãã©ã³ã¹ããšãè¡çºã§ãã 軜éãªãªãã¬ãŒã¿ãæã€ããšã¯ããããç°¡åã«ã幞ããªéãããªããããããšãã«æ³šåããããšãã§ããŸã-ããããããã¯ãšã©ãŒãïŒæé»ã®å¶åŸ¡ãããŒãå°å
¥äŸå€ãšã¯å¯Ÿç
§çã«ïŒèµ·ããããšãã§ããå Žæã®ããã€ãã®å
åãæã£ãŠããããšãéèŠã§ãã ãŸããäœãã®ã¯ç°¡åã§ã?
ïŒäŸãã°ãæ§æ匷調ãéããŠçºèŠãããããã1 ã 2 ïŒã
ãªããã¯ããã¡ãœããåããªãã®ã§ããïŒ
?
ã®å€§ããªå©ç¹ã®1ã€ã¯ãä¿®æ£åŸã®äœçœ®ã§äœ¿çšã§ããããšã§ããã
foo.try!
ãããªãã¡ãœãããã¯ãããããåæ§ã®ã¡ãªãããåŸãããšãã§ããŸãã 確ãã«ãã¡ãœãããã¯ãã¯ãç¹ã«ã¡ãœããã®ããã«åäœããããå ŽåïŒããšãã°ãã¬ã·ãŒããŒã®ã¿ã€ãã«åºã¥ããŠãã£ã¹ããããããåå¥ã¹ã³ãŒãã䜿çšããªãå ŽåïŒãããèªäœãéåžžfoo.try!
ãããªã¡ãœãããã¯ãã䜿çšãããšã foo?
ãããããªãéãééæããããŸãïŒåã®ãã€ã³ããåç
§ïŒã
From
ã¯ã©ã®ãããªå¥çŽãæäŸããå¿
èŠããããŸããïŒ
å
ã®RFCã®è°è«ã§ã¯ã[ From
ãå¥çŽããããã¹ããã©ãã]ïŒïŒhttps://github.com/rust-lang/rust/issues/31436#issuecommentïŒã®è³ªåã延æããããšã«ããŸããã -180558025ïŒãlangããŒã ã®äžè¬çãªã³ã³ã»ã³ãµã¹ã¯ã ?
æŒç®åãFrom
ç¹æ§ãåŒã³åºããã®ãšèŠãªãå¿
èŠãããã From
ç¹æ§ã®å®è£
ã¯èªç¶ã«äœã§ãã§ãããšããããšã§ãã From
ç¹æ§ã®åœ¹å²ã¯ããšã«ããããã§ã¯ããªãå¶éãããŠããããšã«æ³šæããŠãã ãããããã¯ãããçš®é¡ã®ãšã©ãŒããå¥ã®çš®é¡ã®ãšã©ãŒã«å€æããããã«äœ¿çšãããŸãïŒãã ããåžžã«Result
ã³ã³ããã¹ãã§äœ¿çšãããŸãïŒã
ãã ãã ããã£ãªã¢ãç¹æ§ã«é¢ããè°è«ã¯é²è¡äžã§ããããã®ã·ããªãªã§ã¯åŒ·åãªèŠåããŸãã ç¹ã«ããã£ãªã¢ç¹æ§ã¯ãã¿ã€ãã®ãæåããšã倱æããæ§æãããã®ãããã³ããçš®é¡ã®å€ïŒããšãã°ã Option
ïŒãå¥ã®çš®é¡ã®å€ïŒããšãã°ã Result
ïŒã å€ãã®äººããããšã©ãŒã®ãããªãã¿ã€ãéã®ä»»æã®çžäºå€æããµããŒãããããªããšäž»åŒµã?
ã¯Option
ãResult
ã«å€æã§ããªãã¯ãã§ãïŒã æããã«ããšã³ããŠãŒã¶ãŒã¯èªåã®ã¿ã€ãã«å¿ããŠCarrier
ãã¬ã€ããå®è£
ã§ãããããããã¯æçµçã«ã¯ã¬ã€ãã©ã€ã³ã§ãããéèŠãªãã®ã ãšæããŸãã
ããŒããã©ã€ïŒ 䜿çšããã«ã¯ïŒ
ãããéæ¹åã«äºææ§ãæã£ãŠè¡ãããšã¯ã§ããªããšæããŸãã try!
ã®å®è£
ã¯ãã®ãŸãŸã«ããŠããå¿
èŠããããŸãã try!
ãéæšå¥šã«ããå¿
èŠããããŸããïŒ
@nrcãªãäžäœäºææ§ããªãã®ã§ããïŒ
@withoutboats try!(x)
ã¯(x : Result<_, _>)?
ããã_æãã§ããå Žåã¯ãããããã®ããã«å®è£
ã§ããŸãããäžè¬çã«x?
ã¯Carrier
ããµããŒããããã®ãªãäœã§ãæšæž¬ã§ããŸãç¹æ§ïŒå°æ¥ïŒã1ã€ã®äŸã¯iter.collect()?
ã§ãããã¯try!
Result
ãªããŸãããå®éã«ã¯Option
ãŸãã
ããã¯çã«ããªã£ãŠããã stdã«implãè¿œå ãããšãæšè«ããããŸãã«ãªãå¯èœæ§ãããããšãåãå ¥ãããšæããŸããã ããã§ããããåãå ¥ããŠã¿ãŸãããïŒ
ãããã«ããã try!
ã¯éæšå¥šã«ãã¹ãã ãšæããŸãã
ïŒ ã¯ã³ã³ããã¹ãã®ãããªãã«ããŒãã¿ãŒã³ã§ãã䟿å©ã§ãããtryã¯ã³ã³ããã¹ãã®ãããªãã¹ããããã¡ãœããã§ãã䟿å©ã§ãã ãããäœãæå³ããã«ãããããã¯éæšå¥šã«ãããã¹ãã§ã¯ãªããšæããŸãã
@ est31æšè«ãé€ããŠãä»ã¯ãŸã£ããåãããšãããŠããŸãã æ£ç¢ºã«äœãæå³ããã®ãããããŸãããã ?
ã¯éåžžãå³å¯ã«ã¯ãªãŒã³ã§ãïŒããã§ãã¢ãžã¥ãæšè«ïŒã äŸãæããŠããã ããŸããïŒ
@eddyb foo()?.bar()?.baz()
ã¯try!(try!(foo()).bar()).baz()
ãããåªããŠããã try!(bar(try!(foo())))
ã¯bar(foo()?)?
ãããåªããŠããŸã
ã©ã¡ãã®å Žåã?
æ¹ãèªã¿ããããšæããŸãã äžèŠãªæ¬åŒ§ã®ä¹±éããæžãããŸãã
ããã¯ãã€å®å®ããŠçéžããŸããïŒ
@ofekããã¯ãã¹ãŠã®ããã®ãã®ã§ããããŸã å®äºããŠããªãã®ã§ãèšãã®ã¯é£ããã§ãã https://github.com/rust-lang/rust/pull/36995ã¯ãåºæ¬çãª?
æ§æãå®å®ãããŸãããããã¯ã1.14ã§å®å®ããŠããã¯ãã§ãã
ïŒãè¿œå ããããšãå¿ããªãã§ãã ããå®å®ããåç §ãžã®æŒç®åïŒ https ïŒ//doc.rust-lang.org/nightly/reference.html#unary -operator-expressions
ãŸãã @ blussã¯ããã®æ¬ãå€ããªã£ãŠãããšææããŸããïŒ https ïŒ //doc.rust-lang.org/nightly/book/syntax-index.html
@tomaka
ç§ã¯å»¶é·ã«å察ã§ããïŒ ãªãã·ã§ã³ãžã
ãšã©ãŒã®ç®çã§äœ¿çšããå¿
èŠã¯ãããŸããã ããšãã°ã get
ãååŸãããããäœããã®é¢æ°ã§ãããã³ã°ããããã®ã©ãããŒã¡ãœãããäœæããå Žåã None
ã±ãŒã¹ãäŒæã§ããããã«ããããšæããŸãã
ïŒ ãšã©ãŒã®ããã ãã®ãã®ãšããŠå£²ã蟌ãŸããŸããã ãã®ãããªäžè¬çãªäŒæã®ããäžè¬çãªè¡šèšã¯ãç®æšã§ã¯ãããŸããã§ããã
2016幎10æ29æ¥ã11ïŒ08 -0400ãtickiã§[email protected] ãæžããŸããïŒ
@tomaka ïŒhttps://github.com/tomakaïŒ
ç§ã¯å»¶é·ã«å察ã§ããïŒ ãªãã·ã§ã³ãžã
ãšã©ãŒã®ç®çã§äœ¿çšããå¿ èŠã¯ãããŸããã ããšãã°ãgetãååŸãããããäœããã®é¢æ°ã§ãããã³ã°ããããã®ã©ãããŒã¡ãœãããå¿ èŠãªå Žåã¯ãNoneã®å ŽåãäŒæã§ããããã«ããããšæããŸãã
â
ããªããèšåãããã®ã§ããªãã¯ãããåãåã£ãŠããŸãã
ãã®ã¡ãŒã«ã«çŽæ¥è¿ä¿¡ããããGitHubïŒhttps://github.com/rust-lang/rust/issues/31436#issuecomment-257096575ïŒã§è¡šç€ºããããã¹ã¬ããããã¥ãŒãããŸãïŒhttps://github.com/notifications/unsubscribe -auth / AABsipGIpTF1-7enk-z_5JRYYtl46FLPks5q42DCgaJpZM4HUm_-ïŒã
ããïŒ= ?
èªäœïŒã¯å®å®ããæ©èœã«ãªããŸããïŒ ïŒé1.13ããïŒ
2ã€ã®ããã¥ã¡ã³ãã®åé¡ïŒ
Carrier
ãã¬ã€ãããã¥ã¡ã³ããæŽæ°ïŒ37751catch
ãCarrier
ãã¬ã€ãããŸã é©åã«å®è£
ãããŠãããã裞ã®?
æ©èœã ãã§ããããšã«æ³šæããŠãã ããã
Carrier
ãååšãã ?
ã䜿çšãããšãšã©ãŒã¡ãã»ãŒãžããããåç
§ããããããã£ãªã¢ã®åé¡ãæåŠãããã®ã§ã¯ãªãä¿®æ£ãããæ¹ãããã§ãããã ããã¥ã¡ã³ãã¯Optionçšã«å®è£
ãããŠããããšãåç
§ããŠãããããããã¥ã¡ã³ããæŽæ°ããå¿
èŠããããŸãã ïŒããã¯èª€ãã§ãïŒã
Carrier
èšè¿°ãåé€ããå¿
èŠããããŸãã å°ãªããšãCarrier
ããã¥ã¡ã³ãããOption
èšåãåé€ããå¿
èŠãããããã«æããŸããCarrier
ãã¬ã€ããšã®çžäºäœçšã®ããããã®åé¡ã«T-libs
ãè¿œå ããŸã
@cramertjãééãã質åïŒ https ïŒ //internals.rust-lang.org/t/grammatical-ambiguity-around-catch-blocks/4807
ããã«ã¡ã¯; ïŒ31954ã§ã¯ããšã©ãŒã¿ã€ãã®ã¢ãããã£ã¹ãã¯From
ã䜿çšããŠè¡ãããŸãïŒçŸåšã®ãããã§ãåæ§ã§ãïŒãã RFC 243ã§ã¯å€æã«Into
ã䜿çšããå¿
èŠããããšæ確ã«è¿°ã¹ãŠããŸãã
代ããã«From
ã䜿çšãããçç±ã¯ãããŸããïŒ ããã€ãã®äžè¬çãªãšã©ãŒã¿ã€ãïŒã€ãŸãã io::Error
ããŸãã¯å€éšã¯ã¬ãŒãå
ã®ä»ã®äœãïŒã«ã¢ãããã£ã¹ãããããšãããšãããŒã«ã«ãšã©ãŒã¿ã€ãã«From
ãå®è£
ã§ããŸããã
ïŒRFC 243ã®äœæè
ãšããŠã®FWIWã¯ã From
ãšInto
ã©ã¡ããæãŸãããã«ã€ããŠã¯ããŸãèããŠããŸããã§ãããæ£ããéžæããããã©ããã¯ããŸã£ããããããŸããã§ããã質åã¯ãRFCã«æžãããŠããããšã§ã¯ãªããã¡ãªããïŒãã®æç¹ã§ã¯äžäœäºææ§ãå«ãŸããŠããå¯èœæ§ããããŸãïŒã«åºã¥ããŠæ±ºå®ããå¿
èŠããããŸããïŒ
æ²ããããšã«ãååž°ããããŸãã ç¡ïŒéèªæãªïŒå ŽåFrom<...>
ã€ã³ã¹ã¿ã³ã¹ãšã©ãŒã¿ã€ãã«å¯ŸããŠå®æœãããã³ã³ãã€ã©ã䜿çšããå Žåããããæšæž¬ããããšãã§ããªãç¹å®ã®å Žåã«ã¿ã€ããæšå®ããããšãã§ããInto
ïŒã®ã»ããFrom
ã€ã³ã¹ã¿ã³ã¹ã¯çŸåšã®ã¯ã¬ãŒãã«ãã£ãŠå¶éãããŠãããã¯ã¬ãŒãã®ã³ã³ãã€ã«äžã¯Into
ã€ã³ã¹ã¿ã³ã¹ã®ãã«ã»ããã¯äžæã§ãïŒã
https://play.rust-lang.org/?gist=6d3ee9f93c8b40094a80d3481b12dd00ïŒsrc / librustc / util / ppaux.rsïŒL81ã®fmt::Error
ã«é¢é£ããçŸå®ã®åé¡ãããç°¡ç¥åãïŒãåç
§ããŠãã ããã
?
ã®èšè¿°ã«é¢ããŠå€ããã®ã«åã£ãŠä»£ããæ°ããRFCããããŸãïŒrust-lang / rfcs / pull / 1859
ç§ã¯catch
ãããã¯ãæã£ãŠããããšã«-1ã§ããããããã¯ãã§ã«ã¯ããŒãžã£ãŒã§ã¯ããã«ç°¡æœã§ãã
ã¯ããŒãžã£ã¯ããããŒå¶åŸ¡ã¹ããŒãã¡ã³ãã«å¹²æžããŸãã ïŒ break
ã continue
ã return
ïŒ
https://github.com/rust-lang/rfcs/pull/1859ãããŒãžããããã®åé¡ã远跡ã®åé¡ãšããŠåå©çšããŠãããšäž»åŒµããŠããã®ã§ã catch
ãåè©äŸ¡ããããšãææ¡ããããšæãcatch
éšåã
ç§ã¯ãæã
ã¯å®å
šã«ãããåãé€ãããšãææ¡ããŠããªããã ãã©ããžã®ç±æcatch
ãããããã ã£ããšããŠå倧ãªããã§ã¯ãªãã£ã?
ããã¯ãŸã å
ã®äžã§çã«ããªã£ãŠããããšã確èªããç§ã¯ããã®äŸ¡å€ãäœããšæããŸã?
ã§åºçŸãã Try
ã«ç
§ãããŠåºçŸãããšäºæ³ãããã€ãã£ãªã ã®äžéšã
ç§ã¯ãŸã ãã£ããããããšæã£ãŠããŸãã ä»æ¥ã®åãã«ããã£ãããå®å®ããŠããã°åé¿ã§ããæ¹æ³ã§ã³ãŒããããããªããã°ãªããŸããã§ããã
ãã®æ©èœã¯ãæ§ædo catch
ã§æ¯æ©å®è£
ãããŠããŸããã
@withoutboatsã¯ãã catch { ... }
ã¯æ§é äœãªãã©ã«ïŒ struct catch { }; catch { }
ïŒãšç«¶åãããããçŸåšã¯do catch
ã§ãã
ã
@archshift @SimonSapinãäžã§ææããããã«ãã¯ããŒãžã£ã¯break
ã continue
ãããã³return
å¹²æžããŸãã
@bstrieæè¿ã¯catch
ããªãé »ç¹ã«æ¬²ãããšæããŸãã ãªãã¡ã¯ã¿ãªã³ã°äžã«å€ãçºçããŸãã
æ§æãšããŠdo catch
ãèŠæ±ããããšãèšç»ããŠããããšã«æ°ã¥ããŸããã§ããã å®éã®ç Žæã®ãªã¹ã¯ãéåžžã«äœãããã«æãããå ŽåïŒã©ã¡ããæ§é äœã®åœåã¬ã€ãã©ã€ã³ã«éåããã³ã³ã¹ãã©ã¯ã¿ãŒãã¹ããŒãã¡ã³ãã®æåã®åŒã«ããå¿
èŠããããŸãïŒããã¯æ»ãäœçœ®ä»¥å€ã§ã¯ãŸãã§ãïŒïŒãããããrustfmtã掻çšããŠåé¡ã®ããèå¥åãcatch_
æžãæããŸããïŒ ãããããããããã«Rust2.0ãå¿
èŠãšãããªãããŸããç§ã¯ãã€ãRust2.0ããšã«ããäºçŽ°ãªç Žå£çãªå€æŽã ããå«ãã¹ãã§ãããšèšã人ã§ãã...ïŒP
@bstrie do catch
é·æçã«èŠæ±ããããšã¯çµ¶å¯Ÿã«æãã§ããŸããã ä»ã®ãšãããã®æ§æã䜿çšããããšã«ãªã£ãè°è«ã¯ããã«ãããŸãïŒ https ïŒ
çŽ æŽããããã³ã³ããã¹ãã«æè¬ããŸãã
catch
ãå®å®ããŠããããšãæã¿ãããã§ã¯ãªãããšãåŠã°ãªããã°ãªããªãã£ãã®ã§ãããã«æ¥ãŸãããããã§ãããã¡ããã ?
ãå®å®ããŠããã®ã§ã catch
ããããšããã§ããã
ç§ã¯ããã®æ®ãã®éšåã§ã©ããŸã§å°éããããèŠããã£ãããdocatchã®è°è«ãèŠãŸããã
ç§ã¯ãã®ãããªå Žåã«åœ¹ç«ã€ããããã°ãããèããæ€èšããŠããŸããïŒãªãã·ã§ã³ã§ããŒã¯ãŒãã®åã«@ãŸãã¯ä»ã®å°ç« ãä»ããŠããã¹ãŠã®æ°ããããŒã¯ãŒãã«å°ç« ã®ã¿ã䜿çšãããã ã³ã«ãŒãã³ã®è°è«ã§ãåæ§ã®åé¡ããããŸããã ããã§è§£æ±ºçãšããŠããã«å ¥ã£ããã©ããã¯æãåºããŸãããããããããããŸããããããã¯ä»åŸãç¶ãå¯èœæ§ããããŸãã
FWIWãCïŒã¯å®éã«ã¯å察ã®ããšããµããŒãããŠããŸãïŒèå¥åãšããŠããŒã¯ãŒãã䜿çšããããã®@
ã ããã¯Razorã§ããèŠããã new { <strong i="6">@class</strong> = "errorbox" }
ãªã©ãæž¡ããŠHTMLããŒãã«ããããã£ãèšå®ããŸãã
@scottmcm
ããã¯é¢çœãã ç§ã¯ããã«ã€ããŠç¥ããŸããã§ããã ããããRustã®å Žåãäºææ§ããããããéã®æ¹åã«é²ãå¿
èŠããããŸãã
ãããã圌ãã®åŽã®çŽ æŽãããã¢ã€ãã¢ã .netãšã³ã·ã¹ãã ã«ã¯å€ãã®èšèªãããããã¹ãŠãç°ãªãããŒã¯ãŒããæã¡ããã¹ãŠãçžäºã«åŒã³åºãããšãã§ããŸãã
ããŒã¯ãŒãã®å°æ¥ã®ãã1ã€ã®å¯èœæ§ã¯ãããçš®ã®å®å®ãã#[feature]
ããã«ãå±æ§ã®åŸãã«ããŒã¯ãŒããé
眮ããããšã§ãã
ãã®åé¡ã¯ãé·æçã«ã¯ããäžè¬çãªè§£æ±ºçãå¿ èŠã«ãªããšæããŸãã
@camlornãã®ã¹ã¬ããã¯ãç¹ã«Rustã®ããšããã¯ãã«é¢ããã¢ãŒãã³ã®ã¢ã€ãã¢ã«èå³ããããããããŸããïŒ https ïŒ //internals.rust-lang.org/t/pre-rfc-stable-features-for-breaking-changes/5002
ããã®åé¡ã®èª¬æããhttps://github.com/rust-lang/rust/issues/42327ããªã³ã¯ããå¿ èŠããããšæããŸãã ïŒãŸããRFCããã¹ããæŽæ°ããŠãããã§ã¯ãªãããã«ãªã³ã¯ããå¿ èŠããããããããŸãããïŒ
ïŒç·šéïŒã³ã¡ã³ããæçš¿ããŸãããã誰ã賌èªããŠãããã©ããã¯ããããŸããïŒïŒ
@camlornãã ãããrustfmtã¯ãã°ããã®éãäºçŽ°ãªæžãçŽããè¡ã£ãåŸãããŒã¯ãŒãã«ãªããŸãããšãããã¹ãéãå¯èœæ§ããããŸãã AKAã¯ãå®å®æ§ä¿èšŒã®ãšã¹ã±ãŒãããããå©çšããŠããäž¡æ¹ã§æ©èœããããã«èšè¿°ãããå¯èœæ§ã®ããè¿œå ã®æ³šéãããã°å£ããŸãããã ãŸããæšè«ã®å€æŽã«é¢ããUFCSãšåæ§ã«ãæ¶ç©ºã®ãå®å šã«ç²Ÿå·§ãªåœ¢åŒã§ä¿åãã¢ãã«ã䜿çšãããšãå€ãæšæ ãæ©èœããç¶ããããšãã§ããŸãã
catchãããã¯ã®æ§æãdo { ⊠}
ã ãã ã£ããšããŠãã ?{ ⊠}
ã ã£ããšããŠãããŸããŸããã
do
ã¯ããã§ã«ããŒã¯ãŒãã§ãããšããåªããç¹æ§ããããŸãã Haskellã®ãããªdo
è¡šèšãåŒã³åºããšããçãããïŒèŠç¹ã«ãã£ãŠã¯ïŒããããã£ããããŸãããããã¯éå»ã®äœ¿çšãåæ¢ããããšã¯ãªããããã¯ãŠãŒã¹ã±ãŒã¹ã«ããè¿ããã®ã§ãã
èŠãç®ã䌌ãŠããŸãããææ¡ãããjavascriptãšã¯ç°ãªãåäœã
ãã®ææ¡ã¯ããã§ã«è£žã®ãããã¯ãåŒãšããŠäœ¿çšããŠããRustã«ã¯ããŸãé¢ä¿ããããŸããã
ã©ã¡ããåãããã«èŠããŸããããŸã£ããç°ãªãããšããããããæ··ä¹±ã®å¯èœæ§ãææããŠããŸããã
Haskellã®ãããªdo-notationãåŒã³åºããšããçãããïŒããªãã®èŠç¹ã«å¿ããŠïŒç¹æ§ããããŸã
@rpjohnst ResultãšOptionã¯ã¢ããã§ãããããå°ãªããšãæŠå¿µçã«ã¯äŒŒãŠããŸãã ãŸããå°æ¥çã«ãã¹ãŠã®ã¢ããããµããŒãããããã«æ¡åŒµããã«ã¯ãäžäœäºææ§ãå¿ èŠã§ãã
ããã§ããéå»ã«ã¯ãã¢ããã«æŠå¿µçã«äŒŒãŠãããã®ã«do
ãè¿œå ãããšãå®å
šã«ãµããŒããããŠããªããšã人ã
ãæ²ãããªããšããå察æèŠããããŸããã
åæã«ãå®å
šãªdo-notationãšäžäœäºææ§ãæãããããšã¯ã§ããŸãããå®å
šãªdo-notationãè¿œå ããã¹ãã§ã¯ãããŸããã if
/ while
/ for
/ loop
ãŸãã¯break
/ continue
/ã®ãããªå¶åŸ¡æ§é ã§ã¯æ§æã§ããŸããã return
ãããã¯ã catch
ïŒãŸãã¯ãã®å Žåã¯do
ïŒãããã¯å
ããã³ãããã¯catch
ãããã¯ã®å
容ãäžé£ã®ãã¹ããããã¯ããŒãžã£ã«è©°ã蟌ããšãçªç¶ãã¹ãŠã®ãã¬ãŒã¯ãå¶åŸ¡ããããã§ããïŒ
ãããã£ãŠãæçµçã«ããã®do
æ¬ ç¹ã¯ãå®éã«ã¯doè¡šèšã§ã¯ãªããdoè¡šèšã«ãªãããã®é©åãªãã¹ããªãdoè¡šèšã®ããã«èŠããããšã§ãã å人çã«ã¯ãRustã¯ãšã«ããdo
è¡šèšãååŸããªãã®ã§ãããã§ãŸã£ããåé¡ãããŸããããããã¯æ··ä¹±ã§ãã
@ nikomatsakis ãïŒ42526ãããŒãžããã远跡ãªã¹ãã§å®äºãšããŠããŒã¯ã§ããŸã:)
catch
ããŒã¯ãŒããã³ã³ããã¹ãã«åãããŠäœæããããšã¯ã§ããŸããã struct catch
ãã¹ã³ãŒãå
ã«ããå Žåã¯ç¡å¹ã«ããŠãéæšå¥šã®èŠåãçºè¡ããŸããïŒ
ãããã©ãã»ã©é©åãã¯ããããŸãããã return
ã䜿çšãããšãã«çŸåšå¯èœã§ãããšã©ãŒå€ã§ã¯ãªããokãäžæ¢ãããå Žåããããšããç¹ã§ãããããããã解決ããå¿
èŠãããåé¡ã«ééããŸããã _outer_ãä»ããŠ_inner_ãšã©ãŒãäžæ¢ããŸãã é¢æ°sayãOption<Result<_,_>>
ãè¿ããšãã®ããã«ãããã¯sayã€ãã¬ãŒã¿ããéåžžã«äžè¬çã§ãã
ç¹ã«ãçŸåšç§ãè±å¯ã«äœ¿çšããŠãããããžã§ã¯ãã«ãã¯ãããããŸãã
macro-rules! option_try {
( $expr:expr ) => {
match $expr {
Ok(x) => x,
Err(e) => return Some(Err(e.into())),
}
}
}
Iterator::next
å®è£
å
ã§åŒã³åºãããé¢æ°ã¯ã倱æãããšããã«Some(Err(e))
ã§äžæ¢ããå¿
èŠãããããšã¯éåžžã«äžè¬çã§ãã ãã®ãã¯ãã¯éåžžã®é¢æ°æ¬äœã®å
éšã§æ©èœããŸãããcatchã¯return
ã«ããŽãªå¥ã«ååŸãããç¹å¥ãª?
æ§æã®ã¿ãååŸãããããcatchãããã¯ã®å
éšã§ã¯æ©èœããŸããã
æçµçã«ã©ãã«ä»ããªã¿ãŒã³ã¯catch
ãããã¯ã®ã¢ã€ãã¢å
šäœãåé·ã«ããŸãããããã§ã¯ãããŸãããïŒ
ïŒ41414ãå®äºããããã§ãã 誰ããOPãæŽæ°ã§ããŸããïŒ
æŽæ°ïŒRFC rust-lang / rfcsïŒ2388ãããŒãžãããããã catch { .. }
ã¯try { .. }
眮ãæããããŸãã
ãã®ã³ã¡ã³ãã®ããäžã«ãã远跡ã®åé¡ãåç
§ããŠãã ããã
ããã¯Edition2015ã«ãšã£ãŠäœãæå³ããŸããã do catch { .. }
æ§æã¯ãŸã å®å®åãžã®éãé²ãã§ããŸããããããšãããã¯åé€ãããEdition 2018+ã§ã¯try { .. }
ãä»ããŠã®ã¿ãµããŒããããŸããïŒ
@ Nemo157åŸè ã
çŸåšã®ææ¡ã«ã¯2ã€ã®ã¹ããŒãã¡ã³ãtry ... catch ...
ããããŸããïŒ ãããããªããç§ã¯ã»ãã³ãã£ã¯ã¹ãååŸããŸããã
ãšã«ããããã®ææ¡ãè±ç³ã ãã«é¢ãããã®ã§ããã°ãç§ã¯ããã§ãã£ãããã§ãã ã€ãŸãã catch
ãããã¯ã¯ã ?
æŒç®åãçµäºããå Žæãå€æŽããã ãã§ããïŒ
äžéšã®æçš¿ã§ãã¹ãŠã®ãã§ãã¯ããã¯ã¹ããªã³ã«ãªã£ãŠããã®ã§ããã€å ã«é²ã¿ãŸããïŒ ããã§ãæªè§£æ±ºã®åé¡ãããå Žåã¯ãæ°ãããã§ãã¯ããã¯ã¹ãè¿œå ããå¿ èŠããããŸãã
ãããããèšé²ãããŠããªãæªè§£æ±ºã®è³ªåãããããæ®ã£ãŠããŸãã
ããšãã°ãok-wrappingã®åäœã¯ãlangããŒã å
ã§è§£æ±ºãããŸããããŸãã Try
ã®èšèšã¯ç¢ºå®ãããŸããã ãã®åé¡ã¯ããã®æçšæ§ãè¶
ããŠããå¯èœæ§ãé«ãããããããããã®åé¡ãããã«ããã€ãã®å¯Ÿè±¡ãçµã£ãåé¡ã«åå²ããå¿
èŠããããŸãã
ããŒã...ãããã®è³ªåãèšé²ãããŠããªãã®ã¯æ°ã«ãªããŸãã
@ mark-imæ確ã«ããããã«ãç§ã¯åœŒããã©ããã«ãããšæããŸãã ãããã1ã€ã®å Žæã§ã¯ãããŸããã ããŸããŸãªRFCãåé¡ãªã©ã§å°ãæ£ãã°ã£ãŠããATMãªã®ã§ãé©åãªå Žæã«èšé²ããå¿ èŠããããŸãã
ãããã³ã°ãã¬ã€ãã®ãã¶ã€ã³ã¯https://github.com/rust-lang/rust/issues/42327ã§è¿œè·¡ãããŠã
ãããã£ãŠãããã«ã¯try{}
ãæ®ã£ãŠãããšæããŸããç§ãç¥ã£ãŠããå¯äžã®äžäžèŽã¯ãRFCã§è§£æ±ºãããäžèšã®åé¡ã®1ã€ã§å確èªããããã®ã§ãã ãã ããæ確ãªè¿œè·¡ã®åé¡ããããšããã§ãããã
ãŸã å®è¡ããå¿ èŠãããããšãããã£ãŠããä¿çäžã®å®è£ ã¿ã¹ã¯ã®ãã§ãã¯ããã¯ã¹ãè¿œå ããŸã...
@scottmcm @joshtriplettãOKã©ããã³ã°ïŒ try
RFCã«èšèŒïŒã«ã€ããŠæžå¿µãæã£ãŠããããšãç¥ã£ãŠããŸããå人çã«ã¯ã try { .. }
ã®åæå®å®åã§break
ãå¶éããããšæããŸãã loop { try { break } }
ãªã©ã¯ã§ããŸããã
@Centril
loop { try { break } }
ãã§ããªãããã«
çŸåšãéã«ãŒããããã¯ã§break
ã䜿çšããããšã¯ã§ããŸãããããã¯æ£ããããšã§ãã break
ã¯ã«ãŒãã§ã®ã¿äœ¿çšããå¿
èŠããããŸãã try
ãããã¯ãæ©æã«æ®ãããã®æšæºçãªæ¹æ³ã¯ã Err(e)?
ãæžã蟌ãããšã§ãã ãããŠããã¯åæã®èãåžžã«ãç°åžžãªãå¶åŸ¡çµè·¯ã«ããããšã匷å¶ããŸãã
ãããã£ãŠãç§ã®ææ¡ã¯ãããªãã瀺ããã³ãŒãã¯èš±å¯ãããã¹ãã§ããã try
æ®ãã ãã§ãªãã loop
ãå£ãã¯ãã§ãã
çŽæ¥ã®å©ç¹ã¯ã break
ã衚瀺ããããšãã«ãã«ãŒãããæãåºãããšããŠããããšãç¥ã£ãŠããããšã§ãããã€ã§ãcontinue
眮ãæããããšãã§ããŸãã ãŸãã loop
å
ã§try
ãããã¯ã䜿çšããŠããŠãã«ãŒããçµäºããå Žåã«ããã¬ãŒã¯ãã€ã³ãã«ã©ãã«ãä»ããå¿
èŠããªããªããŸãã
@Centrilããããè²ãŠãŠãããŠããããšãã
break
ã«é¢ããŠtry
ã¯break
ãæ°ã«ãããå
å«ã«ãŒãã«æž¡ããããšèšã£ãŠãåé¡ãããŸããã break
ãtry
ãšçžäºäœçšããããšããŸã£ããæãã§ããŸããã
Ok
ã©ããã³ã°ã«ã€ããŠã¯ãã¯ãã try
å®å®ãããåã«å¯ŸåŠããããšæããŸãã
@centrilã¯ããæ¿ç¥ããŠããŸãã ããããããã¯ããã¯åé¡ãæèµ·ååã ããšãèŠããŠããããšãéèŠã§ãã RFCã¯ãããæã€ããšã決å®ãããããªãã§å®è£ ãããŸãããããã®åŸãå ã®æå³ã_åã³_åãããå®è£ ã¯RFCã«åŸãããã«å€æŽãããŸããã ãããã£ãŠãç§ã®å€§ããªè³ªåã¯ãç¹ã«ãããRFC + IRLOã§è°è«ãããäžã§æãéšã ãããããã¯ã®1ã€ã§ããããšãèãããšãéèŠãªäºå®ãå€æŽããããã©ããã§ãã
@scottmcmãã¡ããããåç¥ã®ããã«ãç§ã¯Ok
-wrapping;ïŒãä¿æããããšã«åæããåé¡ã解決ãããšèŠãªãããã¹ãã§ããããšã«åæããŸãã
ããã«ã€ããŠã³ã¡ã³ããããã£ãã®ã§ããããããæ£ãããã©ããã¯ããããŸããã
åºæ¬çã«ãç§ãæ±ããŠããç¶æ³ã¯GUIãã¬ãŒã ã¯ãŒã¯ã§ã®ã³ãŒã«ããã¯ã§ã- Option
ãŸãã¯Result
ãè¿ã代ããã«ã UpdateScreen
ãè¿ãå¿
èŠããããŸããæŽæ°ããå¿
èŠããããã©ããã å€ãã®å Žåããã°ãèšé²ããå¿
èŠã¯ãŸã£ãããªãïŒãã¹ãŠã®ãã€ããŒãšã©ãŒã«ãã°ãªã³ããã®ã¯å®éçã§ã¯ãããŸããïŒããšã©ãŒãçºçãããšãã«UpdateScreen::DontRedraw
è¿ãã ãã§ãã ãã ããçŸåšã®?
æŒç®åã§ã¯ããããåžžã«èšè¿°ããå¿
èŠããããŸãã
let thing = match fs::read(path) {
Ok(o) => o,
Err(_) => return UpdateScreen::DontRedraw,
};
TryæŒç®åã䜿çšããŠResult::Err
ããUpdateScreen::DontRedraw
å€æã§ããªããããããã¯éåžžã«é¢åã«ãªããŸããããã·ã¥ãããã§åçŽãªã«ãã¯ã¢ããã倱æããããšããããããŸãïŒããã¯ãšã©ãŒã§ã¯ãããŸããïŒã ïŒ-1åã®ã³ãŒã«ããã¯ã§?
æŒç®åã5ã10å䜿çšããããšããããããŸãã äžèšã¯æžãã®ãéåžžã«åé·ãªã®ã§ãç§ã®çŸåšã®è§£æ±ºçã¯ããã®ããã«impl From<Result<T>> for UpdateScreen
ã次ã«æ¬¡ã®ããã«ã³ãŒã«ããã¯ã§å
éšé¢æ°ã䜿çšããããšã§ãã
fn callback(data: &mut State) -> UpdateScreen {
fn callback_inner(data: &mut State) -> Option<()> {
let file_contents = fs::read_to_string(data.path).ok()?;
data.loaded_file = Some(file_contents);
Some(())
}
callback_inner(data).into()
}
ã³ãŒã«ããã¯ã¯é¢æ°ãã€ã³ã¿ãŒãšããŠäœ¿çšãããããã -> impl Into<UpdateScreen>
䜿çšã§ããŸããïŒäœããã®çç±ã§ã impl
è¿ãããšã¯çŸåšé¢æ°ãã€ã³ã¿ãŒã§ã¯èš±å¯ãããŠããŸããïŒã ãããã£ãŠã Try
æŒç®åã䜿çšããå¯äžã®æ¹æ³ã¯ãå
éšé¢æ°ã®ããªãã¯ãå®è¡ããããšã§ãã ç§ãåã«ãã®ãããªããšãããããšãã§ããã°ããã¯çŽ æŽãããã§ãããïŒ
impl<T> Try<Result<T>> for UpdateScreen {
fn try(original: Result<T>) -> Try<T, UpdateScreen> {
match original {
Ok(o) => Try::DontReturn(o),
Err(_) => Try::Return(UpdateScreen::DontRedraw),
}
}
}
fn callback(data: &mut State) -> UpdateScreen {
// On any Result::Err, convert to an UpdateScreeen::DontRedraw and return
let file_contents = fs::read_to_string(data.path)?;
data.loaded_file = Some(file_contents);
UpdateScreen::Redraw
}
çŸåšã®ææ¡ã§ãããå¯èœãã©ããã¯ããããŸããããæ€èšã®ããã«ãŠãŒã¹ã±ãŒã¹ãè¿œå ãããã£ãã ãã§ãã ã«ã¹ã¿ã ã®TryæŒç®åããã®ãããªãã®ããµããŒãã§ããã°çŽ æŽããããšæããŸãã
ç·šéïŒ
ç§ãééããŸããã
ãã®æçš¿ã¯ç¡èŠããŠãã ãã
ããã¯åæšè«ã§ããŸãæ©èœããã§ãããããåçŽãªå Žåã§ã倱æããŸãã
fn test_try(a: u32, b: u32) {
let div = if b != 0 {
Some(a / b)
} else {
None
};
let x // : Option<_> // why is this type annotation necessary
= try { div? + 1 };
println!("{:?}", x);
}
ãããtryãããã¯ã®ä»£ããã«ã¯ããŒãžã£ã䜿çšããããã«æžãçŽãããå ŽåïŒãããŠãã®éçšã§ç·©ãèªåã©ããã³ã°ïŒã次ã®ããã«ãªããŸãã
fn test_closure(a: u32, b: u32) {
let div = if b != 0 {
Some(a / b)
} else {
None
};
let x = (|| (div? + 1).into())();
println!("{:?}", x);
}
ããã¯åã¢ãããŒã·ã§ã³ãå¿ èŠãšããŸããããçµæãã©ããããå¿ èŠããããŸãã
@KrishnaSannasiã¯ããŒãžã£ããŒã¹ã®äŸã§ãåæšè«ã®å€±æããããŸãïŒ playground ïŒã Into
ã¯åºåãå¶çŽãããåŸã§äœ¿çšããå Žæã§ã¯äœ¿çšããªãããã§ãã
ããã¯äž»ã«ã try
ãããã¯ã§ã¯ãªãTry
ç¹æ§ã®åé¡ã®ããã§ããããã¯ã Into
ãšåæ§ã«ãå
¥åããåºåã«åæ
å ±ãäŒæããªãããã§ããåºåã¿ã€ãã¯ãåŸã§äœ¿çšããããšã«ãã£ãŠå€å¥ã§ããå¿
èŠããããŸãã https://github.com/rust-lang/rust/issues/42327ã«ç¹æ§ã«ã€ããŠã®è°è«ããããããããŸãããç§ã¯ãããèªãã§ããªãã®ã§ãããã«ããææ¡ã®ããããããã®åé¡ãä¿®æ£ã§ãããã©ããã¯ããããŸããã
@ Nemo157
ã¯ããã³ãŒãã䜿çšããããã«æåŸã®æåŸã®å€æŽãè¡ããŸãããããã¹ãã¯ããŸããã§ããã ç§ã®æªãã
ãã©ã€ãããã¯ã®å®å®åããã©ã®ãããé¢ããŠããŸããïŒ ããã¯ç§ãæ¯æ©ããå¿ èŠãšããå¯äžã®æ©èœã§ãïŒD
@Arignir
ãããã§ããã°ãå®å®ã§ãããšæããŸãã
try {} catchïŒãŸãã¯ä»ã®æ¬¡ã®IDïŒããããã¯ããŠãå°æ¥ã®ããã«ãã¶ã€ã³ã¹ããŒã¹ãéãããŸãŸã«ãã代ããã«ããããã§ããããããšãè¡ãæ¹æ³ã人ã ã«ç€ºããŸãã
å°æ¥ã®ããã«ãã¶ã€ã³ã¹ããŒã¹ãéãããŸãŸã«ããå¯èœæ§ãæ®ããªãããçŸåšãã®æ©èœãèš±å¯ããäžéèšèšã¯ãããŸãããïŒãããã£ãŠãæçµçã«ã¯catch
ãããã¯ïŒïŒ
ç§ãäœã£ãPRã¯ãšã«ãããã®ããã¯ã¹ããã§ãã¯ããå¿ èŠããããŸããCC @nikomatsakis
ç§ã¯æšæ¥ãããåããŠäœ¿çšããããšããŸããããããŠç§ã¯ããã«å°ãé©ããŠããŸããïŒ
#![feature(try_blocks)]
fn main() -> Result<(), ()> {
let x: () = try {
Err(())?
}?;
Ok(x)
}
ã®ããã«ã³ã³ãã€ã«ãããŸãã
error[E0284]: type annotations required: cannot resolve `<_ as std::ops::Try>::Ok == _`
ããããç§ã¯ããªããã°ãªããŸããã§ãã
#![feature(try_blocks)]
fn main() -> Result<(), ()> {
let x: Result<(), ()> = try {
Err(())?
};
let x = x?;
Ok(x)
}
代ããã«ã
ããã¯æåã¯æ··ä¹±ããŠããã®ã§ããšã©ãŒã¡ãã»ãŒãžãå€æŽãããã --explain
èšåãã䟡å€ããããŸããïŒ
æåã®äŸã®çå笊ãå°ãäžã«ç§»åãããš
#![feature(try_blocks)]
fn main() -> Result<(), ()> {
let x: () = try {
Err(())?
};
Ok(x?)
}
ããè¯ããšã©ãŒã¡ãã»ãŒãžã衚瀺ãããŸãã Rustã¯ãäžè¬çã§ããããã try { ... }
ã解決ããã¿ã€ãã決å®ã§ããªãããããšã©ãŒãçºçããŸãã ãã®ã¿ã€ãã解決ã§ããªãããã <_ as Try>::Ok
ã¿ã€ããäœã§ããããç¥ãããšãã§ããŸããããã®ããããšã©ãŒãçºçããŸããã ïŒã®ã§ã ?
ãªãã¬ãŒã¿ã¯ã¢ã³ã©ããTry
ã¿ã€ããšããã¯äžããTry::Ok
ã¿ã€ãïŒã Rustã¯ãããèªäœã§ã¯Try::Ok
ã¿ã€ãã§ã¯æ©èœããŸãããããã¯ã Try
ãã¬ã€ããšããã®ãã¬ã€ããå®è£
ããã¿ã€ãã«ãã£ãŠè§£æ±ºããå¿
èŠããããŸãã ïŒããã¯ãã¿ã€ããã§ãã¯ãæ©èœããçŸåšã®æ¹æ³ã®å¶éã§ãïŒ
ãã®æ©èœã®ãã¹ãŠãå®è£ ãããŠããŸãããïŒ ãããããªããå®å®ããåã«ããã«åº§ã£ãŠããããšãã©ã®ãããèŠããã§ããïŒ
ããã欲ãããã©ããã¯ãŸã æªè§£æ±ºã®åé¡ã ãšæããŸããã ç¹ã«ãããã§äŸå€ã®èšèªã䜿çšãããã©ããã«ã€ããŠããã€ãã®è°è«ããããŸããïŒtryãcatchïŒã
å人çã«ã¯ãRustã«ã¯äŸå€ã®ãããªå°è±¡ãäžããããšããããšã«åŒ·ãå察ããŠããŸãã ç¹ã«catch
ãšããåèªã䜿çšããããšã¯æªãèãã ãšæããŸããäŸå€ã®ããèšèªããæ¥ã人ã¯èª°ã§ãããããã»ã©ãããšæã蟌ãã§ããããã§ãã æããã®ã¯æ··ä¹±ããèŠçã ãšæããŸãã
ç¹ã«ãããã§äŸå€ã®èšèªã䜿çšãããã©ããã«ã€ããŠããã€ãã®è°è«ããããŸããïŒtryãcatchïŒã
https://github.com/rust-lang/rfcs/pull/2388ã¯ãååãšããŠtry
ãåãå
¥ãããããã©ããã決å®çã«è§£æ±ºãããšæããŸãã ããã¯æªè§£æ±ºã®è³ªåã§ã¯ãããŸããã ãããã Try
ç¹æ§ãšOk
ã©ããã³ã°ã®å®çŸ©ã¯ããã§ããããã§ãã
Ok
-wrappingã¯ãå
ã®RFCã§ãã§ã«æ±ºå®ãããŠãããå®è£
äžã«åé€ãããæåŸã«åŸã§å床远å ãããŸããã ãããã©ã®ããã«æªè§£æ±ºã®è³ªåã§ãããããããŸããã
@rpjohnstããã¯ãJoshãå
ã®RFCã®æ±ºå®ã«åæããªãã£ãããã§ã... :)ããã¯ç§ã«ãšã£ãŠè§£æ±ºãããåé¡https://github.com/rust-lang/rust/issues/31436#issuecomment -427096703ã https://github.com/rust-lang/rust/issues/31436#issuecomment -427252202ãããã³httpsïŒ//ã§github.com/rust-lang/rust/issues/31436#issuecomment-437129491 ã ãšã«ãã...ç§ã®ã³ã¡ã³ãã®ãã€ã³ãã¯ããäŸå€ã®èšèªããšããŠã®try
ã¯è§£æ±ºãããåé¡ã§ãããšããããšã§ããã
ãããŒãããã¯ãã€èµ·ãã£ãã®ïŒ ç§ãèŠããŠããæåŸã®ããšã¯ãå éšã«é¢ããè°è«ã§ããã Ok-ã©ããã³ã°ã«ãéåžžã«å察ã§ã:(
Ewwã ãããèµ·ãã£ããšã¯ä¿¡ããããŸããã Ok
-wrappingã¯éåžžã«ã²ã©ãã§ãïŒé¢æ°å
ã®ãã¹ãŠã®æ»ãå€ã®åã¯é¢æ°ã®æ»ãå€ã®åã§ãªããã°ãªããªããšããéåžžã«è³¢æãªçŽæãå£ããŸãïŒã ããã§ãããééããªã@ mark-imã䜿çšããŸãã Joshã®æèŠã®äžäžèŽã¯ããããæªè§£æ±ºã®åé¡ãšããŠç¶æããããã«ã€ããŠããã«è°è«ããã®ã«ååã§ããïŒ ããŒã ã¡ã³ããŒä»¥å€ã®ããšãæå³ããã®ã§ã¯ãªãããããšæŠãããã«åœŒãåãã§ãµããŒãããããšæããŸãã
Ok
-RFC 243ã§åãå
¥ããããŠããã©ããã³ã°ïŒããããã€çºçããã®ãçåã«æã£ãŠãã?
æŒç®åãå®çŸ©ãããã®ïŒã¯ãé¢æ°ã®æ»ãåŒã®åã«ã€ããŠäœãå€æŽããŸããã ããã¯RFC243ããããå®çŸ©ããæ¹æ³ã§ãïŒ https ïŒ
ãã®RFCã¯ã
?
æŒç®åããã¹ã³ãŒããããã®ã«åœ¹ç«ã€åŒãã©ãŒãcatch {..}
ãå°å ¥ããŠããŸããcatch
æŒç®åã¯ãé¢é£ãããããã¯ãå®è¡ããŸãã äŸå€ãã¹ããŒãããªãå Žåãçµæã¯Ok(v)
ããã§ãv
ã¯ãããã¯ã®å€ã§ãã ãã以å€ã®å ŽåãäŸå€ãã¹ããŒããããšãçµæã¯Err(e)
ãŸãã
catch { foo()? }
ã¯åºæ¬çã«foo()
ãšåçã§ããããšã«æ³šæããŠãã ããã
ã€ãŸããã¿ã€ãT
ãããã¯ãåãåãããããç¡æ¡ä»¶ã«ã©ããããŠãã¿ã€ãResult<T, _>
å€ãçæããŸãã ãããã¯å
ã®return
ã¹ããŒãã¡ã³ãã¯ãŸã£ãã圱é¿ãåããŸããã ãããã¯ãé¢æ°ã®ããŒã«åŒã§ããå Žåãé¢æ°ã¯Result<T, _>
è¿ãå¿
èŠããããŸãã
https://play.rust-lang.org/?version=nightly&mode=debug&edition=2018&gist=88379a1607d952d4eae1d06394b50959ã®ããã«ããã®æ¹æ³ã§æ¯æ©å®è£ ãããŠãå€ãã®è°è«ã®åŸã«è¡ããããªã³ã¯ãããŠããŸãïŒrust-lang / rustïŒ41414ïŒããã¯ãã®åé¡ã®äžéšã«ããªã³ã¯ãããŠããŸãïŒã
2019幎5æ28æ¥5æ48å27ç§PM PDTã§ãã¢ã¬ã¯ãµã³ããŒRegueiroã®[email protected]ã¯æžããŸããïŒ
Ewwã ãããèµ·ãã£ããšã¯ä¿¡ããããŸããã
Ok
ã©ããã³ã°ã¯ãšãŠãã²ã©ãã§ãïŒããã¯
ãã¹ãŠãåŒãè¿ããšããéåžžã«è³¢æãªçŽæãç ŽããŸã
é¢æ°ã¯é¢æ°ã®æ»ãå€ã®åã§ããå¿ èŠããããŸãïŒã ãããããééããªã
ããã«ã€ããŠã¯@ mark-imã䜿çšããŸãã Joshã®æèŠã®äžäžèŽã¯ããããç¶æããã®ã«ååã§ãã
æªè§£æ±ºã®åé¡ããããŠããã«ã€ããŠã®ããå€ãã®è°è«ãåŸãŸããïŒ ç§ã¯åãã§åœŒã«ãµããŒãã貞ããŸã
ãããšæŠãããšã«ãããŠããããéããŒã ã¡ã³ããŒãšããŠäœããæå³ãããšããããšã§ã¯ãããŸããã
ããããšãããããŸããã ç§ã¯èªåã®ããã ãã«ããã«å察ããŠããã ãã§ã¯ãããŸããã ç§ã¯ãŸããç§ãèŠãå€ãã®äººã ãç§ãšåãç«å Žãè¡šæããŠããããšã代衚ããŠããŸãã
@joshtriplett @ mark-im @alexreg
Ok
ã©ããã³ã°ãéåžžã«äžå¿«ã ãšæãçç±ã説æãããã以åã«èª¬æããå Žæãžã®ãªã³ã¯ãæäŸãããã§ããŸããïŒ æ¢ãã«è¡ã£ãã®ã§ããããã£ãšèŠããšäœãèŠããŸããã§ããã ç§ã¯ããã«éŠ¬ãæã£ãŠããŸããïŒç§ã¯ãã¹ãŠã®ããã¯ã¹ããã§ãã¯ããã1ãæéè°è«ããªãã£ãã®ã§ãããã«ã€ããŠã³ã¡ã³ãããã ãã§ãïŒãããã®ã¹ãºã¡ããã®å·£ã蹎ã£ãã®ã§ãè°è«ãããããç解ããããšæããŸãã
2019幎5æ28æ¥ç«ææ¥03:40:47 PM -0700ã«ãã©ãã»ã«ãžã§ã³ã¹ãã³ã¯æ¬¡ã®ããã«æžããŠããŸãã
Ok
-wrappingã¯ãå ã®RFCã§ãã§ã«æ±ºå®ãããŠãããå®è£ äžã«åé€ãããæåŸã«åŸã§å床远å ãããŸããã ãããã©ã®ããã«æªè§£æ±ºã®è³ªåã§ãããããããŸããã
èªåã®è³ªåã«éšåçã«çãããšæããŸãã 誰ããããã¯æããªã
å
ã®RFCã®è°è«ã«é¢äžããã®ã¯åãããŒãžã§ããã try
ã¯
絶察ã«å€ãã®äººãæãã§ãããã®ã§ãããã³ã³ã»ã³ãµã¹ã¯ãã
OKã©ããã³ã°çšã
2019幎5æ28æ¥ç«ææ¥03:44:46 PM -0700ãMazdakFarrokhzadã¯æ¬¡ã®ããã«æžããŠããŸãã
ãšã«ãã...ç§ã®ã³ã¡ã³ãã®ãã€ã³ãã¯ããäŸå€ã®èšèªããšããŠã®
try
ã¯è§£æ±ºãããåé¡ã§ãããšããããšã§ããã
æ確ã«ããããã«ãç§ã¯ãäŸå€ãã®ã¡ã¿ãã¡ãŒãé
åçã ãšã¯æããŸããã
ãããŠãtry-fnãOk-wrappingã®ãããªãã®ã§ã®è©Šã¿ã®å€ãã¯
äŸå€ã®ãããªã¡ã«ããºã ãæã€èšèªãåœé ããããšããŸãã
ãããã try
èªäœã¯ã ?
以å€ã®å Žæã§ãã£ããããæ段ãšããŠ
é¢æ°å¢çã¯ãå¶åŸ¡ãããŒæ§é ãšããŠæå³ããããŸãã
2019幎5æ28æ¥ç«ææ¥ãååŸ11æ37å33ç§-0700ã«ãã¬ããªãšã«ã»ã¹ãã¹ã¯æ¬¡ã®ããã«æžããŠããŸãã
Ok
ã©ããã³ã°ããšãŠãäžå¿«ã ãšæãçç±ã説æã§ããŸãã
ããã€ãã®çç±ã®1ã€ãšããŠïŒ
2019幎5æ28æ¥ç«ææ¥05:48:27 PM -0700ã«ãAlexanderRegueiroã¯æ¬¡ã®ããã«æžããŠããŸãã
ããã¯ãé¢æ°å ã®ãã¹ãŠã®æ»ãå€ã®åãé¢æ°ã®æ»ãå€ã®åã§ããå¿ èŠããããšããéåžžã«è³¢æãªçŽæãç ŽããŸãã
ããã¯ã人ã
ãã¿ã€ãæåã®æšè«ã«äœ¿çšããããŸããŸãªã¢ãããŒããç ŽããŸã
é¢æ°ãšã³ãŒãæ§é ã«ã€ããŠã
ç§ã¯ç¢ºãã«ããã§ç§èªèº«ã®èããæã£ãŠããŸãããä»ãã®ãããã¯ãåéããªãã§ãã ããã æ§æã«ã€ããŠ500以äžã®æçš¿ã§è«äºããã£ãã®ã§ããã°ããã®éå°é·ãé¿ããããšæããŸãã
ããã«ã€ããŠè©±ãåã£ãŠããlangããŒã ã§ããããããã¯ãããŠããå Žåã¯ããcatchãããã¯ãçµæå€ããã©ããããããã©ããã解決ããïŒïŒ41414ïŒããã§ãã¯ããã¯ã¹ãå床ãªãã«ããŠïŒããããlangããŒã ã§ãããã¯ãããŠãããšããã³ã¡ã³ããä»ããŠïŒããã®è¿œè·¡ã®åé¡ã¯ã¹ããŒã¿ã¹ãç¥ã£ãŠããŸããïŒ
ç³ãèš³ãããŸããããç§ã¯äœãåéããããšã¯ããŠããŸããã远跡ã®åé¡ã§æ±ºå®ããããšããŒã¯ããããã®ãšãããããã€+ã©ã®ããã«çºçããããèšãçŽããŠãã ããã
@rpjohnstæ å ±ãããããšãïŒ
@yodaldevoidJoshã¯ç§ã®èããã»ãŒèŠçŽããŸããã
ç§ã¯ïŒé¢æ°ã®ã¿ã€ãã«åœ±é¿ãäžããã®ã§ã¯ãªãïŒãããã¯ã«éå®ãããok-wrappingã«å°ãå察ããŠããŸããããããã§ãæªãåäŸãèšå®ããŠãããšæããŸãïŒJoshãèšã£ãããã«ãäŸå€ã®ã¡ã¿ãã¡ãŒã¯é åçã§ã¯ãããŸããã
@joshtriplettã¯ãåºæ¬çã«ç§ã®èŠè§£ãèŠçŽããŠããŸããåé¡ã¯ããäŸå€ãã¡ã¿ãã¡ãŒã®é©åæ§ïŒãããããããã¯+ catch_unwind
ã¯ã¯ããã«é¡äŒŒããŠããŸãïŒãšã¿ã€ãããŒã¹ã®æšè«ã§ãã ç§ã¯ã¹ã³ãŒãã³ã°ãšå¶åŸ¡ãããŒã®ã¡ã«ããºã ãšããŠtry
ãããã¯ã§ã倧äžå€«ã§ããããã£ãšæ¥é²çãªãã€ã³ãã§ã¯ãããŸããã
ããŠãååã«å ¬å¹³ã§ããããã§å šäœã®è°è«ãããªãã§ãã ãã...å€åææ¡ãããããã«ãã§ãã¯ããã¯ã¹ããªãã«ããŠããã®ã¹ã¬ããã§èšåãããçè«çæ ¹æ ã®ããã€ãã䜿çšããŠããããlang-teamã®è°è«ã«æ»ããŸããïŒ å®å®åãæ¥ããªãéããããã¯åççã«èããããšæããŸãã
å泚éã®æ§æã¯åæãããŠããŸããïŒ ç§ã¯ããã€ãã®try { foo()?; bar()?; }.with_context(|_| failure::err_msg("foon' n' barn'")?;
ãæãã§ããŸããããããã¯ã³ã³ãã€ã«ã«ãªã¢ãŒãã§ããèå³ããããŸããïŒ error[E0282]: type annotations needed
ã
ç§ã¯ãã°ããåã«ãã³ã¡ã³ããéããŠå°ããèªãã§ïŒãšgithubã®äžã®300件ã®ã³ã¡ã³ããåã³ããŒããããŸãã«ãéå±ã§ããïŒããç§ã¯ãªã³ãŒã«ãè¡ãããšïŒãã¹ãŠã§ã¯ãªãïŒãã»ãšãã©ã®åšãã®è°è«ã«ã€ããŠã®äŸã®Try::Ok
ã©ãã䜿çšOk
ã Option
ãTry
ãå®è£
ããŠããããšãèãããšããããè°è«ã®ã©ã¡ãåŽã«ããããšããããŒã ã®ç«å Žã«ã©ã®ããã«åœ±é¿ããããç¥ããããšæããŸãã
Rustã䜿çšãããã³ã«ããç·ãããã§tryãããã¯ã䜿çšã§ããã°ããã®ã«ããšæãç¶ããŸããããã®çŽ30ïŒ
ã¯ãtryãOption
䜿çšãããããã§ãïŒç§ã¯Scalaã§ä»¥åã for
æ§æã䜿çšããŠã¢ããã«äžè¬çã«é©çšããŠããŸããããããã§ã¯try
ãšéåžžã«ãã䌌ãŠããŸãã
ã¡ããã©ä»æ¥ãç§ã¯json
ã¯ã¬ãŒãã䜿çšããŠããŸãããããªãã·ã§ã³ãè¿ãas_*
ã¡ãœãããå
¬éãããŠããŸãã
2ã€ã®æ§æã䜿çšãããšãç§ã®äŸã¯æ¬¡ã®ããã«ãªããŸãã
match s {
"^=" => |a, b| try { a.as_str()?.starts_with(b.as_str()?) }.unwrap_or(false),
"$=" => |a, b| try { Some(a.as_str()?.ends_with(b.as_str()?)) }.unwrap_or(false),
// original
"$=" => |a, b| {
a.as_str()
.and_then(|a| b.as_str().map(|b| (a, b)))
.map(|(a, b)| a.starts_with(b))
.unwrap_or(false)
},
}
æèäžãæ»ãå€ã®åãOption
ãResult
ã¯ããªãæ確ã§ãããããã«ãïŒã³ãŒãã®ç解ã«é¢ããéãïŒå®éã«ã¯åé¡ã§ã¯ãªããšæããŸãã ééçã«ããã®æå³ã¯æ確ã§ãããããã2ã€ã®ããšãæå¹ãã©ããã確èªãããããã«å¯ŸããŠæäœãå®è¡ããå¿
èŠããããŸããã try
ããã«ããã®é¢æ°ããã倧ããªã³ã³ããã¹ãã«åã蟌ãŸããŠãããšèãããšãç解ã倱ããããšã¯æããªãã®ã§ããããã®ãããããéžæããå¿
èŠãããå Žåã¯ãæåã®ãã®ã䜿çšããŸããåžžã«ã
ãã®ã¹ã¬ãããæåã«èŠå§ãããšãã¯ãæ瀺ããã»ãããããšæã£ãã®ã§ã Ok
ã©ããã³ã°ã«å察ããŸãããããã以æ¥ããç§ã欲ããããšèšã£ãæéã«æ³šæãæãå§ããŸãããããã§tryãããã¯ã䜿çšã§ããŸãããšç§ã¯Ok
ã©ããã³ã°ãè¯ããšããçµè«ã«éããŸããã
ç§ã¯åœåãæåŸã®ã¹ããŒãã¡ã³ããTry
ãå®è£
ããåãè¿ãé¢æ°ã§ããå Žåã Ok
æãè¿ãã§ã¯ãªãæ¹ããããšèããŠããŸããããæ§æã®éãã¯æ¬¡ã®ããã«ãªããŸãã
try {
fallible_fn()
}
try {
fallible_fn()?
}
ãã®å Žåãã fallible_fn
ãTry
è¿ãé¢æ°ã§ããããšãæ確ã«ãªãããã Ok
ã©ããã³ã°ã®æ¹ãåªããŠãããšæããŸãããããã£ãŠãå®éã«ã¯ããæ瀺çã§ãã
å察掟ãããã«ã€ããŠã©ãæã£ãŠãããç¥ãããã®ã§ããããã®ã¹ã¬ããã§ã¯ä»ã®å€ãã®äººãèŠãããšãã§ããªãã®ã§ã@ joshtriplettã§ãã
ç·šéïŒç§ã¯ããã人éå·¥åŠ/èªè§£ã®èŠ³ç¹ããã®ã¿èŠãŠããŸããã æšè«ãç°¡åã«ãªããªã©ãå®è£ ã®é¢ã§äžæ¹ãä»æ¹ãããæè¡çãªã¡ãªããããããã©ããã¯ããããŸããã
ãã¹ããããOption
解æã«ãã try
ãè©ŠããŠã¿ããã£ãã®ã§ãã
#![feature(try_blocks)]
struct Config {
log: Option<LogConfig>,
}
struct LogConfig {
level: Option<String>,
}
fn example(config: &Config) {
let x: &str = try { config.log?.level? }.unwrap_or("foo");
}
ããã¯å€±æããŸã
error[E0282]: type annotations needed
--> src/lib.rs:12:19
|
12 | let x: &str = try { config.log?.level? }.unwrap_or("foo");
| ^^^^^^^^^^^^^^^^^^^^^^^^^^ cannot infer type
|
= note: type must be known at this point
ç§ãåŸãæãè¿ããã®ã¯
fn example(config: &Config) {
let x: Option<&str> = try { &**config.log.as_ref()?.level.as_ref()? };
let x = x.unwrap_or("foo");
}
as_ref
ã¯éåžžã«æ®å¿µã§ãã Option::deref
ãããã§åœ¹ç«ã€ããšã¯ç¥ã£ãŠããŸãããååã§ã¯ãããŸããã ããã¯ãã©ãããããã人éå·¥åŠïŒãŸãã¯é¢é£ããã¢ã€ãã¢ïŒãšäžèŽããå¿
èŠãããããã«æããŸãã
è€æ°ã®è¡ãæ®å¿µã§ãã
try
ã¯ãæŽæ°ãªãã©ã«ã®ããã«Result
æšè«ãã©ãŒã«ããã¯ã䜿çšã§ããŸããïŒ @shepmasterã®æåã®è©Šã¿ã§Result<&str, NoneError>
æšæž¬ã§ããŸããïŒ æ®ãã®åé¡ã¯äœã§ããïŒãããããå€æãã?
ã®äžè¬çãªãšã©ãŒã¿ã€ããèŠã€ããŸããïŒ ïŒç§ã¯ããã«ã€ããŠã©ããã§è°è«ãéããããšããããŸããïŒïŒ
@shepmasteråæšè«ã«åæããŸãã ããããªããšã«ãç§ã¯ããªãã®æ£ç¢ºãªã³ãŒãããããã€ãŒããªtry_
å®è£
ã§è©ŠããŸããããæ£åžžã«åäœããŸãïŒ https ïŒ
let x = try_! { config.log?.level? }.unwrap_or("foo".to_owned());
assert_eq!(x, "debug");
æ£åžžã«åäœããŸãã
ãããã€ãŒããª
try_
å®è£
ã¯ããããããããªãã®ãã¯ãåŒã³åºãã¯è¿ããŸãString
ããªã&str
ãå¿
èŠãªæææš©ãã åšå²ã®ã³ãŒãã¯è¡šç€ºãããŸãããã Config
æææš©ããªããããããã¯å€±æããŸãã
fn example(config: &Config) {
let x = try_! { config.log?.level? }.unwrap_or_else(|| String::from("foo"));
}
error[E0507]: cannot move out of captured variable in an `Fn` closure
--> src/lib.rs:20:21
|
19 | fn example(config: &Config) {
| ------ captured outer variable
20 | let x = try_! { config.log?.level? }.unwrap_or_else(|| String::from("foo"));
| ^^^^^^^^^^ cannot move out of captured variable in an `Fn` closure
ãŸããç¡æ¡ä»¶ã«String
å²ãåœãŠãŸãã ãã®éå¹çæ§ãåé¿ããããã«ããã®äŸã§ã¯unwrap_or_else
ã䜿çšããŸããã
ãã®æ©èœãasync/await
ãããã¯ã®åã«å®å®ããªãã£ãã®ã¯æ®å¿µã§ãã IMOãæã£ãŠããã°ãã£ãšäžè²«ããŠããã§ããã
let fut = async try {
fut1().await?;
fut2().await?;
Ok(())
};
try
ãªãã§åäœããã代ããã«ã ããããè¹ã¯åºèªããŠãããã£ãšçµã£ãŠãããšæããŸãã
ReïŒèªåã©ããã³ã°ãä»ã¯async
ãããã¯ãšäžè²«æ§ãä¿ã€ããšã¯ã§ããªããšæããŸãã async
ãããã¯ã¯ã Future
å®è£
ããå¿ååã«ãããçš®ã®ãèªåã©ããããè¡ããŸãã ããããããã¯ã try
ãããã¯ã§ã¯äžå¯èœãªæ©æè¿åã§ãåœãŠã¯ãŸããŸãã
æ¶ç©ºã®async try
ãããã¯ããããšããããäºéã«æ··ä¹±ããå¯èœæ§ããããŸãã çµæãèªåã©ããããå¿
èŠ
èªåã©ããã³ã°ã®æå³ã§äžè²«æ§ãä¿ã€æ©äŒã倱ã£ããšã¯æããŸããã ã©ã¡ããasync
ãããã¯ãšæ©èœã¯äœ¿çšããããšãã§ããŸã?
ãäž¡æ¹ãšãèªåã®æåå®è¡ããå¿
èŠããããŸãOk
-wrappingãã®äž¡æ¹æ©ããæçµçãªãªã¿ãŒã³ãã
äžæ¹ã try
ãããã¯ã¯ãèªåOk
ã©ããã³ã°ã§?
ã䜿çšã§ããŸããããã«ã¯ãæ©æè¿åæ©èœïŒããããã©ãã«ãã¬ãŒã¯ïŒãæ³å®ãããæ©æè¿åããå«ãŸããŸããå€ã æ¶ç©ºã®tryé¢æ°ã¯ãæ©æãªã¿ãŒã³ãšæçµãªã¿ãŒã³ã®äž¡æ¹ã§èªåOk
ã©ããã³ã°ãç°¡åã«å®è¡ã§ããŸãã
æ¶ç©ºã®async try
ãããã¯ã¯ã2ã€ã®auto- Ok
-wrapã次ã«auto- Future
wrapã®æ©èœãåçŽã«çµã¿åãããããšãã§ããŸãã ïŒéã®æ¹æ³ãå®è£
ããããšã¯äžå¯èœã§ããããšã«ããtry async
ãšæžãããããšã¯ééããããŸãããïŒ
ç§ãèŠãŠããççŸã¯ã async
ãããã¯ãé¢æ°ãšæ··åããŠããããšã§ãã ïŒããã¯RFCãšã¯éã«ãæåŸã®æåŸã«çºçããŸãããïŒããã¯ã async
ãããã¯ã®return
ããããã¯ãçµäºãã try
return
ããããã¯ãçµäºããããšãæå³ããŸãã try
ãããã¯ã¯ãå«ãŸããŠããé¢æ°ãçµäºããŸãã ãã ãããããã¯å°ãªããšãåç¬ã§ã¯æå³ããããearly-returnãŸãã¯label-break-valueã®ãªãasync
ãããã¯ã¯äœ¿çšããã®ãã¯ããã«å°é£ã§ãã
ããã®å®å®åãæ¢ãããã®ã¯ãããŸããããããšããŸã 誰ããããããã®ã«æéããããŠããŸãããïŒ ãã以å€ã®å Žåã¯å¿ èŠãªPRãäœæããããšã«èå³ããããŸãð
2019幎11æ18æ¥2æ03å36ç§AM PSTã§ãKampfkarren [email protected]æžããŸããïŒ
ããã®å®å®åãåæ¢ãããã®ããŸãã¯èª°ãåã£ãŠããªã
ãŸã ãããããæéã§ããïŒ å¿ èŠãªPRã®äœæã«èå³ããããŸã
ãã以å€ã®å Žåð>
>>
->
ããªããèšåãããã®ã§ããªãã¯ãããåãåã£ãŠããŸãã>
ãã®ã¡ãŒã«ã«çŽæ¥è¿ä¿¡ããããGitHubã§è¡šç€ºããŠãã ããïŒ>
https://github.com/rust-lang/rust/issues/31436#issuecomment -554944079
ã¯ããå®å®åãžã®ãããã«ãŒã¯ãOKã©ããã³ã°ã®æ±ºå®ãéããŠæ©èœããŠããŸãã ããã¯ãã©ã®ããã«åäœãããã«ã€ããŠã³ã³ã»ã³ãµã¹ãåŸããããŸã§å®å®åãããã¹ãã§ã¯ãããŸããã
ç§ã¯å人çã«Ok-wrappingã«å察ããŠããŸãããäºåŸã«è¿œå ããã®ã¯ã©ãã»ã©é£ããã®ã ããããšæã£ãŠããŸãã no-ok-wrapping forwardã¯ok-wrappingãšäºææ§ããããŸããïŒ
Result<Result<T,E>>
ã®ãããŸãããªã©ã®ããªãããŒãªã±ãŒã¹ãæ³åã§ããŸããããã®ãããªãããŸããªã±ãŒã¹ã§ã¯ãã©ããã³ã°ãªãã«ãã©ãŒã«ããã¯ããããšãã§ããŸãã ãã®åŸããŠãŒã¶ãŒã¯æ瀺çã«Ok-wrapããŠæ確ã«ããããšãã§ããŸãã ãã®çš®ã®ãããŸãããããŸãé »ç¹ã«çºçãããšã¯æããªãã®ã§ãããã¯ããã»ã©æªãã¯ãªãããã§ã...
Ok
匷å¶ã§ã¯ãªãã Ok
ã©ããã³ã°ã§ããããããããŸããã¯ãŸã£ãããããŸããã try { ...; x }
ã¯ã Ok(x)
åãããã«æ確ã«Ok({ ...; x })
ãŸãã
@joshtriplettããã¯æªè§£æ±ºã§ããïŒ https://github.com/rust-lang/rust/issues/41414ãåŒçšããŠã远跡ã®åé¡ã«ã¯ãã§ãã¯ãªããããresolve whether catch blocks should "wrap" result value
ããããŸã
@rpjohnstç³ãèš³ãããŸãããããã£ãšæ確ã«ãã¹ãã§ããã ã€ãŸããOk-wrappingã䜿çšããã«try
ãå®å®ãããå ŽåãåŸã§äºææ§ãæã£ãŠè¿œå ã§ãããšæããŸãã
ã€ãŸããã»ãšãã©ã®äººãtry
ãããã¯ãå¿
èŠã§ããããšã«åæããŠãããšæããŸããããã¹ãŠã®äººãcatch
ãŸãã¯ok-wrappingã«ã€ããŠåæããŠããããã§ã¯ãããŸããã ããããç§ã¯ãããã®è°è«ãtry
ããããã¯ããå¿
èŠã¯ãªããšæããŸã...
@Kampfkarrenã¯ãã äžèšã®äŒè©±ã¯ããã®åé¡ã®é²è¡ã詳ãã説æããŠããŸãã å šå¡ã«ååã«çžè«ããããšãªããææå°æ©ã«ãã§ãã¯ãããŸããã ç¹ã«@joshtriplettã«ã¯æžå¿µããããä»ã®äœäººãïŒç§ãå«ãïŒããããå ±æããŸããã
@ mark-imå°æ¥ãOk-wrappingãã©ã®çšåºŠæ£ç¢ºã«è¿œå ããããšæããŸããïŒ ç§ã¯ãããã©ã®ããã«è¡ãããã®ããç解ããããšããŠããŸãããç§ã¯ãããå®å šã«èŠãããšãã§ããŸããã
ã ããç§ã¯ãããè¯ãèããã©ããããããªããšããããšã§ãããå眮ãããŸã...
ok-wrappingãªãã§try
ãããã¯ãå®å®ãããŸãã äŸãã°ïŒ
let x: Result<usize, E> = try { 3 }; // Error: expected Result, found usize
let x: Result<usize, E> = try { Ok(3) }; // Ok (no pun intended)
åŸã§ãOk-wrappingã䜿çšããå¿ èŠããããšããã³ã³ã»ã³ãµã¹ãåŸããããšãããšã以åã¯æ©èœããªãã£ãããã€ãã®ã±ãŒã¹ãèš±å¯ã§ããŸãã
let x: Result<usize, E> = try { 3 }; // Ok
let x: Result<usize, E> = try { Ok(3) }; // Also Ok for backwards compat
let x: Result<Result<usize, E1>, E2> = try { Ok(3) }; // Ok(Ok(3))
let x: Result<Result<usize, E1>, E2> = try { Ok(Ok(3)) }; // Ok(Ok(3))
åé¡ã¯ãããã以åã«ã¯ãªãã£ãäœããææ§ã«ããå¯èœæ§ããããã©ããã§ãã äŸãã°ïŒ
let x = try { Err(3) }; // If x: Result<Result<T1, usize>, usize>, then it is not clear if user meant Ok(Err(3)) or Err(3)...
ããããããããOKã©ããã³ã°ã¯ãã§ã«ãã®åé¡ã«åãçµãå¿ èŠããããŸããïŒ
ãšã«ãããç§ã®çŽæã§ã¯ããã®ãããªå¥åŠãªã±ãŒã¹ã¯ããã»ã©é »ç¹ã«ã¯çºçããªãã®ã§ãããã»ã©éèŠã§ã¯ãªããããããŸããã
è¿ãããã¿ã€ããResult
ãŸãã¯Option
ã§ããå Žåãé€ããŠãOk-wrappingã䜿çšããã®ã¯ã©ãã§ããïŒ ããã«ãããã»ãšãã©ã®å ŽåãããåçŽãªã³ãŒããå¯èœã«ãªããŸãããå¿
èŠã«å¿ããŠæ£ç¢ºãªå€ãæå®ã§ããŸãã
// Ok-wrapped
let v: Result<i32, _> = try { 1 };
// not Ok-wrapped since the returned type is Result
let v: Result<i32, _> = try { Ok(1) };
// not Ok-wrapped since the returned type is Result
let v: Result<i32, _> = try { Err("error") };
// Ok-wrapped
let v: Option<i32> = try { 1 };
// not Ok-wrapped since the returned type is Option
let v: Option<i32> = try { Some(1) };
// not Ok-wrapped since the returned type is Option
let v: Option<i32> = try { None };
Ok
-coercionãŸãã¯æ§æã«äŸåããOk
-wrappingïŒããã¯ããããªãã§å®å®åããµããŒãããåŸã§å°å
¥ããããã«å¿
èŠãªããšã§ãïŒãè¿œå ãããšãèªã¿ããããéåžžã«æªããªããŸãã i.rl.oã§äœåºŠãåºãè°è«ãããŠããŸããïŒäžè¬çã«ãå®è£
ãããŠããåçŽãªOk
ã©ããã³ã°ã誀解ããŠãã人ã
ã«ãã£ãŠïŒã
ç§ã¯å人çã«ã¯å®è£
ãããOk
ã©ããã³ã°ã«åŒ·ãè³æã§ãããã©ããã³ã°ãå°é£ã«ãªãç¶æ³ãç解ããããšãå°é£ã«ãããããã圢åŒã®åŒ·å¶ãŸãã¯æ§æäŸåã«ããã«åŒ·ãå察ããŸãïŒåœ¹ã«ç«ããªããã®ãæžããªããã°ãªããªãã§ãããïŒ Ok(...)
ã¯ã匷å¶ãããŠãããã©ããã確èªããå¿
èŠããããŸãïŒã
let x = try { Err(3) }; // If x: Result<Result<T1, usize>, usize>, then it is not clear if user meant Ok(Err(3)) or Err(3)...
ããããããããOKã©ããã³ã°ã¯ãã§ã«ãã®åé¡ã«åãçµãå¿ èŠããããŸããïŒ
ããããããã¯æ確ã«Ok(Err(3))
ã Ok
wrappingã¯æ§æãåã«äŸåããããããã¯ã®åºåãTry::Ok
ããªã¢ã³ãã«ãããã®ã¯äœã§ãã©ããããã ãã§ãã
@ mark-imå®å®ããåŸãäžæ¹ããä»æ¹ã«åççã«ç§»åã§ãããšã¯æããŸããã Ok-wrappingã¯æªããšæããŸãããå¿ èŠãã©ãããæšæž¬ããããšããäžè²«æ§ã®ãªãOk-wrappingã¯ããã«æªåããŸãã
ç§ã®ã³ãŒãããŒã¹ã§ã¯å€ãã®ãªãã·ã§ã³å€ãæ±ã£ãŠããã®ã§ããã£ãšåã«ãã¯ãã®ãããªç¬èªã®tryãããã¯ãå°å ¥ããŸããã ãããŠãç§ãããã玹ä»ãããšããç§ã¯Ok-wrappingã®æç¡ã«ãããããããŸããŸãªããªãšãŒã·ã§ã³ãæã£ãŠããŸããããããŠOk-wrappingããŒãžã§ã³ã¯éåžžã«äººéå·¥åŠçã§ããããšãå€æããã®ã§ãããã¯ç§ã䜿çšããããšã«ãªã£ãå¯äžã®ãã¯ãã§ãã
䜿çšããå¿ èŠã®ãããªãã·ã§ã³ã®å€ãããããããããããã¯ã»ãšãã©æ°å€ã§ããããã次ã®ãããªç¶æ³ããããããããŸãã
let c = try { 2 * a? + b? };
Ok-wrappingããªããšãå®éã®tryãããã¯ã䜿çšããããããèªåã®ãã¯ãã«çãŸãå¯èœæ§ãé«ããªãã»ã©äººéå·¥åŠçã§ã¯ãããŸããã
ãã®è¿œè·¡åé¡ã®ç±ç·ããæŽå²ã ?
æŒç®åãšã®å
ã
ã®æ®å¿µãªå¯Ÿç«ãããã³Ok
ã©ããã³ã°åé¡ã®é害ãèãããšããã®åé¡ãå®å
šã«éããŠtry
ãéä¿¡ããããšããå§ãããŸãã
OKã©ããã³ã°ããªããšã人éå·¥åŠçã§ã¯ãããŸããã
ãããå°å ¥ããæ£ç¢ºã«é人éå·¥åŠçãªãã®ã«ã€ããŠè©³ããæããŠããã ããŸããïŒ
Ok-wrappingããªãå ŽåãäŸã¯æ¬¡ã®ããã«ãªããŸãã
let c = try { Ok(2 * a? + b?) };
ããã¯ç§ã®æèŠã§ã¯ããªãè¯ãã§ãã
ã€ãŸãããã®ãããªå°ããªäŸã§ã¯ãããéãã®ããã«èŠãããããããŸãããã try
ãããã¯ã«å«ãŸããã³ãŒããå€ãã»ã©ããã®Ok(...)
ã©ãããŒãåŒãèµ·ãã圱é¿ã¯å°ãªããªããŸãã
@CreepySkeletonã®ã³ã¡ã³ãã«å ããŠã try
ãããã¯ããããè¡ããªãå Žåã Ok
ã©ããã³ã°ããšãã¥ã¬ãŒããããã¯ããäœæããã®ã¯éåžžã«ç°¡åã§ããããšã«æ³šæããŠãã ããïŒãããŠèª°ãã確å®ã«äœæããŸãïŒãã®å°ããªãã¯ãã®æšæºçãªã¯ã¬ãŒãïŒã§ããããã®éã¯ããã§ã¯ãããŸããã
Try
ç¹æ§ãäžå®å®ãªéã¯ããã®ãã¯ãã¯äœ¿çšã§ããŸããã
ã©ãããŠïŒ ãšã«ããããããå®å®ãããšãïŒä»®æ³çã«ã¯ããã»ã©é ããªãå°æ¥ïŒãããã¯éåžžã«å¯èœã§ãã
Nemo157 @ try
ãããã¯ã®å€éã®ã¿ãä»ã§ãããããšåœŒãã¯ãããããæã
ã¯ãªããã³ã°ããããšã決å®ãããšã¯èãã«ããå Žåã«ã¯ãå®å®åãããããšã¯ãããŸããTry
ã ããã¯ã Try
åã«å®å®åãããªãå¯èœæ§ãé«ãããšãæå³ããŸãã ãããã£ãŠããã¯ããäžå¯èœã§ãããšèšã£ãŠãæå³ããããŸããã
@KrishnaSannasiãªãTry
ãã¯ãåãããã®ã
@ mark-imãããªããšã¯æããŸãããããããã¯ãè©Šãããã«æ¯æ©Try
ãçºçããããšãå¿é
ããããšãçŸå®çãªåé¡ã§ã¯ãªãçç±ã説æããŠããŸãã å©èã§Try
ã楜ãã¿ã«ããŠããŸãã
?
ã¯ãã§ã«å®å®ããŠããã try
ãããã¯ã¯ã ?
ãšåãããã«ã Result
ãšOption
äž¡æ¹ãå«ãæ確ãªèšèšã«ãªã£ãŠããŸãã ?
ã¯ããã§ããã Try
å®å®åã§ãããã®å®å®åããããã¯ããã®ãèŠãããšãã§ããçç±ã¯ãããŸããã ç§ã¯ããã泚ææ·±ãèŠãŠããŸããTry
ãã try
ãããã¯ãããTry
ã®ãã¶ã€ã³ã«ã€ããŠã®ã³ã³ã»ã³ãµã¹ãã¯ããã«å°ãªãã®ã§ã try
èŠãããšãã§ãããšããå°è±¡ããããŸããã Try
ç¹æ§ã®æ°å¹Žåã«å®å®åããããã¯ããŸãïŒ ?
ïŒã ãããŠãããšãTry
ç§ã¯ãããã¯ããå¿
èŠããªãçç±èŠãªãç¹è²ã«æŸæ£ãããtry
ãããã¯ã¯ãã ã®äœæ¥ãšããŠå®å®åãããResult
ãšOption
ã®ããã«?
ã¯ãããªããŸãã
ïŒå®å®ããtry
ãããã¯ãšäžå®å®ãªTry
ç¹æ§ãäžããããå Žåããã®ãã¯ããèšè¿°ã§ããªãã£ãçç±ã¯ããã¯ããtry { Try::from_ok($expr) }
æ¡åŒµãããããšã§ããã¿ã€ãããšã®ãã¯ããäœæã§ããŸãã Result
ãšOption
ã ãã§ãããIMOã¯ãéåžžã«ç°¡åã«[...]ãšãã¥ã¬ãŒãããããšããç¹ãæºãããŠããŸããïŒã
Try
ãã¬ã€ãã¯å®å®çã§ã¯äœ¿çšã§ããŸãããã ?
ã¯ãã§ã«ç¹æ®ãªã±ãŒã¹ã®å®å®çã§ããããã Try
ãäžå®å®ã§ãããštryãããã¯ããããã¯ãããçç±ãããããŸããã Tryãã¬ã€ããåé€ãããå Žåã§ãã人éå·¥åŠããªããŠããå®å®çã§?
ããµããŒããããªãã·ã§ã³ãšçµæãæ®ã£ãŠãããããå®å®çã«å®è£
ãããŠããŸãã
trycatchã»ãã³ãã£ãã¯ã«ã€ããŠæ¬¡ã®æŠå¿µãææ¡ããŸã...
次ã®ã³ãŒãã«ã€ããŠèããŠã¿ãŸãã
union SomeFunctionMultipleError {
err0: Error1,
err1: Error2,
}
struct SomeFunctionFnError {
index: u32,
errors: SomeFunctionMultipleError,
}
fn some_function() -> Result<i32, SomeFunctionFnError> {
if 0 == 0 {
Ok(2)
} else {
Err(SomeFunctionFnError{ index: 0, errors: SomeFunctionMultipleError {err1: Error2 {id0: 0, id1: 0, id3: 0}}})
}
}
union OtherFunctionMultipleError {
err0: Error1,
err1: Error2,
err2: Error3,
}
struct OtherFunctionFnError {
id: u32,
errors: OtherFunctionMultipleError,
}
fn other_function() -> Result<i32, OtherFunctionFnError> {
if 0 == 0 {
Ok(2)
} else {
Err(OtherFunctionFnError {id: 0, errors: OtherFunctionMultipleError {err0: Error1 {id0: 0, id1: 0}}})
}
}
ããã¯ã次ã®æ§ææ©èœã䜿çšããŠRustã®ãŒããªãŒããŒãããäŸå€ã«ãã£ãŠçæãããå¯èœæ§ã®ããã³ãŒãã§ãã
fn some_function() -> i32 throws Error1, Error2 {
if 0 == 0 {
2
} else {
Error2 {id0: 0, id1: 0, id3: 0}.throw
}
}
fn other_function() -> i32 throws Error1, Error2, Error3 {
if 0 == 0 {
2
} else {
Error1{id0: 0, id1: 0}.throw
}
}
ãŸãã¯ããããã®ãšã©ãŒã§ãããã³ã³ãã€ã©ã«ãã£ãŠæé»çã«æšæž¬ãããå¯èœæ§ããããŸãã
fn some_function(i: i32) -> i32 throws { // Implicitly throws Error1, Error2
if i == 0 {
2
} else if i == 1 {
Error1 {id0: 0, id1: 0, id3: 0}.throw
} else {
Error2 {id0: 0, id1: 0, id3: 0}.throw
}
}
fn other_function(i: i32) -> i32 throws { // Implicitly throws Error1
if i == 0 {
2
} else {
Error1{id0: 0, id1: 0}.throw
}
}
ããã¯ä»ã«äœãç³è¡£æ§æã§ã!! åäœã¯åãã§ã!!
ããã«ã¡ã¯ãã¿ããªã
äžèšã®ãŒããªãŒããŒãããäŸå€ã«é¢ããç§ã®ææ¡ã誰ããèŠãããšããããŸããïŒ
@redradist try
ãããã¯ã®äž»ãªãã€ã³ãã®1ã€ã¯ããããã¯ããšã«é¢æ°ãäœæããå¿
èŠãªãã«ãé¢æ°å
ã§äœ¿çšã§ããããšã§ãã ç§ãèŠãéããããªãã®ææ¡ã¯ããã§ã¯ãŸã£ããé¢ä¿ãããŸããã
ã¡ããã©ä»æ¥ãç§ã¯try
ãããã¯ã®å¿
èŠæ§ãæããŸããã ?
æäœãå€ã倧ããªé¢æ°ããããŸãã ãšã©ãŒã«ã³ã³ããã¹ããè¿œå ãããã£ãã®ã§ããã ?
ããšã«è¿œå ããã«ã¯ãèšå€§ãªéã®å®åæãå¿
èŠã§ããã try
ãšã©ãŒããã£ããããã³ã³ããã¹ãã1ã€ã®å Žæã«è¿œå ãããšããããé²ãããšãã§ããŸãã
ãšããã§ã ãã®å Žåãã³ã³ããã¹ãã«æ確ãªæå¹æéããªãããã®ãè€æ°ã®é¢æ°ã«åå²ãããšNLLãç Žæãããããå éšé¢æ°ã§æäœãã©ããããã®ã¯å°é£ã§ããã
çŸåšã®å®è£
ã§ã¯ã try
ãããã¯ã¯åŒã§ã¯ãªãããšãè¿°ã¹ãŠãããŸãã ããã¯èŠèœãšãã ãšæããŸãã
çŸåšã®å®è£ ã§ã¯ãtryãããã¯ã¯åŒã§ã¯ãªãããšãè¿°ã¹ãŠãããŸãã ããã¯èŠèœãšãã ãšæããŸãã
ããŸããããªãã³ãŒããæçš¿ããŠããã ããŸãããïŒ ããã§åŒã®ã³ã³ããã¹ãã§äœ¿çšã§ããŸãïŒïŒ Rust Playground ïŒ
#![feature(try_blocks)]
fn main() {
let s: Result<(), ()> = try { () };
}
確ãã«ãããã«ãããŸãã
ãããŠãããã¯ãtryãããã¯ã®åæšè«ããŸã å®äºããŠããªãããšã瀺ãå¥ã®äŸã§ãã ã¿ã€ãã®åž°å±ã¯if let
ãããã¯ã§ã¯ãµããŒããããŠããªããããããã¯ç¹ã«åä»ã§ãã
@ Nokel81åã®äŸã®åé¡ã¯ã if let $pat = $expr
åŒãæ£èŠè¡šçŸã®ã³ã³ããã¹ãã§ã¯ãªããç¹å¥ãªãè§ãã£ããªãã®åŒãã³ã³ããã¹ãã§ãããšããããšã§ãã ãããæ§é äœåŒã§ã©ã®ããã«æ©èœãããã®äŸã«ã€ããŠã¯ãæ§é äœåŒãååšããããšãæ§æçã«æããã§ãããã®äŸãšãååšããªããã®äŸãåç
§ããŠãã ããã ãããã£ãŠããšã©ãŒã¯try
ãåŒã§ã¯ãªããšããããšã§ã¯ãªãããšã©ãŒãééã£ãŠãããšããããšã§ã¯ãªããã try
åŒã¯ããã§ã¯èš±å¯ãããŠããŸãããæ¬åŒ§ã§å²ãã§ã¿ãŠãã ãããïŒããã³äžèŠãªæ¬åŒ§ã«é¢ãã誀ã£ãèŠåãæå¶ãããŸããïŒã
åŸè
ã®äŸã¯ãå®éã«ã¯åæšè«ã«é¢ããŠãããŸãã§ãã ãã®å Žåã e
ã®ã¿ã€ãã¯_: From<usize>
ã§ããããã¯ãå
·äœçãªã¿ã€ããäžããã®ã«ååãªæ
å ±ã§ã¯ãããŸããã åæšè«ãæåãããã«ã¯ãäœããã®æ¹æ³ã§å
·äœçãªåãæå®ããå¿
èŠããããŸãã ããã¯try
åºæã®åé¡ã§ã¯ãããŸããã Rustã§åæšè«ãã©ã®ããã«æ©èœãããã§ãã
ããã§ãããã«Ok
ãšããŠç
§åãã Err
ã±ãŒã¹ãç Žæ£ããããšãããšãæé©ã§ã¯ãªããšã©ãŒã¡ãã»ãŒãžã®ã±ãŒã¹ããããããã«å¯ŸåŠããããã®å®éã®
ããã詳现ãªèª¬æãããããšãããããŸããã ãªãåŸã§åæšè«ãææ§ã«ãªãã®ããç§ã¯ãŸã æ··ä¹±ããŠãããšæããŸãã åŒã®ã¿ã€ããResult<isize, usize>
ã¯ãªãã®ã¯ãªãã§ããïŒ
?
æŒç®åã¯ã From
ç¹æ§ã䜿çšããŠãç°ãªããšã©ãŒã¿ã€ãéã§åå€æãå®è¡ã§ããŸãã ããã¯å€§ãŸãã«æ¬¡ã®Rustã³ãŒãã«æ¡åŒµãããŸãïŒ Try
ç¹æ§ãç¡èŠããŸãïŒã
match expr {
Ok(v) => v,
Err(e) => return From::from(e),
}
From
åŒã³åºãã¯ãæçµçã«è¿ãããåŒã®åã䜿çšããŠãå®è¡ãããšã©ãŒåå€æã決å®ããŸããããã©ã«ãã§ã¯ãæž¡ãããå€ã®åã«èªåçã«èšå®ãããŸããã
ããããã§ã«å¯ŸåŠãããŠããå Žåã¯ãè©«ã³ããŸãããç§ã«ã¯å¥åŠã«æããŸãïŒ
#![feature(try_blocks)]
fn main() -> Result<(), ()> {
let result = try { // no type annotation
Err(())?;
};
result.map_err(|err| err)
}
ã³ã³ãã€ã«ã«å€±æããïŒ
error[E0282]: type annotations needed
ã ãïŒ
#![feature(try_blocks)]
fn main() -> Result<(), ()> {
let result : Result<_, _> = try { // partial type annotation
Err(())?;
};
result.map_err(|err| err)
}
倧äžå€«ã
Result
ã®ååŒæ°ãæšæž¬ã§ããªãã£ãããã«ãããåé¡ã ã£ãå Žåã¯ç解ã§ããŸãããäžèšã®ããã«ããã§ã¯ãªããrustcã¯æ¬¡ã®çµæãéç¥ããããšæšè«ãå®è¡ã§ããŸãã try
åŒã¯ãããçš®ã®Result
ã§ããã core::ops::Try::into_result
ããæšæž¬ã§ããã¯ãã§ãã
èãïŒ
@nwsharpã¯ã try
/ ?
ãTry
ã¿ã€ããããäžè¬çã§ããããã§ãã impl Try<Ok=_, Error=()>
ã§ããä»ã®ã¿ã€ããããå Žåãtryãããã¯ã¯Result
ãšåæ§ã«ãã®ã¿ã€ãã«è©äŸ¡ã§ããŸãã è±ç³ãããªãã®äŸã¯å€§ãŸãã«
#![feature(try_trait, label_break_value)]
use std::ops::Try;
fn main() -> Result<(), ()> {
let result /*: Result<_, _>*/ = 'block: {
match Try::into_result(Err(())) {
Ok(ok) => Try::from_ok(ok),
Err(err) => {
break 'block Try::from_error(From::from(err));
}
}
};
result.map_err(|err| err)
}
@ CAD97説æããããšãããããŸãã
ãšã¯èšããã®ã®ã try
ãç°ãªãTry
implséã§äžçš®ã®å€æãå¹æçã«åŒãèµ·ããããšãã§ãããšã¯æã£ãŠããŸããã§ããã
into_result
ã from_ok
ãããã³from_error
ã«å¯ŸããŠåãTry
implãéžæãããããµãŒã¬ãªã³ã°ãæåŸ
ããŸãã
ç§ã®æèŠã§ã¯ãåæšè«ãå®è¡ã§ããªããšãã人éå·¥åŠçãªæ倱ïŒç¹ã«ä»£æ¿ã®impl Try
ãååšããªãããšãèãããšïŒã¯ããã®å€æãèš±å¯ããããšã®å©ç¹ãäžåããŸããã
ç§ãã¡ã¯ããããŸãããé€å»ããããšã«ãããæšè«ãå¯èœãšããã®ãããªãã®ãçµç±ããŠãªããã€ã³ãžã®å€æããèœåãç¶æããããšãã§ããŸãïŒ
try { ... }.into()
察å¿ãããã©ã³ã±ããimplã䜿çšããŠïŒ
impl<T: Try, E: Into<T::Err>> From<Result<T::Ok, E>> for T {
fn from(result: Result<T::Ok, E>) -> Self {
match result {
Ok(ok) => T::from_ok(ok),
Err(err) => T::from_err(err.into()),
}
}
}
ïŒã©ã®æ£çŽç§ã¯å人çã«ãããã§ãšã©ãŒã¿ã€ãã®èªåå€æãçããããããã¯æãã§ãããªãããŠãŒã¶ãŒããã¹ãäœãã«ã¯ããããããæããã»ã³ã¹ãšä»®å®.map_err()
äžã®Result
ãïŒ
äžè¬çã«ããã®è±ç³ã¯ãè³¢ãããããšæããŸãã ããã¯é ããããŠãããçŸåšã®ã»ãã³ãã£ã¯ã¹ã¯äººã ãæ··ä¹±ãããã¡ã§ãã ïŒç¹ã«ãçŸåšã®å®è£ ã§ã¯ãçŽæ¥ãµããŒããããŠããªããã®ã«å泚éãèŠæ±ãããããšãèæ ®ããŠãã ããïŒïŒ
ãŸãã¯ããã©ã³ã±ããimplãããã«é²ããŠãç§ã¯æšæž¬ããŸãã
impl <T: Try, U: Try> From<U> for T
where U::Ok : Into<T::Ok>, U::Err : Into<T::Err>
{
fn from(other: U) -> Self {
match other.into_result() {
Ok(ok) => Self::from_ok(ok.into()),
Err(err) => Self::from_err(err.into()),
}
}
}
ãŸãã¯äœã§ã...
ããã¯èšã£ãŠããtryãå¹æçã«ç°ãªã
Try
implséã§äžçš®ã®å€æãåŒãèµ·ããããšãã§ãããšã¯æã£ãŠããŸããã§ããã
into_result
ãfrom_ok
ãããã³from_error
åãTry
implãéžæãããããµãŒã¬ãªã³ã°ãæåŸ ããŸããç§ã®æèŠã§ã¯ãåæšè«ãå®è¡ã§ããªããšãã人éå·¥åŠçãªæ倱ïŒç¹ã«ä»£æ¿ã®
impl Try
ãååšããªãããšãèãããšïŒã¯ããã®å€æãèš±å¯ããããšã®å©ç¹ãäžåããŸããã
4ã€ã®å®å®ããTry
ã¿ã€ãããããŸãïŒ Option<T>
ã Result<T, E>
ã Poll<Result<T, E>>
ãããã³Poll<Option<Result<T, E>>
ã
NoneError
äžå®å®ãªã®ã§ã Option<T>
ã«ããããšããŠç«ã¡åŸçããŠããOption<T>
ãªããNoneError
äžå®å®ã§ãã ïŒãã ããããã¥ã¡ã³ãã§ã¯From<NoneError>
ãããšã©ãŒã¿ã€ãã«å¯ŸããŠoption?
ãæå¹ã«ããããšæ瀺çã«åŒã³åºããŠããããšã«æ³šæããŠãã ãããïŒ
ãã ãã Poll
ã¯ããšã©ãŒã¿ã€ããE
ã«èšå®ããŸãã ãã®ããã Try
ã®ãã¿ã€ãã¢ãŒãã£ã³ã°ãã¯å®å®ããŠããŸãã -> Result<_, E>
?
Poll<Result<T, E>>
-> Result<_, E>
ãååŸããŠã Poll<T>
ãååŸã§ããããã§ãã E
ã±ãŒã¹ãè¿ããŸãã
å®éãããã¯ããããããå°ããªãã«ããŒã«åãäžããŸãã
fn lift_err<T, E>(x: Poll<Result<T, E>>) -> Result<Poll<T>, E> { Ok(x?) }
@ CAD97ç§ããŠãŒã¢ã¢ã亀ããŠãããŠããããšãã ããã¯ãåå¿è ã«æããã®ãé£ããããšã§ããããšã©ãŒã¡ãã»ãŒãžã«é¢ããŠããªãã®ææ ãå¿ èŠã«ãªããŸãã
ããã§ã®çŽæçã§ãªãåäœãåãããããã«ãç®çã®impl Try
æå®ãèš±å¯ããããšãèããŸãããïŒ
ããšãã°ãå°ããã€ã¯ã·ã§ãã£ã³ã°ã try<T> { ... }
ã ãããšããããã§ãã€ãŸããäœãããŸã ãããŸããïŒ
ããã«ããå°ãè²ãè¿œå ããããã«ã Result
ã®æã®äžã«try { }
ãResult
ãåã«ãçæããªããšããäºå®ã¯äºæ³å€ã§ãããç§ã¯æ²ãããªããŸãã çç±ã¯ããããŸã
ã¯ãããäžè¬åãããã¿ã€ãã®åž°å±ãïŒæ€çŽ¢ããçšèªããããŸãïŒãštry
ã®çµã¿åããã«ã€ããŠã®è°è«ããããŸããã ç§ãæåŸã«èããã®ã¯ã try: Result<_, _> { .. }
ã¯æçµçã«æ©èœããããšãæå³ããŠãããšæããŸãã
ããããç§ã¯ããªãã«åæããŸãïŒ try
ãããã¯ã¯ããããã®åºåã¿ã€ããæå®ãããŠããããšã確èªããããã®ããã€ãã®ã¿ãŒã²ãã蚺æã«å€ããŸãã
Ok
ã©ããã³ã°ã®åé¡ã«é¢ããèšèªããŒã ã®ã³ã³ã»ã³ãµã¹ã解決ããããã®ç¹å®ã®çã質åã«ã€ããŠã¯ããã®å¥ã®åé¡ãåç
§ã
ã³ã¡ã³ãããåã«ããã®ã¹ã¬ããã®åé ã®ã³ã¡ã³ããèªãã§ãã ãããç¹ã«ããã®ã¹ã¬ããã¯ãã®1ã€ã®è³ªåã«é¢ãããã®ã§ããã try
ãŸãã¯?
ãŸãã¯Try
é¢é£ããä»ã®åé¡ã§ã¯ãªãããšã«æ³šæããŠãã ããã
try
ãããã¯ãå¿
èŠãªçç±ãããããŸããã ãã®æ§æ
fn main() -> Result<(), ()> {
try {
if foo() {
Err(())?
}
()
}
}
ããã§çœ®ãæããããšãã§ããŸãïŒ
fn main() -> Result<(), ()> {
Ok({
if foo() {
Err(())?
}
()
})
}
ã©ã¡ããåãæåæ°ã䜿çšããŠããŸããã2çªç®ã®æåã¯ãã§ã«å®å®ããŠããŸãã
çµæãå€æ°ã«å²ãåœãŠãå Žåãçµæãè¿ãããã«ãã«ããŒé¢æ°ãäœæããå¿ èŠãããããšã瀺ããŠããå¯èœæ§ããããŸãã ãããäžå¯èœãªå Žåã¯ã代ããã«ã¯ããŒãžã£ãŒã䜿çšã§ããŸãã
@dylni try
ãããã¯ã¯ãé¢æ°ã®æ¬äœå
šäœãå«ãŸããŠããªãå Žåã«ç¹ã«äŸ¿å©ã§ãã ãšã©ãŒæã®?
æŒç®åã¯ãé¢æ°ããæ»ããã«ããããŒå¶åŸ¡ãæãå
åŽã®try
ãããã¯ã®æåŸã«ç§»åãããŸãã
`` `é
fn mainïŒïŒ/ *ããã«çµæã¯ãããŸãã* / {
çµæ=è©ŠããŠã¿ãŸããã{
fooïŒïŒ?. barïŒïŒ?. bazïŒïŒïŒ
};
äžèŽçµæ{
//âŠ
}
}
@SimonSapinããã¯
fn main() /* no result here */ {
let result = foo()
.and_then(|x| x.bar())
.and_then(|x| x.baz());
match result {
// âŠ
}
}
ããã¯ããåé·ã§ãããããç°¡åãªè§£æ±ºçã¯ã¡ãœããã¯ããŒãžã£æ§æã ãšæããŸãã
fn main() /* no result here */ {
let result = foo()
.and_then(::bar)
.and_then(::baz);
match result {
// âŠ
}
}
åã¯and_then
ã§ãæ£ããæšæž¬ãããŸããããã§ã try
å泚éãå¿
èŠã§ãã ç§ã¯ãããããŸãé »ç¹ã«åºãŠããªãã®ã§ãç°¡æœãªæ§æãèªã¿ããããæãªã䟡å€ããããšã¯æããªãã
åãå ¥ããããRFCã«ã¯ããã«ããã€ãã®çç±ããããŸãïŒ https ïŒ
ãšã«ããã and_then
ãããªãã§ãŒã³ã¡ãœããããã?
ïŒããã³.await
ïŒæŒç®åã䜿çšããå¶åŸ¡ãããŒã®èšèªæ§é ãæ¯æããè°è«ã¯ãã§ã«åºãè°è«ãããŠããŸãã
ãšã«ããã
and_then
ãããªãã§ãŒã³ã¡ãœããããã?
ïŒããã³.await
ïŒæŒç®åã䜿çšããå¶åŸ¡ãããŒã®èšèªæ§é ãæ¯æããè°è«ã¯ãã§ã«åºãè°è«ãããŠããŸãã
@SimonSapinããããšãã ãããšRFCãèªã¿çŽãããšã§ãããã圹ç«ã€ãšç¢ºä¿¡ããŸããã
tryãããã¯ã䜿çšããŠããšã©ãŒã«ã³ã³ããã¹ããç°¡åã«è¿œå ã§ãããšæããŸããããä»ã®ãšããããŸããããŸããã
ããŸãæ©èœããå°ããªé¢æ°ãæžããŸããã File::open()?
ã¯std::io::Error
倱æãã次ã®è¡ã¯anyhow::Error
倱æããããšã«æ³šæããŠãã ããã ã¿ã€ãã¯ç°ãªããŸãããã³ã³ãã€ã©ã¯äž¡æ¹ãResult<_, anyhow::Error>
ã«å€æããæ¹æ³ãç解ããŸãã
fn tls_add_cert(config: &ClientConfig, path: impl AsRef<Path>) -> Result<(usize, usize), anyhow::Error> {
let path = path.as_ref();
let mut file = BufReader::new(File::open(path)?);
Ok(config.root_store.add_pem_file(&mut file)
.map_err(|_| anyhow!("Bad PEM file"))?)
}
ãšã©ãŒã³ã³ããã¹ããè¿œå ãããã£ãã®ã§ãtry-blockã䜿çšããããšããŸãããããšã«ããwith_context()
ïŒ
fn tls_add_cert(config: &ClientConfig, path: impl AsRef<Path>) -> anyhow::Result<(usize, usize)> {
let path = path.as_ref();
try {
let mut file = BufReader::new(File::open(path)?);
Ok(config.root_store.add_pem_file(&mut file)
.map_err(|_| anyhow!("Bad PEM file"))?)
}
.with_context(|| format!("Error adding certificate {}", path.display()))
}
ããããåæšè«ã¯å€±æããŸãã
error[E0282]: type annotations needed
--> src/net.rs:29:5
|
29 | / try {
30 | | let mut file = BufReader::new(File::open(path)?);
31 | | Ok(config.root_store.add_pem_file(&mut file)
32 | | .map_err(|_| anyhow!("Bad PEM file"))?)
33 | | }
| |_____^ cannot infer type
|
= note: type must be known at this point
```
I don't understand why a type annotation is needed here but not in the first case. Nor do I see any easy way to add one, as opposed to using an [IIFE](https://en.wikipedia.org/wiki/Immediately_invoked_function_expression) which does let me add an annotation:
```rust
(|| -> Result<_, anyhow::Error> {
let domain = DNSNameRef::try_from_ascii_str(host)?;
let tcp = TcpStream::connect(&(host, port)).await?;
Ok(tls.connect(domain, tcp).await?)
})()
.with_context(|| format!("Error connecting to {}:{}", host, port))
@jkugelman
åã³ã
ããã¯ã
try
/?
ãTry
ã¿ã€ããããäžè¬çã§ããããã§ãã [impl Try<Ok=_, Error=anyhow::Error>
]ã§ããä»ã®ã¿ã€ããããå Žåãtryãããã¯ã¯Result
ãšåæ§ã«ãã®ã¿ã€ãã«è©äŸ¡ãããå¯èœæ§ããããŸãã
ïŒãŸãã try
ãããã¯ïŒïŒ70941ïŒã§æ«å°Ÿã®åŒãOk
ããå¿
èŠã¯ãããŸãããïŒ
ãããçŸãç¶ããŠãããšããäºå®ã¯ã
try
ã¯ã¿ã€ãã¢ã¯ãªãã·ã§ã³ïŒ try: Result<_,_> {
ãªã©ïŒããµããŒããããããã®åé¡ã軜æžããå¿
èŠããããŸããtry
ãããã¯ã®åæšè«ã倱æããå Žåã«ãçãçµã£ã蚺æãå¿
èŠã§ããtry
ãä»ã®å¶çŽããªãå Žåã¯ã Result<_,_>
ãžã®ã¿ã€ããã©ãŒã«ããã¯ãäžããããšã匷ãæ€èšããå¿
èŠããããŸãã ã¯ããããã¯é£ãããæå®ãäžååã§ãæœåšçã«åé¡ããããŸããã $12: Try<Ok=$5, Error=$8>
ãååã«å
·äœçã§ãªãããã try
ãããã¯ãå泚éãå¿
èŠãšãã80ïŒ
ã®ã±ãŒã¹ã解決ããŸããããã«ãïŒ70941ããã¯ããïŒäœããã®åœ¢åŒã®ïŒã Try::from_ok
ã©ããã³ã°ããå¿
èŠã§ããã«åãã£ãŠè§£æ±ºããŠããããã«æãããå Žåã try
ããŒã«åŒã®å Žåã®ã¿ãŒã²ãã蚺æãå¿
èŠã«ãªãå¯èœæ§ããããŸãã x
ãæ©èœãããšãã«ã Ok(x)
è¿ããŸãã
è©ŠããŠã¿ãã®ã«æ£ããæ¯ãèãã¯
try: Result<_, _> { .. }
ã try as Result<>
ãªã©ã®æåã«ããå²ãåœãŠãèš±å¯ããŸãïŒ try: Result
ã¯ããããåé¡ãªããšæããŸããïŒæšå¥šãããæ§æã®ããã§ãïŒtry
çµæã¿ã€ããšããŠãããåªå
ããŸãResult<_, _>
ããã¯i32
ãããªåæšè«ãã©ãŒã«ããã¯ã§ã¯ãªãã以åã«çºçããŸããã try { }.with_context(...)
ãããªãã®ãã³ã³ãã€ã«ãããããšãæå³ããŸãããã ããå°ãªããšããšã©ãŒã¿ã€ããæå®ãããŠããªãéãã ?
ããã³into
匷å¶ã®ååŸã§ãšã©ãŒãçºçããå¯èœæ§ãããã®ã§ã¯ãªãããšå¿é
ããŠããŸãã ç¹ã«ã try
ãããã¯ã®çµæã?
ããã³ãŒããæžãå Žåã¯ã次ã®ããã«ãªããŸãã
#![feature(try_blocks)]
use std::error::Error;
fn foo() -> Result<(), Box<dyn Error>> {
let x: Result<_, _> = try {
std::fs::File::open("foo")?;
};
x?;
Ok(())
}
fn main() {
}
ã©ã®?
ã§ãintoã匷å¶ãããªã¬ãŒãããã¹ãããæ確ã§ãªãããããšã©ãŒïŒéã³å ŽïŒãçºçããŸãã
ããã§æåã®è§£æ±ºçãäœã§ãããã¯ããããŸãããããããããç§ãç·åŒµãããåæšè«ã®ãã©ãŒã«ããã¯ãå«ãŸããŸãã
ãããããç§ãç·åŒµãããåæšè«ã®ãã©ãŒã«ããã¯ãå«ãŸããŸãã
æãåçŽãªæ¹æ³ïŒç¹å®ã®Try
ãããã¯ã§ã®?
ãã¹ãŠã®äœ¿çšã«ãåãTry::Error
ã¿ã€ããå«ãŸããŠããå Žåã¯ãå«ãŸããŠããtry
ãããã¯ã«ãã®ãšã©ãŒã¿ã€ãã䜿çšããŸãïŒãã ãããã以å€ã®å Žåã¯ãã€ã³ããããŸãïŒã
ãïŒä»ã«çžãããŠããªãéãïŒãã¯ãã¡ããã埮åŠãªæãéšåã§ãã
ç§ã¯ãã®æçš¿ã§ããŸã建èšçã§ã¯ãªãããšãé¡ã£ãŠããŸãã ãã ãã @ nikomatsakisã®äŸãã ?
ã匷å¶å€æãè¡ããã try
ãããã¯ã®çµæã®èªåã©ããã³ã°ããªããã©ã¬ã«ã¯ãŒã«ãã®äŸãšå¯Ÿæ¯ããããšæããŸããã
use std::error::Error; fn foo() -> Result<(), Box<dyn Error>> { let x = try { std::fs::File::open("foo").err_convert()?; Ok(()) }; x?; Ok(()) }
ãã®äžçã§ïŒ
try
ã¹ã³ãŒããšfn
èªäœã®äž¡æ¹ããå€ãªãã§æåããããšã¯ç°¡åã«ããããŸãã ãŸãã Result
ãçæããããšããã«ãç°¡åã«ç¢ºèªã§ããŸããx?
åŒã«ç§»åããŠã try
ã¹ã³ãŒããstd::fs::File
æäœã«åºæã«ããããšãã§ããŸããç§ã¯ãã®ãã©ã¬ã«ãŠãããŒã¹ã§ãšãŠã幞ãã§ãã
@phaylonããªãããã®ã³ã¡ã³ãã泚ææ·±ãæžããæ¹æ³ã«æè¬ããŸãããããã¯ããªãé建èšçã§ãããšæããŸãã ãšã©ãŒå€æã¯?
äžéšã§ãããå€æŽãããããšã¯ãããŸããããããèæ
®ãããšãok-wrappingã¯åºæ¬çã«ãã®èª¬æã®æ®ãã®éšåãšçŽäº€ããŠããŸãã
try
é¢æ°ïŒreturnåãšthrowåïŒãæ€èšããå¿
èŠãããå Žåã¯ãtryãããã¯ãå²ãåœãŠãããã®æ§æãåæ§ã®ãã®ãšèŠãªã䟡å€ããããŸãã
äŸãã°
try fn foo() -> u32 throw String {
let result = try: u32 throw String {
123
};
result?
}
ãããè°è«ãããŠããå Žåã¯ç³ãèš³ãããŸãããã䜿çšããå©ç¹ã¯äœã§ãã
try fn foo() -> u32 throw String { ... }
ãŸãã¯ãšã¯å¯Ÿç §çã«é¡äŒŒ
fn foo() -> Result<u32, String> { ... }
ïŒ
æ§æãéè€ããŠããããã§ãã
@gorilskijç§ãç解ããŠããããã«ãäž»ãªå©ç¹ã¯Ok
ã©ããã³ã°ãååŸããããšã§ãã ãã以å€ã®å Žåã¯ã次ã®ããã«èšè¿°ããå¿
èŠããããŸãã
fn foo() -> Result<u32, String> {
try {
// function body
}
}
äŸå€ã®çšèªãé¢é£ããŠãããšæãã®ã§ã throws
ã奜ã人ãããŸãã
å人çã«ã¯ãäŸå€ã®åºçŸãã§ããã ãé¿ããããšæããŸãã
ããã¯try fn
ã«ã€ããŠè°è«ããã¹ã¬ããã§ã¯ãªãã®ã§ããã®æ¥ç·ããã以äžé²ããªãã§ãã ããã ãã®ã¹ã¬ããã¯ã try
ãããã¯ã®åãå
¥ããããæ©èœã®ããã®ãã®ã§ãããæœåšçãªïŒãããŠãŸã RFCdã§ã¯ãªãïŒæ©èœtry fn
ã§ã¯ãããŸããã
From
ã§ã¯ãªãInto
ã䜿çšããŠææ¡ããã?
ã®
çŸåšã®RFCã¯ããã®ç®çã®ããã«
std::convert::Into
ãã¬ã€ãã䜿çšããŠããŸãïŒFrom
ããã®å æ¬çå®è£ 転éããããŸãïŒã
æ£ç¢ºãªã¢ãããã£ã¹ãæ¹æ³ã¯æªè§£æ±ºã®è³ªåãšããŠæ®ããŠããŸããã Into
ã¯ãïŒããããïŒ From
ããã®ã¬ã€ãã³ã¹ã«åºã¥ããŠåªå
ãããŸããïŒ
ãžã§ããªãã¯é¢æ°ã§ãã¬ã€ãå¢çãæå®ãããšãã¯ã
From
ã䜿çšãããããInto
ã䜿çšããããšããå§ãããŸãã ãã®ããã«ãInto
ãçŽæ¥å®è£ ããåãåŒæ°ãšããŠäœ¿çšããããšãã§ããŸãã
ãã ãã Try
ãã¬ã€ãRFCã§ã¯ã Into
ã¯èšåãããªããªãã代ããã«From
ã䜿çšããŠå€æãè¡ãããŸãã ããã¯ã ?
å Žåã§ããã³ãŒããçŸåšäœ¿çšããŠãããã®ã§ããããŸã
https://github.com/rust-lang/rust/blob/b613c989594f1cbf0d4af1a7a153786cca7792c8/src/librustc_ast_lowering/expr.rs#L1232
Into
ããFrom
移è¡ããå
æ¬çãªå®è£
ããªããããããã¯æ®å¿µãªããšã®ããã§ãã ã€ãŸããïŒ From
ã§ã¯ãªãïŒ Into
ãå®è£
ãããšã©ãŒã¯ãã¬ã¬ã·ãŒã®çç±ã§ããŸãã¯ãã®ä»ã®å¿
èŠæ§ããã ?
ïŒãŸãã¯Try
ïŒã ãŸããæšæºã©ã€ãã©ãªã§æšå¥šãããŠããç¯å²å
ã§Into
ã䜿çšããå®è£
ã¯ã ?
䜿çšã§ããªãããšãæå³ããŸãã äŸãšããŠãæšæºã©ã€ãã©ãªã¯ç§ãæžãããšãæšå¥šããŠããŸãïŒ
fn with_user_err<E>(op: impl Fn() -> Result<(), E>) -> Result<(), MyError>
where E: Into<MyError>
ãããããããããšãé¢æ°æ¬äœã§?
ã䜿çšã§ããªããªããŸãã ããããããã®ãªããç§ã¯æžããªããã°ãªããŸãã
fn with_user_err<E>(op: impl Fn() -> Result<(), E>) -> Result<(), MyError>
where MyError: From<E>
ãããããããããšã From
代ããã«Into
ãå®è£
ãããšã©ãŒã¿ã€ãã®ãŠãŒã¶ãŒã¯ãã®é¢æ°ã䜿çšã§ããªããªããŸãã From
åºã¥ãInto
ã®å
æ¬çå®è£
ã®ãããéã¯çã§ã¯ãªãããšã«æ³šæããŠãã ããã
ä»ãã?
ãä¿®æ£ããã«ã¯ããããïŒïŒïŒé
ãããŸãïŒããã¯_éåžžã«_æ®å¿µã§ãâãããã次ã®çã§ã¯ïŒïŒããå°ãªããšãTry
ã§ãã®ãã¹ãæ·±ãæãäžããªãããã«ããå¿
èŠããããŸã
@jonhoo @cuviperã¯ãïŒ38751ããã§ãã¯ããããã«ïŒ60796ã§è±ç³ãFrom
ããInto
ã«å€æŽããããšããŸãããã From
åå ã§ã倧éã®æšè«ãç ŽæããŸããã -> Into
ãã©ã³ã±ããimplã¯ãrustcãIDå€æã®äžè¬çãªã±ãŒã¹ãåŠçããã®ãé£ããããŸããã ã³ã¹ããç Žãæšè«ã¯ããã»ã©äŸ¡å€ããªããšå€æãããŸããã
@jonhooãŸããæçã§ããããšãããããããããŸããïŒ
ç¹æ§ã·ã¹ãã ã«ã¯ããŒãã³ãŒããããå¶éããããŸãã
?X: Into<ReturnType>
ãããªç®æšã解決ããå¿ èŠãããå Žåã解決ã«å€±æããŸãããReturnType: From<?X>
ãããªç®æšã解決ããå¿ èŠãããå ŽåãæåããŠ?X
å€ãæšæž¬ããå¯èœæ§ããããŸããç·šéïŒããã§ã
?X
ã¯ããã€ãã®æªç¥ã®æšè«å€æ°ãåç §ããŠããŸãã ä»æ¥ã®ç¹æ§ã·ã¹ãã ã§ããŒãã³ãŒããããå¶éã¯ããã®ãªãã·ã§ã³ãæ€èšããããã«ãSelf
ã¿ã€ããå°ãªããšãéšåçã«æšæž¬ããå¿ èŠããããšããããšã§ãã
TL; DRã¯ã Into
ãŠæšæž¬ããã®ãé£ãããç¹æ§ãœã«ããŒãæ©èœããæ¹æ³ã«åºæã®æ¹æ³ã§ãããšããããšã§ãã
@KrishnaSannasi @ CAD97ããããšããããã¯åœ¹ã«ç«ã¡ãŸããïŒ Into
å®è£
è
ãæ°žä¹
ã«é€å€ããŠããããšãèãããšã From
åºã¥ãå®å®åãé²ã¿ãããã®ã§ã¯ãªãããšå¿é
ããŠããŸãã ããã§ã®æšè«ã¯æçµçã«ã¯è¯ããªããããããªããšããæåŸ
ã¯ãããŸããïŒ ç¯å²å
ã§Into
ãåªå
ããã¬ã€ãã³ã¹ãå€æŽããå¿
èŠããããŸããïŒ 1.41ã®æ°ããç¹æ§ã³ããŒã¬ã³ã¹ã«ãŒã«ïŒããã ã£ããšæããŸãïŒã§ã¯ã Into
ã ããå®è£
ããçç±ããªããªããããããã¹ãŠã®implsãã°ãèæ
®ããããšãæåŸ
ããŠããŸããïŒ
æšè«ãååã«ããŸãããå Žåã¯ãåŸã§Into
ã«å€æŽããããã«äžäœäºææ§ãããã¯ãã§ãã From
ãInto
æå³ããããšãèãããšãç§ãã¡ãç Žãããšãã§ããææªã®äºæ
ã¯æšè«ã§ã
ããïŒ Try
ç¹æ§ïŒã¯ã ?
ãTry
ãå®è£
ããåã®äžè¬çãªå¢çãæã€Into
/ From
ç¹æ§ãšé£æºã§ããããã«ããããšãã«ããŒããŠããŸããïŒ Try
ïŒäŸïŒ Result
èªäœïŒïŒ
ã€ãŸãã ?
ãªã©ãè¿ãã¯ããŒãžã£ãŸãã¯é¢æ°ã®impl Into<Result>
ïŒæ¯æ©ãããè©ŠããŠã¿ããšããã§ã¯ãªãããã§ããïŒïŒ
ç§ã¯ãããå®å®ããã®ãèŠãããšæã£ãŠããŸãã ãã®ã¹ã¬ãããšïŒ70941ãèªãã ããèŠçŽã次ã®ããã«æŽæ°ããå¿ èŠããããšæããŸãã
ãcatchãããã¯ãçµæå€ããã©ãããããå¿ èŠããããã©ããã解決ãããã«ãã§ãã¯ããŒã¯ãä»ããå¿ èŠããããŸãã ã
ãããã®æšè«ã®åé¡ã«ã€ããŠæ°ããªæžå¿µãè¿œå ãããŸããã ãããã次ã®ãããªãã®ã§ãïŒ
ãã®æåŸã®æžå¿µã¯ããšããã次ã®æ¹æ³ã§å¯ŸåŠã§ãããšããISTMïŒ
try
ã«è¿œå ããŸãResult
ïŒtry
ãçŸç¶ã®ãŸãŸå®å®ãããããšã決å®ããå°æ¥ã®æ¹åã®ããã«æ§æ/æå³ç©ºéãæ®ããŸãïŒãããã®ãªãã·ã§ã³ã®äžéšã¯çžäºã«æä»çã§ã¯ãããŸãããïŒ
ãæž èŽããããšãããããŸããããã®ã¡ãã»ãŒãžãã圹ã«ç«ãŠã°å¹žãã§ãã
ã¿ã€ãã¢ã¯ãªãã·ã§ã³ã«ã¯å€ãã®åé¡ïŒæ§æããã³ãã®ä»ïŒããããå®å®åã¯èšããŸã§ããªããããã«å®è£
ãããå¯èœæ§ã¯äœãããã§ãã ã¿ã€ãã¢ã¯ãªãã·ã§ã³æ§æã§try
ãããã¯ããããã¯ããããšã¯é©åã§ã¯ãªãããã§ãã
Result
ãžã®ãã©ãŒã«ããã¯ã¯åœ¹ç«ã€ãããããŸãããããšã©ãŒåã®åæšè«ã®åé¡ã¯è§£æ±ºããŸããã try { expr? }?
ïŒãŸãã¯å®éã«ã¯ããè€éãªåçç©ïŒã«ã¯ãå®è³ªçã«.into()
ãžã®2ã€ã®åŒã³åºãããããŸãã ãããã«ãããã³ã³ãã€ã©ã¯äžéåã«å¯ŸããŠæè»æ§ãé«ããªããããŸãã
@ijacksonã¯ãçŸåšã®ç¶æ ãèŠçŽããããã«çå ããŠ
ãã ããåã®å²ãåœãŠã«é¢ããŠã¯ãå®è£ ã®èª²é¡ã¯ããã»ã©é£ãããªããšæããŸãã ããã¯ã泚æãåããŠãããããã£ããã·ã¥ã©ã€ã³ã«æŒãäžããããšããã®ã«è¯ãåè£ãããããŸããã æ§æããã®ãããªãã®ã«ã€ããŠå€ãã®è«äºããã£ããã©ããã¯èŠããŠããŸããã
2020幎8æ5æ¥æ°Žææ¥02:29:06 PM -0700ã«ããã³ã»ããµãã¹ã¯æ¬¡ã®ããã«æžããŠããŸãã
ãã ããåã®å²ãåœãŠã«é¢ããŠã¯ãå®è£ ã®èª²é¡ã¯ããã»ã©é£ãããªããšæããŸãã ããã¯ã泚æãåããŠãããããã£ããã·ã¥ã©ã€ã³ã«æŒãäžããããšããã®ã«è¯ãåè£ãããããŸããã æ§æããã®ãããªãã®ã«ã€ããŠå€ãã®è«äºããã£ããã©ããã¯èŠããŠããŸããã
ç§ãæãåºããããã«ãäž»ãªé¢å¿äºã¯ã¿ã€ãã®åž°å±ãèš±å¯ããããšã§ãã
ã©ãã§ãææ³ã倧å¹
ã«å€æŽãããå Žåã«ãã£ãŠã¯
1ã€ãå¶éããŸãã ç§ã¯å®å
šãªè©³çŽ°ãæãåºããŸããããã æžå¿µããã£ããšããããšã ãã§ã
äžããã
å人çã«ã¯ã人éå·¥åŠçãªåé¡ã¯ããã»ã©æªãã¯ãªãã®ã§ãä»ãã®æ©èœãå®å®ããã䟡å€ã¯ãªããšæããŸãã åŒã¿ã€ãã®å²ãåœãŠããªããŠããletãã€ã³ãã£ã³ã°ãå°å ¥ããããšã¯ããã»ã©éãåé¿çã§ã¯ãããŸããã
ãŸãã try
ãããã¯ã¯ãã¯ãã§åœ¹ç«ã€å ŽåããããŸãã ç¹ã«ã @ withoutboatsã®åªããfehlerã©ã€ãã©ãªã¯ã try
ã©ããã§ããã°ããã¯ãã·ã¹ãã ã®æ¬ é¥ã«é¢ããåé¡ãå°ãªããªãã®ã§ã¯ãªãããšæããŸãã
ãã©ã€ãããã¯ããããã䜿ããããšããã«åºããããŸãã ãããäžç·ãè¶ããŠååŸããã®ã¯è¯ãããšã§ãã å人çã«ã¯ãè©Šè¡ãããã¯ãååŸããå¿ èŠãããå Žåã¯ã絶察ã«100ïŒ ç ç²ã¿ã€ãã®ã¢ã¯ãªãã·ã§ã³ã䜿çšããŸãã ãããã«ã¿ã€ãã¢ã¯ãªãã·ã§ã³ã欲ããããšèšã£ãç¶æ³ã«ã¯ãŸã æ°ã¥ããŠããŸããããè©Šè¡ãããã¯ãã·ãã¥ã¬ãŒãããããã«IIFEãå®è¡ããããšã«ãªããŸãã å¥ã®é·æçã§äžå®å®ãªæ©èœãšç«¶åãããããé·æçã§æçšãªæ©èœãäžå®å®ãªãŸãŸã«ããŠããããšã¯ãæ¬åœã«äžå¹žãªç¶æ³ã§ãã
ããå°ãå ·äœçã«èšããšãResultãè¿ãé¢æ°å ã«ãããšãã«ãããå®è¡ããŠããããšã«æ°ä»ããŸãããOptionãè¿ããã®ã«å¯ŸããŠäœããã®åŠçãå®è¡ããããšæããŸãã ãšã¯èšããã®ã®ãTryãäžè¬çã«å®å®ããŠããå Žåã¯ãå®éã«ã¯mainé¢æ°ããæ»ããããªãã®ã§ãtryãããã¯ã奜ãã§ããããã代ããã«ããã§ãŒã³å ã®ãããããå®å®ããŠããå Žåã¯ãäœããã®ããã©ã«ãå€ãæå®ããŸãããªãã ããã¯ãã·ãªã¢ã«åã¹ã¿ã€ã«ã®ã³ãŒãã§çºçããåŸåããããŸãã
å人çã«ãç§ã¯ãããã¯ãè©Šããããã¯ããã«é »ç¹ã«ã¿ã€ãã®åž°å±ãæãã§ããŸããïŒç§ã¯æã äž¡æ¹ãæãã§ããŸãããïŒã ç¹ã«ãã³ã³ãã€ã©ãäºæ³ãšã¯ç°ãªãåãæšæž¬ãããåã®ãããã°ãã«èŠåŽããããšããããããŸãã éåžžãã©ããã«æ°ããletãã€ã³ãã£ã³ã°ãè¿œå ããå¿ èŠããããŸããããã¯éåžžã«æ··ä¹±ãæããrustfmtãå ã«æ»ãå±¥æŽãå£ããŠããŸããŸãã ããã«ãã¿ã€ãã®åž°å±ãäœåãªã¿ãŒããã£ãã·ã¥ãåé¿ããå ŽæããããããããŸãã
å¯Ÿç §çã«ãand_thenãŸãã¯ä»ã®ã³ã³ãããŒã¿ã䜿çšããŠãçµäºããã«æ©æã«çµäºããããšãã§ããŸãã ããããããããã¯ãè©Šãã»ã©ã¯ãªãŒã³ã§ã¯ãããŸããããããã»ã©æªãã¯ãããŸããã
@steveklabnik @ mark-im Tryãããã¯ãšåã®å²ãåœãŠã¯ã決ããŠç«¶åããŠããŸãããæ©èœã®åé¡ã§ã¯ãããŸããã try
ãããã¯ã«ã¯é人éå·¥åŠçãªåæšè«ã®å€±æããããäžè¬åãããåã®åž°å±ã¯ãã®åé¡ã解決ããæ¹æ³ã§ããå¯èœæ§ããããŸãããäžè¬åãããåã®åž°å±ã¯çæçãªæ©èœã§ã¯ãªãã確å®ãªãã®ã§ããªãããã @ joshtriplett ïŒããã³ç§åæããïŒãã®æ©èœãäžè¬åãããåæšè«ã®çºçããããã¯ããããšãæãŸãªãã
ããã¯ãäžè¬åãããã¿ã€ãã®åž°å±ãåé¡ã®è§£æ±ºçã«ããªããšããæå³ã§ããããŸããã 調æ»ã«å€ãã1ã€ã®ãªãã·ã§ã³ã¯ãããã€ãäžè¬åãããã¿ã€ãã®åž°å±ããã®åé¡ã解決ããããšãæåŸ ããŠãè©Šè¡ããã®ãŸãŸå®å®ããããããšã§ãã èšãããŠããããšã¯ãåã®åž°å±ã®å®å®åã劚ããªãããšã§ãã
@ rust-lang / lang GitHubãããã§èª¬æããä»ã®å€ãã®äž»é¡ã®å¶éã®ããããã®ã¹ã¬ããããã®åæšè«ã®å€±æã®ãã¥ã¢ã³ã¹ãç解ããã®ã¯å°ãé£ããããšãèªããªããã°ãªããŸããã æšè«ã®å€±æãã©ã®ããã«åŠçãããã決å®ããããšããtryãããã¯ã®å®å®åã劚ããå¯äžã®ããšãªã®ã§ãããã«ã€ããŠè©±ãåãããã®äŒè°ãããã°æçã ãšæããŸãã誰ããæšè«ã®åé¡ãæ·±ãç解ããããã®ãã€ã³ããåŸãããšãã§ããŸãã ã
ããšãã°ãç§ã«çºçãã1ã€ã®è³ªåã¯ããã®æšè«ã®åé¡ã¯ãç¹ã«Try
èš±å¯ãããŠããå€æã®æè»æ§ã«ãããã®ã§ããïŒ æ±ºå®ãæ»ã¬ãŸã§è°è«ãããããšã¯ç¥ã£ãŠããŸãããããã§ããã°ãããã¯Try
ç¹æ§ã®å®çŸ©ãå€æŽããããšãæ£åœåã§ããé©åãªæ°ããæ
å ±ã®ããã«æãããŸãã
@withoutboatsç§ã¯ããã¹ãŠã®æ
å ±ã1ãæã«åéããå¿
èŠæ§ãšããã®æ©èœããã£ããã·ã¥ã©ã€ã³ã«æŒãäžããããšããé¡æã«åæããŸãã ãšã¯èšããã®ã®ãååããã§èª¿æ»ãããšãã«ãäžäœäºææ§ã®ããã«Try
ãžã®å€æŽãé£ããå¯èœæ§ãããããšãæããã«ãªã£ããšæããŸã- @ cramertjã¯ããã€ãã®ç¹å®ã®Pin
implãIIRCã«ã€ããŠèšåããŸããã
æãåèã«ãªãã³ã¡ã³ã
@ mark-imå®å®ããåŸãäžæ¹ããä»æ¹ã«åççã«ç§»åã§ãããšã¯æããŸããã Ok-wrappingã¯æªããšæããŸãããå¿ èŠãã©ãããæšæž¬ããããšããäžè²«æ§ã®ãªãOk-wrappingã¯ããã«æªåããŸãã