ãã®ã¹ã¬ããã«ã³ã¡ã³ãããåã«ã httpsïŒ//github.com/rust-lang/rust/issues/50547ããã§ãã¯ããŠããã§ã«ããã§è¡ãããåŒæ°ãè€è£œããŠããªãããšã確èªããŠãã ããã
çŸé£Œãããã®ã¡ã¢ïŒ
ãã®ã¹ã¬ãããåããŠäœ¿çšããå Žåã¯ã httpsïŒ //github.com/rust-lang/rust/issues/57640#issuecomment -456617889ããéå§ããããšãæ€èšããŠãŸããææ°ã®ã³ã¡ã³ãã¯
ä»ã®èšèªãawaitæ§é ãã©ã®ããã«åŠçããããæžãããšã¯åœ¹ã«ç«ã€ãããããªããšæããŸããã
val result = task.await()
var result = await task;
let! result = task()
val result = Await.result(task, timeout)
result = await task
let result = await task;
auto result = co_await task;
$result = await task;
var result = await task;
ããã§ããRuståŒã¯ããã€ãã®é£éã¡ãœããã«ãªãå¯èœæ§ãããããšãå¿ããªãã§ãã ããã ã»ãšãã©ã®èšèªã¯ããããªãåŸåããããŸãã
ããã§ããRuståŒã¯ããã€ãã®é£éã¡ãœããã«ãªãå¯èœæ§ãããããšãå¿ããªãã§ãã ããã ã»ãšãã©ã®èšèªã¯ããããªãåŸåããããŸãã
æ¡åŒµã¡ãœããããµããŒãããèšèªã¯æ¡åŒµã¡ãœãããæã£ãŠããåŸåããããšæããŸãã ãããã«ã¯ãRustãKotlinãCïŒïŒããšãã°ãã¡ãœããæ§æLINQããã³ããŸããŸãªãã«ããŒïŒããã³FïŒãå«ãŸããŸãããåŸè ã¯åãå¹æã®ããã«ãã€ãæŒç®åãå€çšããŸãã
ç§ã®åŽã§ã¯çŽç²ã«éžè©±çã§ãããç§ã¯å®æçã«Rustã³ãŒãã§æ°å以äžã®ã¡ãœããé£éåŒã«ééãããããèªã¿åã£ãŠæ£åžžã«å®è¡ããŸãã ç§ã¯ä»ã®å Žæã§ãããçµéšããããšããããŸããã
ãã®åé¡ã¯ãïŒ50547ã®äžçªäžã®æçš¿ïŒ[åŸ æ©ã®æçµæ§æ]ãã§ãã¯ããã¯ã¹ã®æšªïŒã§åç §ãããŠããããšã確èªããããšæããŸãã
Kotlin
val result = task.await()
Kotlinã®æ§æã¯æ¬¡ã®ãšããã§ãã
val result = doTask()
await
ã¯åãªãsuspendable function
ã§ãããäžæµã®ãã®ã§ã¯ãããŸããã
èšåããŠããã ãããããšãããããŸãã å ç©ã¯ããã©ã«ãã§ç±å¿ã§ãããããKotlinã¯ããæé»çã«æããŸãã ãã ãããã®ã¡ãœããã䜿çšããŠä»ã®é 延ãããã¯ãåŸ æ©ããããšã¯ãé 延ãããã¯ã§ã¯äŸç¶ãšããŠäžè¬çãªãã¿ãŒã³ã§ãã ç§ã¯ç¢ºãã«ãããæ°åããŸããã
@cramertj https://github.com/rust-lang/rust/issues/50547ã«276ã®ã³ã¡ã³ããããã®ã§ãããã§ç¹°ãè¿ããªãããã«ããããã«ãããã§è¡ãããåŒæ°ãèŠçŽã§ããŸããïŒ ïŒãã¶ãããã§ããããOPã«è¿œå ããŸããïŒïŒ
å ç©ã¯ããã©ã«ãã§ç±å¿ã§ãããããKotlinã¯ããæé»çã«æããŸãã ãã ãããã®ã¡ãœããã䜿çšããŠä»ã®é 延ãããã¯ãåŸ æ©ããããšã¯ãé 延ãããã¯ã§ã¯äŸç¶ãšããŠäžè¬çãªãã¿ãŒã³ã§ãã ç§ã¯ç¢ºãã«ãããæ°åããŸããã
å€åããªãã¯å°ãã®æè/説æã§äž¡æ¹ã®ãŠãŒã¹ã±ãŒã¹ãè¿œå ããã¹ãã§ãã
ãŸããgo-langã®ããã«ãæé»ã®åŸ æ©ã䜿çšããä»ã®langãšã¯äœã§ããïŒ
ä¿®æ£åŸã®æ§æãæ¯æããçç±ã®1ã€ã¯ãåŒã³åºãå ã®èŠ³ç¹ãããawaitãé¢æ°åŒã³åºãã®ããã«åäœããããšã§ãããããŒå¶åŸ¡ãæŸæ£ãããããåãæ»ããšãçµæãã¹ã¿ãã¯ã§åŸ æ©ããŸãã ãããã«ãããfunction-paranthesisãå«ããããšã§ãé¢æ°ã®ãããªåäœãåãå ¥ããæ§æããå§ãããŸãã ãŸããã³ã«ãŒãã³ã®æ§ç¯ãæåã®å®è¡ããåå²ããŠããã®åäœãåæãããã¯ãšéåæãããã¯ã®éã§äžè²«ããããã«ããã®ã«ã¯ååãªçç±ããããŸãã
ããããæé»ã®ã³ã«ãŒãã³ã¹ã¿ã€ã«ãè°è«ãããŠãããç§ã¯æ瀺æ§ã®åŽã«ããŸãããã³ã«ãŒãã³ãåŒã³åºãããšã¯ååã«æ瀺çã§ã¯ãªãã§ããããïŒ ããã¯ãããããã³ã«ãŒãã³ãæ§ç¯ãããå Žæã§çŽæ¥äœ¿çšãããŠããªãå ŽåïŒãŸãã¯ã¹ããªãŒã ã§æ©èœããå¯èœæ§ãããå ŽåïŒã«æé©ã«æ©èœããŸãã æ¬è³ªçã«ãéåžžã®åŒã³åºããšã¯å¯Ÿç
§çã«ããããªã©ãã¯ã¹ããè©äŸ¡é åºã§ã¯ãã³ã«ãŒãã³ã«å¿
èŠä»¥äžã«æéãããããšäºæ³ãããŸãã ãããŠã .await!()
ã¯ãå€ããå°ãªãããéåžžã®é話ãšã³ã«ãŒãã³é話ãåºå¥ããè©Šã¿ã§ãã
ããã§ãããŸãããã°ããã¹ããã£ãã¯ã¹ã奜ãŸããçç±ã«ã€ããŠããããæ°ããèŠè§£ãæäŸããåŸãæ§æã®è¬èãªææ¡ïŒ
future(?)
future(await)
ã¯ãã¡ããç¬èªã®ãã¬ãŒããªãããããŸãããæ··ä¹±ãå°ãªããšèªããããŠããããã§ããæçš¿ã®äžéšãåç
§ããŠãã ãããä»ã®ã¹ã¬ããããã®ããªã人æ°ã®ããäŸãé©å¿ãããïŒ logger.log
ãã³ã«ãŒãã³ã§ãããšä»®å®ããŠãããã«åŒã³åºãããšãã©ã®ããã«èŠãããã瀺ããŸãïŒïŒ
async fn log_service(&self) -> T {
let service = self.myService.foo(); // Only construction
self.logger.log("beginning service call")(?);
let output = service(?); // Actually wait for its result
self.logger.log("foo executed with result {}.", output)(?);
output
}
ãããŠä»£æ¿æ¡ïŒ
async fn log_service(&self) -> T {
let service = self.myService.foo(); // Only construction
self.logger.log("beginning service call")(await);
let output = service(await);
self.logger.log("foo executed with result {}.", output)(await);
output
}
å€èªäžèœãªã³ãŒããåé¿ããæ§æ解æãæ¯æŽããããã«ãçå笊ãšãªãŒãã³ãã©ã³ã®éã§ã¯ãªããçå笊ã®åŸã«ã¹ããŒã¹ãå
¥ããŠãã ããã ãããã£ãŠã future(? )
ã¯é©åã§ããã future( ?)
ã¯é©åã§ã¯ãããŸããã ãã®åé¡ã¯ãçŸåšã®ãã¹ãŠã®ããŒã¯ã³ã以åã®ããã«äœ¿çšã§ããfuture(await)
ã®å Žåã«ã¯çºçããŸããã
ä»ã®ä¿®æ£åŸã®æŒç®åïŒçŸåšã®?
-tryãªã©ïŒãšã®çžäºäœçšããé¢æ°åŒã³åºãã®å Žåãšåãã§ãã
async fn try_log(message: String) -> Result<usize, Error> {
let logger = acquire_lock()(?);
// Very terse, construct the future, wait on it, branch on its result.
let length = logger.log_into(message)(?)?;
logger.timestamp()(?);
Ok(length)
}
ãŸãã¯
async fn try_log(message: String) -> Result<usize, Error> {
let logger = acquire_lock()(await);
// Very terse, construct the future, wait on it, branch on its result.
let length = logger.log_into(message)(await)?;
logger.timestamp()(await);
Ok(length)
}
ããã奜ãã«ãªãããã€ãã®çç±ïŒ
.await!()
ãšæ¯èŒããŠãä»ã®çšéãæã€å¯èœæ§ã®ããã¡ã³ããŒãæ瀺ããŠããŸããã?
䜿çšãªã©ãåŒã³åºãã®èªç¶ãªåªå
é äœã«åŸããŸãã ããã«ãããåªå
ã¯ã©ã¹ã®æ°ãå°ãªããªããåŠç¿ã«åœ¹ç«ã¡ãŸãã ãŸããé¢æ°åŒã³åºãã¯åžžã«èšèªã§ããããç¹æ®ã§ããããïŒç¹æ§ã¯ãããŸããïŒããŠãŒã¶ãŒã³ãŒããéåžžã«é¡äŒŒããæ§æãšå¹æãæã€ç¬èªã®my_await!()
ãå®çŸ©ã§ããããšã¯æåŸ
ã§ããŸãããFnOnce
ãšããŠåäœããŸããã Streams
ã¯FnMut
ããã«åäœããŸãã è¿œå ã®è°è«ãç°¡åã«åãå
¥ããããšãã§ããŸããFutures
ã䜿çšããããšããã人ã®ããã«ãããã¯Poll
ãå«ã?
ããã£ãšæ©èœããã¯ãã ã£ãæ¹æ³ããã£ããã£ããŸãïŒããã§ã¯æ®å¿µãªå®å®åã·ãŒã±ã³ã¹ïŒã åŠç¿ã¹ããããšããŠã ?
ããŒã¹ã®ãªãã¬ãŒã¿ãŒãå¶åŸ¡ãããŒãè¿åãããããšãæåŸ
ããããšãšãäžèŽããŸãã (await)
ã¯ãããæºãããŸããããçµå±ã®ãšãããé¢æ°ã¯åžžã«åå²ç¹ã§åéããããšãæåŸ
ããŸãããããŠããã奜ãŸãªãçç±ïŒ
?
ã¯åŒæ°ã®ããã«èŠããŸãããåŒã«ã¯é©çšãããŠããŸããã é©çšãããŠããããã«èŠããããŒã¯ã³ã¯é¢æ°åŒã³åºãèªäœã§ãããããããã¯æããããšã§è§£æ±ºã§ãããšæããŸããããã¯ããæ£ããæŠå¿µã§ãã ããã¯ãŸããæ§æãæ確ã§ããããšãæ確ã«æå³ããŸãã?
ããå€ãã®ïŒãããŠç°ãªãïŒçµã¿åããã¯ã解æãé£ããå ŽåããããŸãã ç¹ã«ãããæªæ¥ãå¥ã®æªæ¥ã®çµæãè¿ãå ŽåïŒ construct_future()(?)?(?)?
ã ãã ãã fn
ãªããžã§ã¯ãã®çµæãååŸã§ããããã«ããããã«åãåŒæ°ãäœæããŠã次ã®ãããªåŒãèš±å¯ããããšãã§ããŸãïŒ foobar()?()?()?
ã ããã«ãããããããç§ã¯ããã䜿çšããããèŠæ
ããã£ããããã®ãèŠãããšããªãã®ã§ããã®ãããªå Žåã«å¥ã
ã®ã¹ããŒãã¡ã³ãã«åå²ããããšãååã«å¿
èŠã«ãªãããšã¯ãã£ãã«ãªãããã§ãã ãã®åé¡ã¯construct_future()(await)?(await)?
ãååšããŸãã-future(?)
ã¯ãç°¡æœã§ãããªããæ§æãããç°¡æœãªç§ã®ãã¹ãã·ã§ããã§ãã ããã§ãããã®çç±ã¯ã³ã«ãŒãã³ã§ã®å®è£
ã®è©³çŽ°ïŒäžæçã«æ»ã£ãŠåéæã«ãã£ã¹ãããããïŒã«åºã¥ããŠãããããæœè±¡åã«ã¯é©ããªãå¯èœæ§ããããŸãã future(await)
ã¯ã await
ãããŒã¯ãŒããšããŠå
éšåãããåŸã§ã説æã§ãã代æ¿æ段ã§ãããåŒæ°ã®äœçœ®ã飲ã¿èŸŒãã®ã¯å°ãé£ããã§ãã ããã¯åé¡ãªããããããŸããããããŠã³ã«ãŒãã³ãçµæãè¿ããšããããã¯ç¢ºãã«ããèªã¿ããããªããŸãã
future(?)
Result
ã«ã€ããŠç¹å¥ãªããšä»»æã®Rustã¿ã€ããè¿ãããšãã§ããŸãã äžéšã®å
ç©ãResult
è¿ãã®ã¯ããŸããŸã§ã
ã§ã¯ã Result
è¿ããªãå
ç©ã§ã¯ã©ã®ããã«æ©èœããã®ã§ããããã
ç§ãäœãæå³ããã®ãã¯ã£ããããŠããªãã£ãããã§ãã future(?)
ã¯ã以åã«future.await!()
ãŸãã¯åæ§ã®ãã®ãšããŠèª¬æãããŠãããã®ã§ãã çµæãè¿ãæªæ¥ã«åå²ãããšã future(?)?
ïŒå¶åŸ¡ãããŒãæ©æã«æŸæ£ãã2ã€ã®ç°ãªãæ¹æ³ïŒã ããã«ãããå°æ¥ã®ããŒãªã³ã°(?)
ãšçµæã®ãã¹ã?
çŽäº€ããŸãã ç·šéïŒãã®ããã®è¿œå ã®äŸãè¿œå ããŸããã
åæ§ã«çµæãè¿ãæªæ¥ãžã®åå²ã¯
future(?)?
æ確ã«ããŠããã ãããããšãããããŸãã ãã®å Žåãç§ã¯ééããªãããã®ãã¡ã³ã§ã¯ãããŸããã
ã€ãŸãã Future<Output = Result<_, _>>
ãè¿ãé¢æ°ãåŒã³åºããšã foo()(?)?
ããã«èšè¿°ãããŸãã
ããã¯æ§æãéåžžã«å€ãã2ã€ã®ãŸã£ããç°ãªãç®çã§?
ã䜿çšããŸãã
ç¹ã«ãéãæŒç®å?
ãžã®ãã³ãã§ããå Žåã¯ããã¡ãããæ°ããäºçŽãããããŒã¯ãŒãã«çœ®ãæããããšãã§ããŸãã ç§ã¯åœåãããã¯äžå¯è§£ãªã¿ã€ãã®å®éã®è°è«ã«éåžžã«äŒŒãŠãããšèããŠããŸãããããã®ãã¬ãŒããªãã¯ãã¹ããŒãã¡ã³ãã粟ç¥çã«è§£æããã®ã«åœ¹ç«ã€ãšããç¹ã§æ©èœããå¯èœæ§ããããŸãã ãããã£ãŠã impl Future<Output = Result<_,_>>
ã®åãã¹ããŒãã¡ã³ãã¯æ¬¡ã®ããã«ãªããŸãã
foo()(await)?
?
ãé©åã§ããçç±ã®æè¯ã®è°è«ã¯ã䜿çšãããå
éšã¡ã«ããºã ãããã¶ã䌌ãŠãããšããããšã§ãïŒããã§ãªããã°ãçŸåšã®ã©ã€ãã©ãªã§ã¯Poll
ã䜿çšã§ããŸãã
æ§æãéåžžã«å€ã
ç§ã¯ãããæ瀺çãªåŸ æ©ã®èŠç¹ã ãšæããŸãããïŒ
ããã¯äœ¿çšããŠããŸã ïŒ 2ã€ã®å®å šã«ç°ãªãç®çã®ããã«ã
ãããã ããfoo()(await)
æ§æã¯ãã£ãšããã§ãããã
ãã®æ§æã¯ãã¯ããŒãžã£ãè¿ãé¢æ°ãåŒã³åºããŠãããJSã§ãã®ã¯ããŒãžã£ãåŒã³åºããããªãã®ã§ãã
ãsyntax-heavyãã®ç§ã®èªã¿ã¯ãsigil-heavyãã«è¿ãã ()(?)?
ã·ãŒã±ã³ã¹ãèŠããšããªãè³éãã§ãã ããã¯å
ã®æçš¿ã§åãäžããããŸããïŒ
æ§æ解æãš
?
ããå€ãã®ïŒãããŠç°ãªãïŒçµã¿åããã¯ã解æãé£ããå ŽåããããŸãã ç¹ã«ãããæªæ¥ãå¥ã®æªæ¥ã®çµæãè¿ãå ŽåïŒconstruct_future()(?)?(?)?
ãã ãã
fn
ãªããžã§ã¯ãã®çµæãååŸã§ããããã«ããããã«åãåŒæ°ãäœæããŠã次ã®ãããªåŒãèš±å¯ããããšãã§ããŸãïŒfoobar()?()?()?
ã ããã«ãããããããç§ã¯ããã䜿çšããããèŠæ ããã£ããããã®ãèŠãããšããªãã®ã§ããã®ãããªå Žåã«å¥ã ã®ã¹ããŒãã¡ã³ãã«åå²ããããšãååã«å¿ èŠã«ãªãããšã¯ãã£ãã«ãªãããã§ãã
ããã§ã®åè«ã¯æ¬¡ã®ãšããã ãšæããŸããéçã§-> impl Fn
ãèŠãããšããããŸããïŒ -> Result<impl Fn() -> Result<impl Fn() -> Result<_, _>, _>, _>
ãŸããïŒã éåæã³ãŒãããŒã¹ã§-> impl Future<Output = Result<_, _>>
ã衚瀺ããããšäºæ³ãããåæ°ã¯ïŒ ã³ãŒããèªã¿ãããããããã«ãŸããªimpl Fn
æ»ãå€ã«ååãä»ããå¿
èŠãããããšã¯ãäžæçãªimpl Future
æ»ãå€ã®ããªãã®éšåã«ååãä»ããå¿
èŠãããããšãšã¯å€§ããç°ãªããŸãã
ã³ãŒããèªã¿ãããããããã«ãŸããªimplFnæ»ãå€ã«ååãä»ããå¿ èŠãããããšã¯ãäžæçãªimplFutureæ»ãå€ã®ããªãã®éšåã«ååãä»ããå¿ èŠãããããšãšã¯å€§ããç°ãªããŸãã
ãã®æ§æã®éžæããçµæã¿ã€ãã«æ瀺çã«ååãä»ããå¿
èŠãããåæ°ã«ã©ã®ããã«åœ±é¿ãããã¯ããããŸããã await? future
ãšåãããã«åæšè«ã«åœ±é¿ãäžããããšã¯ãªããšæããŸãã
ãã ããçããã¯ããã§éåžžã«è¯ãç¹ãææããç§ãèæ¡ããäŸãå€ãã»ã©ïŒå
ã®æçš¿ãç·šéããŠãåžžã«äž¡æ¹ã®æ§æããŒãžã§ã³ãå«ãŸããããã«ããŸããïŒãèªåèªèº«ãfuture(await)
ã«åŸåããŸãã å
¥åããã®ã¯äžåçã§ã¯ãããŸããããããã§ãããããåŒã³èµ·ããããšãæå³ããé¢æ°åŒã³åºãæ§æã®æ確ãããã¹ãŠä¿æããŠããŸãã
äœåèŠããšæããŸãã-> impl Future
ãããšåçã®ã¿ã€ãïŒçµæãè¿ãéåæfnïŒãåžžã«è¡šç€ºãããããšãæåŸ ããŠããŸããããããã
远跡ã®åé¡ã«é¢ããç§ã®ä»¥åã®æçš¿ã«ãªã³ã¯ããããã«ããã€ãã®èããè¿œå ããŸãã
æååawait
ãå«ãŸãªãæ§æããã®æ§æã§åãå
¥ããããå¯èœæ§ã¯ã»ãšãã©ãªããšæããŸãã ãã®æç¹ã§ããã®æ©èœã«é¢ãã1幎éã®äœæ¥ã®åŸãæ°ããæ§æãææ¡ããããããæ¢ç¥ã®å®è¡å¯èœãªä»£æ¿æ¡ã®é·æãšçæãæ¯èŒæ€èšããŠãã©ã¡ããæé©ããèŠã€ããããšããæ¹ãçç£çã ãšæããŸãã ç§ã®ä»¥åã®æçš¿ãèãããšãç§ãæãæ§æã¯å®è¡å¯èœã§ãïŒ
await(future)
ãŸãã¯await { future }
ã§ãã ããã«ãããåªå
é äœã®åé¡ã¯å®å
šã«è§£æ±ºãããŸãããæ§æçã«ãã€ãºãå€ããäž¡æ¹ã®åºåãæåãªââãã·ã§ã³ãæ··ä¹±ã®åå ãšãªãå¯èœæ§ããããŸãã?
ã«é¢ãããæçšãªãåªå
é äœã§åŸ
æ©ããŸãã ïŒã€ãŸããåŸ
æ©ã¯ïŒãããç·å¯ã«ãã€ã³ããããŸãïŒã ããã¯ãã³ãŒããèªãã§ããäžéšã®ãŠãŒã¶ãŒãé©ããããããããŸããããçµæã®å
ç©ãè¿ãé¢æ°ã¯ãå
ç©ã®çµæãè¿ãé¢æ°ãããå§åçã«äžè¬çã§ãããšæããŸãã?
ã«é¢ãããæãããªãåªå
é äœã§åŸ
æ©ããŸãã ïŒã€ãŸããïŒã¯åŸ
ã€ãããç·å¯ã«çµåããŸãïŒã åŸ
æ©ãšïŒãçµã¿åãããè¿œå ã®ã·ã³ã¿ãã¯ã¹ã·ã¥ã¬ãŒawait?
ãªãã¬ãŒã¿ãŒã ãã®æ§æç³è¡£æ§æã¯ããã®åªå
é äœãå®è¡å¯èœã«ããããã«å¿
èŠã ãšæããŸããããããªããšã誰ããåžžã«(await future)?
æžã蟌ãããšã«ãªããŸããããã¯ãç§ãåæããæåã®ãªãã·ã§ã³ã®ããæªãå€åœ¢ã§ãããããã®éžæã«å¯Ÿããç§èªèº«ã®ã©ã³ãã³ã°ã¯ãåé¡ã調ã¹ããã³ã«å€ãããŸãã çŸæç¹ã§ã¯ãç ç³ãšã®æãããªåªå é äœã䜿çšããããšã¯ã人éå·¥åŠã芪ãã¿ããããããã³ç解ã®æè¯ã®ãã©ã³ã¹ã®ããã«æããããšæããŸãã ããããéå»ã«ã¯ãä»ã®2ã€ã®ãã¬ãã£ãã¯ã¹æ§æã®ãããããåªå ããŠããŸããã
説æã®ããã«ã次ã®4ã€ã®ãªãã·ã§ã³ã«æ¬¡ã®ååãä»ããŸãã
åå| æªæ¥| çµæã®æªæ¥| æªæ¥ã®çµæ
--- | --- | --- | ---
å¿
é ã®åºåãæå| await(future)
ãŸãã¯await { future }
| await(future)?
ãŸãã¯await { future }?
| await(future?)
ãŸãã¯await { future? }
䟿å©ãªåªå
é äœ| await future
| await future?
| await (future?)
ç ç³ä»ãã®æãããªåªå
é äœ| await future
| await? future
ãŸãã¯(await future)?
| await future?
æ¥å°ŸèŸããŒã¯ãŒã| future await
| future await?
| future? await
ïŒç§ã¯ãã®ãªãã·ã§ã³ããpostfixmacroãã®ãããªä»ã®postfixæ§æãšåºå¥ããããã«ç¹ã«ãpostfixkeywordãã䜿çšããŸãããïŒ
䟿å©ãªåªå
é äœã®ãç¥çŠã await future?
ã®æ¬ ç¹ã®1ã€ã ãã§ãªããåŸçœ®ãšããŠæ©èœããªãä»ã®æ¬ ç¹ã¯ã ?
åŒãæåã§å€æããéåžžã®ãã¿ãŒã³ãé©çšãããªããªãå¯èœæ§ãããããšã§ãããŸãã¯ã Future
ãäºææ§ã®ããæ¹æ³ã§Result
ã¡ãœãããæ瀺çã«è€è£œããããšãèŠæ±ããŸãã ããã¯é©ãã¹ãããšã§ãã ããããè€è£œããããšãã©ã®ã³ã³ãããŒã¿ãæ»ã£ãŠããæªæ¥ã«åãçµã¿ãã©ããç±å¿ã§ããããçªç¶æ··ä¹±ããŸãã èšãæããã°ãæé»ã®åŸ
æ©ã®å Žåãšåãããã«ãã³ã³ãããŒã¿ãå®éã«äœããããã決å®ããã®ã¯é£ããã§ãããã ïŒç·šéïŒå®éã«ã¯ã以äžã®2ã€ã®ã³ã¡ã³ããåç
§ããŠãã ãããããã§ã¯ã ?
é©ãã¹ã眮ãæããæå³ãããããæè¡çãªèŠ³ç¹ããããŸãïŒ
ãšã©ãŒã±ãŒã¹ããå埩ã§ããäŸïŒ
async fn previously() -> Result<_, lib::Error> {
let _ = await get_result()?;
}
async fn with_recovery() -> Result<_, lib::Error> {
// Does `or_recover` return a future or not? Suddenly very important but not visible.
let _ = await get_result().unwrap_or_else(or_recover);
// If `or_recover` is sync, this should still work as a pattern of replacing `?` imho.
// But we also want `or_recover` returning a future to work, as a combinator for futures?
// Resolving sync like this just feel like wrong precedence in a number of ways
// Also, conflicts with `Result of future` depending on choice.
let _ = await get_result()?.unwrap_or_else(or_recover);
}
ãã®åé¡ã¯ãå®éã®ä¿®æ£åŸã®æŒç®åã§ã¯çºçããŸããã
async fn with_recovery() -> Result<_, lib::Error> {
// Also possible in 'space' delimited post-fix await route, but slightly less clear
let _ = get_result()(await)
// Ah, this is sync
.unwrap_or_else(or_recover);
// This would be future combinator.
// let _ = get_result().unwrap_or_else(or_recover)(await);
}
// Obvious precedence syntax
let _ = await get_result().unwrap_or_else(or_recover);
// Post-fix function argument-like syntax
let _ = get_result()(await).unwrap_or_else(or_recover);
ãããã¯ç°ãªãåŒã§ããããããæŒç®åã¯ãæçœãªåªå
é äœã await
æŒç®åãããåªå
é äœãé«ããããåçã®ãã®ã¯æ¬¡ã®ãšããã§ãã
let _ = get_result().unwrap_or_else(or_recover)(await);
ããã¯ã or_recover
ãéåæã§ãããã©ãããšãŸã£ããåããããŸãããæã£ãŠããŸãã ïŒç§ã䞻匵ããããšã¯éèŠã§ã¯ãããŸããããåŒå
šäœãéåæã§ããããšãç¥ã£ãŠããŸããäœããã®çç±ã§ãã®ç¹å®ã®éšåãéåæã§ãããã©ãããç¥ãå¿
èŠãããå Žåã¯ã or_recover
ã®å®çŸ©ãèŠãããšãã§ããŸãïŒã
ããã«ã¯ãor_recoverãéåæã§ãããã©ãããšãŸã£ããåããããŸããããããŸãã
ãŸã£ããåãã§ã¯ãããŸããã unwrap_or_else
ã¯åŸ
æ©ããŠãããããã³ã«ãŒãã³ãçæããå¿
èŠããããŸãããããã£ãŠã get_result
ãã³ã«ãŒãã³ïŒã€ãŸãã³ã³ãããŒã¿ãæ§ç¯ãããïŒã§ãããã Result<impl Future, _>
ïŒããã³Ok
ïŒã§ãããããããŸãã«ãªããŸãã Err
ã³ã«ãŒãã³ãäœæããŸãïŒã ã©ã¡ããã await
ã·ãŒã±ã³ã¹ãã€ã³ããjoin
ã«ç§»åããããšã§ãå¹çã®åäžãäžç®ã§èå¥ã§ãããšããåãæžå¿µã¯ãããŸãããããã¯ãã®äž»èŠãªæžå¿µã®1ã€ã§ããæé»ã®åŸ
æ©ã ãã®çç±ã¯ãã©ã®ãããªå Žåã«ã¯ããã®äžéã®èšç®ãåæã§ãªããã°ãªããªããšã®awaitåã®ã¿ã€ãã«é©çšãããŠããå¿
èŠããªããã°ãªããªããšããããšã§ãã ããã«ã¯ãäºãã«å€§ããªæžå¿µããããŸãïŒ
ãããã¯ç°ãªãåŒã§ããããããæŒç®åã¯ãæçœãªåªå é äœãã®åŸ æ©æŒç®åãããåªå é äœãé«ããããåçã®ãã®ã¯
ããã¯æ··ä¹±ã®äžéšã§ããã ?
ãå埩æäœã«çœ®ãæãããšã await
ã®äœçœ®ãæ ¹æ¬çã«å€ãããŸããã ?
æ§æã®ã³ã³ããã¹ãã§ã¯ãã¿ã€ãT
éšååŒexpr
ãäžãããããšãå€æãã次ã®ã»ãã³ãã£ã¯ã¹ãæåŸ
ãããŸãïŒ T::unwrap_or_else
ãååšãããšä»®å®ïŒ ïŒ
expr?
-> expr.unwrap_or_else(or_recover)
<T as Try>::into_result(expr)?
-> T::unwrap_or_else(expr, or_recover)
ãã ããã䟿å©ãªåªå
é äœããšawait expr?
ïŒ await expr
ã¯T
ïŒã§ã¯ã代ããã«æ¬¡ã®ããã«ãªããŸãã
await expr?
-> await expr.unwrap_or_else(or_recover)
<T as Try>::into-result(await expr)
-> await Future::unwrap_or_else(expr, or_recover)
äžæ¹ãæãããªåªå é äœã§ã¯ããã®å€æã¯äœåãªãã©ã³ã»ã·ã¹ãªãã§ã¯ãŸã£ããé©çšãããŸããããå°ãªããšãçŽæã¯ãæªæ¥ã®çµæãã«å¯ŸããŠã¯æ©èœããŸãã
ãããŠãã³ã³ãããŒã¿ã·ãŒã±ã³ã¹ã®2ã€ã®ç°ãªããã€ã³ãã§åŸ æ©ããããã«èå³æ·±ãã±ãŒã¹ã¯ã©ãã§ããïŒ æ¥é èŸã®æ§æã§ã¯ãããã«ã¯æ¬åŒ§ãå¿ èŠã ãšæããŸãã Rustèšèªã®æ®ãã®éšåã¯ããåŒãå·Šããå³ã«è©äŸ¡ããããããã«ããããé·ã ãšåé¿ããããšããŸãããã®1ã€ã®äŸã¯ãèªååç §ããžãã¯ã§ãã
è€æ°ã®await / try / combinationãã€ã³ããæã€é·ããã§ãŒã³ã§ãããæªåããããšã瀺ãäŸã
// Chain such that we
// 1. Create a future computing some partial result
// 2. wait for a result
// 3. then recover to a new future in case of error,
// 4. then try its awaited result.
async fn await_chain() -> Result<usize, Error> {
// Mandatory delimiters
let _ = await(await(partial_computation()).unwrap_or_else(or_recover))?
// Useful precedence requires paranthesis nesting afterall
let _ = await { await partial_computation() }.unwrap_or_else(or_recover)?;
// Obivious precendence may do slightly better, but I think confusing left-right-jumps after all.
let _ = await? (await partial_computation()).unwrap_or_else(or_recover);
// Post-fix
let _ = partial_computation()(await).unwrap_or_else(or_recover)(await)?;
}
ç§ãé¿ããŠã»ããã®ã¯ãCã®å解æã®Rustã¢ããã°ãäœæããããšã§ãã
'pointer'ããã³ 'array'ã³ã³ãããŒã¿ã®åŒã®å·ŠåŽãšå³åŽã
@withoutboatsã¹ã¿ã€ã«ã®ããŒãã«ãšã³ããªïŒ
| åå| æªæ¥| çµæã®æªæ¥| æªæ¥ã®çµæ|
|-|-|-|-|
| å¿
é ã®åºåãæå| await(future)
| await(future)?
| await(future?)
|
| 䟿å©ãªåªå
é äœ| await future
| await future?
| await (future?)
|
| æãããªåªå
é äœ| await future
| await? future
| await future?
|
| æ¥å°ŸèŸã®åŒã³åºã| future(await)
| future(await)?
| future?(await)
|
| åå| é£é|
|-|-|
| å¿
é ã®åºåãæå| await(await(foo())?.bar())?
|
| 䟿å©ãªåªå
é äœ| await(await foo()?).bar()?
|
| æãããªåªå
é äœ| await? (await? foo()).bar()
|
| æ¥å°ŸèŸã®åŒã³åºã| foo()(await)?.bar()(await)
|
ç§ã¯ããŸããŸãªçç±ã§åŸçœ®åŸ
æ©ã匷ãæ¯æããŠããŸããã foo await.method()
ã¯çŽããããã§ãã
ãŸããåæ§ã®è¡šãèŠãŠã¿ãŸãããããããã«ããã€ãã®æ¥å°ŸèŸã®ããªãšãŒã·ã§ã³ãè¿œå ããŸãã
| åå| æªæ¥| çµæã®æªæ¥| æªæ¥ã®çµæ|
| ---------------------- | -------------------- | ----- ---------------- | --------------------- |
| å¿
é ã®åºåãæå| await { future }
| await { future }?
| await { future? }
|
| 䟿å©ãªåªå
é äœ| await future
| await future?
| await (future?)
|
| æãããªåªå
é äœ| await future
| await? future
| await future?
|
| æ¥å°ŸèŸããŒã¯ãŒã| future await
| future await?
| future? await
|
| æ¥å°ŸèŸãã£ãŒã«ã| future.await
| future.await?
| future?.await
|
| æ¥å°ŸèŸã¡ãœãã| future.await()
| future.await()?
| future?.await()
|
次ã«ãé£éããå°æ¥ã®åŒãèŠãŠã¿ãŸãããã
| åå| çµæã®é£éããæªæ¥|
| ---------------------- | -------------------------- ----------- |
| å¿
é ã®åºåãæå| await { await { foo() }?.bar() }?
|
| 䟿å©ãªåªå
é äœ| await (await foo()?).bar()?
|
| æãããªåªå
é äœ| await? (await? foo()).bar()
|
| æ¥å°ŸèŸããŒã¯ãŒã| foo() await?.bar() await?
|
| æ¥å°ŸèŸãã£ãŒã«ã| foo().await?.bar().await?
|
| æ¥å°ŸèŸã¡ãœãã| foo().await()?.bar().await()?
|
ãããŠä»ãå®éã®äŸãšããŠã reqwests
ãããé£éããçµæã®æªæ¥ãåŸ
ã¡ãããšæããããããŸããïŒç§ã®å¥œã¿ã®awaitãã©ãŒã ã䜿çšïŒã
let res: MyResponse = client.get("https://my_api").send().await?.json().await?;
å®éãç§ã¯ãã¹ãŠã®ã»ãã¬ãŒã¿ãŒãåŸçœ®æ§æã«å¯ŸããŠããŸãèŠãããšæããŸããäŸãã°ïŒ
let res: MyResponse = client.get("https://my_api").send()/await?.json()/await?;
ããããç§ã¯ã©ã¡ãã䜿çšãããã«ã€ããŠåŒ·ãæèŠãæã£ãŠããŸããã
åŸçœ®ãã¯ãïŒã€ãŸãfuture.await!()
ïŒã¯ãŸã ãªãã·ã§ã³ã§ããïŒ ããã¯æ確ãç°¡æœããããŠæçœã§ãïŒ
| æªæ¥| çµæã®æªæ¥| æªæ¥ã®çµæ|
| --- | --- | --- |
| future.awaitïŒïŒïŒ| future.awaitïŒïŒïŒïŒ | futureïŒ.awaitïŒïŒïŒ|
ãŸããæ¥å°ŸèŸãã¯ãã¯å®è£ ã«å¿ èŠãªåŽåãå°ãªããç解ãšäœ¿çšãç°¡åã§ãã
ãŸããæ¥å°ŸèŸãã¯ãã¯å®è£ ã«å¿ èŠãªåŽåãå°ãªããç解ãšäœ¿çšãç°¡åã§ãã
ãŸããäžè¬çãªlangæ©èœã䜿çšããŠããã ã
åŸçœ®ãã¯ãã¯ãåŸçœ®ã®ç°¡æœããšé£éæ§ããéæ³ã§ã¯ãªãããããã£ãšãã¯ãã®æãããªååšãšçµã¿åãããŠãããã€ãã®.await_debug!()
ã .await_log!(WARN)
ãªã©ã®ãµãŒãããŒãã£ã®ãŠãŒã¶ãŒãã¯ããšããŸãé©åããã®ã§äŸ¿å©ã§ãã .await_trace!()
æ¥å°ŸèŸãã¯ãã¯ããã¯ãã®ééæ³ã®ããããã£[...]ãçµã¿åãããŠããã®ã§äŸ¿å©ã§ãã
@novacrazyãã®åŒæ°ã®åé¡ã¯ã await!
ãã¯ããéæ³ã®ããã«ãªãããŠãŒã¶ãŒäœæã³ãŒãã§ã¯äžå¯èœãªæäœãå®è¡ããããšã§ãïŒçŸåšãåºç€ãšãªããžã§ãã¬ãŒã¿ãŒããŒã¹ã®å®è£
ã¯å€å°å
¬éãããŠããŸãããç§ã®ç解ã§ã¯å®å®åããåã«ãããã¯å®å
šã«é ãããŸãïŒãããŠãçŸæç¹ã§å®éã«ãããšå¯Ÿè©±ããã«ã¯ããšã«ããããã€ãã®rustc
å
éšã®å€éæ©èœã䜿çšããå¿
èŠããããŸãïŒïŒã
@ Nemo157ããŒãã ç§ã¯ãããããã»ã©äžéæã§ããããšãæå³ããŠããããšã«æ°ã¥ããŠããŸããã§ããã
#[async]
ãããªæç¶ãåãã¯ãã䜿çšããŠãéæ³ã®ããŒã¯ãŒãã§ã¯ãªãããéåæãé¢æ°ãããžã§ãã¬ãŒã¿ãŒé¢æ°ãžã®å€æãåæ€èšããã®ã¯é
ãããŸããïŒ å
¥åããã®ã¯3æåäœåã§ã #[must_use]
ãŸãã¯#[repr(C)]
ãšåãæ¹æ³ã§ããã¥ã¡ã³ãã«ããŒã¯ãä»ããããšãã§ããŸãã
å®è¡ã®æµããçŽæ¥å¶åŸ¡ããéåžžã«å€ãã®æœè±¡åã¬ã€ã€ãŒãé衚瀺ã«ãããšããã¢ã€ãã¢ã¯æ¬åœã«å«ãã§ãã Rustãšã¯æ£å察ã®æããããŸãã ãŠãŒã¶ãŒã¯ãã³ãŒããå®å šã«ãã¬ãŒã¹ããŠããã¹ãŠãã©ã®ããã«æ©èœããã©ãã§å®è¡ãããããç解ã§ããå¿ èŠããããŸãã 圌ãã¯ç©äºããããã³ã°ããŠã·ã¹ãã ãã ãŸãããã«å¥šå±ãããã¹ãã§ããã圌ããå®å šãªRustã䜿çšãããªãããã¯å®å šã§ãªããã°ãªããŸããã äœã¬ãã«ã®ã³ã³ãããŒã«ã倱ã£ãŠããããã¯äœãæ¹åããŸãããç§ã¯çã®å ç©ã«åºå·ããã»ããããã§ãããã
èšèªïŒ std
/ core
ã§ã¯ãªãïŒã§ããRustã¯ããŠãŒã¶ãŒãŸãã¯std
ãå®è¡ã§ããªãïŒãŸãã¯éåžžã«å®çšçã§ãªãïŒå Žåã«ã®ã¿ãæœè±¡åãšæ§æãæäŸããå¿
èŠããããšç¢ºä¿¡ããŠããŸãã ã ãã®å®å
šãªéåææ§ã¯ããã®ç¹ã§æã«è² ããªããªã£ãŠããŸãã rustc
ã®ãã³APIãšãžã§ãã¬ãŒã¿ãŒä»¥å€ã®ãã®ãæ¬åœã«å¿
èŠã§ããïŒ
@novacrazyç§ã¯äžè¬çã«ææ ã«ã¯åæããŸãããçµè«ã«ã¯åæããŸããã
æœè±¡åãšæ§æã¯ããŠãŒã¶ãŒãŸãã¯æšæºã§å®è¡ã§ããªãïŒãŸãã¯éåžžã«å®çšçã§ãªãïŒå Žåã«ã®ã¿æäŸããå¿ èŠããããŸãã
èšèªã«for
ã«ãŒããããçç±ã¯ããããããã¬ãŒã¯ä»ãã§loop
å€ãããã¯ãã§ããå¯èœæ§ãããå Žåã§ãã || closure
ãå°çšã®ãã¬ã€ãããã³ãªããžã§ã¯ãã³ã³ã¹ãã©ã¯ã¿ãŒã§ããå¯èœæ§ãããå Žåããã®çç±ã¯äœã§ããã ãã§ã«try!()
ãããã®ã«ããªã?
ãå°å
¥ããã®ã§ããã ç§ããããã®è³ªåãšããªãã®çµè«ã«åæããªãçç±ã¯ãäžè²«æ§ã§ãã ãããã®æœè±¡åã®ãã€ã³ãã¯ãã«ãã»ã«åããåäœã ãã§ãªãããã®ã¢ã¯ã»ã·ããªãã£ã«ããããŸãã for
-replacementã¯ãå¯å€æ§ããã©ã€ããªã³ãŒããã¹ãããã³å¯èªæ§ã«åé¡ãããŸãã ||
眮æã¯å®£èšã®åé·æ§ã«åé¡ãããŸã-çŸåšã®Futures
ãšåæ§ã§ãã try!()
ã¯ãè¡šçŸãšæ§æå¯èœæ§ã®äºæ³ãããé åºã§åé¡ãããŸãã
async
ã¯é¢æ°ã®ãã³ã¬ãŒã¿ã§ããã ãã§ãªãã aync-blocks
ãšasync ||
ã«ãã£ãŠè¿œå ã®ãã¿ãŒã³ãæäŸãããšããä»ã®èããããããšãèæ
®ããŠãã ããã ããŸããŸãªèšèªã¢ã€ãã ã«é©çšãããããããã¯ãã®äœ¿ããããã¯æé©ã§ã¯ãªãããã§ãã ãã®å ŽåããŠãŒã¶ãŒã«è¡šç€ºããå¿
èŠãããå Žåã¯ãå®è£
ã«ã€ããŠãèããªãã§ãã ããã
ãŠãŒã¶ãŒã¯ãã³ãŒããå®å šã«ãã¬ãŒã¹ããŠããã¹ãŠãã©ã®ããã«æ©èœããã©ãã§å®è¡ãããããç解ã§ããå¿ èŠããããŸãã 圌ãã¯ç©äºããããã³ã°ããŠã·ã¹ãã ãã ãŸãããã«å¥šå±ãããã¹ãã§ããã圌ããå®å šãªRustã䜿çšãããªãããã¯å®å šã§ãªããã°ãªããŸããã
å®å
šã«std
apiã䜿çšããŠã³ã«ãŒãã³ãå®è£
ãããšã unsafe
倧ããäŸåããå¯èœæ§ãããããããã®è°è«ã¯åœãŠã¯ãŸããªããšæããŸãã ãããŠãéã®è°è«ããããŸãããªããªããããã¯å®è¡å¯èœã§ãããèšèªã«æ§æçããã³æå³çãªæ¹æ³ããã£ããšããŠãåæ¢ãããªãããã§ããå€æŽã¯ã unsafe
è¡ãããä»®å®ãç Žããªã¹ã¯ãéåžžã«é«ããªããŸãã extern "rust-call"
ãããããã¯çŸåšã®éæ³ãšããŠæ©èœããé¢æ°åŒã³åºãã«ã¯ãã®ãããªä¿èšŒããªãããšãæ確ã«ããŸãã ç©ã¿éããããã³ã«ãŒãã³ã®éåœã¯ãŸã 決å®ãããŠããŸããããå®éã«return
ã«ããå¿
èŠã¯ãªããããããŸãããå ŽåããããŸãã
äœè«ã§ãããçè«çã«ã¯ãå®å
šã«çé¢ç®ãªèãã§ã¯ãããŸããããã³ã«ãŒãã³ãä»®æ³ã®extern "await-call" fn () -> T
ãšããŠç€ºãããã®ãåŸ
ã€ããšãã§ããŸããïŒ ãããããªããããã¯åå¥æ²ã§èš±å¯ããŸã
trait std::ops::Co<T> {
extern "rust-await" fn await(self) -> T;
}
impl<T> Co<T> for Future<Output=T> { }
å¥åã ãŠãŒã¶ãŒã¹ããŒã¹ã«ææžåãããã¢ã€ãã ã®future.await()
ã ãŸãã¯ããã®ããšã«ã€ããŠã¯ãä»ã®æŒç®åæ§æãå¯èœã§ããå¯èœæ§ããããŸãã
@HeroicKatora
ãã§ã«
try!()
æã£ãŠããã®ã«ããªã?
ãå°å ¥ããã®ã§ããïŒ
å
¬å¹³ãæãããã«ãç§ãããã«å察ããŸããããããã¯ç§ã«æé·ããŸããã Try
ãå®å®ããŠããã°ãã£ãšåãå
¥ããããŸãããããã¯å¥ã®ãããã¯ã§ãã
ããªããäžãããç ç³ãã®äŸã®åé¡ã¯ãããããéåžžã«éåžžã«èãç ç³ã§ãããšããããšã§ãã impl MyStruct
ãããå€ããå°ãªããimpl <anonymous trait> for MyStruct
ç ç³ã§ãã ãããã¯ããªãŒããŒãããããŸã£ããè¿œå ããªãç掻ã®è³ªã®ç ç³ã§ãã
å¯Ÿç §çã«ããžã§ãã¬ãŒã¿ãŒãšéåæé¢æ°ã¯ããŸã£ããéèŠã§ã¯ãªããªãŒããŒããããšéèŠãªç²Ÿç¥çãªãŒããŒããããè¿œå ããŸãã ãžã§ãã¬ãŒã¿ãŒã¯ç¹ã«ãŠãŒã¶ãŒãšããŠå®è£ ããã®ãéåžžã«é£ãããèšèªèªäœã®äžéšãšããŠããå¹æçãã€ç°¡åã«äœ¿çšã§ããŸãããéåæã¯ãã®äžã«æ¯èŒçç°¡åã«å®è£ ã§ããŸãã
éåæãããã¯ãŸãã¯ã¯ããŒãžã£ã«ã€ããŠã®ãã€ã³ãã¯èå³æ·±ãã§ãããããŠç§ã¯ããã§ããŒã¯ãŒããããæçšã§ãããšèªããŸãããããç§ã¯ããã§ãå¿ èŠãªãã°ããäœãã¬ãã«ã®ã¢ã€ãã ã«ã¢ã¯ã»ã¹ããããšãã§ããªãããšã«å察ããŸãã
çæ³çã«ã¯ã async
ããŒã¯ãŒããš#[async]
å±æ§/æç¶ãåãã¯ãããµããŒãããåè
ãçæãããïŒããããæå³ããŠããªãïŒãžã§ãã¬ãŒã¿ãŒãžã®äœã¬ãã«ã®ã¢ã¯ã»ã¹ãèš±å¯ããã®ã¯çŽ æŽãããããšã§ãã äžæ¹ã yield
ã¯ã async
ãããŒã¯ãŒããšããŠäœ¿çšãããããã¯ãŸãã¯é¢æ°ã§ã¯çŠæ¢ããå¿
èŠããããŸãã 圌ãã¯å®è£
ã³ãŒããå
±æããããšããã§ãããšç¢ºä¿¡ããŠããŸãã
await
ãäžèšã®äž¡æ¹ãå¯èœã§ããã°ãç§ãã¡ã¯äŒŒãäœãããããŒã¯ãŒãå¶éãããå¯èœæ§ãawait
ã«async
ããŒã¯ãŒãæ©èœ/ãããã¯ãããšã®ããã€ãã®çš®é¡ã䜿çšããŸãawait!()
#[async]
é¢æ°ã®await!()
ãã¯ãã
æ¬äŒŒã³ãŒãïŒ
// imaginary generator syntax stolen from JavaScript
fn* my_generator() -> T {
yield some_value;
// explicit return statements are only included to
// make it clear the generator/async functions are finished.
return another_value;
}
// `await` keyword would not be allowed here, but the `yield` keyword is
#[async]
fn* my_async_generator() -> Result<T, E> {
let item = some_op().await!()?; // uses the `.await!()` macro
// which would really just use `yield` internally, but with the pinning API
yield future::ok(item.clone());
return Ok(item);
}
// `yield` would not be allowed here, but the `await` keyword is.
async fn regular_async() -> Result<T, E> {
let some_op = async || { /*...*/ };
let item = some_op() await?;
return Ok(item);
}
äž¡æ¹ã®é·æã
ããã¯ããŠãŒã¶ãŒã«æ瀺ããè€éãã®ããèªç¶ãªé²è¡ã®ããã«æããããããå€ãã®ã¢ããªã±ãŒã·ã§ã³ã§ããå¹æçã«äœ¿çšã§ããŸãã
ãã®åé¡ã¯ãç¹ã«await
æ§æã«ã€ããŠèª¬æããããã®ãã®ã§ããããšãå¿ããªãã§ãã ããã async
é¢æ°ãšãããã¯ãã©ã®ããã«å®è£
ãããŠãããã«ã€ããŠã®ä»ã®äŒè©±ã¯ã await!
ãRustã§æžãããšãã§ããããŸãã¯ããããã§ããããšã§ã¯ãªãããšã人ã
ã«æãåºãããç®çãé€ããŠãç¯å²å€ã§ããè¡šé¢èšèªã
ãã¹ãŠã®ä¿®æ£åŸã®æ§æææ¡ã®é·æãšçæãå ·äœçã«éã¿ä»ãããããšæããŸãã æ§æã®1ã€ãããããªçæã§éç«ã£ãŠããå Žåã¯ããããéžæããå¿ èŠããããŸãã ãã ãããªãå Žåã¯ãå¿ èŠã«å¿ããŠããŸã 決å®ãããŠããªããã¹ããã£ãã¯ã¹ãšåæ¹äºææ§ã®ããæ§æãã¬ãã£ãã¯ã¹åºåãæ§æããµããŒãããã®ãæåã§ãã Postfixã¯å°æ°ã®ã¡ã³ããŒã«ãšã£ãŠæãç°¡æœã§ãããšå ±é³ŽããŠããããã«èŠããã®ã§ãä»ã®ã¡ã³ããŒã«ç§»åããåã«ãæåã«ãããã匷ãè©äŸ¡ããããšãå®çšçã§ããããã«æãããŸãã
æ¯èŒã¯syntax
ã example
ïŒ@ mehcodeããã®reqwestã¯ããã®ç¹ã§äœ¿çšå¯èœãªå®éã®ãã³ãããŒã¯ã®ããã«èŠããŸãïŒã次ã«ïŒ concerns
ãããã³ãªãã·ã§ã³ã®resolution
ãäŸãã°ããããæããããšã«åž°çããå¯èœæ§ãããããšã«åæããå ŽåïŒã æ§æãæžå¿µäºé
ãèªç±ã«è¿œå ããŠãã ãããããããç·šéããŠãã®éåçãªæçš¿ã«ããŸãã ç§ãç解ããŠããããã«ã await
ãå«ãŸãªãæ§æã¯ãåå¿è
ãšçµéšè±å¯ãªãŠãŒã¶ãŒã®äž¡æ¹ã«ãšã£ãŠç°è³ªã§ãããšæããå¯èœæ§ãéåžžã«é«ãã§ãããçŸåšãªã¹ããããŠãããã¹ãŠã®æ§æã«å«ãŸããŠããŸãã
åç §çšã®1ã€ã®ãã¬ãã£ãã¯ã¹æ§æã®äŸã§ããããã®éšåããã€ã¯ã·ã§ããããªãã§ãã ããã
let sent = (await client.get("https://my_api").send())?;
let res: MyResponse = (await sent.json())?;
foo() await?
client.get("https://my_api").send() await?.json() await?
?
ãªãã®ãã§ãŒã³ã¯ãæ··ä¹±ããããèš±å¯ãããªãã£ããããå¯èœæ§ããããŸã| |foo().await?
client.get("https://my_api").send().await?.json().await?
foo().await()?
client.get("https://my_api").send().await()?.json().await()?
ops::
ç¹æ§ãšããŠææžåããããããããŸãããïŒ |foo()(await)?
client.get("https://my_api").send()(await)?.json()(await)?
foo().await!()?
client.get("https://my_api").send().await!()?.json().await!()?
await
ã¯ããŒã¯ãŒãã§ã¯ãªããªããŸãã| |ãžã§ãã¬ãŒã¿ãŒãçµã¿èŸŒãå¯èœæ§ã®èŠ³ç¹ããã®ãã¹ããã£ãã¯ã¹ãšãã¬ãã£ãã¯ã¹ã«é¢ããè¿œå ã®èãïŒå€ãèæ
®ãããšã yield
ãšawait
ã¯2ã€ã®çžåããçš®é¡ã®ã¹ããŒãã¡ã³ããå ããŸãã åè
ã¯é¢æ°ããå€éšã«å€ãäžããåŸè
ã¯å€ãåãå
¥ããŸãã
è£è¶³ïŒPythonã«ã¯ã
yield
ãå€ãè¿ãããšãã§ããã€ã³ã¿ã©ã¯ãã£ããªãžã§ãã¬ãŒã¿ãŒããããŸãã 察称çã«ããã®ãããªãžã§ãã¬ãŒã¿ãŒãŸãã¯ã¹ããªãŒã ã®åŒã³åºãã«ã¯ãå³å¯ãªã¿ã€ãèšå®ã§è¿œå ã®åŒæ°ãå¿ èŠã§ãã ããŸãäžè¬åããããšããªãã§ãã ãããã©ã¡ãã®å Žåã§ããè°è«ã移ãå¯èœæ§ãé«ãããšãããããŸãã
ãããŠããããã®çºèšã䌌ãŠããã®ã¯äžèªç¶ã ãšç§ã¯äž»åŒµããŸãã ããã§ã¯ã代å
¥åŒãšåæ§ã«ãä»ã®èšèªã«ãã£ãŠèšå®ãããåºæºããéžè±ããå¿
èŠããããŸãããã®åºæºãäžè²«æ§ãäœããRustã«ãšã£ãŠç°¡æœã§ãªãå Žåã§ãã ä»ã®å Žæã§è¡šçŸãããŠããããã«ã await
ãå«ããåãåŒæ°ã®é åºãæââã€ä»ã®åŒãšã®é¡äŒŒæ§ãååšããéããå¥ã®ã¢ãã«ããã®ç§»è¡ã«ã倧ããªé害ã¯ãããŸããã
æé»çã§ããããã«æãããã®ã§ã
ä»ã®èšèªã§async / awaitã䜿çšããããã§ãªãã·ã§ã³ã確èªãããšãããfutureãé£éãããããšãæ§æçã«å¿«é©ã§ãããšã¯æããŸããã§ããã
ããŒãã«ã«ãã§ãŒã³äžå¯ã®ããªã¢ã³ãã¯ãããŸããïŒ
// TODO: Better variable names.
await response = client.get("https://my_api").send();
await response = response?.json();
await response = response?;
ããããã¿ãŒã³ã®äžéšã§ãããšããè°è«ãããããšãã§ããã®ã§ãç§ã¯ãã®ãããªãã®ã§ãã
ãã€ã³ãã£ã³ã°ãåŸ æ©ãããããšã®åé¡ã¯ããšã©ãŒã¹ããŒãªãŒãããŸãè¯ããªãããšã§ãã
// Error comes _after_ future is awaited
let await res = client.get("http://my_api").send()?;
// Ok
let await res = client.get("http://my_api").send();
let res = res?;
ã³ãã¥ããã£ã§åŸ
ã€ããšãã§ããã»ãŒãã¹ãŠã®å
ç©ã¯èª€ããããã ?
ãšçµã¿åãããå¿
èŠãããããšãèŠããŠããå¿
èŠããããŸãã
ã·ã³ã¿ãã¯ã¹ã·ã¥ã¬ãŒãæ¬åœã«å¿ èŠãªå ŽåïŒ
await? response = client.get("https://my_api").send();
await? response = response.json();
await
ãšawait?
äž¡æ¹ãããŒã¯ãŒããšããŠè¿œå ããå¿
èŠããããŸããããã§ãªãå Žåã¯ããããlet
ãã€ãŸãlet? result = 1.divide(0);
ãæ¡åŒµããŸãã
Rustã³ãŒãã§ãã§ãŒã³ã䜿çšãããé »åºŠãèãããšããã§ãŒã³åŸ æ©ãèªè ã«ã§ããã ãæ確ã§ããããšãéèŠã§ããããšã«å®å šã«åæããŸãã awaitã®æ¥å°ŸèŸããªã¢ã³ãã®å ŽåïŒ
client.get("https://my_api").send().await()?.json().await()?;
ããã¯éåžžãRustã³ãŒãã®åäœãšåãããã«åäœããŸãã ãã®ã³ã³ããã¹ãã§ã®await()
ã¯é¢æ°åŒã³åºãã®ããã«æããŸãããåŒã®ã³ã³ããã¹ãã§ã¯éæ³ã®ïŒé¢æ°ã®ããã§ã¯ãªãïŒåäœããããšããäºå®ã«åé¡ããããŸãã
æ¥å°ŸèŸãã¯ãããŒãžã§ã³ã¯ãããããæ確ã«ããŸãã 人ã ã¯ãããã«éæ³ãããããšããæå³ã®éã³ãæå笊ã«æ £ããŠããã®ã§ãç§ã¯ç¢ºãã«ãã®ããŒãžã§ã³ã奜ã¿ãŸãã
client.get("https://my_api").send().await!()?.json().await!()?;
ããã¯èšã£ãŠãããã®èšèªã«ã¯try!(expr)
ããããããã?
å身ã§ãã£ãããšãèæ
®ãã䟡å€ããããŸãã è¿œå await!(expr)
ãã¯ãã¯ãä»ã©ã®ããã«ãšå®å
šã«äžèŽããã§ãããtry!(expr)
ãš?
èšèªã«å°å
¥ãããŸããã
await!(expr)
ããŒãžã§ã³ã®awaitã§ã¯ãåŸã§åŸçœ®ãã¯ã?
ã¹ã¿ã€ã«ã®æŒç®åãè¿œå ããããéžæã§ããŸãã ?
䌌ãŠããŸãããåŸ
æ©ããäŸïŒ
// Not proposing this syntax at the moment. Just an example.
let a = perform()^;
client.get("https://my_api").send()^?.json()^?;
éåžžã«åççã§å®çšçã§ãããããä»ã®ãšããawait!(expr)
ãŸãã¯await!{expr}
ã䜿çšããå¿
èŠããããšæããŸãã ãã®åŸãæ¥å°ŸèŸãã¯ããåé¡ã«ãªã£ãå Žåã¯ãåŸã§awaitã®æ¥å°ŸèŸããŒãžã§ã³ïŒã€ãŸãã .await!
ãŸãã¯.await!()
ïŒã«ç§»è¡ããããšãèšç»ã§ããŸãã ïŒãŸãã¯ãæçµçã«ã¯ã ?
ã¹ã¿ã€ã«ã®æŒç®åãè¿œå ããã«ãŒãã«ãªããŸã...äž»é¡ã«é¢ããå€ãã®ãã€ã¯ã·ã§ããã®åŸïŒPïŒ
åèãŸã§ã«ãScalaã®æ§æã¯Await.result
ã¯ãããŸãããããã¯ãããããã³ã°åŒã³åºãã§ããããã§ãã Scalaã®å
ç©ã¯ã¢ããã§ãããããéåžžã®ã¡ãœããåŒã³åºããŸãã¯for
ã¢ããå
å
è¡šèšã䜿çšããŸãã
for {
result <- future.map(further_computation)
a = result * 2
_ <- future_fn2(result)
} yield 123
ãã®æãããè¡šèšã®çµæãšããŠã scala-async
ãšããã©ã€ãã©ãªããç§ãæã奜ãæ§æã§äœæãããŸãããããã¯æ¬¡ã®ãšããã§ãã
import scala.concurrent.ExecutionContext.Implicits.global
import scala.async.Async.{async, await}
val future = async {
val f1 = async { ...; true }
val f2 = async { ...; 42 }
if (await(f1)) await(f2) else 0
}
ããã¯ãå¿
é ã®åºåãæåã䜿çšããŠãRustã³ãŒããã©ã®ããã«èŠããããã匷ãåæ ããŠãããããçŸåšã®æ§æawait!()
ãç¶æããããšã«ã€ããŠä»ã®äººã«åæããããšæããŸãã åæã®éã¯ã·ã³ãã«ãéããæ£åœãªçç±ã§é¢ãããšæããŸãã æ¥å°ŸèŸæŒç®åïŒãŸãã¯ããªããæã£ãŠãããã®ïŒã®åœ¢ã§ã®ã·ã³ã¿ãã¯ã¹ã·ã¥ã¬ãŒã®äœ¿çšã¯ããã€ãã®ããã«ãäžäœäºææ§ãããã await!(future)
ã®æå¿«ãã¯æçœã§ãã ãŸããåè¿°ã®ããã«ã try!
ã§ã®é²è¡ç¶æ³ãåæ ããŠããŸãã
ãã¯ããšããŠä¿æããããšã®å©ç¹ã¯ããããéåžžã®é¢æ°åŒã³åºãã§ã¯ãªãèšèªæ©èœã§ããããšãäžç®ã§ããã«ãããããšã§ãã !
è¿œå ããªããšããšãã£ã¿ãŒ/ãã¥ãŒã¢ãŒã®æ§æã®åŒ·èª¿è¡šç€ºãåŒã³åºããèŠã€ããããšãã§ããæè¯ã®æ¹æ³ã§ããããããã®å®è£
ã«äŸåããããšã¯ãã匱ãéžæã ãšæããŸãã
ç§ã®2ã»ã³ãïŒéåžžã®å¯çš¿è
ã§ã¯ãããŸãããfwiwïŒç§ã¯try!
ã¢ãã«ãã³ããŒããããšã«æãéšåçã§ãã ããã¯ä»¥åã«äžåºŠè¡ããããã®ã§ãããŸãæ©èœããéåžžã«äººæ°ãåºãåŸãæ¥å°ŸèŸæŒç®åãæ€èšããã®ã«ååãªãŠãŒã¶ãŒãããŸããã
ãããã£ãŠãç§ã®æ祚ã¯æ¬¡ã®ããã«ãªããŸãã await!(...)
å®å®ããRustéçºè
ã®æ祚ã«åºã¥ããŠãåŸçœ®æŒç®åããã³ãããŠãé©åãªãã§ãŒã³ãäœæããŸãã Awaitã¯ããŒã¯ãŒãã§ããã !
ã¯ãããç§ã«ãšã£ãŠãéæ³ãã§ãããæ¬åŒ§ã§å²ãŸããŠããããšã瀺ããŠããŸãã
ãŸããæ¯èŒïŒ
| Postfix | åŒ|
| --- | --- |
| .await
| client.get("https://my_api").send().await?.json().await?
|
| .await!
| client.get("https://my_api").send().await!?.json().await!?
|
| .await()
| client.get("https://my_api").send().await()?.json().await()?
|
| ^
| client.get("https://my_api").send()^?.json()^?
|
| #
| client.get("https://my_api").send()#?.json()#?
|
| @
| client.get("https://my_api").send()@?.json()@?
|
| $
| client.get("https://my_api").send()$?.json()$?
|
ç§ã®3çªç®ã®ã»ã³ãã¯ã @
ïŒãåŸ
æ©ãã®å ŽåïŒãš#
ïŒãã«ãã¹ã¬ãã/䞊è¡æ§ãè¡šãããïŒã奜ããªããšã§ãã
ç§ãæ¥å°ŸèŸ@
ã奜ãã§ãïŒ å®è¡å¯èœã§ã¯ãªããšããææ
ãããããã«èŠããŸãããå®éã«ã¯æªãéžæè¢ã§ã¯ãªããšæããŸãã
?
ãš@
ãéåžžã«äŒŒãŠåŠç¿ããã§ããã@
åŠç¿åŸ?
ããã®ãããªé£èºãã¹ãã§ã¯ãããŸããç§ã¯await? foo
æ§æã«éåžžã«è³æã§ãããããŠããã¯æ°åŠã§èŠãããããã€ãã®æ§æã«äŒŒãŠãããšæããŸãã sin²xã¯ãïŒsin xïŒÂ²ãæå³ããããã«äœ¿çšã§ããŸãã æåã¯å°ãããã¡ãªãèŠããŸããããªããªãæ
£ãããããšæããŸãã
äžã§è¿°ã¹ãããã«ãç§ã¯ä»ã®ãšããtry!()
ããã«ããã¯ããšããŠawait!()
ãè¿œå ããæçµçã«ãããåŸçœ®ããæ¹æ³ã決å®ããããšã«è³æã§ãã await!()
åŒã³åºããæ¥å°ŸèŸã«èªåçã«å€æããrustfixã®ãµããŒãã念é ã«çœ®ãããšãã§ããã°ãããã¯ãŸã 決å®ãããŠããŸããã
æ¥å°ŸèŸã®ããŒã¯ãŒããªãã·ã§ã³ã¯ç§ã«ãšã£ãŠæãããªåè ã§ãã
åªå é äœ/é åºã®åé¡ã¯ãããŸããããæ¬åŒ§ã䜿çšããŠé åºãæ瀺ããããšãã§ããŸãã ããããã»ãšãã©ã®å Žåãé床ã®ãã¹ãã¯å¿ èŠãããŸããïŒ 'tryïŒïŒïŒ'ã®ä»£ããã«postfix 'ïŒ'ãåªå ããããã®åæ§ã®åŒæ°ïŒã
è€æ°è¡ã®ãã§ãŒã³ã§èŠæ ããããïŒ@earthengineã«ãã以åã®ã³ã¡ã³ããåç §ïŒãç¹°ãè¿ãã«ãªããŸãããé åºãäœãåŸ ããããŠãããã«ã€ããŠæ··ä¹±ã¯ãããŸããã ãŸããawaitãè€æ°å䜿çšããåŒã«ã¯ãå ¥ãå/äœåãªæ¬åŒ§ã¯ãããŸããã
let x = x.do_something() await
.do_another_thing() await;
let x = x.foo(|| ...)
.bar(|| ...)
.baz() await;
macro_rules! await {
($e:expr) => {{$e await}}
}
client.get("https://my_api").send() await.unwrap().json() await.unwrap()
ç§ããŸã ææ¡ããŠããªãå¥ã®åè£ãææ¡ããããã«ïŒããããããã¯è§£æã§ããªãããïŒã楜ããäºéããã '..'æ¥å°ŸèŸæŒç®åã¯ã©ãã§ããïŒ ããã¯ç§ãã¡ãäœããåŸ ã£ãŠããããšãæãåºãããŸãïŒçµæïŒïŒ...
client.get("https://my_api").send()..?.json()..?
ç§ãæ¥å°ŸèŸ
@
ã奜ãã§ãïŒ å®è¡å¯èœã§ã¯ãªããšããææ ãããããã«èŠããŸãããå®éã«ã¯æªãéžæè¢ã§ã¯ãªããšæããŸãã
- _ @ for await_ã¯ãèŠããããããŒã¢ããã¯ã§ãã
?
ãš@
ãéåžžã«äŒŒãŠåŠç¿ããã§ããã@
åŠç¿åŸ?
ããã®ãããªé£èºãã¹ãã§ã¯ãããŸãã- åŒãç解ããããã«çµäºåºåãæåãèŠã€ããããã«åæ¹ã«ã¹ãã£ã³ããå¿ èŠãªãã«ãåŒã®ãã§ãŒã³ãå·Šããå³ã«ã¹ãã£ã³ããã®ã«åœ¹ç«ã¡ãŸã
ç§ã¯@ã䜿ã£ãŠåŸ ã€ã®ã奜ãã§ã¯ãããŸããã å³æã®èŠªæã§alt-grãæŒããŠãããæ°åã®è¡ã®ããŒ2ãæŒãå¿ èŠããããããfin / sweã¬ã€ã¢ãŠãããŒããŒãã§å ¥åããã®ã¯é¢åã§ãã ãŸãã@ã¯ïŒatïŒã§ååã«ç¢ºç«ãããæå³ãæã£ãŠããã®ã§ããªããã®æå³ãæ··åããå¿ èŠãããã®ãââããããŸããã
åã«await
ãšå
¥åãããã ãã§ãããããŒããŒãã®ã¢ã¯ãããããå¿
èŠãšããªããããããé«éã§ãã
ãããç§èªèº«ã®éåžžã«äž»èŠ³çãªè©äŸ¡ã§ãã future@await
ãè¿œå ããŸããããããã¯èå³æ·±ããšæããŸãã
| æ§æ| ããŒã|
| --- | --- |
| await { f }
| 匷ãïŒ
for
ã loop
ã async
ãªã©ãawait { await { foo() }?.bar() }?
ïŒawait f
| 匷ãïŒawait
æ§æã«å¯Ÿå¿?
ããŸãåäœããŸãïŒ await fut?
察await? fut
ïŒawait (await foo()?).bar()?
察await? (await? foo()).bar()
ïŒfut.await
fut.await()
fut.await!()
| 匷ãïŒawait!()
ãæãéæ³ãå°ãªããšæãã@jplatteã«åæãfut(await)
| 匷ãïŒawait
å€æ°ãã©ããã«å®çŸ©ãããŠãããå
ç©ã¯é¢æ°ã®ããã«åŒã³åºãããšãã§ãããšãŠãŒã¶ãŒãéšããŸãf await
| 匷ãïŒclient.get("https://my_api").send() await.unwrap().json() await.unwrap()
ãclient.get("https://my_api").send()
ã await.unwrap().json()
ã await.unwrap()
ã°ã«ãŒãåããŸãïŒæåã«
ã°ã«ãŒãåãã次ã«.
ã°ã«ãŒãåããŸãïŒããã¯æ£ãããããŸããf@
| 匷ãïŒ@
ãæ¶è²»ããŸãããããã¯ä»ã®äœãã«é©ããŠããå¯èœæ§ããããŸã@
ããŸãf@await
| 匷ãïŒawait
ã¯ããŒã¯ãŒãã«ãªãå¿
èŠã¯ãããŸãã@operator
圢åŒã§è¿œå ã§ããŸãã ããšãã°ã ?
ã¯@try
ãšããŠå®è¡ã§ããŸããclient.get("https://my_api").send()@await.unwrap().json()@await.unwrap()
ãæ£ããã°ã«ãŒãã«ã°ã«ãŒãåããŸãïŒæåã«.
ã°ã«ãŒãåããã次ã«@
ã°ã«ãŒãåãããŸãïŒ@
ããŸã.
ãä»ã®await
ãšãã§ãŒã³ããã®ã¯ç°¡åã§ã| æ§æ| ãã¡ã | obv | vrb | vis | ãã£| grp | fwd |
| --------------------- | ----- | ----- | ----- | ----- | --- -| ----- | ----- |
| await!(fut)
| ++ | + | -| ++ | -| 0 | ++ |
| await { fut }
| ++ | ++ | -| ++ | -| 0 | + |
| await fut
| ++ | -| + | ++ | -| 0 | -|
| fut.await
| 0 | -| + | ++ | ++ | + | -|
| fut.await()
| 0 | -| -| ++ | ++ | + | -|
| fut.await!()
| 0 | 0 | -| ++ | ++ | + | -|
| fut(await)
| -| -| 0 | ++ | ++ | + | -|
| fut await
| -| -| + | ++ | ++ | -| -|
| fut@
| -| -| ++ | -| ++ | ++ | -|
| fut@await
| -| 0 | + | ++ | ++ | ++ | 0 |
æåã®ã«ããã§try!()
æ§æããã©ãŒãªã³ã°ããä»ã®æ§æãå°å
¥ããåã«await!(expr)
ã®äœ¿çšãå®éã«äœ¿çšããå¿
èŠãããããã«æããŸãã
ãã ãã代æ¿æ§æãäœæããå Žåã¯ã
@
ã¯èŠèŠããããasyncãã®ãatãã¯ç§ã«ã¯ããã»ã©çŽæçã§ã¯ãªããšæããŸãããã®èšå·ã¯ãã§ã«ãã¿ãŒã³ãããã³ã°ã«äœ¿çšãããŠããŸãã
ããŒã¬ã³ã®ãªãasync
ãã¬ãã£ãã¯ã¹ã¯ã ?
ïŒå€ãã®å ŽåïŒãšäžç·ã«äœ¿çšãããšãæçœã§ãªãåªå
é äœãŸãã¯åšå²ã®ããŒã¬ã³ã«ã€ãªãããŸãã
æ¥å°ŸèŸ.await!()
ããŸããã§ãŒã³ããããã®æå³ãããã«ãããããããéæ³ã䜿ãããšãæããŠããã!
ãå«ãŸããŠãããæ§æçã«ã¯ããŸãç®æ°ãããã®ã§ã¯ãªãã®ã§ãã次ã®ã«ãããã¢ãããŒãã¯Iå人çã«ã¯ããã奜ãã§ãããã ãšã¯èšããã®ã®ãç§ã«ãšã£ãŠã¯ãæåã®ã«ããawait! (expr)
ãããå®éã®ã³ãŒããã©ãã ãæ¹åããããã¯ãŸã ããããŸããã
åçŽãªã±ãŒã¹ã§ã¯ããã¬ãã£ãã¯ã¹æŒç®åã䜿çšããŸãã
let result = await task;
çµæã®çš®é¡ãæžãåºããªãããšãèãããšãã¯ããã«èªç¶ã«æããã®ã§ãå·Šããå³ã«èªããšãã«ãçµæãåŸ
æ©ã®ã¿ã¹ã¯ã§ããããšãç解ããããã«ãåŸ
æ©ã¯ç²Ÿç¥çã«åœ¹ç«ã¡ãŸãã
ãã®ããã«æ³åããŠã¿ãŠãã ããã
let result = somehowkindoflongtask await;
ã¿ã¹ã¯ã®æåŸã«å°éããªããŸã§ãã¿ã¹ã¯ãè¿ãã¿ã€ããåŸ
ã€å¿
èŠãããããšã«æ°ã¥ããŸããã IntellijãšããŠã®IDEãååãšequalsã®éã«ã¿ã€ããïŒããŒãœãã©ã€ãºãªãã§ïŒã€ã³ã©ã€ã³åããããšãèŠããŠãããŠãã ããïŒããã¯å€æŽãããå¯èœæ§ããããèšèªã®å°æ¥ã«çŽæ¥ãªã³ã¯ãããŠããŸããïŒã
ãã®ããã«æ³åããŠãã ããïŒ
ããã¯ç§ã®æèŠãæ¥é èŸã«å¯ŸããŠ100ããŒã»ã³ãã§ãããšããæå³ã§ã¯ãããŸããã çµæãé¢ä¿ããå Žåã¯ãfutureã®postfixããŒãžã§ã³ãéåžžã«èªç¶ã«æããããã®ã§éåžžã«å¥œã¿ãŸãã ã³ã³ããã¹ãããªããŠãããããã®ã©ããäœãæå³ããã®ããç°¡åã«ç¥ãããšãã§ããŸãã
future await?
future? await
代ããã«ãåå¿è
ã®èŠ³ç¹ãããããã2ã€ã®ãã¡ã©ã¡ããæ£ããããèŠãŠãã ããã
await future? === await (future?)
await future? === (await future)?
ç§ã¯ãã¬ãã£ãã¯ã¹ããŒã¯ãŒãawait future
ã«è³æã§ãã
ããã¯ãasync / awaitãåããã»ãšãã©ã®ããã°ã©ãã³ã°èšèªã§äœ¿çšãããŠãããã®ã§ããããããããã®1ã€ãç¥ã£ãŠãã人ã«ã¯ããã«éŠŽæã¿ããããŸãã
await future?
ã®åªå
é äœã«ã€ããŠãäžè¬çãªã±ãŒã¹ã¯äœã§ããïŒ
Result<Future>
ãè¿ãé¢æ°ãResult
ïŒ Future<Result>
ãè¿ããåŸ
ããªããã°ãªããªãæªæ¥ãI / Oæäœã倱æããå¯èœæ§ããããããäžè¬çãªã·ããªãªãåŠçããå Žåã¯ã2çªç®ã®ã±ãŒã¹ã®æ¹ãã¯ããã«äžè¬çã ãšæããŸãã ãããã£ãŠïŒ
await future? <=> (await future)?
ããŸãäžè¬çã§ã¯ãªãæåã®ã±ãŒã¹ã§ã¯ãæ¬åŒ§ãä»ããŠãããŸããŸããïŒ await (future?)
ã try!
ãã¯ããéæšå¥šã«ãªã£ãŠããªãå Žåãããã¯await try!(future)
䜿çšã«ãé©ããŠããå¯èœæ§ããããŸãã ãã®ããã«ã await
ãšçå笊ã®æŒç®åã¯å°æ¥ã®ç°ãªãåŽé¢ã«ãããŸããã
await
ãæåã®async
é¢æ°ãã©ã¡ãŒã¿ãŒãšããŠäœ¿çšããŠã¿ãŸãããïŒ
async fn await_chain() -> Result<usize, Error> {
let _ = partial_computation(await)
.unwrap_or_else(or_recover)
.run(await)?;
}
client.get("https://my_api")
.send(await)?
.json(await)?
let output = future
.run(await);
ããã§ã future.run(await)
ã¯await future
代ããã«ãªããŸãã
ããã¯ãfutureãåããåã«await!()
ãã¯ããå®è¡ããéåžžã®async
é¢æ°ã§ããå¯èœæ§ããããŸãã
C ++ïŒåæå®è¡TRïŒ
auto result = co_await task;
ããã¯ã³ã«ãŒãã³TSã«ããã䞊è¡æ§ã§ã¯ãããŸããã
å¥ã®ãªãã·ã§ã³ã¯ã await
代ããã«become
ããŒã¯ãŒãã䜿çšããããšã§ãã
async fn become_chain() -> Result<usize, Error> {
let _ = partial_computation_future(become)
.unwrap_or_else(or_recover_future)
.start(become)?;
}
client.get("https://my_api")
.send_future(become)?
.json_future(become)?
let output = future.start(become);
become
ã¯ãä¿èšŒãããTCOã®ããŒã¯ãŒãã«ãªãå¯èœæ§ããããŸã
ãã®[æŠèŠ]ã@EyeOfPythonã«æè¬ããŸãã ããã¯ãèªè»¢è»å°å±ã«åå ããã°ããã®äººã«ãšã£ãŠç¹ã«äŸ¿å©ã§ãã
å人çã«ã¯ã f await
ããé¢ããããšãæãã§ããŸãããªããªããæ§æãéåžžã«çŽ æŽã§ãªããç¹å¥ã§éæ³ã®ããã«èŠããããã§ãã RustãåããŠäœ¿çšãããŠãŒã¶ãŒãå€ãã®ããšã«ã€ããŠæ··ä¹±ããããšã¯ããããã®ããšã®1ã€ã«ãªããŸãããããŠãRustã®ããã©ã³ã§ããããã®äŸ¡å€ãããã»ã©æ確ã«ã¯ãªããªãããã«æããŸãã
@novacrazyãã®åŒæ°ã®åé¡ã¯ã
await!
ãã¯ããéæ³ã®ããã«ãªãããŠãŒã¶ãŒäœæã®ã³ãŒãã§ã¯äžå¯èœãªæäœãå®è¡ããããšã§ãã
@ Nemo157 await!
ãã¯ããéæ³ã«ãªãããšã«åæããŸãããããã¯åé¡ã§ã¯ãªããšäž»åŒµããŸãã std
ã¯ããã®ãããªãã¯ãããã§ã«è€æ°ãããŸããããšãã°ã compile_error!
ã誰ããããã«ã€ããŠäžæºãèšã£ãŠããã®ãèŠãããšããããŸããã ãã¯ãã䜿çšããã®ã¯ããããã©ã®ããã«è¡ããããã§ã¯ãªããäœãããããç解ããã ãã§ããã®ãæ®éã ãšæããŸãã
ç§ã¯Postfixãæã人éå·¥åŠçã§ããããšã以åã®ã³ã¡ã³ã¿ãŒã«åæããããç§ã¯ããããæ¥é ãã¯ãããå§ããŸãawait!(expr)
ããããã®ã«ãªããšããåŸçœ®ãã¯ããžã®æœåšç移è¡ã§ã¯ãªããæã£ãŠããexpr.await
ïŒããžãã¯ã³ã³ãã€ã©çµã¿èŸŒã¿ãã£ãŒã«ãïŒãŸãã¯expr.await()
ïŒããžãã¯ã³ã³ãã€ã©çµã¿èŸŒã¿ã¡ãœããïŒã ã©ã¡ãããçŽç²ã«ãã®æ©èœã®ããã®å®å
šã«æ°ããæ§æãšãèšèªã®äžè²«æ§ãæãªãã ãã®IMOãå°å
¥ããŸãã
@EyeOfPythonãã€ã³ãã¯ããªãã®ãªã¹ããšããŒãã«ã«future(await)
ãè¿œå ããŸããïŒ future.await()
è©äŸ¡ã®ãã¹ãŠã®è¯å®çãªç¹ã¯ã匱ç¹ãªãã«ç§»è¡ããŠããããã§ã
æ§æã®åŒ·èª¿è¡šç€ºã«ããããããã foo.await
ã¯ãã£ãŒã«ãã¢ã¯ã»ã¹ã«éåžžã«äŒŒãŠãããšäž»åŒµãã人ããããããããŒã¯ã³.
ã#
ã代ããã«foo#await
ãšæžãããšãã§ããŸãã ã äŸãã°ïŒ
let foo = alpha()#await?
.beta#await
.some_other_stuff()#await?
.even_more_stuff()#await
.stuff_and_stuff();
GitHubããããæ§æã®åŒ·èª¿è¡šç€ºã§ã©ã®ããã«ã¬ã³ããªã³ã°ãããã説æããããã«ã await
ãmatch
眮ãæããŠã¿ãŸãããããããã¯åãé·ããªã®ã§ã次ã®ããã«ãªããŸãã
let foo = alpha()#match?
.beta#match
.some_other_stuff()#match?
.even_more_stuff()#match
.stuff_and_stuff();
ããã¯æ確ã§äººéå·¥åŠçã§ããããã«æãããŸãã
#
ã®è«ççæ ¹æ ã¯ç¹å®ãããŠããŸããããããŒã¯ã³ã¯éåžžã«ç®ç«ã¡ãŸãã
ã ãããå¥ã®æŠå¿µïŒæªæ¥ãåç §ã ã£ãå ŽåïŒ
async fn log_service(&self) -> T {
let service = self.myService.foo(); // Only construction
*self.logger.log("beginning service call");
let output = *service.exec(); // Actually wait for its result
*self.logger.log("foo executed with result {}.", output);
output
}
async fn try_log(message: String) -> Result<usize, Error> {
let logger = *acquire_lock();
// Very terse, construct the future, wait on it, branch on its result.
let length = (*logger.log_into(message))?;
*logger.timestamp();
Ok(length)
}
async fn await_chain() -> Result<usize, Error> {
*(*partial_computation()).unwrap_or_else(or_recover);
}
(*(*client.get("https://my_api").send())?.json())?
let output = *future;
ããã¯æ¬åœã«éããŠäžè²«æ§ããããŸããã å°ãªããšããã®æ§æãæ確ã«ããŸãããã
async fn log_service(&self) -> T {
let service = self.myService.foo(); // Only construction
$self.logger.log("beginning service call");
let output = $service.exec(); // Actually wait for its result
$self.logger.log("foo executed with result {}.", output);
output
}
async fn try_log(message: String) -> Result<usize, Error> {
let logger = $acquire_lock();
// Very terse, construct the future, wait on it, branch on its result.
let length = ($logger.log_into(message))?;
$logger.timestamp();
Ok(length)
}
async fn await_chain() -> Result<usize, Error> {
$($partial_computation()).unwrap_or_else(or_recover);
}
($($client.get("https://my_api").send())?.json())?
let output = $future;
ããè¯ãã§ãããããã§ãéãã§ãïŒããã«æªãããšã«ãgithubã®æ§æã匷調衚瀺ãããŸãïŒã ãã ããããã«å¯ŸåŠããããã«ããã¬ãã£ãã¯ã¹æŒç®åã
async fn log_service(&self) -> T {
let service = self.myService.foo(); // Only construction
self.logger.$log("beginning service call");
let output = service.$exec(); // Actually wait for its result
self.logger.$log("foo executed with result {}.", output);
output
}
async fn try_log(message: String) -> Result<usize, Error> {
let logger = $acquire_lock();
// Very terse, construct the future, wait on it, branch on its result.
let length = logger.$log_into(message)?;
logger.$timestamp();
Ok(length)
}
async fn await_chain() -> Result<usize, Error> {
($partial_computation()).$unwrap_or_else(or_recover);
}
client.get("https://my_api").$send()?.$json()?
let output = $future;
ããã¯ãŸãã«ç§ã欲ãããã®ã§ãïŒ awaitïŒ $
ïŒã ãã§ãªããderefïŒ *
ïŒãšnegateïŒ !
ïŒãåæ§ã§ãã
ãã®æ§æã®ããã€ãã®èŠåïŒ
$
ã·ã³ãã«ã¯ããã§åé¡ãåŒãèµ·ãããŸããïŒ.
åºåãããåŒã«ã®ã¿é©çšãããŸãïŒ await_chain
fnã¯ããã瀺ããŠããŸãïŒãããã¯æ··ä¹±ããŸããïŒ@Centril
IMOïŒãçã®ãªãã©ã«æ§æã«è¿ãããŸãr#"A String with "quotes""#
IMOïŒãçã®ãªãã©ã«æ§æã«è¿ãããŸã
r#"A String with "quotes""#
ãã®å Žåã®éãã¯ãã³ã³ããã¹ãããã¯ããªãæãããªããã§ãã
@Centril
ããã§ãããæ§æãRustãIMHOã䜿çšããã¹ã¿ã€ã«ãšã¯ãŸã£ããç°è³ªã§ãã ããã¯ãåæ§ã®æ©èœãæã€æ¢åã®æ§æãšã¯äŒŒãŠããŸããã
@Laaaså°å
¥ããããšãã ?
ãããŸããã§ããã .await
è¡ãããå¬ããã§ã; ããããä»ã®äººã¯ããã«äžæºãæã£ãŠããããã«èŠããã®ã§ãç§ã¯ããŸãããäœããèŠã€ããããšããŠããŸãïŒã€ãŸããæ確ã§ã人éå·¥åŠçã§ãå
¥åãååã«ç°¡åã§ãé£éå¯èœã§ãåªå
é äœãé«ãïŒã foo#await
ã¯ããããã¹ãŠæºããããã§ãã
?
ã¯ä»ã«ãããããã®è¯ãç¹ããããŸããã .await
ãããªãã®ãå¿
èŠãªå Žåã¯ã .await!
ãªãã§ããããã
@Centrilãããfuture(await)
èåŸã«ããäž»ãªçç±ã§ãããäœåãªæŒç®åãå€éšæ§æãè¿œå ããå¿
èŠããªãããã£ãŒã«ãã¢ã¯ã»ã¹ãåé¿ããããã§ãã
#awaitã¯ããªãæ£æçã§ãã
#
ã¯æ£æçã§ããã¯ã-ããã¯æåã§ããããããšã倱æã§ããïŒ ããæç¹ã§æ°ããæ§æãçºæããããšãã誰ãããããèŠæ ããè¯ããçã«ããªã£ãŠãããšæã£ãã®ã§ãããã¯æ£æçã§ãªããã°ãªããŸããã
ãªã
.await!
ãªãã®ã§ããïŒ
ãããåæ§ã«æ£æçã§ãããç§ã¯ããã«å察ããŠããŸããã
@Centrilããã
future(await)
èåŸã«ããäž»ãªçç±ã§ãããäœåãªæŒç®åãå€éšæ§æãè¿œå ããå¿ èŠããªãããã£ãŒã«ãã¢ã¯ã»ã¹ãåé¿ããŸããã
代ããã«ã await
ãfuture
æž¡ãé¢æ°é©çšã®ããã«èŠããŸãã ããã¯ããã£ãŒã«ãã¢ã¯ã»ã¹ããããæ··ä¹±ããŠããããã«ç§ã襲ããŸãã
代ããã«ãããã¯ããªããééããŠããé¢æ°é©çšã®ããã«èŠããŸãã ããã¯ããã£ãŒã«ãã¢ã¯ã»ã¹ããããæ··ä¹±ããŠããããã«ç§ã襲ããŸãã
ç§ã«ãšã£ãŠãããã¯ç°¡æœãã®äžéšã§ããã Awaitã¯ãé¢æ°åŒã³åºãïŒåŒã³åºãå ãããªããšããªãã®çµæã®éã§å®è¡ãããïŒã®ãããªå€ãã®åŽé¢ã§ããããã®é¢æ°ã«ããŒã¯ãŒããæž¡ãããšã§ããããå¥ã®çš®é¡ã®åŒã³åºãã§ããããšãæããã«ãªããŸããã ããããããŒã¯ãŒããä»ã®åŒæ°ãšé¡äŒŒããŠããããšãã©ã®ããã«æ··ä¹±ããå¯èœæ§ãããããããããŸãã ïŒãã€ãã¹ã®æ§æã®åŒ·èª¿è¡šç€ºãšããã®ã¡ãã»ãŒãžãè£åŒ·ããããšããã³ã³ãã€ã©ãšã©ãŒã¡ãã»ãŒãžãå ç©ã¯ãåŸ æ©ãã以å€ã®æ¹æ³ã§åŒã³åºãããšã¯ã§ããŸããããã®éãåæ§ã§ãïŒã
@Centril
æ£æçã§ããããšã¯åŠå®çãªããšã§ã¯ãããŸããããæ¢åã®æ§æã«é¡äŒŒããŠããããšã¯è¯å®çãªããšã§ãã .await!
ã¯å®å
šã«æ°ããæ§æã§ã¯ãªããããããã»ã©æ£æçã§ã¯ãããŸããã çµå±ã®ãšãããããã¯await
ãšããååã®ä¿®æ£åŸã®ãã¯ãã«ãããŸããã
ç¹ã«await
æ°ããæ§æã«ã€ããŠæ確ã«ãã/èŠç¹ãè¿œå ããããã«ãç§ãæå³ããã®ã¯ãæ¢åã®æ§æãšã¯ç°ãªãæ°ããæ§æãå°å
¥ããããšã§ãã ãã¬ãã£ãã¯ã¹ããŒã¯ãŒãã¯ããããããããã®ãã¡ã®ããã€ãã¯Rust 1.0ã®åŸã«è¿œå ãããŠããŸãïŒäŸïŒ union
ïŒããAFAIKã¯åäžã®ãã¹ããã£ãã¯ã¹ããŒã¯ãŒãã§ã¯ãããŸããïŒã¹ããŒã¹ããããããŸãã¯ä»ã®äœãã§åºåãããŠããŠãïŒ ã ãŸããæ¥å°ŸèŸã®ããŒã¯ãŒããæã€ä»ã®èšèªã¯èããããŸããã
ç§èŠã§ã¯ãRustã®å¥åŠããå€§å¹ ã«å¢å ãããªãå¯äžã®æ¥å°ŸèŸæ§æã¯ãã¡ãœããåŒã³åºããåæ ããŠãããã以åã«Rustãã¯ããèŠãããšããã人ãªã誰ã§ããã¯ããšããŠæ確ã«èå¥ã§ãããããæ¥å°ŸèŸãã¯ãã§ãã
æšæºã®await!()
ãã¯ããæ°ã«å
¥ããŸããã ããã¯æ確ã§åçŽã§ãã
awaited
ãšããŠå
±åãããããããã£ãŒã«ãã®ãããªã¢ã¯ã»ã¹ïŒãŸãã¯ä»ã®æ¥å°ŸèŸïŒã奜ã¿ãŸãã
cloned()
ã¡ãœããã«äžè²«æ§ããããŸãããŸãã @?
ã?
ãããªç ç³ãšããŠå¥œãã§ããã
ããã¯å人çãªããšã§ããã @
ã¯é«ãããŠã©ã€ã³ãã¢ã³ããŒã·ã¥ãŒãããåŸåããããéåžžã«æ°ãæ£ãã®ã§ãå®éã«ã¯&?
çµã¿åããã奜ã¿ãŸãã &
ãèãé«ãïŒè¯ãïŒããã¢ã³ããŒã·ã¥ãŒãã¯ããªãïŒè¯ãïŒã æ®å¿µãªããã &
ãã§ã«æå³ããããŸãããåžžã«?
ãç¶ããŸãã
äŸãã°ã
Lorem@?
.ipsum@?
.dolor()@?
.sit()@?
.amet@?
Lorem@?.ipsum@?.dolor()@?.sit()@?.amet@?
Lorem&?
.ipsum&?
.dolor()&?
.sit()&?
.amet&?
Lorem&?.ipsum&?.dolor()&?.sit()&?.amet&?
ç§ã«ãšã£ãŠã @
ã¯è¥å€§åãããã£ã©ã¯ã¿ãŒã®ããã«æããèªæžã®æµããéªéããŸãã äžæ¹ã &?
ã¯å¿å°ãããïŒç§ã®ïŒèªæžã®éªéã«ãªããã &
ãš?
éã«çŽ æµãªäžéšã¹ããŒã¹ããããŸãã
å人çã«ã¯ãåçŽãªawait!
ãã¯ãã䜿çšããå¿
èŠããããšæããŸãã ä¿®æ£åŸã®ãã¯ããèšèªã«çµã¿èŸŒãŸããå Žåããã¯ãã¯åçŽã«å±éã§ããŸããã
@Laaasç§ãæãéããRustã«ã¯ãŸã æ¥å°ŸèŸãã¯ãããªãã®ã§ããããã¯æ°ããæ§æã§ãã ãŸãã foo.await!.bar
ãšfoo.await!().bar
ã¯åããµãŒãã§ã¹æ§æã§ã¯ãªãããšã«æ³šæããŠãã ããã åŸè
ã®å Žåãå®éã®æ¥å°ŸèŸãšçµã¿èŸŒã¿ãã¯ãããããŸãïŒããŒã¯ãŒããšããŠawait
ããããããå¿
èŠããããŸãïŒã
@jplatte
å€ãã®ãã¬ãã£ãã¯ã¹ããŒã¯ãŒããããããã®ãã¡ã®ããã€ãã¯Rust 1.0ã®åŸã«è¿œå ãããŠããŸãïŒäŸïŒ
union
ïŒã
union
ã¯åé
åŒæŒç®åã§ã¯ãªãããããã®æ¯èŒã«ã¯é¢ä¿ãããŸããã Rustã«ã¯æ£ç¢ºã«3ã€ã®å®å®ããåé
ãã¬ãã£ãã¯ã¹æŒç®åïŒ return
ã break
ãããã³continue
ïŒãããããããã¯ãã¹ãŠ!
å
¥åãããŸãã
ããŒã... @
ãç§ã®ä»¥åã®ææ¡ã¯å°ãè¯ãèŠããŸãïŒ
client.get("https://my_api").@send()?.@json()?
let output = @future;
let foo = (@alpha())?
.<strong i="8">@beta</strong>
.@some_other_stuff()?
.@even_more_stuff()
.stuff_and_stuff();
@Centrilãããç§ã®ãã€ã³ãã§ããä¿®æ£åŸã®ãã¯ãã¯ãŸã ãªãã®ã§ãåã«await!()
ãŸãã ãŸããç§ã¯.await!()
FYIãæå³ããŸããã await
ã¯ããŒã¯ãŒãã§ããå¿
èŠã¯ãªããšæããŸãããåé¡ãããå Žåã¯äºçŽã§ããŸãã
union
ã¯åé åŒæŒç®åã§ã¯ãªãããããã®æ¯èŒã«ã¯é¢ä¿ãããŸããã Rustã«ã¯æ£ç¢ºã«3ã€ã®å®å®ããåé ãã¬ãã£ãã¯ã¹æŒç®åïŒreturn
ãbreak
ãããã³continue
ïŒãããããããã¯ãã¹ãŠ!
å ¥åãããŸãã
ããã¯ãããšãã¿ã€ããç°ãªã£ãŠããŠããæ¥é èŸ-ããŒã¯ãŒãããªã¢ã³ããåé
åŒæŒç®åã®ã°ã«ãŒãã«é©åããããšãæå³ããŸãã æ¥å°ŸèŸ-ããŒã¯ãŒãã®å€åœ¢ã¯ãæ¢åã®æ§æããã®ã¯ããã«å€§ããªçžéã§ãããç§ã®æèŠã§ã¯ãèšèªã«ãããawait
ã®éèŠæ§ã«é¢é£ããŠå€§ããããŸãã
ãã¬ãã£ãã¯ã¹ãã¯ããšãã¹ããã£ãã¯ã¹ãžã®ç§»è¡ã®å¯èœæ§ã«ã€ããŠïŒ await
ã¯ããããæ©èœããããã®ããŒã¯ãŒãã®ãŸãŸã§ããå¿
èŠããããŸãã ãã®å Žåããã¯ãã¯ç¹å¥ãªlangã¢ã€ãã ã«ãªããè¿œå ã®r#
ãªãã§ååãšããŠããŒã¯ãŒãã䜿çšã§ãã r#await!()
ã¯åããã¯ããåŒã³åºãããšãã§ããŸããããããããããã¹ãã§ã¯ãããŸããã ãã以å€ã¯ããããå©çšå¯èœã«ããããã®æãå®çšçãªè§£æ±ºçã®ããã§ãã
ã€ãŸãã await
ãããŒã¯ãŒããšããŠä¿æãã await!
ãlang-itemãã¯ãã«è§£æ±ºããŸãã
@HeroicKatoraãªããããæ©èœããããã«ããŒã¯ãŒãã®ãŸãŸã§ããå¿ èŠãããã®ã§ããïŒ
@Laaas移è¡ã®å¯èœæ§ãéãããŸãŸã«ããŠããããå Žåã¯ããããããŒã¯ãŒããšããŠäœ¿çšããå°æ¥ã®ä¿®æ£åŸã®æ§æã®ããã«éãããŸãŸã«ããå¿ èŠãããããã§ãã ãããã£ãŠã移è¡ã®ããã«ãšãã£ã·ã§ã³ãäžæããå¿ èŠããªãããã«ãããŒã¯ãŒãã®äºçŽãç¶æããå¿ èŠããããŸãã
@Centril
ãŸããfoo.awaitïŒ.barãšfoo.awaitïŒïŒïŒãbarã¯åããµãŒãã§ã¹æ§æã§ã¯ãªãããšã«æ³šæããŠãã ããã åŸè ã®å Žåãå®éã®æ¥å°ŸèŸãšçµã¿èŸŒã¿ãã¯ãããããŸãïŒããŒã¯ãŒããšããŠã®åŸ æ©ããããããå¿ èŠããããŸãïŒã
ããŒã¯ãŒãawait
ã!
ãšçµã¿åãããŠå
éšãã¯ãïŒéåžžã®æ¹æ³ã§ã¯å®çŸ©ã§ããªãïŒã«è§£æ±ºããããšã§ããã解決ã§ããŸãããïŒ ãã®åŸãããŒã¯ãŒãã®ãŸãŸã§ããããã以å€ã®å Žåã¯ãã¯ãæ§æã§ãã¯ãã«è§£æ±ºãããŸãã
@HeroicKatora x.await!()
await
ãäºçŽããŒã¯ãŒãã«ãªãã®ã¯ãªãã§ããïŒ
ããã§ã¯ãããŸããããä¿®æ£åŸãæªè§£æ±ºã®ãŸãŸã«ããŠããã°ãåŸã®è°è«ã§å°éãã解決çã§ããå¿ èŠã¯ãããŸããã ãããå¯äžã®åæãããæè¯ã®å¯èœæ§ã§ããå Žåãæåã«ãã®æ£ç¢ºãªä¿®æ£åŸã®æ§æãæ¡çšããå¿ èŠããããŸãã
ããã¯ãæ¥å°ŸèŸæŒç®åãšããŠã¯ããã«ããŸãæ©èœããäœãã«åºããããã1ã€ã®æ©äŒã§ãã ãã®å€§ããªäŸã¯try!
ã§ãæçµçã«ã¯ç¬èªã®ã·ã³ãã«?
ã ãã ããæ¥å°ŸèŸæŒç®åãããæé©ã§ããããã¹ãŠã«ç¬èªã®ç¹å¥ãªæåãäžããããšãã§ããªãã®ã¯ãããæåŸã§ã¯ãªããšæããŸãã ãããã£ãŠãå°ãªããšã@
å§ããã¹ãã§ã¯ãªããšæããŸãã ãã®ãããªããšãããæ¹æ³ãããã°ãã£ãšããã§ãããã ãã®ãããæ¥å°ŸèŸãã¯ãã¹ã¿ã€ã«.await!()
ããµããŒãããŠããŸãã
let x = foo().try!();
let y = bar().await!();
ãããããããæå³ã®ããæ¥å°ŸèŸãã¯ããç解ããã«ã¯ããããèªäœãå°å
¥ããå¿
èŠããããŸãã ãããã£ãŠãéåžžã®await!(foo)
ãã¯ãæ§æããå§ããã®ãæåã ãšæããŸãã ãããããèªäœã®ã·ã³ãã«ãæ£åœåããã®ã«ååéèŠã§ãããšæ¬åœã«æããå ŽåãåŸã§ãããfoo.await!()
ãŸãã¯foo@
ã«æ¡åŒµããããšãã§ããŸãã
ãã®ãã¯ãã«å°ãã®éæ³ãå¿
èŠã«ãªãããšã¯ãstdã«ãšã£ãŠç®æ°ããããšã§ã¯ãªããç§ã«ãšã£ãŠã¯å€§ããªåé¡ã§ã¯ãããŸããã
@jplatteãèšã£ãããã«ïŒ
@ Nemo157
await!
ãã¯ããéæ³ã«ãªãããšã«åæããŸãããããã¯åé¡ã§ã¯ãªããšäž»åŒµããŸããstd
ã¯ããã®ãããªãã¯ãããã§ã«è€æ°ãããŸããããšãã°ãcompile_error!
ã誰ããããã«ã€ããŠäžæºãèšã£ãŠããã®ãèŠãããšããããŸããã ãã¯ãã䜿çšããã®ã¯ããããã©ã®ããã«è¡ããããã§ã¯ãªããäœãããããç解ããã ãã§ããã®ãæ®éã ãšæããŸãã
ããã§èª¬æããŠããç¹°ãè¿ãçºçããåé¡ã¯ããã§ãŒã³ãšãã®äœ¿çšæ¹æ³ã«é¢ãããã®ã§ãã
åŒãé£éãããã®ãåŸ
ã¡ãŸãã å€åå¥ã®è§£æ±ºçããããããããŸãããïŒ
é£éã®ããã«awaitã䜿çšãããawaitforã®ã¿ã䜿çšããå Žå
å²ãåœãŠãletãawaitã«çœ®ãæãããããªãã®ããããŸãïŒ
await foo = future
次ã«ããã§ãŒã³ã®å Žåã await res =
fut1 -> fut2
ãawait res = fut1 >>= fut2
ãããªããçš®ã®æäœãæ³åã§ããŸãã
æ¬ èœããŠããå¯äžã®ã±ãŒã¹ã¯ãçµæãåŸ
ã£ãŠè¿ãããšã§ããããã€ãã®ã·ã§ãŒãã«ãã
await res = fut; res
ã
ããã¯ãåçŽãªawait fut
ã§ç°¡åã«å®è¡ã§ããŸãã
ç§ã¯ãã®ãããªå¥ã®ææ¡ãèŠãããšããªããšæããŸãïŒå°ãªããšã
ãã§ãŒã³ïŒãªã®ã§ãããã«ãããããããšãããšæããŸãã
@HeroicKatoraãªã¹ãã«fut(await)
ãè¿œå ããç§ã®æèŠã«åŸã£ãŠã©ã³ã¯ä»ãããŸããã
誰ããç§ã®åŸç¹ããããŠãããšæããããæããŠãã ããïŒ
æ§æçã«ã¯ã .await!()
ã¯ã¯ãªãŒã³ã§ãæ§æã«å¥åŠãªç¹ãè¿œå ããã«é£éã§ãããšæããŸãã
ãã ãããå®éã®ãæ¥å°ŸèŸãã¯ããååŸããå Žåããããã.r#await!()
ãã·ã£ããŠãããå¯èœæ§ãããã®ã«å¯Ÿãã .await!()
ã¯ã·ã£ããŠã€ã³ã°ã§ããªããããå°ãå¥åŠã«ãªããŸãã
await
ãåŒã®æ¬¡ã®éšåã«çµåãããŠããããšãããã£ãããããpostfixããŒã¯ãŒãããªãã·ã§ã³ïŒ foo() await?.bar() await?
ãããªã¹ããŒã¹ã§åºåãïŒã«ã¯ããªã匷ãå察ããŠããŸãããããåäœããéšåã§ã¯ãããŸããã ããã§ã¯ã空çœä»¥å€ã®ã»ãšãã©ãã¹ãŠã®èšå·ã奜ã¿ãŸãããŸããé·ããã§ãŒã³ã®æ¬ ç¹ã«ãããããããããããããã¬ãã£ãã¯ã¹æ§æã奜ã¿ãŸãã
å¿
é ã®åºåãæåã¯åäžã®ã¹ããŒãã¡ã³ããåŸ
ã€ãšããéåžžã«äžè¬çãªã±ãŒã¹ã«ãšã£ãŠèŠçã§ããããæçšãªåªå
é äœãã¯ãŸã£ãããªãããããæçœãªåªå
é äœãïŒ await?
ç ç³ã䜿çšïŒãæããã«æè¯ã®ãã¬ãã£ãã¯ã¹ãªãã·ã§ã³ã ãšæããŸãçŽæçã§ããããã£ãŠæ··ä¹±ããŸãã
æ§æçã«ã¯ã
.await!()
ã¯ã¯ãªãŒã³ã§ãæ§æã«å¥åŠãªç¹ãè¿œå ããã«é£éã§ãããšæããŸãããã ãããå®éã®ãæ¥å°ŸèŸãã¯ããååŸããå Žåããããã
.r#await!()
ãã·ã£ããŠãããå¯èœæ§ãããã®ã«å¯Ÿãã.await!()
ã¯ã·ã£ããŠã€ã³ã°ã§ããªããããå°ãå¥åŠã«ãªããŸãã
postfixãã¯ããååŸãã .await!()
ã䜿çšããå ŽåãããŒã¯ãŒããšããŠawait
ãäºçŽè§£é€ãããããpostfixãã¯ãã«ããããšãã§ããŸãã ãã®ãã¯ãã®å®è£
ã«ã¯ããŸã å°ãã®éæ³ãå¿
èŠã§ãããä»æ¥ã®compiler_error!
ããã«å®éã®ãã¯ãã«ãªããŸãã
@EyeOfPython forward-compatibility
æ€èšããå€æŽã«ã€ããŠè©³ãã説æããŠããã ããŸããïŒ fut@await
ãfut.await!()
ããé«ãã await { future }
ãawait!(future)
ããäœããªãæ¹æ³ãããããŸããã verbosity
åãå°ãå¥åŠã«èŠããŸããäžéšã®åŒã¯çãã§ãããè©äŸ¡ãäœããé£éã¹ããŒãã¡ã³ããªã©ãèæ
®ãããŠããŸããä»ã®ãã¹ãŠã¯ãã©ã³ã¹ãåããŠããããã§ããããŸã§ã§æãããåçž®ãããåºç¯ãªè©äŸ¡ã®ããã§ãã
ãã®è°è«ãèªãã åŸãå€ãã®äººãéåžžã®await!()
ãã¯ããè¿œå ããåŸã§åŸçœ®ããŒãžã§ã³ãç解ããããšæã£ãŠããããã§ãã ããã¯ãå®éã«postfixããŒãžã§ã³ãå¿
èŠã§ãããšæ³å®ããŠããŸããããã«ã€ããŠã¯ããã®ã³ã¡ã³ãã®æ®ãã®éšåã§ãåœãŠã¯ãŸããŸãã
ã ããç§ã¯ããã«ããã¿ããªã®æèŠã調æ»ããããšæããŸãïŒä»ã®ãšããawait!(future)
æ§æã«å
šå¡ãåæããå¿
èŠããããŸããïŒ é·æã¯ããã®æ§æã«æ§æ解æã®ãããŸããããªãããã¯ãã§ãããããããã®å€æŽããµããŒãããããã«èšèªã®æ§æãå€æŽããªãããšã§ãã çæã¯ããã§ãŒã³ã®èŠæ ããæªãããšã§ããããã®æ§æã¯ç°¡åã«åŸçœ®ããŒãžã§ã³ã«èªåçã«çœ®ãæããããšãã§ãããããããã¯åé¡ã§ã¯ãããŸããã
ããã解決ããŠèšèªã«å®è£ ããããpostfix awaitæ§æã«ã€ããŠã®è°è«ãç¶ããã§ããã°ãã£ãšæçããçµéšãã¢ã€ãã¢ããããŠããããä»ã®ã³ã³ãã€ã©æ©èœã䜿çšããããšãã§ããŸãã
@HeroicKatora await
ã解æŸããŠéåžžã®èå¥åãšããŠèªç¶ã«äœ¿çšã§ããä»ã®æ¥å°ŸèŸæŒç®åãè¿œå ã§ããã®ã§ãç§ã¯ãããé«ãè©äŸ¡ããŸãããã fut.await!()
ã¯await
æ¹ãè¯ããšæããŸãfut.await!()
ãé«ãå¯èœæ§ãããããšãééããªãæå¹ã§ãã
await { future }
ãšawait!(future)
å ŽåãåŸè
ã¯ãªãã·ã§ã³ãéãããŸãŸã«ããŠä»ã®ã»ãšãã©ãã¹ãŠã®ãªãã·ã§ã³ã«å€æŽã§ããŸãããåè
ã¯å®éã«ã¯await future
ããªã¢ã³ãã®ããããã®ã¿ãèš±å¯ããŸãïŒ @withoutboatsã®ããã°ãšã³ããªã«èšèŒãããŠããfwd(await { future }) < fwd(await!(future))
ã§ããã¹ãã ãšæããŸãã
åé·æ§ã«ã€ããŠã¯ãæ£è§£ã§ããã±ãŒã¹ããµãã°ã«ãŒãã«åå²ããåŸãåé·æ§ãåè©äŸ¡ããŸããã§ãããããã¯ããã¹ãŠã®äžã§æã客芳çãªãã®ã§ããã¯ãã§ãã
ã³ã¡ã³ããèæ ®ããŠç·šéããŸããããããšãããããŸãïŒ
await!(future)
å®å®ãããããšã¯ãç§ãæ³åã§ããææªã®éžæè¢ã§ãã
await
ãäºçŽè§£é€ããå¿
èŠãããããšãæå³ããŸããããã¯ãå°æ¥ã®èšèªèšèšãããã«å°é£ã«ãªãããšãæå³ããŸããtry!(result)
ãšåãã«ãŒããæå³çã«åã£ãŠããŸãïŒRust 2018ã§r#try!(result)
ãèšè¿°ããå¿
èŠããããŸãïŒãawait!(future)
ãäžé©åãªæ§æã§ããããšãããã£ãŠããå Žåãæçµçã«ã¯éæšå¥šã«ããããšãæå³ããŸããããã¯æå³çã«æè¡çè² åµãçã¿åºããŠããŸããtry!(..)
ã¯Rustã§å®çŸ©ãããŠããŸããã await!(future)
ã¯å®çŸ©ã§ããã代ããã«ã³ã³ãã€ã©ã®éæ³ã«ãªããŸããtry!(..)
å»æ¢ã¯å®¹æã§ã¯ãªãã瀟äŒçã«å€§ããªææãäžããŸããã ãã®è©Šç·ŽãããäžåºŠçµéšããããšã¯é
åçã§ã¯ãªãããã§ããawait!(future)
ã¯ããããã§ã; ç°ãªãã await future
次ã®ããã«èšè¿°ããå¿
èŠããããŸã!( ... )
ãIterator
ãåŠçããå Žåãã¡ãœããããã§ãŒã³ããã®ãäžè¬çã§ãã await { future }
ããã³await future
åæ§ã«ã await!(future)
æ§æã¯ã¡ãœãããã§ãŒã³ãå°é£ã«ããäžæçãªlet
ãã€ã³ãã£ã³ã°ãèªçºããŸãã ããã¯äººéå·¥åŠã«ãšã£ãŠããèªã¿ãããã«ã€ããŠãç§ã®èŠè§£ã§ã¯æªãããšã§ãã@Centrilåæãããã®ã§ãããããã€ãã®æªè§£æ±ºã®è³ªåããããŸãã 1.
ããããã§ããïŒ ããããéæ³ãã«ãããšãããŒã¯ãŒããšããŠããããããã«ãã¯ããåç
§ã§ããããã«ããããšã§ãããã«éæ³ã«ããããšã¯ã§ããŸãããïŒ
ç§ã¯Rustã«åå ããã®ãé
ãããŠã 2.
ã®ç€ŸäŒçèŠç¹ãè©äŸ¡ã§ããŸããtry!
ããå€æãããŠããªããããããã解決çã§ãã£ãããšã¯æããã§ãã ããã¯ããšãã£ã·ã§ã³2018
ã«ç§»è¡ããã€ã³ã»ã³ãã£ããšããŠã async/await
ã䜿çšããã®ãããããšãèŸæ±åŒ·ããããç¹°ãè¿ããªãã®ããšããåé¡ãæèµ·ããŸãã
3.
ã«éåžžã«ãã䌌ãä»ã®2ã€ã®ïŒimhoïŒäžå¿æ©èœïŒ vec![]
ãšformat!
/ println!
ã åè
ã¯å®å®ããããã¯ã¹æ§é ããªãããã§ããåŸè
ã¯ãã©ãŒãããæååæ§é ã§ãããäŸååã®åŒããªãããã§ãã ãããã®æ¯èŒãéšåçã«4.
ãå¥ã®èŠç¹ã«çœ®ããŠãããšæããŸãã
ç§ã¯è±èªã®ããã«èªããªãæ§æã«ã¯å察ã§ãã IEããawaitxãã¯è±èªã®ãããªãã®ãèªã¿ãŸãã ãxïŒ!! @ïŒïŒãã¯ããã§ã¯ãããŸããã ãx.awaitãã¯è±èªã®ããã«èå³ããããããã«èªã¿ãŸãããxãé·ãååã®ã¡ã³ããŒé¢æ°åŒã³åºããäžé£ã®é£éã€ãã¬ãŒã¿ãŒã¡ãœãããªã©ã®éèŠãªè¡ã§ããå Žåã¯ããã§ã¯ãããŸããã
å
·äœçã«ã¯ããkeyword xãããµããŒãããŠããŸããããã§ãkeywordã¯ããããawait
ã§ãã ç§ã¯C ++ã³ã«ãŒãã³TSãšUnityã®cïŒã³ã«ãŒãã³ã®äž¡æ¹ã䜿çšããŠãããã©ã¡ããããã«éåžžã«ãã䌌ãæ§æã䜿çšããŠããŸãã ãããŠãããããæ¬çªã³ãŒãã§äœå¹Žã䜿çšããåŸãç§ã®ä¿¡å¿µã¯ãããªãã®æ©çãŸããã€ã³ããã©ãã«ããããäžç®ã§ç¥ãããšã¯çµ¶å¯Ÿã«éèŠã§ãããšããããšã§ãã é¢æ°ã®ã€ã³ãã³ãè¡ããã£ãšèªããšã200è¡ã®é¢æ°ã®ãã¹ãŠã®co_await
/ yield return
ããèªç¥çè² è·ãªãã§æ°ç§ã§éžæã§ããŸãã
åãããšã¯ãåŸã§åŸ æ©ãããããæŒç®åããŸãã¯ä»ã®æ¥å°ŸèŸãã·ã³ãã«ã®å±±ãæ§æã«ã¯åœãŠã¯ãŸããŸããã
await
ã¯åºæ¬çãªå¶åŸ¡ãããŒæäœã ãšæããŸãã 'if
ã while
ã match
ãããã³return
ãšåãã¬ãã«ã®æ¬æãæãå¿
èŠããããŸãã ãããã®ãããããæ¥å°ŸèŸæŒç®åã§ãããšæ³åããŠã¿ãŠãã ãã-Rustã³ãŒããèªãããšã¯æªå€¢ã§ãã ç§ã®awaitã®è°è«ãšåæ§ã«ãRusté¢æ°ã®ã€ã³ãã³ãè¡ãã¹ããã³ã°ããŠããã¹ãŠã®å¶åŸ¡ãããŒãããã«éžæã§ããŸãã äŸå€ã¯ãããŸãããããã¯äŸå€ã§ãããç§ãã¡ãåªåãã¹ããã®ã§ã¯ãããŸããã
@ejmahlerã«åæããŸãã éçºã®å察åŽã§ããã³ãŒãã¬ãã¥ãŒãå¿ããŠã¯ãªããŸããã ãœãŒã¹ã³ãŒããå«ããã¡ã€ã«ã¯ãèªã¿åãããŠããæžã蟌ãŸããããšãã¯ããã«å€ããããæžã蟌ã¿ãããèªã¿åããšç解ã®æ¹ãç°¡åãªã¯ãã§ãã ã³ãŒãã¬ãã¥ãŒã§ã¯ãéäŒç¹ãèŠã€ããããšãéåžžã«éèŠã§ãã ãããŠç§ã¯å人çã«Useful precedence
æ祚ããŸãã
ç§ã¯ãããä¿¡ããŠããŸãïŒ
...
let response = await client.get("https://my_api").send()?;
let body: MyResponse = await response.into_json()?;
ãããããç解ããããã§ãïŒ
...
let body: MyResponse = client.get("https://my_api").send().await?.into_json().await?;
@HeroicKatora
@Centrilåæãããã®ã§ãããããã€ãã®æªè§£æ±ºã®è³ªåããããŸãã
1.
ããããã§ããïŒ ããããéæ³ãã«ãããšãããŒã¯ãŒããšããŠããããããã«ãã¯ããåç §ã§ããããã«ããããšã§ãããã«éæ³ã«ããããšã¯ã§ããŸãããïŒ
æè¡çã«ã¯ïŒ ããããã ãã ããç¹å¥ãªå Žåã«ã¯åŒ·åãªæ£åœåãå¿ èŠã§ããããã®å Žåãéæ³ã«éæ³ããããããšã¯æ£åœåãããŠããªãããã§ãã
ããã¯ããšãã£ã·ã§ã³
2018
ã«ç§»è¡ããã€ã³ã»ã³ãã£ããšããŠãasync/await
ã䜿çšããã®ãããããšãèŸæ±åŒ·ããããç¹°ãè¿ããªãã®ããšããåé¡ãæèµ·ããŸãã
æ°ããã¢ãžã¥ãŒã«ã·ã¹ãã ã async
/ await
ãããã³try { .. }
ãã€ã³ã»ã³ãã£ãã«ããã€ããã ãšèšã£ããã©ããã¯ããããŸããã ããããç§ãã¡ã®æå³ã«é¢ä¿ãªããããã¯è¯ãããšã ãšæããŸãã ç§ãã¡ã¯ã人ã
ãæçµçã«æ°ããèšèªæ©èœã䜿çšããŠãããåªããæ
£çšçãªã©ã€ãã©ãªãäœæãå§ããããšãæãã§ããŸãã
3.
ã«éåžžã«ãã䌌ãä»ã®2ã€ã®ïŒimhoïŒäžå¿æ©èœïŒvec![]
ãšformat!
/println!
ã åè ã¯ãå®å®ããç®±åæ§é ã®ã¢ãã¡ã€ã¯ããªããããéåžžã«
åè
ã¯ååšãã vec![1, 2, 3, ..]
ãšèšè¿°ãããŠãé
åãªãã©ã«åŒãæš¡å£ããŸãïŒäŸïŒ [1, 2, 3, ..]
ã
@ejmahler
ãx.awaitãã¯è±èªã®ããã«èå³ããããããã«èªã¿ãŸãããxãé·ãååã®ã¡ã³ããŒé¢æ°åŒã³åºããäžé£ã®é£éã€ãã¬ãŒã¿ãŒã¡ãœãããªã©ã®éèŠãªè¡ã§ããå Žåã¯ããã§ã¯ãããŸããã
ãã§ãŒã³ãããã€ãã¬ãŒã¿ã¡ãœããã®æã®äœãåé¡ã«ãªã£ãŠããŸããïŒ ããã¯æããã«æ
£çšçãªRustã§ãã
rustfmt
ããŒã«ã¯ãã¡ãœãããã§ãŒã³ãããŸããŸãªè¡ã«ãã©ãŒãããããããã次ã®ããã«ãªããŸãïŒããã§ãã match
ã䜿çšããŠæ§æã®åŒ·èª¿è¡šç€ºã衚瀺ããŸãïŒã
let foo = alpha().match? // or `alpha() match?`, `alpha()#match?`, `alpha().match!()?`
.beta
.some_other_stuff().match?
.even_more_stuff().match
.stuff_and_stuff();
.await
ããããããåŸ
ã€ããšèªãã å Žåãå°ãªããšãç§ã«ãšã£ãŠã¯å®å
šã«èªã¿ãŸãã
ãããŠãããããæ¬çªã³ãŒãã§äœå¹Žã䜿çšããåŸãç§ã®ä¿¡å¿µã¯ãããªãã®æ©çãŸããã€ã³ããã©ãã«ããããäžç®ã§ç¥ãããšã¯çµ¶å¯Ÿã«éèŠã§ãããšããããšã§ãã
ç¹ã«äžèšã®rustfmt
ãã©ãŒãããã§ã¯ãpostfix await
ããããã©ã®ããã«åŠå®ããã®ãããããŸããã ããã«ãããªãã¯æžãããšãã§ããŸãïŒ
let foo = alpha().match?;
let bar = foo.beta.some_other_stuff().match?;
let baz = bar..even_more_stuff().match;
let quux = baz.stuff_and_stuff();
ããªããããã空æ³ãããªãã
èªç¥çè² è·ãªãã§ãã»ãã®æ°ç§ã§200è¡ã®æ©èœã§ã
ç¹å®ã®æ©èœã«ã€ããŠããŸãç¥ããªãéãã200 LOCã¯ããããåäžè²¬ä»»ã®ååã«éåããããããã§ããããã«æãããŸãã 解決çã¯ããããããå°ãªããããããåå²ããããšã§ãã å®éããããä¿å®æ§ãšèªã¿ãããã«ãšã£ãŠæãéèŠãªããšã ãšæããŸãã
await
ã¯åºæ¬çãªå¶åŸ¡ãããŒæäœã ãšæããŸãã
?
ã§ãã å®éã await
ãš?
ã¯ã©ã¡ããããã³ã³ããã¹ãããå€ãæœåºããããšããå¹æçãªå¶åŸ¡ãããŒæäœã§ãã èšãæãããšãããŒã«ã«ã³ã³ããã¹ãã§ã¯ããããã®æŒç®åã®ã¿ã€ããawait : impl Future<Output = T> -> T
ããã³? : impl Try<Ok = T> -> T
ãšæ³åã§ããŸãã
äŸå€ã¯ãããŸãããããã¯äŸå€ã§ãããç§ãã¡ãåªåãã¹ããã®ã§ã¯ãããŸããã
ãããŠãããã§ã®äŸå€ã¯?
ã§ããïŒ
@andreytkachenko
@ejmahlerã«åæããŸãã éçºã®å察åŽã§ããã³ãŒãã¬ãã¥ãŒãå¿ããŠã¯ãªããŸããã ãœãŒã¹ã³ãŒããå«ããã¡ã€ã«ã¯ãèªã¿åãããŠããæžã蟌ãŸããããšãã¯ããã«å€ããããæžã蟌ã¿ãããèªã¿åããšç解ã®æ¹ãç°¡åãªã¯ãã§ãã
äžäžèŽã¯ãèªã¿ããããšäººéå·¥åŠã«ãšã£ãŠäœãæåããšããããšã§ãã
ãããããç解ããããã§ãïŒ
... let body: MyResponse = client.get("https://my_api").send().await?.into_json().await?;
ããã¯ãã©ãŒãããæ¹æ³ã§ã¯ãããŸããã rustfmt
ãå®è¡ãããšã次ã®ããã«ãªããŸãã
let body: MyResponse = client
.get("https://my_api")
.send()
.match?
.into_json()
.match?;
@ejmahler @andreytkachenkoããã§ä¿ãããããšã§ãã ããã¯Rust-yã§ã¯ãªããéåžžã®ãã©ãŒãããèŠåãä¿®æ£åŸã®æ§æã§ãããè£ããŸãã ãŸãã await
ã¯å®éã«ã¯ãyieldã®ã³ãŒããã€ã³ãã§ã¯ãªããyieldãã€ã³ãã«é
眮ãããŠããªãããããã¬ãã£ãã¯ã¹æ§æã§ã¯yield-pointããããããŸãã§ãããšèããŠããŸãã
ããªãã¯ãã®éãè¡ãå Žåã¯ããããããŠãããã綎ãã®ããã®å®éšãããŸãããawait
ã®ä»£ãããšããŠlet
æ¬åœã«ãããæœè¡ãã@Keruspeã®ã¢ã€ãã¢ã®ç²Ÿç¥ã€ã³ããããã¯ã¹ãã¬ããã®ããã«èŠããã®ã§ãä»ã®æ§ææ¡åŒµãªãã
await? response = client.get("https://my_api").send();
await? body: MyResponse = response.into_json();
ãããããããã®ã©ãã«ã€ããŠããææ³ã«ããããããã®æ§æå¯èœæ§ã®åªå€±ãšè€éãã説æããã®ã«ååãªå©ç¹ã¯èŠãããŸããã
ããŒã...æ¥é èŸãšæ¥å°ŸèŸã®äž¡æ¹ã®åœ¢åŒãåŸ ã€ããšãæãŸããã§ããïŒ ãããšãæ¥å°ŸèŸã®åœ¢ã ãã§ããïŒ
ã¡ãœããåŒã³åºããé£éãããããšã¯ãç¹ã«è©±ããŠãããšãã«æ
£çšçã§ã
ã€ãã¬ãŒã¿ãšã¯ããã«å°ãªãçšåºŠã®ãªãã·ã§ã³ã§ããããããé€ãã°ãéã¯
æåã«åœä»€åèšèªã次ã«é¢æ°åèšèªã
ç§ã¯æ¥å°ŸèŸãæåéãç解ã§ããªããšäž»åŒµããŠããã®ã§ã¯ãããŸãããç§ã¯ããã³ã§ã
æäžäœã®å¶åŸ¡ãããŒæäœãé ãèªç¥çè² è·ã®è°è«ã
ããªã¿ãŒã³ããšåãéèŠæ§ãæã¡ã次ã®å Žåã«èªç¥çè² è·ãå¢å ãããŸã
è¡é ã®è¿ãã«çœ®ãã®ãšæ¯èŒããŠ-ãããŠç§ã¯
ãã®è°è«ã¯ãé·å¹Žã®çç£çµéšã«åºã¥ããŠè¡ãããŸãã
11:59ããºãã¯æFarrokhzadã§åã2019幎1æ19æ¥ã«ã¯[email protected]
æžããŸããïŒ
@HeroicKatora https://github.com/HeroicKatora
@Centril https://github.com/Centrilåæãããã®ã§ããããããŸã
ããã€ãã®æªè§£æ±ºã®è³ªåã 1ã«ã€ããŠããããã§ããïŒ ç§ãã¡ãããããéæ³ãã«ããã°
ããããã¯ããªãã§ãã¯ããåç §ã§ããããã«ããããšã§ããããããã«éæ³ã«ããããšã¯ãããŸãã
ããŒã¯ãŒããšããŠããããããŸããïŒæè¡çã«ã¯ïŒ ããããã ãã ãã
ç¹å¥ãªå ŽåããããŠãã®å Žåãéæ³ã«éæ³ããããããšã¯ãªãããã§ã
æ£åœåãããŸããããã¯ç§ãã¡ãéåæ/åŸ æ©ããã€ãããã©ãããšããåé¡ãæèµ·ããŸã
2018幎çã«ç§»è¡ããã€ã³ã»ã³ãã£ãããŸãã¯ãããå¿è匷ãã
ãããç¹°ãè¿ããŸããæ°ããã¢ãžã¥ãŒã«ã·ã¹ãã ãasync /ãæå³ããŠãããšèšã£ããã©ããã¯ããããŸãã
åŸ ã£ãŠã{..}ãã€ã³ã»ã³ãã£ãã«ããããšããŸãã ããããç§ãã¡ã®æå³ã«é¢ä¿ãªã
圌ãã¯ããã§ãããããŠããã¯è¯ãããšã ãšæããŸãã æçµçã«ã¯äººã ã«
æ°ããèšèªæ©èœã䜿çšããŠãããè¯ããããæ £çšçãªæç« ãæžãå§ããŸã
ã©ã€ãã©ãªã3ã«éåžžã«ãã䌌ãä»ã®2ã€ã®ïŒimhoïŒäžå¿æ©èœïŒvecïŒ[]ãšformatïŒ/
printlnïŒã åè ã¯å®å®ããç®±ããªãã®ã§ãšãŠã
建èšafaikãåè ã¯ååšããé åãæš¡å£ããããã«vecïŒ[1ã2ã3ã..]ãšæžãããŠããŸãã
ãªãã©ã«åŒãäŸïŒ[1ã2ã3ã..]ã@ejmahler https://github.com/ejmahler
ãx.awaitãã¯è±èªã®ããã«é£æ¬²ããããããã«èªã¿ãŸãããxã
é·ãååã®ã¡ã³ããŒé¢æ°åŒã³åºããæãªã©ã®éèŠãªè¡
é£éã€ãã¬ãŒã¿ã¡ãœãããªã©ã®ãã§ãŒã³ãããã€ãã¬ãŒã¿ã¡ãœããã®æã®äœãåé¡ã«ãªã£ãŠããŸããïŒ ããã¯æããã«
æ £çšçãªãã³ã
rustfmtããŒã«ã¯ãã¡ãœãããã§ãŒã³ãããŸããŸãªè¡ã«ãã©ãŒãããããããã
getïŒããã§ãmatchã䜿çšããŠæ§æã®åŒ·èª¿è¡šç€ºã衚瀺ããŸãïŒïŒfoo = alphaïŒïŒãmatchïŒ //ãŸãã¯
alpha() match?
ãalpha()#match?
ãalpha().match!()?
ãããŒã¿
.some_other_stuffïŒïŒãmatchïŒ
.even_more_stuffïŒïŒãmatch
.stuff_and_stuffïŒïŒ;.awaitããthenawaitããšèªããšãå°ãªããšãç§ã«ãšã£ãŠã¯å®å šã«èªã¿ãŸãã
ãããŠãçç£ã³ãŒãã§ãããã䜿çšããŠæ°å¹ŽåŸãç§ã®ä¿¡å¿µã¯ç¥ã£ãŠãããšããããšã§ãäžç®ã§ããªãã®ã€ãŒã«ããã€ã³ããã©ãã«ãããã¯çµ¶å¯Ÿã«éèŠã§ãã
ç¹ã«rustfmtã§ã¯ãpostfixãã©ã®ããã«ãããåŠå®ããã®ãããããŸãã
äžèšã®ãã©ãŒãããã ããã«ãããªãã¯æžãããšãã§ããŸãïŒlet foo = alphaïŒïŒãmatch ïŒ; let bar = foo.beta.some_other_stuffïŒïŒãmatch ïŒ; let baz = bar..even_more_stuffïŒïŒãmatch; let quux = baz.stuff_and_stuffïŒïŒ;
ããªããããã空æ³ãããªãã
èªç¥çè² è·ãªãã§ãã»ãã®æ°ç§ã§200è¡ã®æ©èœã§ã
ç¹å®ã®æ©èœã«ã€ããŠããŸãç¥ããªããŠããç§ã«ã¯æããŸã
ãã®200LOCã¯ãããããåäžè²¬ä»»ã®ååã«éåããŠããã
é床ã«ã 解決çã¯ããããããå°ãªããããããåå²ããããšã§ãã å®éãç§ã¯
ãããä¿å®æ§ãšèªã¿ãããã«ãšã£ãŠæãéèŠãªããšã ãšæããŸããåŸ æ©ã¯åºæ¬çãªå¶åŸ¡ãããŒæäœã ãšæããŸãã
ããã§ããïŒ å®éãåŸ ã£ãŠïŒ ã©ã¡ããå¹æçãªå¶åŸ¡ãããŒæäœã§ã
ããã¯ãæèãã䟡å€ãåŒãåºãããšèšã£ãŠããŸãã èšãæããã°ãå°å ã§
ã³ã³ããã¹ãã§ã¯ã次ã®ã¿ã€ãã®æŒç®åãawaitïŒimplã§ãããšæ³åã§ããŸãã
æªæ¥äŸå€ã¯ãããŸãããããã¯äŸå€ã§ãããç§ãã¡ããã¹ãããšã§ã¯ãããŸããã
ã®ããã«åªåããããŠããã§ã®äŸå€ã¯ïŒ ïŒ
@andreytkachenko https://github.com/andreytkachenko
@ejmahlerhttps ïŒ //github.com/ejmahlerã«åæããŸãã ãã¹ãã§ã¯ãªã
éçºã®å察åŽãå¿ããŠãã ãã-ã³ãŒãã¬ãã¥ãŒã ãœãŒã¹ã³ãŒãä»ãã®ãã¡ã€ã«ã¯
èªãã ãæžãããããããšãã¯ããã«å€ãã®ã§ããã£ãšç°¡åã«ã§ããã¯ãã§ã
èªãã§ç解ããŠããæžããäžäžèŽã¯ãèªã¿ããããš
人éå·¥åŠããããããç解ããããã§ãïŒ
...æ¬æïŒMyResponse = client.getïŒ "httpsïŒ// my_api"ïŒãsendïŒïŒãawaitïŒ.into_jsonïŒïŒãawaitïŒ;
ããã¯ãã©ãŒãããæ¹æ³ã§ã¯ãããŸããã æ £çšçãªrustfmtãã©ãŒããã
ã¯ïŒæ¬äœïŒMyResponse =ã¯ã©ã€ã¢ã³ã
.getïŒ "httpsïŒ// my_api"ïŒ
.sendïŒïŒ
ãäžèŽïŒ
.into_jsonïŒïŒ
ãäžèŽïŒ;â
ããªããèšåãããã®ã§ããªãã¯ãããåãåã£ãŠããŸãã
ãã®ã¡ãŒã«ã«çŽæ¥è¿ä¿¡ããGitHubã§è¡šç€ºããŠãã ãã
https://github.com/rust-lang/rust/issues/57640#issuecomment-455810497 ã
ãŸãã¯ã¹ã¬ããããã¥ãŒãããŸã
https://github.com/notifications/unsubscribe-auth/ABGmeocFJpPKaypvQHo9LpAniGOUFrmzks5vE3kXgaJpZM4aBlba
ã
@ejmahlerç§ãã¡ã¯reã«åæããŸããã "é èœ"; åãè°è«ããªãããã
?
æŒç®åã¯éåžžã«çããéå»ã«è¿åããé ãããšæ¹å€ãããŠããŸããã ã»ãšãã©ã®å Žåãã³ãŒãã¯æžã蟌ãŸããã®ã§ã¯ãªããèªã¿åãããŸãã ååã?!
ã«å€æŽãããšã2åã®é·ãã«ãªããèŠèœãšãã«ãããªããŸãã
ããã«ãããããããç§ãã¡ã¯æçµçã«?
ãå®å®ããããã以æ¥ãäºèšã¯å®çŸããªãã£ããšæããŸãã
ç§ã«ãšã£ãŠãæ¥å°ŸèŸawait
ã¯ãèªç¶ãªèªã¿é ã«åŸããŸãïŒå°ãªããšãå·Šããå³ã®èšèªã話ã人ã«ãšã£ãŠïŒã ç¹ã«ãããŒã¿ãããŒã®é åºã«åŸããŸãã
æ§æã®åŒ·èª¿è¡šç€ºã¯èšããŸã§ããããŸãããåŸ
æ©ã«é¢é£ãããã®ã¯ãã¹ãŠæããè²ã§åŒ·èª¿è¡šç€ºã§ãããããäžç®ã§èŠã€ããããšãã§ããŸãã ãããã£ãŠãå®éã®await
åèªã®ä»£ããã«èšå·ããã£ããšããŠããæ§æã匷調衚瀺ãããã³ãŒãã§éåžžã«èªã¿ããããèŠã€ãããããªããŸãã ããã¯èšã£ãŠããç§ã¯ãŸã await
åèªãgrepã®çç±ã§äœ¿çšããããšã奜ã¿ãŸã-èšå·ã®ä»£ããã«await
åèªã ãã䜿çšãããšãåŸ
ã£ãŠãããã®ãã¹ãŠã®ã³ãŒããgrepããæ¹ãç°¡åã§ã@ãïŒã®ããã«ããã®æå³ã¯ææ³ã«äŸåããŸãã
ããã¯ãã¹ãŠãã±ããç§åŠã§ã¯ãããŸãã
let body: MyResponse = client.get("https://my_api").send()...?.into_json()...?;
æ¥å°ŸèŸ...
ã¯éåžžã«èªã¿ããããäžç®ã§èŠéãã«ãããå°æ¥ã®çµæãå©çšå¯èœã«ãªãã®ãåŸ
ã€éãã³ãŒãã®äžçš®ã®æ«å°ŸãšããŠèªç¶ã«èªã¿åããããããéåžžã«çŽæçã§ãã 誰ãã以åã«æ¥åãèŠãããšãããã®ã§ãåªå
é äœ/ãã¯ãã·ã§ããã¬ã³ã¯å¿
èŠãªããèŠæ
£ããªãã·ãžã«ããã®äœåãªã©ã€ã³ãã€ãºããããŸããã
ïŒ@solsonã«è¬çœªïŒ
@ ben0x539ã€ãŸãã future()....start
ãããªçµæã®ã¡ã³ããŒã«ã¢ã¯ã»ã¹ã§ãããšããããšã§ããïŒ ãŸãã¯ã range().....
ãããªç¯å²ã®çµæãåŸ
ã¡ãŸããïŒ ãããŠãçŸåšã®çç¥èšå·..
ã¯ãå³åŽã®äºé
æŒç®åãŸãã¯äºé
æŒç®åã§ããå¿
èŠããããããã¯äžç®ã§éåžžã«è¿ãã®ã§ã no precedence/macro shenanigans necessary and
æ£ç¢ºã«æå³ããŸãã
ã¯ã ïŒ ãªãã¬ãŒã¿ãŒãååšããŸãã ç§ã¯ãã§ã«ãã£ãããšãèªããŸãã
äŸå€ã ããããããã¯äŸå€ã§ãã å¶åŸ¡ãããŒã®å€§éšåã¯
Rustããã°ã©ã ã¯ããã¬ãã£ãã¯ã¹ããŒã¯ãŒããä»ããŠè¡ãããŸãã
13:51ãã³ãžã£ãã³åã®åã2019幎1æ19æ¥ã«ã¯[email protected]
æžããŸããïŒ
ããã¯ãã¹ãŠãã±ããç§åŠã§ã¯ãããŸãã
let bodyïŒMyResponse = client.getïŒ "httpsïŒ// my_api"ïŒãsendïŒïŒ...ïŒãinto_jsonïŒïŒ...ïŒ;
æ¥å°ŸèŸ...ã¯éåžžã«èªã¿ããããäžç®ã§èŠéããããã§ãã
ããªãã¯ãããã³ãŒãã®ãããªãã®ãšããŠèªç¶ã«èªãã®ã§çŽæçã§ã
å°æ¥ã®çµæãå©çšå¯èœã«ãªãã®ãåŸ ã€éã çªå·
åªå é äœ/ãã¯ãã·ã§ããã¬ã³ãå¿ èŠã§ãããããã®äœåãªã©ã€ã³ãã€ãºã¯ãããŸãã
誰ãã以åã«æ¥åãèŠãããšãããã®ã§ããªãã¿ã®ãªãã·ãžã«ãâ
ããªããèšåãããã®ã§ããªãã¯ãããåãåã£ãŠããŸãã
ãã®ã¡ãŒã«ã«çŽæ¥è¿ä¿¡ããGitHubã§è¡šç€ºããŠãã ãã
https://github.com/rust-lang/rust/issues/57640#issuecomment-455818177 ã
ãŸãã¯ã¹ã¬ããããã¥ãŒãããŸã
https://github.com/notifications/unsubscribe-auth/ABGmen354fhk7snYsANTfp5oOuDb4OLYks5vE5NSgaJpZM4aBlba
ã
@HeroicKatoraå°ã人工çã«èŠããŸããã確ãã«ããã§ãã ããã¯ãææ¡ãããŠããä»ã®æ¥å°ŸèŸãœãªã¥ãŒã·ã§ã³ãšåæ§ã«ãæ¥å°ŸèŸæäœã§ããããã await x?
çŽæã«åããåªå
é äœã®å¿
èŠæ§ãåé¿ãããã¯ãã§ã¯ãªãããšãæå³ããŸããã
@ejmahler
ã¯ã ïŒ ãªãã¬ãŒã¿ãŒãååšããŸãã ç§ã¯ãã§ã«äŸå€ããã£ãããšãèªããŸããã ããããããã¯äŸå€ã§ãã
keyword expr
ã«é©åãã2ã€ã®åŒåœ¢åŒãã€ãŸãreturn expr
ãšbreak expr
ãŸãã åè
ã¯åŸè
ãããäžè¬çã§ãã continue 'label
圢åŒã¯ãåŒã§ã¯ãããŸããã keyword expr
圢åŒã§ã¯ãªããããå®éã«ã¯ã«ãŠã³ããããŸããã ããã§ã2ã€ã®æ¥é èŸããŒã¯ãŒãåé
åŒãã©ãŒã ãš1ã€ã®åŸçœ®åé
åŒãã©ãŒã ãã§ããŸããã ?
ãšawait
ãawait
ãšreturn
ããã䌌ãŠããããšãèæ
®ããåã«ãç§ã¯return/break expr
ãšã¯ã»ãšãã©åŒã³ãŸããã ?
ãäŸå€ãšãªãã«ãŒã«ã
Rustããã°ã©ã ã®å¶åŸ¡ãããŒã®å€§éšåã¯ããã¬ãã£ãã¯ã¹ããŒã¯ãŒããä»ããŠè¡ãããŸãã
åè¿°ã®ããã«ã break expr
ã¯ããã»ã©äžè¬çã§ã¯ãããŸããïŒ break;
ãããäžè¬çã§ã return;
ãããäžè¬çã§ãããåé
åŒã§ã¯ãããŸããïŒã æ®ã£ãŠããã®ã¯åæã®return expr;
ããããããmatch
ã ?
ããã¹ããããif let
ãããã¯ããã«äžè¬çã§ããããšã¯ç§ã«ã¯ãŸã£ããããããŸããã else
sãããã³for
ã«ãŒãã try { .. }
å®å®ãããã ?
ãããã«äœ¿çšããããšæããŸãã
@ ben0x539æºåãã§ããããå¯å€ååŒæ°ãžã§ããªãã¯çšã«...
ãäºçŽããå¿
èŠããããšæããŸã
ç§ã¯ããã§postfixæ§æã§é©æ°ãããšããã¢ã€ãã¢ãæ¬åœã«å¥œãã§ãã ãããŒã®æ¹ãã¯ããã«çã«ããªã£ãŠããããã¬ãã£ãã¯ã¹try!
ãããã¹ããã£ãã¯ã¹?
移è¡ãããšãã«ãã³ãŒããã©ãã ãæ¹åãããããèŠããŠããŸãã Rustã³ãã¥ããã£ã§ãã³ãŒããã©ãã ãæ¹åãããããäœéšãã人ã¯ãããããããšæããŸãã
.await
ã®ã¢ã€ãã¢ãæ°ã«å
¥ããªãå Žåã¯ãå®éã®æ¥å°ŸèŸæŒç®åãèŠã€ããããã«ããçšåºŠã®åµé æ§ãçºæ®ã§ãããšç¢ºä¿¡ããŠããŸãã äžäŸãšããŠã ++
ãŸãã¯@
ã䜿çšããŠåŸ
æ©ããããšãèããããŸãã
:(ç§ã¯ããåŸ ã¡ãããªãã ãã§ãã
誰ãããã¯ãæ§æã«æ £ããŠããŸããä»ã®æèŠã§å§ãŸããã®ã¹ã¬ããã®ã»ãšãã©ã®äººã¯ãæçµçã«ãã¯ãæ§æã奜ãããã§ãã
確ãã«ããã¯ãéæ³ã®ãã¯ããã«ãªãã§ããããããŠãŒã¶ãŒã¯ãã¯ãå±éãã©ã®ããã«èŠããããæ°ã«ããããšã¯ãã£ãã«ãªãããããã人ã«ãšã£ãŠã¯ãããã¥ã¡ã³ãã§ãã¥ã¢ã³ã¹ã説æããã®ã¯ç°¡åã§ãã
éåžžã®ãã¯ãæ§æã¯ãã¢ããã«ãã€ã®ãããªãã®ã§ã誰ãã2çªç®ã«å¥œããªãªãã·ã§ã³ã§ããããã®çµæã家æã奜ããªãªãã·ã§ã³ã§ã[0]ã éèŠãªã®ã¯ãtryã®ããã«ïŒ åŸã§ãã€ã§ãå€æŽã§ããŸãã ããããæãéèŠãªããšã¯ãç§ãã¡å šå¡ãåæããã®ãæ©ããã°æ©ãã»ã©ãå®éã«ããã䜿ãå§ããŠçç£çã«ãªãããšãã§ããã®ã§ãïŒ
[0]ïŒæåã®1åéã«åç §ïŒ https://www.ted.com/talks/kenneth_cukier_big_data_is_better_data/transcript?language=en
matchãifãif letãwhileãwhileãforã¯ããã¹ãŠåºç¯ãªå¶åŸ¡ãããŒã§ãã
ãã¬ãã£ãã¯ã¹ã䜿çšããŸãã äŒæ©ãšç¶è¡ã®ãµããããããšãå¯äžã®å¶åŸ¡ãããŒã§ã
ããŒã¯ãŒãã¯ã€ã©ã€ã©ããã»ã©èª€è§£ãæããã®ã§ãã
15:37 Yazad Daruvalaã§åã2019幎1æ19æ¥ã«ã¯[email protected]
æžããŸããïŒ
:(ç§ã¯ããåŸ ã¡ãããªãã ãã§ãã
誰ãããã¯ãæ§æã«æ £ããŠããŸãããã®ã¹ã¬ããã®ã»ãšãã©ã®äººã¯
ä»ã®æèŠããå§ããŠããã¯ãæ§æãæ¯æããããšã«ãªã£ãããã§ãã確ãã«ããã¯ãéæ³ã®ãã¯ããã«ãªãã§ããããããŠãŒã¶ãŒã¯ãã¯ããäœã§ããããæ°ã«ããããšã¯ãã£ãã«ãããŸãã
æ¡åŒµã¯æ¬¡ã®ããã«èŠããŸãããããã人ã«ãšã£ãŠã¯ã説æããã®ã¯ç°¡åã§ãã
ããã¥ã¡ã³ãã®ãã¥ã¢ã³ã¹ãéåžžã®ãã¯ãæ§æã¯ã¢ããã«ãã€ã®ãããªãã®ã§ãã¿ããªã®2çªç®ã§ã
ãæ°ã«å ¥ãã®ãªãã·ã§ã³ã§ãããçµæãšããŠå®¶æã®ãæ°ã«å ¥ãã®ãªãã·ã§ã³[0]ã
éèŠãªã®ã¯ãtryã®ããã«ïŒ åŸã§ãã€ã§ãå€æŽã§ããŸãã ããããã»ãšãã©ã®
éèŠãªã®ã¯ãç§ãã¡å šå¡ãåæããã®ãæ©ããã°æ©ãã»ã©ãç§ãã¡å šå¡ãæ©ãå§ããããšãã§ãããšããããšã§ãã
å®éã«äœ¿çšããŠçç£æ§ãé«ããŸãããïŒ[0]ïŒæåã®1åéã«åç §ïŒ
https://www.ted.com/talks/kenneth_cukier_big_data_is_better_data/transcript?language=enâ
ããªããèšåãããã®ã§ããªãã¯ãããåãåã£ãŠããŸãã
ãã®ã¡ãŒã«ã«çŽæ¥è¿ä¿¡ããGitHubã§è¡šç€ºããŠãã ãã
https://github.com/rust-lang/rust/issues/57640#issuecomment-455824275 ã
ãŸãã¯ã¹ã¬ããããã¥ãŒãããŸã
https://github.com/notifications/unsubscribe-auth/ABGmesz5_LfDKdcKn6zMO5uuSJs9lFiYks5vE6wygaJpZM4aBlba
ã
@mitsuhikoåæããŸãïŒ ãã§ãŒã³ã«ãããPostfixã¯ããçŽ æŽã«æããŸãã ç§ãææ¡ããfut@await
æ§æã¯ãä»ã®ææ¡ã»ã©å€ãã®æ¬ ç¹ããªãããã«èŠãããã1ã€ã®èå³æ·±ããªãã·ã§ã³ã ãšæããŸãã ãããããŸãã«ãé ãããŠããã£ãšçŸå®çãªããŒãžã§ã³ãæãŸãããã©ããã¯ããããŸãããã
@ejmahler
matchãifãif letãwhileãwhile letãããã³forã¯ãã¹ãŠããã¬ãã£ãã¯ã¹ã䜿çšããåºç¯ãªå¶åŸ¡ãããŒã§ãã ãã¬ãŒã¯ãšã³ã³ãã£ãã¥ãŒã®ãµããããããšããã€ã©ã€ã©ããã»ã©èª€è§£ãæãå¯äžã®å¶åŸ¡ãããŒããŒã¯ãŒãã§ãã
誀解ãæãããšã¯ãŸã£ãããããŸããã ãããã®æ§æã«é¢é£ããææ³ã¯å€§ãŸãã«æ¬¡ã®ãšããã§ãã
Expr = kind:ExprKind;
ExprKind =
| If:{ "if" cond:Cond then:Block { "else" else_expr:ElseExpr }? };
| Match:{ "match" expr:Expr "{" arms:MatchArm* "}" }
| While:{ { label:LIFETIME ":" }? "while" cond:Cond body:Block }
| For:{ { label:LIFETIME ":" }? "for" pat:Pat "in" expr:Expr body:Block }
;
Cond =
| Bool:Expr
| Let:{ "let" pat:Pat "=" expr:Expr }
;
ElseExpr =
| Block:Block
| If:If
;
MatchArm = pats:Pat+ % "|" { "if" guard:Expr }? "=>" body:Expr ","?;
ããã§ããã©ãŒã ã¯if/while expr block
ã for pat in expr block
ãããã³match expr { pat0 => expr0, .., patn => exprn }
ã§ãã ããããã¹ãŠã®åœ¢åŒã§ãåŸã«ç¶ããã®ã®åã«ããŒã¯ãŒãããããŸãã ãããããã¬ãã£ãã¯ã¹ã䜿çšããããšããæå³ã ãšæããŸãã ãã ãããããã¯ãã¹ãŠãããã¯åœ¢åŒã§ãããåé
æ¥é æŒç®åã§ã¯ãããŸããã ãããã£ãŠã await expr
ãšã®æ¯èŒã¯ãäžè²«æ§ãã«ãŒã«ããªãããã誀解ãæãæãããããŸãã ãããã¯ãã©ãŒã ãšã®äžè²«æ§ãä¿ã€å Žåã¯ã await block
ã§ã¯ãªãawait expr
await block
ãšæ¯èŒããŠãã ããã
@mitsuhikoåæããŸãïŒ ãã§ãŒã³ã«ãããPostfixã¯ããçŽ æŽã«æããŸãã
ãã³ã¯äºå è«çã§ãã åœä»€åã¢ãããŒããšæ©èœçã¢ãããŒãã®äž¡æ¹ããµããŒãããŸãã å Žåã«ãã£ãŠã¯ããããããããé©ããŠããå¯èœæ§ããããããåé¡ãªããšæããŸãã
ç¥ããŸããã äž¡æ¹ãããã°çŽ æŽããããšæããŸãïŒ
await foo.bar();
foo.bar().await;
ãã°ããScalaã䜿ã£ãŠããã®ã§ãç§ããã®ããã«æ©èœããããšããããã奜ãã§ããã ç¹ã«match
ãšif
ã¯ãRustã®æ¥å°ŸèŸã®äœçœ®ã«ãããšäŸ¿å©ã§ãã
foo.bar().await.match {
Bar1(x, y) => {x==y},
Bar2(y) => {y==7},
}.if {
bazinga();
}
ãªãã·ã§ã³ãããªãã¯ã¹ïŒ
ãªãã·ã§ã³ã®èŠçŽãããªãã¯ã¹ïŒ @
ãå°ç« ãšããŠäœ¿çšããŸãããã»ãšãã©äœã§ãããŸããŸããïŒïŒ
| åå| Future<T>
| Future<Result<T, E>>
| Result<Future<T>, E>
|
| --- | --- | --- | --- |
| ãã¬ãã£ãã¯ã¹| -| -| -|
| ããŒã¯ãŒããã¯ã| await!(fut)
| await!(fut)?
| await!(fut?)
|
| ããŒã¯ãŒãæ©èœ| await(fut)
| await(fut)?
| await(fut?)
|
| æçšãªåªå
é äœ| await fut
| await fut?
| await (fut?)
|
| æãããªåªå
é äœ| await fut
| await? fut
| await fut?
|
| POSTFIX | -| -| -|
| ããŒã¯ãŒãä»ãFn | fut(await)
| fut(await)?
| fut?(await)
|
| ããŒã¯ãŒããã£ãŒã«ã| fut.await
| fut.await?
| fut?.await
|
| ããŒã¯ãŒãã¡ãœãã| fut.await()
| fut.await()?
| fut?.await()
|
| æ¥å°ŸèŸããŒã¯ãŒããã¯ã| fut.await!()
| fut.await!()?
| fut?.await!()
|
| ã¹ããŒã¹ããŒã¯ãŒã| fut await
| fut await?
| fut? await
|
| ã·ãžã«ããŒã¯ãŒã| fut@await
| fut@await?
| fut?@await
|
| ã·ãžã«| fut@
| fut@?
| fut?@
|
ãSigilKeywordãã®sigilã¯#
ã«ãªãããšã¯ã§ããŸããããã®å Žåã r
ãšããæªæ¥ã§ã¯ãããè¡ãããšãã§ããŸããã ...
ã¯ãç§ã®æåã®å¿é
ã®ããã«ãå°ç« ãããŒã¯ã³åãå€æŽããå¿
èŠããªãããã§ãã
ããçŸå®ã®äœ¿çšïŒPMç§ã®è€æ°æã€ä»ã®_real_ã®ãŠãŒã¹ã±ãŒã¹await
urloã«ãç§ã¯ããããè¿œå ããŸãïŒïŒ
| åå| ïŒreqwestïŒ Client
|> Client::get
|> RequestBuilder::send
|> await
|> ?
|> Response::json
| > ?
|
| --- | --- |
| ãã¬ãã£ãã¯ã¹| -|
| ããŒã¯ãŒããã¯ã| await!(client.get("url").send())?.json()?
|
| ããŒã¯ãŒãæ©èœ| await(client.get("url").send())?.json()?
|
| æçšãªåªå
é äœ| (await client.get("url").send()?).json()?
|
| æãããªåªå
é äœ| (await? client.get("url").send()).json()?
|
| POSTFIX | -|
| ããŒã¯ãŒãä»ãFn | client.get("url").send()(await)?.json()?
|
| ããŒã¯ãŒããã£ãŒã«ã| client.get("url").send().await?.json()?
|
| ããŒã¯ãŒãã¡ãœãã| client.get("url").send().await()?.json()?
|
| æ¥å°ŸèŸããŒã¯ãŒããã¯ã| client.get("url").send().await!()?.json()?
|
| ã¹ããŒã¹ããŒã¯ãŒã| client.get("url").send() await?.json()?
|
| ã·ãžã«ããŒã¯ãŒã| client.get("url").send()@await?.json()?
|
| ã·ãžã«| client.get("url").send()@?.json()?
|
ç·šéã¡ã¢ïŒ Response::json
ãFuture
ãè¿ãããšã¯çã«ããªã£ãŠãããããããªããšç§ã«ææãããŸãããããã§ã send
ã¯çºä¿¡IOãåŸ
æ©ãã json
ïŒãŸãã¯çµæã®ä»ã®è§£éïŒã¯ãçä¿¡IOãåŸ
æ©ããŸãã ãã ããåŒã«IOåŸ
æ©ãã€ã³ãã1ã€ãããªãå Žåã§ããã§ãŒã³ã®åé¡ãé©çšãããããšã瀺ãã®ã¯æå³ããããšæãã®ã§ããã®äŸã¯ãã®ãŸãŸã«ããŠãããŸãã
ãã¬ãã£ãã¯ã¹ãªãã·ã§ã³ã«ã€ããŠã¯å€§ãŸããªã³ã³ã»ã³ãµã¹ãããããã§ãããïŒ await?
ç ç³ãšäžç·ã«ïŒæãããªåªå
é äœãæãæãŸããã§ãã ãã ããäžèšã®ãããªé£éã容æã«ããããã«ãå€ãã®äººãåŸçœ®ãœãªã¥ãŒã·ã§ã³ãæ¯æããããã«èšã£ãŠããŸãã ãã¬ãã£ãã¯ã¹ã®éžæã«ã¯å€§ãŸããªã³ã³ã»ã³ãµã¹ããããŸãããã©ã®ãã¹ããã£ãã¯ã¹ãœãªã¥ãŒã·ã§ã³ãæé©ã§ãããã«ã€ããŠã®ã³ã³ã»ã³ãµã¹ã¯ãªãããã§ãã ææ¡ããããã¹ãŠã®ãªãã·ã§ã³ã¯ãç°¡åãªæ··ä¹±ã«ã€ãªãããŸãïŒããŒã¯ãŒãã®åŒ·èª¿è¡šç€ºã«ãã£ãŠè»œæžãããŸãïŒã
await
ãšããåŒæ°ã§fnãåŒã³åºãawait
ã¯ããŒã¯ãŒãã§ããïŒãã®ä»ã®ããææ¬çãªææ¡ïŒ
match
ã if
ãªã©ã®ããå€ãã®ããŒã¯ãŒãã«é©çšããããããäžè¬åããããã¿ãŒã³ã«ããããšãã§ããŸãããäžèŠã§ããã®èšè«ãžã®è£éºïŒ[[åç
§]ïŒhttps://github.com/rust-lang/rust/issues/57640#issuecomment-455827164ïŒ]await
ïŒé£éãªãïŒ[[åç
§]ïŒhttps://github.com/rust-lang/rust/issues/57640ïŒ]ããŒã¯ãŒããã¯ãawait!(fut)
ã§ã®å®å®åã¯ããã¡ãããåºæ¬çã«äžèšã®ãã¹ãŠãšå°æ¥äºææ§ããããŸããããã¯ãã§éåžžã®èå¥åã®ä»£ããã«ããŒã¯ãŒãã䜿çšããå¿
èŠããããŸãã
1ã€ã®ãã§ãŒã³ã§2ã€ã®await
ã䜿çšãããã»ãšãã©çŸå®çãªäŸãããå Žåã¯ããã²ã芧ãã ããã ãããŸã§èª°ãå
±æããŠããŸããã ãã ããæ¥å°ŸèŸawait
ã¯ãreqwestã®äŸã«ç€ºãããã«ããã§ãŒã³å
ã§await
è€æ°åå®è¡ããå¿
èŠããªãå Žåã§ã圹ç«ã¡ãŸãã
ãã®èŠçŽã³ã¡ã³ãã®äžã«æ³šç®ãã¹ãäœããèŠéããå Žåã¯ãurloã§ç§ããããè¿œå ããããšããŸãïŒãã ãã倧ããªå£°ã®å¥œæãé¿ããããã«ãä»ã®èª°ãã®ã³ã¡ã³ããè¿œå ããå¿ èŠããããŸãïŒã
å人çã«ãç§ã¯æŽå²çã«æãããªåªå
é äœãæã€ãã¬ãã£ãã¯ã¹ããŒã¯ãŒããæ¯æããŠããŸããã ããŒã¯ãŒããã¯ãawait!(fut)
å®å®åããããšã¯ãå®éã®ãŠãŒã¹ã±ãŒã¹ã§åŸ
æ©ãçºçããå Žæã«é¢ããå®éã®æ
å ±ãåéããã®ã«åœ¹ç«ã¡ãåŸã§ãã¯ã以å€ã®ãã¬ãã£ãã¯ã¹ãŸãã¯ãã¹ããã£ãã¯ã¹ãªãã·ã§ã³ãè¿œå ã§ãããšæããŸãã ã
ããããäžèšã®èŠçŽãæžãéçšã§ãç§ã¯ãããŒã¯ãŒããã£ãŒã«ããã奜ãã«ãªãå§ããŸããã ãã¹ããŒã¹ããŒã¯ãŒããã¯ãè€æ°ã®è¡ã«æ²¿ã£ãŠåå²ãããšå¿«é©ã«ãªããŸãã
client
.get("url")
.send() await?
.json()?
ãããã1è¡ã§ã¯ãåŒã®ã°ã«ãŒãåãäžååãªåä»ãªäžæãçºçããŸãïŒ client.get("url").send() await?.json()?
ã ãã ããããŒã¯ãŒããã£ãŒã«ãã䜿çšãããšã次ã®äž¡æ¹ã®åœ¢åŒã§èŠæ ãããããªããŸãã client.get("url").send().await?.json()?
client
.get("url")
.send()
.await?
.json()?
ã¢ã¯ã·ã§ã³ãªã®ã§ãããŒã¯ãŒãã¡ãœãããã®æ¹ãæµãããããšæããŸããã å¿
èŠã«å¿ããŠã Future
ãå®éã®ãã¡ãœããã«ããããšãã§ããŸãã
trait Future<..> {
..
extern "rust-await" fn r#await(self) -> _;
}
ïŒ extern "rust-await"
ã¯ãã¡ãããå®éã«åŸ
æ©ãè¡ãããã«å¿
èŠãªãã¹ãŠã®éæ³ãæå³ããå®éã«ã¯å®éã®fnã§ã¯ãããŸãããããŒã¯ãŒãã®å Žåãæ§æãã¡ãœããã®ããã«èŠãããããäž»ã«ããã«ãããŸããã¡ãœããã䜿çšãããŸããïŒ
ãã¬ãã£ãã¯ã¹ïŒæãããªåªå é äœïŒãšãã¹ããã£ãã¯ã¹ããã£ãŒã«ããã®äž¡æ¹ãèš±å¯ããŸã...
æ¥é èŸæ§æãéžæãããŠããå ŽåïŒäžç·ã«ããŸãã¯æ¥é èŸã®ä»£ããã«ïŒãããã¯ééããªãå°æ¥ã®è°è«ã®è°è«ã«ãªããŸããæ¥é èŸãšæ¥å°ŸèŸã®äž¡æ¹ã®è¡šèšã§æ©èœããããŒã¯ãŒãããããŸãããã1ã€ã¯ãã«ãŒã«ãçµ±äžããªãããæå³ã®ããå Žæã§äž¡æ¹ãèš±å¯ããæ§æã®æè»æ§ãé«ããããšãã§ãããããããŸããã æªãèããããããŸããããåŽäžããããããããŸãããã await
postixè¡šèšã䜿çšãããŠããå Žåãå°æ¥çã«ã¯ééããªãè°è«ãããã§ãããã
ãã®æ§æã§awaitæååãå«ãŸãªãæ§æãåãå ¥ããããå¯èœæ§ã¯ã»ãšãã©ãªããšæããŸãã
ïŒ+1ïŒ
ããã«ããããããã®äŸïŒ @mehcodeãªã©ïŒãèŠãåŸã«ç§ãæãã€ããã©ã³ãã ãªèãïŒ .await
ã«ã€ããŠèŠããŠããäžæºã®1ã€ã¯ãèŠã¥ãããšããããšã§ãâ ãéåžžã¯ééãã§ããã .await?
ããããšãå€ããšããäºå®ã¯ããšã«ããããã«ç¹å¥ãªæ³šæãåŒãã®ã«åœ¹ç«ã¡ãŸãã
â ããŒã¯ãŒãã匷調ããªããã®ã䜿çšããŠããå Žå
@ejmahler
è±èªã®ããã«èªããªãæ§æã«ã¯å察ã§ã
request.get().await
ãããªãã®ã¯ã body.lines().collect()
ãããªãã®ãšåãããã«èªã¿åããŸãã ããã§ãŒã³ãããã€ãã¬ãŒã¿ã¡ãœããã®æãã§ã¯ãæåã«ãåŸ
æ©ããšèšã£ãããšãèŠããŠããå¿
èŠããããäœããèããããšãã«ãããèªåã®ç®çã«ãªããã©ããããããªããããå®éã«ã¯_prefix_ã®èªã¿åããæªããªããšæããŸããã¡ãã£ãšåŸ
ã£ãŠãåºã®å°éã®æç« ã®ããã«ã
ãããŠãäœå¹Žã«ãããã£ãŠæ¬çªã³ãŒãã§ãããã䜿çšããåŸãç§ã®ä¿¡å¿µã¯ãäžç®ã§ããªãã®æ©çãŸããã©ãã«ããããç¥ãããšã¯çµ¶å¯Ÿã«éèŠã§ãããšããããšã§ãã é¢æ°ã®å Žåã«ã€ã³ãã³ãè¡ããã£ãšèªããšãèªç¥çè² è·ãªãã§ã200è¡ã®é¢æ°ã®ãã¹ãŠã®co_await / yieldãªã¿ãŒã³ãæ°ç§ã§éžæã§ããŸãã
ããã¯ãRustã®åŒæåã®æ§è³ªãèãããšãåŒã®äžã«ã¯æ±ºããŠååšããªãããšãæå³ããŸããããã¯ãç§ã絶察ã«ãµããŒãããªãå¶éã§ãã ãããŠãå°ãªããšãCïŒã®await
ã§ã¯ã CallSomething(argument, await whatever.Foo()
ãæã€ããšã¯çµ¶å¯Ÿã«ãã£ãšããããã§ãã
async
_will_ãåŒã®éäžã«è¡šç€ºãããããšãèãããšãæ¥é èŸãããæ¥é èŸã®æ¹ãèŠãããçç±ãããããŸããã
'ifãwhileãmatchãreturnãšåãã¬ãã«ã®æ¬æãæãå¿ èŠããããŸãã ãããã®ãããããæ¥å°ŸèŸæŒç®åã§ãããšæ³åããŠã¿ãŠãã ãã-Rustã³ãŒããèªãããšã¯æªå€¢ã§ãã
return
ïŒããã³continue
ãšbreak
ïŒãšwhile
ã¯ãåžžã«!
ãš()
è¿ãããããã§ãŒã³ã«ã¯_å®å
šã«_圹ã«ç«ããªãããšã§æ³šç®ã«å€ããŸãã for
ãçç¥ããŸããããç¹ã«ã¬ãŒãšã³ã§ã¯ã .for_each()
ã䜿çšããŠã³ãŒããåé¡ãªãèšè¿°ãããŠããŠãæªåœ±é¿ã¯ãããŸããã
async/await
ãäž»èŠãªèšèªæ©èœã«ãªããšããäºå®ãšå解ããå¿
èŠãããã§ãããã ããããçš®é¡ã®ã³ãŒãã«è¡šç€ºãããŸãã ããã¯çæ
ç³»ã«æµžéããŸã-ããã€ãã®å Žæã§ã¯ããã¯?
ãšåããããäžè¬çã§ãã 人ã
ã¯ãããåŠã¶å¿
èŠããããŸãã
ãããã£ãŠãæ§æã®éžæã¯ãæåã«ã©ã®ããã«æãããã§ã¯ãªããé·æé䜿çšããåŸã«ã©ã®ããã«æãããã«æèçã«çŠç¹ãåãããããšæããããããŸããã
ãŸããå¶åŸ¡ãããŒæ§é ã«é¢ããéãã await
ã¯å¥ã®çš®é¡ã®åç©ã§ããããšãç解ããå¿
èŠããããŸãã return
ã break
ã continue
ãããã«ã¯yield
ãããªæ§æã¯ã jmp
芳ç¹ããçŽæçã«ç解ã§ããŸãã ããããèŠããšãé¢å¿ã®ããå¶åŸ¡ãããŒãä»ã®å Žæã«ç§»åããŠãããããç®ãç»é¢äžã§è·³ãè¿ããŸãã ãã ãã await
ã¯ãã·ã³ã®å¶åŸ¡ãããŒã«åœ±é¿ãäžããŸãããç§ãã¡ã®ç®ãã³ãŒãã®çŽæçãªç解ã«ãšã£ãŠéèŠãªå¶åŸ¡ãããŒã¯ç§»åããŸããã
ç¡æ¡ä»¶ã®åŒã³åºããreturn
ãŸãã¯break
ã«ãã§ãŒã³ããããšã¯æå³ããªããããèªæãããŸããã åæ§ã®çç±ã§ãåªå
ã«ãŒã«ãå€æŽããŠããã«å¯Ÿå¿ããããšã¯ã§ããŸããã ãããã®æŒç®åã®åªå
é äœã¯äœããªããŸãã 圌ãã¯ãã¹ãŠãå³ã«æã£ãŠè¡ããã©ããã«æ»ãããã®é¢æ°ãŸãã¯ãããã¯å
ã§ã®å®è¡ãçµäºããŸãã ãã ãã await
æŒç®åã¯ãã§ãŒã³åããå¿
èŠããããŸãã ããã¯åŒã®äžå¯æ¬ ãªéšåã§ãããåŒã®çµããã§ã¯ãããŸããã
ãã®ã¹ã¬ããã§ã®è°è«ãšäŸãæ€èšããçµæãé©ãã¹ãåªå é äœã®ã«ãŒã«ãåŸæããããã«çããã ãããšããããã£ãæèŠãæ®ã£ãŠããŸãã
ã¹ããŒãã³ã°éŠ¬ã®åè£è
ã¯ä»ã®ãšããawait!(expr)
ã§è¡ãããã§ããã£ãšè¯ããã®ãåŸã§è§£æ±ºãããããšãæãã§ããŸãã @Centrilã®ã³ã¡ã³ããèªãåã«ããã®éèŠãªæ©èœãã»ãŒãã¹ãŠã®æ§æã§äœ¿çšã§ããããã«ããããã«ãããããµããŒãããŠãããšæããŸãã ãããã圌ã®è°è«ã¯ãããããã ã®åãç· ãŸãã§ãããšç§ã«ç¢ºä¿¡ãããŸãã Rustã§ã¯ã¡ãœããåŒã³åºãã®é£éãéèŠã§ããããšãç§ãã¡ã¯ç¥ã£ãŠããŸãã ãã®ããã ?
ããŒã¯ãŒããæ¡çšãããåºãæ®åãã倧æåãåããŸããã ç§ãã¡ã倱æããããšãããã£ãŠããæ§æã䜿çšããããšã¯ã確ãã«æè¡çè² åµãè¿œå ããã ãã§ãã
ãã®ã¹ã¬ããã®æ©ã段éã§ã @ withoutboatsã¯ã4ã€ã®æ¢åã®ãªãã·ã§ã³ã®ã¿ãå®è¡å¯èœã§ããããã«èŠããããšã瀺ããŸããã ãããã®ãã¡ãæ¥å°ŸèŸexpr await
æ§æã ããç§ãã¡ãé·æçã«å¹žãã«ããå¯èœæ§ããããŸãã ãã®æ§æã¯ãå¥åŠãªåªå
é äœã®é©ããçã¿åºããŸããã ?
æŒç®åã®ãã¬ãã£ãã¯ã¹ããŒãžã§ã³ãäœæããå¿
èŠã¯ãããŸããã ã¡ãœãããã§ãŒã³ãšããŸãé£æºããå·Šããå³ãžã®å¶åŸ¡ãããŒãåå²ããŸããã æåãã?
æŒç®åã¯ãæ¥å°ŸèŸæŒç®åã®åäŸãšããŠæ©èœããŸãã await
ã¯ãå®éã«ã¯return
ã break
ããã?
ã«äŒŒãŠããŸãã break
ããŸãã¯yield
ã æ¥å°ŸèŸã®éèšå·æŒç®åã¯Rustã®æ°æ©èœãããããŸãããã async/await
䜿çšæ³ã¯ãããã«äœ¿ãæ
£ããããã«ååã«æ®åããŠããŸãã
æ¥å°ŸèŸæ§æã®ãã¹ãŠã®ãªãã·ã§ã³ã¯æ©èœããŠããããã«èŠããŸããã expr await
ã¯ããã€ãã®å©ç¹ããããŸãã ãã®æ§æã¯ã await
ãããŒã¯ãŒãã§ããããšãæ確ã«ããéæ³ã®å¶åŸ¡ãããŒã匷調ããã®ã«åœ¹ç«ã¡ãŸãã expr.await
ã expr.await()
expr.await!
ã expr.await!()
ãªã©ãšæ¯èŒãããšãããã¯ãã£ãŒã«ã/ã¡ãœãã/ãã¯ãã®ããã«èŠããããšã説æããå¿
èŠããããŸããããå®éã«ã¯ãã®1ã€ã®ç¹å¥ãªã±ãŒã¹ã§ã¯ãããŸããã ããã§ã¯ãã¹ããŒã¹ã»ãã¬ãŒã¿ãŒã«æ
£ããŠããŸãã
await
ã@
ãšç¶Žã£ããã解æã®åé¡ãåŒãèµ·ãããªãä»ã®èšå·ã䜿çšãããããã®ã¯é
åçã§ãã ããã¯ç¢ºãã«ãããä¿èšŒããã®ã«ååéèŠãªãªãã¬ãŒã¿ãŒã§ãã ããããæçµçã«await
ãšç¶Žãå¿
èŠãããå Žåã¯ãããã§åé¡ãããŸããã æ¥å°ŸèŸã®äœçœ®ã«ããéãã
誰ãã_å®éã®_äŸã«ã€ããŠèšåããããã«...ç§ã¯ïŒtokeiã«ãããšïŒ23,858è¡ã®éã³ãã³ãŒãããŒã¹ãç¶æããŠããŸããããã¯éåžžã«éåæã§ãå
ç©0.1 await
ïŒéåžžã«å®éšçã§ãïŒã ïŒç·šéæžã¿ã®ïŒæŽçªæ¢æ€ã«è¡ããŸãããïŒãã¹ãŠãrustfmtãä»ããŠå®è¡ãããŠããããšã«æ³šæããŠãã ããïŒïŒ
// A
if !await!(db.is_trusted_identity(recipient.clone(), message.key.clone()))? {
info!("recipient: {}", recipient);
}
// B
match await!(db.load(message.key))? {
Some(key) => key,
None => {
return Err(/* [...] */);
}
};
// C
let mut res = await!(client
.get(&script_src)
.header("cookie", self.cookies.read().as_header_value())
.header("user-agent", USER_AGENT)
.send())?
.error_for_status()?;
// D
let mut res =
await!(client.get(inbox_url).headers(inbox_headers).send())?.error_for_status()?;
let mut res: InboxResponse = await!(res.json())?;
// E
let mut res = await!(client
.post(url)
.multipart(form)
.headers(headers.clone())
.send())?
.error_for_status()?;
let res: Response = await!(res.json())?;
// F
#[async]
fn request_user(self, user_id: String) -> Result<User> {
let url = format!("users/{}/profile", user_id);
let (_, mut res) = await!(self.request(url, Method::GET, None, true))?;
let user = await!(res.json::<UserResponse>())?
.user
.into();
Ok(user)
}
ããã§ããããæã人æ°ã®ãããã¬ãã£ãã¯ã¹ããªã¢ã³ãã«å€æããŠã¿ãŸãããã æãããªçç±ã§ãããã¯rustfmtãä»ããŠå®è¡ãããŠããªãã®ã§ããããæžãããã®ããè¯ãæ¹æ³ãããå Žåã¯ãè©«ã³ããŸãã
// A
if await? db.is_trusted_identity(recipient.clone(), message.key.clone()) {
info!("recipient: {}", recipient);
}
// B
match await? db.load(message.key) {
Some(key) => key,
None => {
return Err(/* [...] */);
}
};
// C
let mut res = (await? client
.get(&script_src)
.header("cookie", self.cookies.read().as_header_value())
.header("user-agent", USER_AGENT)
.send())
.error_for_status()?;
// D
let mut res =
(await? client.get(inbox_url).headers(inbox_headers).send()).error_for_status()?;
let mut res: InboxResponse = await? res.json();
// E
let mut res = (await? client
.post(url)
.multipart(form)
.headers(headers.clone())
.send())
.error_for_status()?;
let res: Response = await? res.json();
// F
async fn request_user(self, user_id: String) -> Result<User> {
let url = format!("users/{}/profile", user_id);
let (_, mut res) = await? self.request(url, Method::GET, None, true);
let user = (await? res.json::<UserResponse>())
.user
.into();
Ok(user)
}
æåŸã«ããããç§ã®ãæ°ã«å ¥ãã®æ¥å°ŸèŸããªã¢ã³ããæ¥å°ŸèŸãã£ãŒã«ããã«å€æããŸãããã
// A
if db.is_trusted_identity(recipient.clone(), message.key.clone()).await? {
info!("recipient: {}", recipient);
}
// B
match db.load(message.key).await? {
Some(key) => key,
None => {
return Err(/* [...] */);
}
};
// C
let mut res = client.get(&script_src)
.header("cookie", self.cookies.read().as_header_value())
.header("user-agent", USER_AGENT)
.send().await?
.error_for_status()?;
// D
let mut res: InboxResponse = client.get(inbox_url)
.headers(inbox_headers)
.send().await?
.error_for_status()?
.json().await?;
// E
let mut res: Response = client.post(url)
.multipart(form)
.headers(headers.clone())
.send().await?
.error_for_status()?
.json().await?;
// F
async fn request_user(self, user_id: String) -> Result<User> {
let url = format!("users/{}/profile", user_id);
let user = self.request(url, Method::GET, None, true).await?
.res.json::<UserResponse>().await?
.user
.into();
Ok(user)
}
ãã®æŒç¿ã®åŸãç§ã¯ããã€ãã®ããšãèŠã€ããŸããã
ç§ã¯ä»ã await? foo
ã«åŒ·ãå察ããŠããŸãã åçŽãªåŒã«ã¯é©ããŠããŸãããè€éãªåŒã§ã¯?
ã倱ãããŠããããã«æããŸãã ãã¬ãã£ãã¯ã¹ãä»ããå¿
èŠãããå Žåã¯ãã䟿å©ãªãåªå
é äœãä»ããããšæããŸãã
åŸçœ®è¡šèšã䜿çšãããšãã¹ããŒãã¡ã³ããçµåããäžèŠãªletãã€ã³ãã£ã³ã°ãæžããããšãã§ããŸãã
postfix _field_è¡šèšã䜿çšãããšãrustfmtã®çšèªã§ããèªäœã®è¡ã§ã¯ãªããåŸ
æ©ããŠãããã®ã®è¡ã«.await?
ã衚瀺ããããšã匷ã奜ã¿ãŸãã
äžèšã®æ¥åã®åŸçœ®è¡šèšã...ãã¯ããã®ç°¡æœããšãä»ã®äœããèŠè¶ããŠäžæåæ¢ãè¡šãè±èªã®è±¡åŸŽã®äž¡æ¹ã«æè¬ããŸãã ïŒéåæåäœãã©ã®ããã«æ©èœããããšåãããã«ïŒïŒãããã¯ãŸãããŸãé£éããŸãã
let resultValue = doSomethingAndReturnResult()...?;
let resultValue = doSomethingAndReturnResult()...?.doSomethingOnResult()...?;
let value = doSomethingAndReturnValue()....doSomethingOnValue()...;
let arrayOfValues = vec![doSomethingA(),doSomethingB()]...?;
// Showing stacking
let value = doSomethingWithVeryLongFunctionName()...?
.doSomethingWithResult()...?;
ä»ã®ãªãã·ã§ã³ãããã»ã©ç°¡æœã§èŠèŠçã«æå³ããããšã¯æããŸããã
A
let mut res: Response = (await client.post(url)
.multipart(form)
.headers(headers.clone())
.send().await?
.error_for_status()?
.json())?;
B
let mut res: Response = await client.post(url)
.multipart(form)
.headers(headers.clone())
.send().await?
.error_for_status()?
.json());
let res = res.unwrap();
é·ãé£éãåŸ ã£ãŠããã®ã¯è¯ã圢ã ãšããèããã¹ãã§ããããïŒ
éåžžã®Future
ã³ã³ãããŒã¿ãåçŽã«äœ¿çšããªãã®ã¯ãªãã§ããïŒ
å®éã倱ææã«ããã¯ã¢ããåäœãå®è¡ãããå Žåãäžéšã®åŒã¯åŸ æ©ãã§ãŒã³ã«ããŸãå€æãããŸããã
å人çã«ç§ã¯ããã ãšæããŸãïŒ
let value = await some_op()
.and_then(|v| v.another_op())
.and_then(|v2| v2.final_op())
.or_else(|| backup_op());
value.unwrap()
ããããã¯ããã«èªç¶ã«èªã¿ãŸãïŒ
let value = match await some_op() {
Ok(v) => match await v.another_op() {
Ok(v2) => await v2.final_op(),
Err(_) => await backup_op(),
},
Err(_) => await backup_op(),
};
value.unwrap()
çµå±ã®ãšãããç§ãã¡ã¯ãŸã ãŒãã³ã¹ãå ç©ã®å šåãæã«ããŠããŸãã
ãããèæ ®ããŠãã ããã
@EyeOfPython future@await
@
以å€ã®éžæè¢ãããããšã匷調ããããšæããŸãã future~await
ãšæžãããšãã§ããŸããããã§ã ~
ã¯ã»ããã€ãã³ã®ããã«æ©èœããå¯èœãªãã¹ãŠã®æ¥å°ŸèŸæŒç®åã«å¯ŸããŠæ©èœããŸãã
ãã€ãã³-
ã¯ããã€ãã¹æŒç®åãšè² ã®æŒç®åãšããŠãã§ã«äœ¿çšãããŠããŸãã ããè¯ããªãã ãã ãã ~
ã¯ãRustã®ããŒããªããžã§ã¯ãã瀺ãããã«äœ¿çšãããŠããŸããããã以å€ã®å Žåãããã°ã©ãã³ã°èšèªã§ã¯ã»ãšãã©äœ¿çšãããŠããŸããã§ããã ä»ã®èšèªã®äººã«ãšã£ãŠã¯æ··ä¹±ãå°ãªããªãã¯ãã§ãã
@earthengineè¯ãèãã§ããã future~
ã䜿çšããããšãã§ããŸã~
ãawait
ããŒã¯ãŒãã®ããã«æ©èœããæªæ¥ãåŸ
ã€ããšãæå³ããŸãïŒ ?
èšå·ã®ããã«ïŒ
æªæ¥| çµæã®æªæ¥| æªæ¥ã®çµæ
-| -| -
æªæ¥ã|æªæ¥ãïŒ|æªæ¥ïŒã
ãŸãã次ã®ãããªå ç©ã®é£éïŒ
let res: MyResponse = client.get("https://my_api").send()~?.json()~?;
Goãéåæããã°ã©ãã³ã°ãã©ã®ããã«å®è£
ããŠããããèŠãŠãããã§äœãé¢çœããã®ãèŠã€ããŸããã Goã®å
ç©ã«æãè¿ã代æ¿æ段ã¯ãã£ãã«ã§ãã ãããŠãå€ãåŸ
ã€ããã®await
ãŸãã¯ä»ã®å«ã³å£°ã®æ§æã®ä»£ããã«ãGoãã£ãã«ã¯ãã®ç®çã®ããã«<-
æŒç®åãæäŸããã ãã§ãã ç§ã«ãšã£ãŠãããã¯ããªããããã§ç°¡åã«èŠããŸãã 以åãGoã®ã·ã³ãã«ãªæ§æãšåªããéåææ©èœã人ã
ãã©ã®ããã«ç§°è³ããããããèŠãŸããããã®ããããã®çµéšããäœããåŠã¶ããšã¯ééããªãè¯ãèãã§ãã
æ®å¿µãªãããRustãœãŒã¹ã³ãŒãã«ã¯Goãããå€ãã®å±±æ¬åŒ§ãããããããŸã£ããåãæ§æã䜿çšããããšã¯ã§ããŸããã§ãããããã¯äž»ã«ãžã§ããªãã¯ãåå ã§ãã ããã«ããã <-
æŒç®åã¯éåžžã«åŸ®åŠã«ãªããæäœãå¿«é©ã§ã¯ãªããªããŸãã ãã1ã€ã®æ¬ ç¹ã¯ãé¢æ°ã·ã°ããã£ã§->
ãšå察ã«èŠããå¯èœæ§ãããããã®ããã«èããçç±ããªãããšã§ãã ããã«ãã1ã€ã®æ¬ ç¹ã¯ã <-
å°ç« ãplacement new
ãšããŠå®è£
ãããããšãæå³ããŠããããã人ã
ãããã誀解ããå¯èœæ§ãããããšã§ãã
ãããã£ãŠãæ§æãããã€ãè©ŠããåŸã <--
sigilã§åæ¢ããŸããã
let output = <-- future;
async
ã³ã³ããã¹ãã§ã¯ã <-
æªæºã§ããã <--
ã¯éåžžã«åçŽã§ãã ãã ãã代ããã«ã <-
ããã¬ãã£ãã¯ã¹await
ããã倧ããªå©ç¹ããããŸããã€ã³ãã³ãã§ããŸãæ©èœããŸãã
async fn log_service(&self) -> T {
let service = self.myService.foo();
<-- self.logger.log("beginning service call");
let output = <-- service.exec();
<-- self.logger.log("foo executed with result {}.", output));
output
}
async fn try_log(message: String) -> Result<usize, Error> {
let logger = <-- acquire_lock();
let length = <-- logger.log_into(message)?;
<-- logger.timestamp();
Ok(length)
}
async fn await_chain() -> Result<usize, Error> {
<-- (<-- partial_computation()).unwrap_or_else(or_recover);
}
ç§ã«ãšã£ãŠããã®æŒç®åã¯await
ïŒã³ãŒãã³ã³ããã¹ãå
ã®ä»ã®ããŒã¯ãŒããå€æ°ã®ããã«èŠããŸãïŒãããããã«ãŠããŒã¯ã§èŠã€ããããããã«èŠããŸãã æ®å¿µãªãããGithubã§ã¯ã³ãŒããšãã£ã¿ãŒãããèãèŠããŸãããããã¯èŽåœçã§ã¯ãªããšæããŸãã 誰ããäžå¿«ã«æãããšããŠããç°ãªãæ§æã®åŒ·èª¿è¡šç€ºãŸãã¯ããè¯ããã©ã³ãïŒç¹ã«ååã®å ŽåïŒã¯ãã¹ãŠã®åé¡ã解決ããŸãã
ãã®æ§æã奜ããªãã1ã€ã®çç±ã¯ãæŠå¿µçã«ããŸã ããã«ãªããã®ããšããŠè¡šçŸã§ããããã§ãã ç¢å°ã®å³ããå·Šã®æ¹åã¯ãããã¹ãã®èªã¿æ¹ãšã¯éã§ããããæªæ¥ããæ¥ããã®ããšè¡šçŸããããšãã§ããŸãã <--
æŒç®åã®é·ã圢ç¶ã¯ããæ°žç¶çãªæäœãéå§ããããããšã瀺ããŠããŸãã future
ããã®å±±ãã£ããš2ã€ã®ãã€ãã³ã¯ããç¶ç¶çãªããŒãªã³ã°ããè¡šãããšãã§ããŸãã ãããŠãããã§ã以åãšåãããã«ãåŸ
ã€ããšèªãããšãã§ããŸããã
ããçš®ã®æãã§ã¯ãããŸãããã楜ãããããããŸããã
ãã®ææ¡ã§æãéââèŠãªããšã¯ã人éå·¥åŠçãªã¡ãœãããã§ãŒã³ãå¯èœã§ãããšããããšã§ãã ç§ã以åã«ææ¡ããé
延ãã¬ãã£ãã¯ã¹æŒç®åã®ã¢ã€ãã¢ã¯ãããã«ãŽã£ããã§ãã ãã®ããã«ããŠãæ¥é èŸãšæ¥å°ŸèŸã®await
æ§æã®äž¡æ¹ã®äžçããæé«ã®ãã®ãåŸãããšãã§ããŸãã 以åã«å€ãã®å Žé¢ã§å人çã«æ¬²ããã£ãããã€ãã®äŸ¿å©ãªè¿œå æ©èœãå°å
¥ãããããšãæ¬åœã«æãã§ããŸãïŒé
延éæ¥åç
§ãšé
延åŠå®æ§æã
å šäœãšããŠãããã§é 延èªãé©åãã©ããã¯ããããŸãããå¥ã®ååãä»ããå¿ èŠããããããããŸããã
client.get("https://my_api").<--send()?.<--json()?
let not_empty = some_vec.!is_empty();
let deref = value.*as_ref();
æŒç®åã®åªå é äœã¯éåžžã«æçœã«èŠããŸãïŒå·Šããå³ãžã
ãã®æ§æã«ãã£ãŠã is_not_*
é¢æ°ãäœæããå¿
èŠæ§ãæžãããšãé¡ã£ãŠããŸãããã®é¢æ°ã®ç®çã¯ã bool
ããããã£ãç¡å¹ã«ããŠè¿ãããšã ãã§ãã ãŸããããŒã«/éåç
§åŒã䜿çšãããšãããã¯ãªãŒã³ã«ãªãå ŽåããããŸãã
æåŸã«ã @ mehcodeã«ãã£ãŠæçš¿ãããå®éã®äŸã«é©çšããŸããã <--
ãã¡ãœããåŒã³åºããã§ãŒã³å
ã®async
é¢æ°ãé©åã«åŒ·èª¿ããæ¹æ³ãæ°ã«å
¥ã£ãŠããŸãã éã«ãæ¥å°ŸèŸawait
ã¯ãéåžžã®ãã£ãŒã«ãã¢ã¯ã»ã¹ãŸãã¯é¢æ°åŒã³åºãïŒæ§æã«ãã£ãŠç°ãªããŸãïŒã®ããã«èŠããç¹å¥ãªæ§æã®åŒ·èª¿è¡šç€ºãŸãã¯ãã©ãŒããããªãã§ããããåºå¥ããããšã¯ã»ãŒäžå¯èœã§ãã
// A
if db.<--is_trusted_identity(recipient.clone(), message.key.clone())? {
info!("recipient: {}", recipient);
}
// B
match db.<--load(message.key)? {
Some(key) => key,
None => {
return Err(/* [...] */);
}
};
// C
let mut res = client.get(&script_src)
.header("cookie", self.cookies.read().as_header_value())
.header("user-agent", USER_AGENT)
.<--send()?
.error_for_status()?;
// D
let mut res: InboxResponse = client.get(inbox_url)
.headers(inbox_headers)
.<--send()?
.error_for_status()?
.<--json()?;
// E
let mut res: Response = client.post(url)
.multipart(form)
.headers(headers.clone())
.<--send()?
.error_for_status()?
.<--json()?;
// F
async fn request_user(self, user_id: String) -> Result<User> {
let url = format!("users/{}/profile", user_id);
let user = self.<--request(url, Method::GET, None, true)?
.res.<--json::<UserResponse>()?
.user
.into();
Ok(user)
}
çµå±ã®ãšããããããç§ã䜿çšãããæ§æã§ãã
@novacrazy
é·ãé£éãåŸ ã£ãŠããã®ã¯è¯ã圢ã ãšããèããã¹ãã§ããããïŒ éåžžã®Futureã³ã³ãããŒã¿ãåçŽã«äœ¿çšããŠã¿ãŸãããïŒ
ç§ãããªãã誀解ããªãã£ããã©ããã¯ããããŸãããããããã¯æä»çã§ã¯ãããŸãããããªãã¯ãŸã ã³ã³ãããŒã¿ã䜿ãããšãã§ããŸã
let value = some_op()
.and_then(|v| v.another_op())
.and_then(|v2| v2.final_op())
.or_else(|| backup_op())
.await;
ãã ãããããæ©èœãããã«ã¯ã FnOnce(T) -> U
ã ãã§ãªãã FnOnce(T) -> impl Future<_>
ã§and_then
å¥ãå
¥åããå¿
èŠããããŸãã å°æ¥çã«é£éã³ã³ãããŒã¿ãå®è¡ãããšãçµæã¯æ¥å°ŸèŸã«paranthesisããªããŠããããã«æ©èœããŸãã
let result = load_local_file()
.or_else(|_| request_from_server()) // Async combinator
.await
.and_then(|body| serde_json::from_str(&body)); // Sync combinator
ãã®æçš¿ã§ã¯ãä¿®æ£åŸã®å Žåã®æŒç®åã®åªå é äœã®åé¡ã«çŠç¹ãåœãŠãŸãã ç§ã®ç¥ãéããå°ãªããšãããçšåºŠã¯æ©èœãã3ã€ã®å®è¡å¯èœãªéžæè¢ãããããããããçŸåšã®æ§æã§ãããã®åªå é äœãæã€1ã€ã®ä¿®æ£åŸã®åŒã«ãã£ãŠäŸç€ºãããŠããŸãã ç§ã¯ãã©ã®ææ¡ãçŸåšã®ãªãã¬ãŒã¿ãŒã®åªå é äœãå€ããã¹ãã§ã¯ãªããšåŒ·ãæããŠããŸãã
future.await()
ïŒfuture.await
ïŒfuture(await)
ïŒæ©èœã®éãã¯ããªãå°ããã§ãããååšããŸãã ç§ã¯ããããã¹ãŠãåãå ¥ããããšã«æ³šæããŠãã ãããããã¯ã»ãšãã©åŸ®èª¿æŽã§ãã ããããã¹ãŠã衚瀺ããã«ã¯ãããã€ãã®ã¿ã€ããå¿ èŠã§ãã äŸã®äžèªç¶ãã«ã€ããŠã³ã¡ã³ãããªãã§ãã ãããããã¯ããã¹ãŠã®éããäžåºŠã«è¡šç€ºããæãå§çž®ãããããŒãžã§ã³ã§ãã
struct Foo<A, F, S> where A: Future<Output=F>, F: FnOnce(usize) -> S {
member: A,
}
// What we want to do, in macro syntax:
let foo: Foo<_, _, _> = âŠ;
(await!(foo.member))(42)
foo.member.await()(42)
(foo.member.await)(42)
let ⊠{ await: value } = foo.member; value(42)
ã©ããããããïŒ(foo.member)(await)(42)
ã¡ã³ããŒã®ç§»åã«ãã£ãŠå ¥åæ§é äœãå解ããããçµæãåŒã³åºãå¯èœãšããŠåŒã³åºãããããªãå Žåãããã3ã€ã®åªå ã¯ã©ã¹ã¯æ¬¡ã ã«æ¥ãããããã¹ãŠåãããã«èŠããŸãã å ç©ãã©ã®ããã«æ¯ãèããããã§ããïŒ
ã¡ãœããåŒã³åºããšæããã䌌ãŠããã®ã¯ã self
ãåãåãå¥ã®ã¡ãœããåŒã³åºãã§ãã
ã¡ã³ããŒã«æããã䌌ãŠããã®ã¯ãæé»ã®ã¡ã³ããŒawait
ã®ã¿ãæã€æ§é äœã§ããããããã£ãŠããããã移åããããšã«ãã£ãŠæ§é äœãç Žå£ããããã®ç§»åã¯æé»çã«å°æ¥ãåŸ
ã¡ãŸãã ããã¯æãç®ç«ããªãããã«æããŸãã
é¢æ°ãšäžŠè¡ããŠåŒã³åºãããã®ã¯ãã¯ããŒãžã£ã®åäœã§ãã èšèªã³ãŒãã¹ãžã®æãã¯ãªãŒã³ãªè¿œå ãšããŠãã®ãœãªã¥ãŒã·ã§ã³ããå§ãããŸãïŒæ§æã¯åã®å¯èœæ§ã«æããã䌌ãŠããŸãïŒããã¡ãœããåŒã³åºãã®ããã€ãã®è¯ãç¹ã§ããã .await
ã¯ä»ã®ãã®ããé·ããªãããšã¯ãããŸããã
@HeroicKatoraæã
ã¯ç¹æ®ãªã±ãŒã¹ã§ã.await
ãå¯èœã«ããlibsyntaxã§foo.await(42)
ããããã¯ççŸ/ã¢ãããã¯ã ãããã ãã ããã¯ããŒãžã£ãåºåããå
ç©ã¯ååšããŸãããããããããã»ã©äžè¬çã§ã¯ãªãããã (foo.await)(42)
ã¯æçšã§ããããã«æãããŸãã ãããã£ãŠãäžè¬çãªã±ãŒã¹ã«åãããŠæé©åãããšã ()
ã.await
ã«è¿œå ããå¿
èŠããªãããããã©ã³ã¹ãåããŠããå¯èœæ§ããããŸãã
@CentrilåæããŸããäžè²«æ§ãéèŠã§ãã 䌌ããããªè¡åãããã€ãèŠãããããçµ±åãéããŠä»ã®è¡åãæšæž¬ããããšæããŸãã ããããããã§ã¯.await
ãæ±ãã«ããããã«èŠããŸããç¹ã«ãäžèšã®äŸã§ã¯ãæé»ã®ç Žæ£ãšäžŠè¡ããŠããããšãæ確ã«ç€ºãããŠããŸãïŒãããã®åœ±é¿ãçºçããå¥ã®æ§æãèŠã€ãããªãå Žåãé€ãïŒã ç Žæ£ãèŠããšãlet-bindingsãªã©ã§ããã䜿çšã§ãããã©ããããã«çåã«æããŸãããã ãããã®ãããªã¡ã³ããŒããªãå
ã®åãå解ããããããŸãã¯ç¹ã«åãimpl Future<Output=F>
å Žåã¯ãããã¯äžå¯èœã§ãã let _ =
代ããã«ä»£æ¿ãã¬ãã£ãã¯ã¹await _ =
ã«æ»ããŸã¹ïŒã
æ§æèªäœã䜿çšããããšãçŠããŠããããã§ã¯ãããŸãããç§ã¯ãããåŠã¶ããšã«å¯ŸåŠã§ãããšæããŸãããããæçµçãªãã®ã§ããããšãå€æããå Žåã¯ã粟åçã«äœ¿çšããŸãããæããã«åŒ±ç¹ã®ããã§ãã
¹ããã¯ããã¿ãŒã³å
ã®ååã®åŸãã«?
ãèš±å¯ããããšã§ã ?
ãèš±å¯ããªããäžè²«æ§ãä¿ã€ããšãã§ããŸãã
await value? = failing_future();
Result
ã®Ok
éšåãšäžèŽããŸãã ããã¯ãä»ã®ã³ã³ããã¹ãã§ã調æ»ããã®ã¯èå³æ·±ãããã§ããããããã¯ããå€ããŠããŸãã ãŸããåæã«await
ãã¬ãã£ãã¯ã¹ãšãµãã£ãã¯ã¹ã®æ§æãäžèŽããããšã«ãªããŸãã
æ§æèªäœã䜿çšããããšãçŠããŠããããã§ã¯ãããŸãããç§ã¯ãããåŠã¶ããšã«å¯ŸåŠã§ãããšæããŸãããããæçµçãªãã®ã§ããããšãå€æããå Žåã¯ã粟åçã«äœ¿çšããŸãããæããã«åŒ±ç¹ã®ããã§ãã
ç§ã¯ãã¹ãŠã®è§£æ±ºçãããã€ãã®æ¬¡å ãŸãã¯ã±ãŒã¹ã«é¢ããŠããã€ãã®æ¬ ç¹ãæã£ãŠãããšæããŸãã äžè²«æ§ã人éå·¥åŠãé£éæ§ãå¯èªæ§ãªã©...ããã«ãããçšåºŠãã±ãŒã¹ã®éèŠæ§ãå žåçãªRustã³ãŒãããã³APIãžã®é©åæ§ãªã©ãåé¡ã«ãªããŸãã
foo.await(42)
æžããŠãããŠãŒã¶ãŒã®å Žå..ã
struct HasClosure<F: FnOnce(u8)> { closure: F, }
fn _foo() {
let foo: HasClosure<_> = HasClosure { closure: |x| {} };
foo.closure(42);
}
...ç§ãã¡ã¯ãã§ã«åªãã蚺æãæäŸããŠããŸãïŒ
5 | foo.closure(42);
| ^^^^^^^ field, not a method
|
= help: use `(foo.closure)(...)` if you meant to call the function stored in the
`closure` field
ãããfoo.await(42)
ã«åãããã«èª¿æŽããããšã¯ãããªãéæã§ããããã§ãã å®éãç§ãèŠãéãã foo.await(42)
ãæžã蟌ãŸãããšãã«ãŠãŒã¶ãŒã(foo.await)(42)
æå³ããŠããããšãããã£ãŠããã®ã§ããããMachineApplicable
ã§cargo fix
ç·šéã§ããŸãããããŒã å®éã foo.await
ãå®å®ãããŠãã foo.await(42)
ãèš±å¯ããªãå Žåã foo.await(42)
ã¯æåã¯åæ³ã§ã¯ãªããããå¿
èŠã«å¿ããŠåŸã§åªå
é äœãå€æŽããããšãã§ãããšæããŸãã
ãããªãå
¥ãåãæ©èœããŸãïŒããšãã°ãééã®çµæã®å°æ¥-ããã¯äžè¬çã§ã¯ãããŸããïŒïŒ
`` `é
struct HasClosure
let fooïŒHasClosure <_ i = "27"> = HasClosure {closureïŒOkïŒ| x | {}ïŒ};
foo.closure?(42);
Ok(())
}
äŸïŒééã®çµæã®å°æ¥-ãããäžè¬çã§ãããšããããã§ã¯ãããŸãã
è¿œå ã®æ¥å°ŸèŸ?
æŒç®åã¯ãã©ã®ä¿®æ£åŸã®äŸã§ããæ§æãå€æŽããã«ãããæ確ã«ããŸãã 埮調æŽã¯å¿
èŠãããŸããã åé¡ã¯ã .member
æ瀺çã«ãã£ãŒã«ãã§ãããæåã«é©çšããããã«ç§»åç Žå£ãå¿
èŠãªããšã ãã§ãã ãããŠããããæžãã®ã¯é£ãããšã¯èšããããããŸããã ç§ã¯äž»ã«ãããã¯ä»ã®.member
䜿çšæ³ãšççŸããŠããããã«æããããšèšãããã§ããããšãã°ããããã³ã°ã«å€æããããšãã§ããŸãã å
ã®æçš¿ã¯ããã®ç¹ã§ããžãã£ããšãã¬ãã£ããæ¯èŒæ€èšããŠããŸããã
ç·šéïŒ future.await(42)
ã«åãããã«èª¿æŽãããšããããäœæããå¯èœæ§ããããæå³ããªãè¿œå ã®ãªã¹ã¯ããããŸããaïŒã¡ã³ããŒãšåãååã®ã¡ãœãããèš±å¯ãããŠããããã«ããããåœãŠã¯ãŸããªãã¯ããŒãžã£ãšççŸããŸãã bïŒ await
è°è«ãäžãããå°æ¥ã®éçºãçŠæ¢ããã ããããåã«è¿°ã¹ãããã«ãã¯ããŒãžã£ãè¿ãFuture
埮調æŽããããšã¯ãæãå·®ãè¿«ã£ãåé¡ã§ã¯ãªãã¯ãã§ãã
@novacrazyåã«éåžžã®Futureã³ã³ãããŒã¿ã䜿çšããªãã®ã¯ãªãã§ããïŒ
Futures 0.3ã§ã©ãã ãã®çµéšããããã¯ããããŸããããäžè¬çãªäºæ³ã§ã¯ãã³ã³ãããŒã¿ã¯ããŸã䜿çšãããããã©ã€ããª/ã€ãã£ãªã ã®äœ¿çšã¯éåæ/åŸ æ©ã«ãªããŸãã
Async / awaitã«ã¯ãã³ã³ãããŒã¿ã«æ¯ã¹ãŠããã€ãã®å©ç¹ããããŸããããšãã°ãyieldãã€ã³ãéã§ã®åçšããµããŒãããŸãã
ã³ã³ãããŒã¿ã¯async / awaitã®ãã£ãšåããååšããŠããŸãããããšã«ããasync / awaitãçºæãããã®ã«ã¯ãæ£åœãªçç±ããããŸãã
Async / awaitã¯ããã«ãšã©ãŸããŸããã€ãŸãã人éå·¥åŠçã§ããå¿ èŠããããŸãïŒã¡ãœãããã§ãŒã³ãå«ãïŒã
ãã¡ãããå¿ èŠã«å¿ããŠã³ã³ãããŒã¿ãèªç±ã«äœ¿çšã§ããŸããã人éå·¥åŠã«åºã¥ããŠã³ã³ãããŒã¿ã䜿çšããå¿ èŠã¯ãããŸããã
@cramertjãèšã£ãããã«ãasync / awaitã®ä»£ããã§ã¯ãªããasync / awaitã«çŠç¹ãåœãŠãŠè°è«ãç¶ããããã«ããŸãããã
å®éã倱ææã«ããã¯ã¢ããåäœãå®è¡ãããå Žåãäžéšã®åŒã¯åŸ æ©ãã§ãŒã³ã«ããŸãå€æãããŸããã
ããªãã®äŸã¯å€§å¹ ã«åçŽåããããšãã§ããŸãïŒ
let value = try {
let v = await some_op()?;
let v2 = await v.another_op()?;
await v2.final_op()?
};
match value {
Ok(value) => Ok(value),
Err(_) => await backup_op(),
}.unwrap()
ããã«ãããã©ã®ããŒãããšã©ãŒãåŠçããŠããããã©ã®ããŒããéåžžã®ããããŒãã¹äžã«ããããæ確ã«ãªããŸãã
ããã¯async / awaitã®åªããç¹ã®1ã€ã§ããã«ãŒãããã©ã³ãã match
ã ?
ã try
ãªã©ãèšèªã®ä»ã®éšåãšããŸãé£æºããŸãã
å®éã await
é€ãã°ãããã¯Futuresã䜿çšããŠããªãã£ãå Žåã«äœæããã³ãŒããšåãã§ãã
or_else
ã³ã³ãããŒã¿ã䜿çšãããå Žåã¯ãå¥ã®æ¹æ³ã§èšè¿°ããŸãã
let value = await async {
try {
let v = await some_op()?;
let v2 = await v.another_op()?;
await v2.final_op()?
}
}.or_else(|_| backup_op());
value.unwrap()
ãããŠäœããããéåžžã®ã³ãŒããå¥ã®é¢æ°ã«ç§»åããŠããšã©ãŒåŠçã³ãŒããããã«æ確ã«ããããšã§ãã
async fn doit() -> Result<Foo, Bar> {
let v = await some_op()?;
let v2 = await v.another_op()?;
await v2.final_op()
}
let value = await doit().or_else(|_| backup_op());
value.unwrap()
ïŒããã¯@joshtriplettã®ã³ã¡ã³ããžã®è¿ä¿¡ã§ãïŒã
æ確ã«ããããã«ãæ¬åŒ§ãä»ããå¿ èŠã¯ãããŸãããæ¬åŒ§ãªãã§ã¯èªãã®ãé£ãããšèšã人ãããã®ã§ãç§ã¯ããã«ã€ããŠèšåããŸããã ãããã£ãŠãæ¬åŒ§ã¯ãªãã·ã§ã³ã®ã¹ã¿ã€ã«ã®éžæã§ãïŒè€éãªã¯ã³ã©ã€ããŒã«ã®ã¿åœ¹ç«ã¡
ç¶æ³ã«ãã£ãŠã¯ããã¹ãŠã®æ§æãæ¬åŒ§ã®æ©æµãåããŸããã©ã®æ§æãå®å šã§ã¯ãããŸããã
ãŸããããªãã®ã³ã¡ã³ããèªã¿çŽããåŸãããããããªãã¯ç§ãæ¥é èŸawait
ãæå±ããŠãããšæã£ãã®ã§ããïŒ ç§ã¯ããã§ã¯ãããŸããã§ãããç§ã®äŸã¯postfix await
ã ç§ã¯å
šäœçã«æ¥å°ŸèŸawait
ã奜ãã§ãããä»ã®æ§æãããã€ã奜ãã§ãã
ç§ã¯fut.await
ã«æ
£ãå§ããŠããŸãã人ã
ã®æåã®åå¿ã¯ãåŸ
ã£ãŠããããããªããåŸ
ã€æ¹æ³ã§ããïŒå¥åŠãªãã ãããšæããŸãã ãããåŸã§åœŒãã¯äŸ¿å©ã®ããã«ããã奜ãã«ãªãã§ãããã ãã¡ãããåãããšã@await
ã«ãåœãŠã¯ãŸããŸããããã¯ã .await
ãããã¯ããã«éç«ã£ãŠããŸãã
ãã®æ§æã䜿çšãããšãäŸã®ããã€ãã®ã¬ãããçç¥ã§ããŸãã
`.await` | `@ await` |
---|---|
|
|
ããã«ããã ?
ã§äœãã¢ã³ã©ãããããã®ããæ確ã«ãªãã await some_op()?
å Žåã some_op()
ãã¢ã³ã©ãããããã®ããåŸ
æ©äžã®çµæã«ãªãã®ããæ確ã«ãªããŸããã
@Pauan
ç§ã¯ããã§ã®ãããã¯ããçŠç¹ã移ãããšããŠããã®ã§ã¯ãªãããããããã«ã®äžã«ååšããªãããšãææããããšããŠããŸãã ç§ãã¡ã¯ç©äºãã©ã®ããã«é£æºããããèæ ®ããå¿ èŠããããŸãã
çæ³çãªæ§æãéžæããããšããŠããç¶æ³ã«ãã£ãŠã¯ã«ã¹ã¿ã å ç©ãšã³ã³ãããŒã¿ã䜿çšããããšæããŸãã ãããããœããã«éæšå¥šã«ãªãå¯èœæ§ããããšããèãã¯ãRustã®å šäœçãªæ¹åæ§ã«çåãæããããŸãã
ããªããäžããäŸã¯ãã³ã³ãããŒã¿ãŒãšæ¯èŒããŠãŸã ã²ã©ãããã«èŠããŸãããããŠãžã§ãã¬ãŒã¿ãŒã®ãªãŒããŒãããã§ããããå°ãé ããªããããå€ãã®ãã·ã³ã³ãŒããçæããŸãã
åŸ ã£ãŠããéãããã®æ¥é èŸ/æ¥å°ŸèŸã®å°ç« /ããŒã¯ãŒãã®ãã€ã¯ã·ã§ãã£ã³ã°ã¯ãã¹ãŠçŽ æŽãããã§ãããããããç§ãã¡ã¯å®çšçã§ãããRustã«æ¥ããŠãŒã¶ãŒã«æã銎æã¿ã®ããæãåçŽãªãªãã·ã§ã³ãéžæããå¿ èŠããããŸãã ã€ãŸãããã¬ãã£ãã¯ã¹ããŒã¯ãŒã
ä»å¹Žã¯ç§ãã¡ãæã£ãŠãããããæ©ãéããŠããã§ãããã 1æã§ãã»ãšãã©å®äºã§ãã ãŠãŒã¶ãŒããã¬ãã£ãã¯ã¹ããŒã¯ãŒãã«æºè¶³ããŠããªãããšãå€æããå Žåã¯ã2019/2020ãšãã£ã·ã§ã³ã§å€æŽã§ããŸãã ãåŸç¥æµã¯2020幎ããšããåè«ãèšãããšããã§ããŸãã
@novacrazy
ç§ãèŠãäžè¬çãªã³ã³ã»ã³ãµã¹ã¯ã第3çãå¿ èŠãª_æãæ©ã_ã¯2022幎ã§ãããšããããšã§ããç§ãã¡ã¯ééããªãå¥ã®çãèšç»ããããããŸããã 2018幎çã¯çŽ æŽãããã£ãããã³ã¹ããããããªãã£ãããã§ã¯ãªãã£ãã ïŒãããŠã2018幎çã®ãã€ã³ãã®1ã€ã¯ãéåæ/åŸ æ©ãå¯èœã«ããããšã§ãããããåãæ»ããŠããããããä»ãã2020幎çã«ã¢ããã°ã¬ãŒãããå¿ èŠããããŸãïŒããšèšãããšãæ³åããŠãã ããïŒ
ãããã«ãããããšããããæãŸãããšããŠããæ¥é èŸããŒã¯ãŒã->æ¥å°ŸèŸããŒã¯ãŒãã®ç§»è¡ããšãã£ã·ã§ã³ã§å¯èœã§ãããšã¯æããŸããã ãšãã£ã·ã§ã³ã«é¢ããèŠåã¯ãèŠåãªãã«ã³ã³ãã€ã«ããããšãã£ã·ã§ã³X + 1ã§ãåãããã«æ©èœããããã«ããšãã£ã·ã§ã³Xã§æ £çšçãªã³ãŒããèšè¿°ããæ¹æ³ãå¿ èŠã§ãããšããããšã§ãã
å¥ã®ãœãªã¥ãŒã·ã§ã³ã§ã³ã³ã»ã³ãµã¹ãåŸãããšãã§ããã°ãããŒã¯ãŒããã¯ãã§å®å®ãããããªãã®ãšåãçç±ã§ãã æãŸãããªãããšãããã£ãŠãããœãªã¥ãŒã·ã§ã³ãæå³çã«å®å®åããããšèªäœãåé¡ã§ãã
åŸ æ©ãã€ã³ãã1ã€ãããªãåŒã®å Žåã§ããæ¥å°ŸèŸãœãªã¥ãŒã·ã§ã³ãããæé©ã§ããããšã瀺ãããšæããŸãã ããããææ¡ãããæ¥å°ŸèŸãœãªã¥ãŒã·ã§ã³ã®ãããããä»ã®ãã¹ãŠãããæããã«åªããŠãããšã¯æããŸããã
ã¡ããã©ç§ã®2ã»ã³ãïŒç§ã¯èª°ã§ããããŸããããç§ã¯ããªãé·ãéè°è«ã«åŸããŸãïŒã ç§ã®ãæ°ã«å
¥ãã®è§£æ±ºçã¯@await
postfixããŒãžã§ã³ã§ãããã ãã¶ããããã€ãã®æ°ããæ¥å°ŸèŸãã¯ãæ§æã®ããã«ãæ¥å°ŸèŸ!await
æ€èšã§ããŸããïŒ
äŸïŒ
let mut res: InboxResponse = client.get(inbox_url)
.headers(inbox_headers)
.send()!await?
.error_for_status()?
.json()!await?;
æ°åã®èšèªå埩ã®åŸãç¬èªã®æ¥å°ŸèŸãã¯ããå®è£ ã§ããããšã¯çŽ æŽãããããšã§ãã
...ãã¹ãŠã®æ°ããsygilsã®ææ¡
Rustã¯ãã§ã«æ§æ/ sygilãéãã await
ããŒã¯ãŒããäºçŽãããŠããã stuff@await
ïŒãŸãã¯ä»ã®sygilïŒã¯å¥åŠã§éãïŒäž»èŠ³çãç§ã¯ç¥ã£ãŠããŸãïŒããã«èŠããŸãã倧ããªèµ€ãæã§ããèšèªã®ä»ã®ãã®ãšçµ±åããŸããã
Goãã©ã®ããã«å®è£ ããããèŠãŠããŸãã
... <-...ææ¡
@ I60R ïŒGoã«ã¯ã¢ãããã¯ãªãœãªã¥ãŒã·ã§ã³ã§ãã£ã±ãã®ã²ã©ãæ§æããããRustãšã¯éåžžã«ç°ãªããå®å
šã«å¿
é ã§ãã ãã®ææ¡ããŸãããã®ç¹å®ã®æ©èœã®ããã ãã«ãsygil / syntaxãéããå®å
šã«ã¢ãããã¯ã§ãã
@ I60R ïŒGoã®æ§æã¯ã²ã©ã
ããã§ä»ã®èšèªãããã·ã³ã°ããããšã¯æ§ããŸãããã ãXã¯ã²ã©ãæ§æãæã£ãŠãããã¯æããšã³ã³ã»ã³ãµã¹ã«ã€ãªãããŸããã
Python / JavaScript / Rustã®ãŠãŒã¶ãŒã§ãããã³ã³ãã¥ãŒã¿ãŒãµã€ãšã³ã¹ã®åŠçã§ããç§ã¯ãå人çã«ã¯æ¥é èŸawait
+ f.await()
ãäž¡æ¹ã®èšèªã§äœ¿çšããããšã奜ã¿ãŸãã
PythonãšJavaScriptã®äž¡æ¹ã«ãã¬ãã£ãã¯ã¹await
ãŸãã æåã«await
ã衚瀺ããããšæããŸãã ãããéåæã³ãŒãã§ããããšãç解ããããã«è¡ãæ·±ãèªãŸãªããã°ãªããªãå Žåãç§ã¯éåžžã«äžå®ãæããŸãã Rustã®WASMæ©èœã䜿çšãããšãå€ãã®JSéçºè
ãåŒãä»ããå¯èœæ§ããããŸãã Rustã«ã¯ãã§ã«ä»ã«ãããããã®æ°ããæŠå¿µãããããšãèãããšã芪ãã¿ããããšå¿«é©ããæ¬åœã«éèŠã ãšæããŸãã
æ¥å°ŸèŸawait
ã¯ãèšå®ãé£éãããã®ã«äŸ¿å©ãªããã§ãã ãã ãã .await
ã @await
ã f await
ãããªãœãªã¥ãŒã·ã§ã³ã¯ã await
æ§æã®ã¢ãããã¯ãœãªã¥ãŒã·ã§ã³ã®ããã«èŠããŸããã .await()
ãèããã®ã¯çã«ããªã£ãŠãããããå«ãã§ãã future
ã¡ãœãããåŒã³åºããšãã®.await()
future
ã
Rustã¯ãã§ã«javascriptããã®éžè±ã§ãããawaitã¯ãé¢æ°ã䜿çšããŠawaitã瀺ãé¢æ°ãåŒã³åºãïŒã€ãŸããé¢æ°ãä»ããŠãšãã¥ã¬ãŒãã§ããªãïŒãããªãã®ã§ã¯ãªããasync-awaitã«å°å ¥ãããæåã®ã¿ã€ããŒãæ··ä¹±ãããŸãã ãããã£ãŠãæ§æã¯ç°ãªãã¯ãã ãšæããŸãã
.await()
ã¯ãããã.await
ãããã¯ããã«æãŸãããšç§ã¯ç¢ºä¿¡ããŸãããããã®æçš¿ã®æ®ãã®éšåã¯ãã®äœçœ®ãå°ããããžããŠããŸãã
ããã¯ã await!(fut)
ã_å€ã§fut
ãæ¶è²»ããå¿
èŠãããããã§ã_ã ãã£ãŒã«ãã¢ã¯ã»ã¹ã®ããã«èŠããããšã¯_bad_ã§ããããã¯ããã¬ãã£ãã¯ã¹ããŒã¯ãŒãã®ããã«ç§»åãããšããæå³ããªãããã¯ããã¡ãœããåŒã³åºãã®ããã«ç§»åããå¯èœæ§ããªãããã§ãã
èå³æ·±ãããšã«ãããŒã¯ãŒãã¡ãœããã®æ§æã«ãããæé»ã®åŸ
æ©èšèšã®ããã«èŠããŸãã æ®å¿µãªããã async fn() -> T
ãfn() -> Future<T>
ãšåãããã«äœ¿çšãããã®ã§ãRustã§ã¯ãæ瀺çãªéåæãæé»ã®åŸ
æ©ãã¯ã§ããŸããïŒãããã£ãŠããã®ã¹ã¬ããã§å蚎èšããªãã§ãã ããïŒã ãæé»ã®åŸ
æ©ãåäœãã¢ã¯ãã£ãã«ããã®ã§ã¯ãªãã
.await()
æ§æãïŒKotlinã䜿çšãããããªïŒæé»ã®åŸ
æ©ã·ã¹ãã ã®ããã«èŠãããšããäºå®ã¯ãäžå·ã«ãªãå¯èœæ§ããããnot-ã®åšãã®éæ³ã®ããã«ãæé»ã®éåæãæé»ã®åŸ
æ©ãã®æèŠãã»ãšãã©äžããŸããæ¬åœã«ã¡ãœããåŒã³åºã.await()
æ§æã ãããUFCSã§await(fut)
ãšããŠäœ¿çšã§ããŸããïŒ UFCSã®å Žåã¯Future::await(fut)
ã«ãªããŸããïŒ èšèªã®å¥ã®æ¬¡å
ã®ããã«èŠããæ§æã¯ãæ©èœçã§ãªããŠããå°ãªããšãæ§æçã«ããçšåºŠçµ±äžã§ããªãéããåé¡ãåŒãèµ·ãããŸãã
åŸçœ®ãœãªã¥ãŒã·ã§ã³ã®æŠå¿µã¯äžè¬ã«æ¥é èŸãœãªã¥ãŒã·ã§ã³ã®æŠå¿µãããæãŸãããã®ã®ã_åå¥ã®_åŸçœ®ãœãªã¥ãŒã·ã§ã³ã®å©ç¹ãåããœãªã¥ãŒã·ã§ã³ã®æ¬ ç¹ãäžåã£ãŠããå Žåãç§ã¯æççã§ãã
ãã®ã¹ã¬ããããæåã®ææ¡ããã倧ããªã¡ãªãããããããããã«èŠããããã§ã¯ãªããå¯èœã§ããããã«è¡ãããããã«èŠããææ¡ã§ãã£ã±ãã§ããããšã«å°ãé©ããŠããŸãã
$
ã #
ã @
ã !
ã ~
ãªã©ã«ã€ããŠãäœãæªãã®ããšããéèŠãªè°è«ãããããšãªã話ãã®ããããããšã¯ã§ããŸããïŒ await
ãããã¯ããç解ãããŠãããä»ã®ããŸããŸãªããã°ã©ãã³ã°èšèªã§èšŒæãããŠããŸããïŒ
https://github.com/rust-lang/rust/issues/57640#issuecomment -455361619ããã®æçš¿ã«ã¯ããã§ã«ãã¹ãŠã®é©åãªãªãã·ã§ã³ããªã¹ããããŠãããšæããŸãã
ãããããïŒ
client.get("url").send() await?.json()?
ã éã«ãããã®ç©ºçœã¯ãå Žéãã«èŠããŸãã ãã£ãã䜿çšãããšãç§ã«ãšã£ãŠããå°ãæå³ããããŸãïŒ (client.get("url").send() await)?.json()?
await
ã¯éåžžã«è€éãªæäœãå®è¡ããŸã-Rustã«ã¯èšç®å¯èœãªããããã£ããªãããã£ãŒã«ãã¢ã¯ã»ã¹ã¯ãã以å€ã®å Žåã¯éåžžã«åçŽãªæäœã§ãã ãããã£ãŠããã®æäœã®è€éãã«ã€ããŠééã£ãå°è±¡ãäžããããã§ãããããã®çç±ãããç§ã¯ãæçšãªåªå é äœãã®åŸã«ãå¿ é ã®åºåãæåããç¶ãããšã奜ã¿ãŸã
Goã«ã¯ãã¢ãããã¯ãœãªã¥ãŒã·ã§ã³ã§ãã£ã±ãã®ã²ã©ãæ§æããããRustãšã¯éåžžã«ç°ãªããå®å šã«å¿ é ã§ãã ãã®ææ¡ããŸãããã®ç¹å®ã®æ©èœã®ããã ãã«ãsygil / syntaxãéããå®å šã«ã¢ãããã¯ã§ãã
@dpc ã <--
ææ¡ãå®å
šã«èªãã å Žåããã®æ§æã¯Goã«ã®ã¿è§ŠçºãããŠããããšãããããŸãããåœä»€åãšé¢æ°ãã§ãŒã³ã®ã©ã¡ãã®ã³ã³ããã¹ãã§ãããªãç°ãªãã䜿çšã§ããŸãã ãŸãã await
æ§æãã¢ãããã¯ãªè§£æ±ºçã§ã¯ãªãããšãããããŸãããç§ã«ãšã£ãŠã¯ã <--
ãããã¯ããã«å
·äœçã§äžåšçšã§ãã ããã¯ã *reference
代ããã«deref reference
/ reference.deref
/ etcã䜿çšãããã result?
代ããã«try result
/ result.try
/ etcã䜿çšããã®ãšäŒŒãŠããŸãã result?
ã JS / Python / etcã«ç²ŸéããŠããããšä»¥å€ã«ã await
ããŒã¯ãŒãã䜿çšããå©ç¹ã¯èŠåœãããŸãããããã¯ãäžè²«æ§ã®ããæ§æå¯èœãªæ§æãããéèŠæ§ãäœãã¯ãã§ãã ãããŠã <--
å°ç« ãæã£ãŠããããšã®äžå©ãªç¹ã¯ããããawait
ã§ã¯ãªãããšãé€ããŠã¯èŠãããŸããã
ç·šéïŒããã@ Matthias247ã®æçš¿ã«å¯Ÿããè¯ãçãã«ãªãå¯èœæ§ããããŸããããã¯ã await
ã«å¯Ÿããããã€ãã®è°è«ãæäŸããåãåé¡ã®åœ±é¿ãåããªãå¯èœãªä»£æ¿æ¡ãææ¡ããããã§ãã
æŽå²çã§åèŠã®ããçç±ã«èšŽããè°è«ãã解æŸãããŠã <--
æ§æã«å¯Ÿããæ¹è©ãèªãããšã¯ãç§ã«ãšã£ãŠæ¬åœã«èå³æ·±ãããšã§ãã
åªå é äœã«é¢ããå®éã®è©³çŽ°ã«ã€ããŠèª¬æããŸãããã
åªå é äœãã£ãŒããããä»æ¥ç«ã£ãŠããããïŒ
æŒç®å/åŒ| çµåæ§
-| -
ãã¹|
ã¡ãœããåŒã³åºã|
ãã£ãŒã«ãåŒ| å·Šããå³ãž
é¢æ°åŒã³åºããé
åã€ã³ããã¯ã¹|
?
|
åé
-
*
!
&
&mut
|
as
| å·Šããå³ãž
*
/
%
| å·Šããå³ãž
+
-
| å·Šããå³ãž
<<
>>
| å·Šããå³ãž
&
| å·Šããå³ãž
^
| å·Šããå³ãž
\|
| å·Šããå³ãž
==
!=
<
>
<=
>=
| æ¬åŒ§ãå¿
èŠ
&&
| å·Šããå³ãž
\|\|
| å·Šããå³ãž
..
..=
| æ¬åŒ§ãå¿
èŠ
=
+=
-=
*=
/=
%=
&=
\|=
^=
<<=
>>=
| å³ããå·Šãž
return
break
ã¯ããŒãžã£|
䟿å©ãªåªå
é äœã¯await
ã?
await
åã«çœ®ãã®ã§ã ?
ãããç·å¯ã«ãã€ã³ããããŸãã ãããã£ãŠããã§ãŒã³å
ã®?
ã¯ã `awaitããã®åã®ãã¹ãŠã«ãã€ã³ãããŸãã
let res = await client
.get("url")
.send()?
.json();
ã¯ãã䟿å©ãªåªå é äœã§ãããã¯ãæ£ããæ©èœããŸããã ãããäžç®ã§äœããããç¥ã£ãŠããŸããïŒ ããã¯ïŒããããïŒæªãã¹ã¿ã€ã«ã§ããïŒ ãããããªããrustfmtã¯ãããèªåçã«ä¿®æ£ã§ããŸããïŒ
æãããªåªå
é äœã«ããã await
?
ãã_ã©ãã_äžã«ãªããŸãã æ£ç¢ºãªå Žæã¯ããããŸãããããããã®è©³çŽ°ã¯ããããããã»ã©éèŠã§ã¯ãããŸããã
let res = await? (client
.get("url")
.send())
.json();
ãããäžç®ã§äœããããç¥ã£ãŠããŸããïŒ rustfmtã¯ãåçŽæ¹åãšæ°Žå¹³æ¹åã®ã¹ããŒã¹ãèªåçã«ç¡é§ã«ããªã䟿å©ãªã¹ã¿ã€ã«ã«ããããšãã§ããŸããïŒ
åŸçœ®ããŒã¯ãŒãã¯ããã®ã©ãã«è©²åœããŸããïŒ ãããããã¡ãœããåŒã³åºãã䜿çšããããŒã¯ãŒãã¡ãœãããšãã£ãŒã«ãåŒã䜿çšããããŒã¯ãŒããã£ãŒã«ãã§ãããä»ã®ã¡ãœãããã©ã®ããã«ãã€ã³ãããå¿
èŠãããã®ãââããããŸããã await
ãé©ãã¹ããè°è«ããåãåãå¯èœæ§ã®äœãæ§æã«ã€ãªãããªãã·ã§ã³ã¯äœã§ããïŒ
ãã®æ¯èŒã§ã¯ããå¿ é ã®åºåãæåãïŒèŠçŽã§
@ CAD97æ確ã«ããããã«ã .json()
ãæªæ¥ã§ããããšãå¿ããªãã§ãã ããïŒå°ãªããšãreqwests
ã§ã¯ïŒã
let res = await await client
.get("url")
.send()?
.json()?;
let res = await? await? (client
.get("url")
.send())
.json();
è€éãªéã®åŒãå€æããããšã§éã¶ã»ã©ïŒãã ãã1ã€ã®åŸ æ©ãå¿ èŠãªãã®ã§ãã20,000以äžã®å°æ¥ã®ã³ãŒãããŒã¹ã§ã¯ãã»ãŒãã¹ãŠã®éåæåŒãåŸ æ©ãããã®çŽåŸã«å¥ã®åŸ æ©ãç¶ãããšã«æ³šæããŠãã ããïŒãå«ãã«ãªããŸãã Rustã®ãã¬ãã£ãã¯ã¹ã
?
æŒç®åããããããããã¯_all_ã§ãã ä»ã®èšèªã«ã¯ãåºæ¬çã«åžžã«å®éã®ã³ãŒãã§ãã¢ã«ãªã£ãŠããæ¥å°ŸèŸå¶åŸ¡ãããŒæŒç®å_ããã³_ await
ããããŸããã
ç§ã®å¥œã¿ã¯ãŸã æ¥å°ŸèŸãã£ãŒã«ãã§ãã æ¥å°ŸèŸå¶åŸ¡æŒç®åãšããŠã future.await
ãfuture await
以äžãæäŸããå³å¯ãªèŠèŠçã°ã«ãŒãåãå¿
èŠã ãšæããŸãã ãããŠã .await()?
ãšæ¯èŒããŠã .await?
ã_å¥åŠãª_ããã«èŠããã®ã§ã_æ°ã¥ãã_ããŠãŒã¶ãŒã¯ãããåçŽãªé¢æ°ã§ãããšã¯æããªãã§ãããïŒãããã£ãŠãUFCSãæ©èœããªãçç±ãå°ããŸããïŒ ã
åŸçœ®ãæ¯æãããã1ã€ã®ããŒã¿ãã€ã³ããšããŠããããå®å®ãããã rustfix
ãawait!(...)
ããç§ãã¡ã決å®ãããã®ã«ç§»åããããšãéåžžã«é«ãè©äŸ¡ããŸãã ( ... )
äžå¿
èŠã«ã©ããããããšãªããæ¥å°ŸèŸæ§æ以å€ã®äœãæ確ã«ç¿»èš³ã§ããæ¹æ³ãããããŸããã
æåã«ãããã§ãŒã³ã³ã³ããã¹ãã§await
䜿çšã奚å±ãããã§ããïŒããšãã質åã«çããå¿
èŠããããšæããŸãã äžè¬çãªçãã¯ãã¯ããã ãšæãã®ã§ãåŸçœ®ããªã¢ã³ãã®åŒ·åãªè°è«ã«ãªããŸãã await!(..)
ãè¿œå ããã®ãæãç°¡åã§ããã try!(..)
話ãç¹°ãè¿ãã¹ãã§ã¯ãªããšæããŸãã ãŸãããé£éã¯æœåšçã«ã³ã¹ãã®ãããæäœãé ãããšããè°è«ã«ãå人çã«åæããŸããããã§ã«å€ãã®é£éæ¹æ³ããããéåžžã«éãå¯èœæ§ããããããé£éã¯æ æ°ã䌎ããŸããã
ãã¬ãã£ãã¯ã¹await
ããŒã¯ãŒãã¯ä»ã®èšèªã䜿çšãããŠãŒã¶ãŒã«ãšã£ãŠæã銎æã¿æ·±ããã®ã§ãããããã«åºã¥ããŠæ±ºå®ããå¿
èŠã¯ãªããšæããŸãã代ããã«ã䜿ãããããå©äŸ¿æ§ãèªã¿ããããªã©ãããé·æçãªãã®ã«éäžããå¿
èŠããããŸãã ã @withoutboatsã¯ã芪ãã¿ãããã®äºç®ãã«ã€ããŠ
ä»ãç§ãã¡ã¯ããããåãããšããã2ã€ã®æ¹æ³ãæãŸãªãã®ã§ãæ¥å°ŸèŸãšæ¥é èŸã®äž¡æ¹ã®ããªã¢ã³ããå°å ¥ããã¹ãã§ã¯ãããŸããã ãããã£ãŠããªãã·ã§ã³ãæ¥å°ŸèŸã®ããªã¢ã³ãã«çµã蟌ãã ãšããŸãããã
ãŸãã fut await
ããå§ããŸãããããã®ããªã¢ã³ãã¯ã人éãã³ãŒãã解æããæ¹æ³ãæ·±å»ã«æ··ä¹±ãããã³ãŒããèªã¿åãéã«åžžã«æ··ä¹±ãæããããéåžžã«å«ãã§ãã ïŒã³ãŒãã¯äž»ã«èªã¿åãçšã§ããããšãå¿ããªãã§ãã ããïŒ
次ã®fut.await
ã fut.await()
ã fut.await!()
ã æãäžè²«æ§ããããæ··ä¹±ã®å°ãªãããªã¢ã³ãã¯ãæ¥å°ŸèŸãã¯ãã®ãã®ã«ãªããšæããŸãã ããã€ãã®æåãç¯çŽããããã ãã«ãæ°ãããããŒã¯ãŒãé¢æ°ããŸãã¯ãããŒã¯ãŒãã¡ãœããããšã³ãã£ãã£ãå°å
¥ãã䟡å€ã¯ãªããšæããŸãã
æåŸã«ãå°ç« ããŒã¹ã®ããªã¢ã³ãïŒ fut@await
ããã³fut@
ã fut@await
ããªãšãŒã·ã§ã³ã奜ãã§ã¯ãããŸãããå°ç« ã玹ä»ãããšããªãawait
éšåã«ç
©ããããã®ã§ããããã å°æ¥ã®æ¡åŒµfut@something
èšç»ã¯ãããŸããïŒ ããã§ãªããã°ãããã¯åã«åé·ã«æããŸãã ã ããç§ã¯fut@
ããªã¢ã³ãã奜ãã§ããããã¯åªå
é äœã®åé¡ã解決ããã³ãŒãã¯ç解ãããããæžãããããèªã¿ããããªããŸãã å¯èŠæ§ã®åé¡ã¯ãã³ãŒãã®åŒ·èª¿è¡šç€ºã«ãã£ãŠè§£æ±ºã§ããŸãã ãã®æ©èœãã@forawaitããšèª¬æããã®ã¯é£ããããšã§ã¯ãããŸããã ãã¡ãããæ倧ã®æ¬ ç¹ã¯ãéåžžã«éããããå°ç« äºç®ããããã®æ©èœã®æéãæ¯æãããšã§ãããæ©èœã®éèŠæ§ãšéåæã³ãŒãããŒã¹ã§äœ¿çšãããé »åºŠãèæ
®ãããšãé·æçã«ã¯äŸ¡å€ããããšæããŸãã ãããŠãã¡ããã ?
ã§ç¹å®ã®é¡äŒŒç¹ãæãããšãã§ããŸãã ïŒãã ããRustæ¹è©å®¶ããã®Perlãžã§ãŒã¯ã«åããå¿
èŠããããŸãïŒ
çµè«ïŒç§ã®æèŠã§ã¯ããå°ç« äºç®ãã«è² æ
ããããæºåãã§ããŠããå Žåã¯fut@
ã䜿çšããããã§ãªãå Žåã¯fut.await!()
ãŸãã
Rustã¯ããããç°ãªãããã§ã«å€ãã®ç¹ã§ç°ãªã£ãŠèŠããããã芪ãã¿ãããã«ã€ããŠè©±ããšããJS / Python / CïŒã®èŠªãã¿ãããã«ã€ããŠããŸãæ°ã«ããå¿ èŠã¯ãªããšæããŸãã ãããã®èšèªã«é¡äŒŒããæ§æãæäŸããããšã¯ãçæçã§äœå ±é ¬ã®ç®æšã§ãã Rustãå®å šã«ç°ãªãåäœãããå Žåã䜿ãæ £ããããŒã¯ãŒãã䜿çšããããã ãã«Rustãéžæããããšã¯ãããŸããã
ããããRustã¯åæ§ã®ãããã§ãããå²åŠã«ãã£ãŠãããä»ã®èšèªãããGoã«è¿ããããGoã«ç²ŸéããŠããããšãéèŠã§ãã ãããŠãåèŠã®ããæãã¿ã®ãã¹ãŠã«ãããããããäž¡æ¹ã®æ倧ã®ãã€ã³ãã®1ã€ã¯ãæ©èœãç²ç®çã«ã³ããŒããã®ã§ã¯ãªããæ¬åœã«çç±ã®ãããœãªã¥ãŒã·ã§ã³ãå®è£ ããããšã§ãã
IMOããã®æå³ã§<--
æ§æã¯ããã§æã匷åã§ã
ããã§ããRuståŒã¯ããã€ãã®é£éã¡ãœããã«ãªãå¯èœæ§ãããããšãå¿ããªãã§ãã ããã ã»ãšãã©ã®èšèªã¯ããããªãåŸåããããŸãã
CïŒéçºããŒã ã®çµéšãæãåºããããïŒ
CïŒæ§æã«å¯Ÿããäž»ãªèæ ®äºé ã¯ãæŒç®åã®åªå é äœãfooãåŸ ã€ããšã§ãã
ããã¯ç§ãã³ã¡ã³ãã§ãããããªæ°ãããŸãã 'await'ã§åªå é äœãããèããå¿ èŠãªãã©ãŒã ãèšå®ããåã«å€ãã®ãã©ãŒã ãè©ŠããŸããã ç§ãã¡ãèŠã€ããäžå¿çãªããšã®1ã€ã¯ããã®æ©èœã䜿çšããããšæã£ãŠããç§ãã¡ãšé¡§å®¢ïŒå éšããã³å€éšïŒã«ãšã£ãŠãéåæåŒã³åºããè¶ ããŠäœããããã§ãŒã³ãããããšæãããšã¯ãã£ãã«ãããŸããã§ããã
exprå ã§ãawaitãã䜿çšããŠãç¶è¡ãããããšããåŸåã¯ãŸãã§ããã ïŒawait exprïŒ.MïŒïŒã®ãããªãã®ãæã èŠãããŸããããããã¯expr.MïŒïŒãåŸ ã€äººã®æ°ãããäžè¬çã§ã¯ãªãæãŸãããªãããã§ãã
ãããŠ
ãããããawaitãã«ãæé»ã®ã圢åŒã䜿çšããªãã£ãçç±ã§ããããŸãã å®éã«ã¯ãããã¯äººã ãéåžžã«æ確ã«èããããšæã£ãŠãããã®ã§ããã圌ããããã«æ³šæãæãããšãã§ããããã«ã³ãŒãã®äžå¿ã«çœ®ããããšæã£ãŠããŸããã èå³æ·±ãããšã«ãæ°å¹ŽåŸããã®åŸåã¯ç¶ããŠããŸãã ã€ãŸããäœå¹ŽãåŸã«ãäœããé床ã«åé·ã§ããããšãåŸæããããšããããŸãã ããã€ãã®æ©èœã¯æ©ã段éã§ãã®ããã«åªããŠããŸããã人ã ãããã«æ £ããããäœãããç°¡æœãªãã®ã«é©ããŠããŸãã 'await'ã®å Žåã¯ããã§ã¯ãã
å°çšã®ïŒããŒã¯ãŒãïŒåèªã§ã¯ãªããå°ç« ã«å¯Ÿããè¯ãç¹ã§ãã
https://github.com/rust-lang/rust/issues/50547#issuecomment -388939886
ããªãã¯æ¬åœã«äœçŸäžãã®ãŠãŒã¶ãŒãæã€äººã«è³ãåŸããã¹ãã§ãã
ãããã£ãŠãäœããã§ãŒã³ããããªããããã€ãã®await
ãå¿
èŠãªã ãã§ãç§ã®çµéšã¯åãã§ãã async/await
ã³ãŒãã6幎以äžäœæããŠããŠããã®ãããªæ©èœã¯å¿
èŠãããŸããã§ããã æ¥å°ŸèŸã®æ§æã¯æ¬åœã«ç°è³ªã«èŠãã決ããŠèµ·ãããªãå¯èœæ§ãé«ãç¶æ³ã解決ãããšèããããŠããŸãã Async
åŒã³åºãã¯æ¬åœã«å€§èãªãã®ãªã®ã§ã1è¡ã§è€æ°ã®åŸ
æ©ãéãããŸãã
exprå ã§ãawaitãã䜿çšããŠãç¶è¡ãããããšããåŸåã¯ãŸãã§ããã ïŒawait exprïŒ.MïŒïŒã®ãããªãã®ãæã èŠãããŸããããããã¯expr.MïŒïŒãåŸ ã€äººã®æ°ãããäžè¬çã§ã¯ãªãæãŸãããªãããã§ãã
ããã¯äºåŸåæã®ããã§ãã ãããããç¶è¡ããªãçç±ã®1ã€ã¯ããã¬ãã£ãã¯ã¹æ§æã§ç¶è¡ããã®ãéåžžã«åä»ãªããã§ãïŒæŒç®å?
èªã¿åãå¯èœãªãŸãŸã§ãããããã¹ããŒãã¡ã³ãã§try!
è€æ°åå®è¡ããããªãå Žåãšæ¯èŒããŠïŒ ?
ïŒã äžèšã¯äž»ã«ïŒç§ãç¥ãéãïŒåªå
é äœã§ã¯ãªããåªå
é äœãèæ
®ããŠããŸãã ãŸããCïŒã¯Rustã§ã¯ãªãããã¬ã€ãã¡ã³ããŒã¯çµæã®ã¡ãœãããåŒã³åºããããšãã欲æ±ãããªãå€ããå¯èœæ§ãããããšãæãåºããŠãã ããã
@ I60R ã
.await!()
ïŒã ãã¬ãã£ãã¯ã¹åœ¢åŒã§ã¯ãéçºè
ã¯æ¬¡ã®ããã«ããã§ãŒã³ã§ã¯ãªãã¡ãœããã«ã³ãŒããæœåºããå¿
èŠããããŸããlet resp = await client.get("http://api")?;
let body: MyResponse = await resp.into_json()?;
ãã®ãããªãã®ã«ïŒ
let body: MyResponse = await client.get_json("http://api")?;
ããã¯äºåŸåæã®ããã§ãã ãããããããããç¶ç¶ããªãçç±ã®1ã€ã¯ããã¬ãã£ãã¯ã¹æ§æã§ããããããšãéåžžã«åä»ã ããã§ãã äžèšã¯ãäœçœ®ã§ã¯ãªããåªå é äœã®ã¿ãèæ ®ããŠããŸãã ãŸããCïŒã¯Rustã§ã¯ãªãããã¬ã€ãã¡ã³ããŒã¯çµæã®ã¡ãœãããåŒã³åºããããšãã欲æ±ãããªãå€ããå¯èœæ§ãããããšãæãåºããŠãã ããã
ãããããã¬ãã£ãã¯ã¹/ãã¹ããã£ãã¯ã¹/æé»ã®åœ¢åŒã®äž¡æ¹ãããå Žåã®å éšCïŒããŒã ã®å®éšã«é¢ãããã®ã§ãã ãããŠãç§ã¯æ¥å°ŸèŸãã©ãŒã ã®ãããèŠãããšãã§ããªããšããåãªãç¿æ £ã§ã¯ãªãç§ã®çµéšã«ã€ããŠè©±ããŠããã
@mehcodeããªãã®äŸã¯ç§ãããæ°ã«ãããŸããã reqwest
ã¯ãæåã®èŠæ±/å¿çãµã€ã¯ã«ãšããã«ç¶ãå¿çïŒããã£ã¹ããªãŒã ïŒã®åŠçãå¥ã
ã®äžŠè¡ããã»ã¹ã«ããããšãæèçã«æ±ºå®ããããã åŸ
æ©ããå¿
èŠããããŸãã
reqwest
ã¯ã次ã®APIãå®å
šã«å
¬éããå¯èœæ§ããããŸãã
let res = await client
.get("url")
.json()
.send();
ãŸãã¯
let res = await client
.get("url")
.send()
.json();
ïŒåŸè
ã¯and_then
è¶
ããåç³ã§ãïŒã
reqwest
ãšhyper
ã®æè¯ã®API決å®ã¯ããããå¥ã
ã«ä¿ã€ããšã§ãããããããã§ã®æ¥å°ŸèŸã®äŸã®å€ãããã®ãã§ãŒã³ãäŸãšããŠäœ¿çšããŠããã®ã¯åä»ã§ãã
ããã§ã®ã»ãšãã©ã®æ¥å°ŸèŸåŸ æ©ã®äŸã¯ãã³ã³ãããŒã¿ïŒããã³å¿ èŠã«å¿ããŠç ç³ïŒã䜿çšããŠæžãçŽãããåæ§ã®æäœãç¶ããŠè€æ°ååŸ æ©ããå¿ èŠããããšæ£çŽã«ä¿¡ããŠããŸãã
@andreytkachenko
ãã¬ãã£ãã¯ã¹åœ¢åŒã§ã¯ãéçºè ã¯æ¬¡ã®ããã«ããã§ãŒã³ã§ã¯ãªãã¡ãœããã«ã³ãŒããæœåºããå¿ èŠããããŸãã
ããã¯è¯ãããšã§ãããæªãããšã§ããïŒ Nåã®ã¡ãœãããããããããããMåã®ãã©ããŒã¢ãããããããå¯èœæ§ãããå Žåãéçºè
ã¯N * M
ã¡ãœãããæäŸããããšã«ãªã£ãŠããŸããïŒ å人çã«ã¯ãå°ãé·ããŠããæ§æå¯èœãªãœãªã¥ãŒã·ã§ã³ã奜ãã§ãã
ãã®ãããªãã®ã«ïŒ
let body: MyResponse = await client.get_json("http://api")?;
let body: MyResponse = client.get("http://api").await?.into_json().await?;
@Pzixel
CïŒã§ã¯ãRustã®å Žåã»ã©å€ãã®é£é/é¢æ°åã³ãŒããååŸã§ãããšã¯æããŸããã ãããšãç§ã¯ééã£ãŠããŸããïŒ ããã«ãããCïŒéçºè /ãŠãŒã¶ãŒã®çµéšã¯èå³æ·±ããã®ã«ãªããŸãããå¿ ãããRustã«é©çšã§ãããšã¯éããŸããã OcamlãHaskellãšå¯Ÿæ¯ã§ãããããã®ã«ãšæããŸãã
ãããæèŠã®çžéã®æ ¹æ¬çãªåå ã ãšæããŸããç§ãã¡ã®äžã«ã¯åœä»€åã®ã¹ã¿ã€ã«ã楜ããã§ãã人ãããã°ãæ©èœçãªã¹ã¿ã€ã«ã楜ããã§ãã人ãããŸãã 以äžã§ãã Rustã¯äž¡æ¹ããµããŒãããŠãããè°è«ã®äž¡åŽã¯ãéåæãéåžžã®ã³ãŒãã®èšè¿°æ¹æ³ã«ããŸãé©åããããšãæãã§ããŸãã
@dpc
CïŒã§ã¯ãRustã®å Žåã»ã©å€ãã®é£é/é¢æ°åã³ãŒããååŸã§ãããšã¯æããŸããã ãããšãç§ã¯ééã£ãŠããŸããïŒ ããã«ãããCïŒéçºè /ãŠãŒã¶ãŒã®çµéšã¯èå³æ·±ããã®ã«ãªããŸãããå¿ ãããRustã«é©çšã§ãããšã¯éããŸããã OcamlãHaskellãšå¯Ÿæ¯ã§ãããããã®ã«ãšæããŸãã
LINQãšæ©èœã¹ã¿ã€ã«ã¯CïŒã§ããªã人æ°ããããŸãã
@dpc ã
èªã¿ãããã«ã€ããŠã¯ãã³ãŒããæ瀺çã§ãããšåããããåªããŠããŸããç§ã®çµéšã§ã¯ãã¡ãœãã/é¢æ°ã®ååãèªå·±èšè¿°çã§ããå Žåã¯ããã©ããŒã¢ãããè¡ãå¿
èŠã¯ãããŸããã
ãªãŒããŒãããã«ã€ããŠã®å Žå-Rustã³ã³ãã€ã©ã¯ããããã€ã³ã©ã€ã³åããã®ãããªãè³¢ãã§ãïŒãšã«ããç§ãã¡ã¯åžžã«#[inline]
æã£ãŠããŸãïŒã
@dpc
let body: MyResponse = client.get("http://api").await?.into_json().await?;
ç§ã®æãã§ã¯ãããã¯åºæ¬çã«futures APIã®åé¡ãç¹°ãè¿ããŸãããã§ãŒã³ã¯ç°¡åã«ãªããŸããããã®ãã§ãŒã³ã®ã¿ã€ãã¯æµžéããŠãããã°ããã®ãã¯ããã«é£ãããªããŸãã
åãè°è«ãïŒã«ãåœãŠã¯ãŸããŸãããïŒ ã§ããªãã¬ãŒã¿ãŒïŒ ããã«ãããããå€ãã®é£éãå¯èœã«ãªãããããã°ãå°é£ã«ãªããŸãã ãããããªãç§ãã¡ã¯éžãã ã®ã§ããïŒ ããéãïŒ ãããªãïŒ ãããŠããªãRustã¯ãã«ããŒãã¿ãŒã³ã®APIã奜ãã®ã§ããïŒ ãã®ãããRustã¯ãAPIã§ã®ãã§ãŒã³ãæ¯æããå€ãã®éžæããã§ã«è¡ã£ãŠããŸãã ã¯ããããã¯ãããã°ãé£ãããããããããŸããããããã¯ç³žããã¬ãã«ã§èµ·ããã¹ãã§ã¯ãããŸãã-å€å倧ãããããã§ãŒã³ã®ããã®ã¯ãªãããŒã®ããã®æ°ãã糞ããïŒ ããã§ã®åŸ æ©ã®éãã«ã€ããŠã¯ããŸã ååãªåæ©ä»ããå¿ èŠã§ãã
ããã¯è¯ãããšã§ãããæªãããšã§ããïŒ Nåã®ã¡ãœãããããããããããMåã®ãã©ããŒã¢ãããããããå¯èœæ§ãããå Žåãéçºè ã¯
N * M
ã¡ãœãããæäŸããããšã«ãªã£ãŠããŸããïŒ å人çã«ã¯ãå°ãé·ããŠããæ§æå¯èœãªãœãªã¥ãŒã·ã§ã³ã奜ãã§ãã
NãšMã¯å¿ ããã倧ããããã§ã¯ãªãããã¹ãŠãé¢å¿ã®ãã/æœåºã«åœ¹ç«ã€ãšã¯éããŸããã
@andreytkachenko ã
ç§ã¯åæããŸããã芪ãã¿ãããã¯ããã§é倧è©äŸ¡ãããŠããŸãã ä»ã®èšèªãã移è¡ãããšããæåã®äººã
ã¯async-await
ã¹ã¿ã€ã«ã®ããã°ã©ãã³ã°ãè¡ãèœåãæ±ããŸããããŸã£ããåãæ§æã§ã¯ãããŸããã å®è£
æ¹æ³ãç°ãªãããããã«ãã£ãŠããã°ã©ãã³ã°ãšã¯ã¹ããªãšã³ã¹ãåäžããå Žåã¯ãããã«å¥ã®å©ç¹ã«ãªããŸãã
é·ããã§ãŒã³ããããã°ã§ããªãããšã¯ãã³ãŒãã¹ã¿ã€ã«ã§ã¯ãªããããã¬ãŒã®å¶éã§ãã èªã¿ãããã«ã€ããŠã¯ç¶æ³æ¬¡ç¬¬ã ãšæããŸãããããã§ã¯åœä»€åã匷å¶ããããšã¯äžå¿
èŠã«å¶éãããŠããŸãã async
é¢æ°åŒã³åºãããŸã é¢æ°åŒã³åºãã§ããå Žåããã§ãŒã³ããµããŒãããªãã®ã¯é©ãã¹ãããšã§ãã ãšã«ããã <--
ã¯ãè¿œå ãªãã·ã§ã³ãšããŠé¢æ°ãã§ãŒã³ã§äœ¿çšã§ãããã¬ãã£ãã¯ã¹æŒç®åã§ãã
@skadeåæããŸããã
åŸ æ©ã®é·ããã§ãŒã³ãæã€ãã¹ãŠã®äŸã¯ãã³ãŒãã®èãã§ãã ãããã®ãžã§ãã¬ãŒã¿ãŒã¹ãã²ããã£ã¹ããŒããã·ã³ãå éšã§äœæããã®ã§ã¯ãªããã³ã³ãããŒã¿ãŒãŸãã¯æŽæ°ãããAPIã䜿çšããŠã¯ããã«ãšã¬ã¬ã³ãã«è§£æ±ºã§ããŸãã 極端ãªçç¥æ§æã¯ãçŸåšã®å°æ¥ãããããã«é£ãããããã°ã®ã¬ã·ãã§ãã
ç§ã¯ãŸã ãã¬ãã£ãã¯ã¹ããŒã¯ãŒãawait
ãšãã¯ãawait!(...)
/ .await!()
ã®äž¡æ¹ã®ãã¡ã³ã§async
ãš#[async]
ãžã§ãã¬ãŒã¿ãŒé¢æ°ãšçµã¿åãããŠããŸããããã«ç§ã®ã³ã¡ã³ã
ãã¹ãŠãããŸãããã°ããã¬ãã£ãã¯ã¹ãšãµãã£ãã¯ã¹ã®äž¡æ¹ãåŠçããããã«await!
ã«å¯ŸããŠåäžã®ãã¯ããäœæã§ãã await
ããŒã¯ãŒãã¯async
é¢æ°å
ã®ããŒã¯ãŒãã«ãªããŸãã
@skade ã
ç§ã«ãšã£ãŠã future
ã³ã³ãããŒã¿ã䜿çšããããšã®å€§ããªæ¬ ç¹ã¯ãã³ã³ãããŒã¿ãasync
é¢æ°åŒã³åºããé衚瀺ã«ããéåžžã®é¢æ°ãšåºå¥ã§ããªãããšã§ãã ãã«ããŒã¹ã¿ã€ã«ã®ãã§ãŒã³å
ã§äœ¿çšãããå¯èœæ§ãéåžžã«é«ãããããã¹ãŠã®ãµã¹ãã³ãå¯èœãªãã€ã³ãã確èªããããšæããŸãã
@ I60Rã®é·ãåŒã³åºããã§ãŒã³ã®ãããã°ã¯ããããã¬ãŒã®åé¡ã§ã¯ãããŸããããããã®ãã§ãŒã³ã®èšè¿°ã«é¢ããåé¡ã¯ãåæšè«ãæ£ããè¡ãããšã ããã§ãã ãããã®ã¡ãœããã®å€ãããžã§ããªãã¯ãã©ã¡ãŒã¿ãŒãåãåããã¯ããŒãžã£ãŒã«ãã€ã³ããããå¯èœæ§ã®ãããžã§ããªãã¯ãã©ã¡ãŒã¿ãŒãé åžããããšãèãããšãæ·±å»ãªåé¡ã§ãã
ãã¹ãŠã®ãµã¹ãã³ã·ã§ã³ãã€ã³ãã衚瀺ããããšããã®æ©èœã®ç®çã§ãããã©ããã¯ããããŸããã ããã¯å®è£
è
ã決å®ããå¿
èŠããããŸãã ãããŠãããã¯await
æ§æã®ææ¡ããããã¹ãŠã®ããŒãžã§ã³ã§å®å
šã«å¯èœã§ãã
@novacrazyã®è¯ãç¹ãããªãããããèšã£ãã®ã§ã以åã®javascripterãšããŠãç§ã¯awaitãã§ãŒã³ã決ããŠäœ¿çšããŸãããç§ã¯åžžã«ãã®åŸãããã¯ã䜿çšããŸãã
ç§ã¯ããã次ã®ããã«èŠãããšæããŸã
let result = (await doSomethingAsync()
.then(|result| {
match result {
Ok(v) => doSomethingAsyncWithFirstResponse(v)
Err(e) => Future.Resolve(Err(e))
}
}).then(|result| {
Ok(result.unwrap())
})).unwrap();
ãããå¯èœãã©ããããããããŸããããRustã®å ç©ã調ã¹ãå¿ èŠããããŸã
@richardanayaããã¯å®å šã«å¯èœã§ãïŒç°ãªãæ§æïŒã
Box implã®ããã«ïŒ
impl<T> Box<T> {
#[inline]
pub fn new(x: T) -> Box<T> {
box x
}
...
}
次ã®ããã«ãæ°ããããŒã¯ãŒãawait
ãå
¥åããŠAwait
ãç¹æ§åã§ããŸãã
impl<T> Await for T {
#[inline]
pub fn await(self) -> T {
await self
}
...
}
ãŸããã¡ãœããããã³ããŒã¯ãŒããšããŠawait
ã䜿çšããŸãã
let result = await foo();
first().await()?.second().await()?;
@richardanayaåæããŸããã ç§ã¯äœå¹Žãåã«ç§ã®webdevã®ãã®ã«async / awaitãæ¡çšããæåã®éçºè ã®äžäººã§ããããããŠæ¬åœã®åã¯async / awaitãæ¢åã®Promises / Futuresãšçµã¿åãããããšããæ¥ãŸããã ãŸããããªãã®äŸã§ããããããã次ã®ããã«åçŽåããããšãã§ããŸãã
let result = await doSomethingAsync()
.and_then(doSomethingAsyncWithFirstResponse);
let value = result.unwrap();
å
ç©ãŸãã¯å
ç©ã®çµæãŸãã¯çµæã®å
ç©ããã¹ãããŠããå Žåã .flatten()
ã³ã³ãããŒã¿ã¯ãããããã«å€§å¹
ã«åçŽåã§ããŸãã æåã§ãã¹ãŠãé梱ããŠåŸ
ã€ã®ã¯æªã圢ã§ãã
@XXããã¯åé·ã§ç¡å¹ã§ãã await
ã¯async
é¢æ°ã«ã®ã¿ååšãããšã«ããFuture
/ IntoFuture
ãå®è£
ããåã§ã®ã¿æ©èœãããããæ°ããé¢æ°ã¯å¿
èŠãããŸãããç¹æ§ã
@ novacrazy ã @ richardanaya
ãããã®ãžã§ãã¬ãŒã¿ã¹ãã²ããã£ã¹ããŒããã·ã³ãå éšã§äœæããã®ã§ã¯ãªããã³ã³ãããŒã¿ãŸãã¯æŽæ°ãããAPIã䜿çšããŠã¯ããã«ãšã¬ã¬ã³ãã«è§£æ±ºã§ããŸãã 極端ãªçç¥æ§æã¯ãçŸåšã®å°æ¥ãããããã«é£ãããããã°ã®ã¬ã·ãã§ãã
@novacrazyã®è¯ãç¹ãããªãããããèšã£ãã®ã§ã以åã®javascripterãšããŠãç§ã¯awaitãã§ãŒã³ã決ããŠäœ¿çšããŸãããç§ã¯åžžã«ãã®åŸãããã¯ã䜿çšããŸãã
ã³ã³ãããŒã¿ã¯ãRusts async / awaitã§ãŸã£ããç°ãªãããããã£ãšãã¯ãŒãæã£ãŠããŸããããšãã°ãyieldãã€ã³ãéã§ã®åçšã«é¢ããŠã§ãã éåæãããã¯ãšåãæ©èœãæã€ã³ã³ãããŒã¿ãå®å šã«äœæããããšã¯ã§ããŸããã ã³ã³ãããŒã¿ã®è°è«ã¯åœ¹ã«ç«ããªãã®ã§ããã®ã¹ã¬ããããé€å€ããŸãããã
@ I60R
ç§ã«ãšã£ãŠãå°æ¥ã³ã³ãããŒã¿ã䜿çšããããšã®å€§ããªæ¬ ç¹ã¯ãããããéåæé¢æ°åŒã³åºããé衚瀺ã«ããããããéåžžã®é¢æ°ãšåºå¥ããããšãäžå¯èœã«ãªãããšã§ãã ãã«ããŒã¹ã¿ã€ã«ã®ãã§ãŒã³å ã§äœ¿çšãããå¯èœæ§ãéåžžã«é«ãããããã¹ãŠã®ãµã¹ãã³ãå¯èœãªãã€ã³ãã確èªããããšæããŸãã
ãµã¹ãã³ããã€ã³ããé衚瀺ã«ããããšã¯ã§ããŸããã ã³ã³ãããŒã¿ãèš±å¯ããå¯äžã®ããšã¯ãä»ã®å ç©ãäœæããããšã§ãã ããæç¹ã§ãããããåŸ ããªããã°ãªããŸããã
CïŒã«ã¯ããã¬ãã£ãã¯ã¹await
ã䜿çšããã»ãšãã©ã®ã³ãŒãããïŒæ¢åã®ïŒãã¹ããã£ãã¯ã¹?
æŒç®åãšçµåãããšããåé¡ããªãããšã«æ³šæããŠãã ããã ç¹ã«ãåªå
é äœã«é¢ãã質åãããã³2ã€ã®é¡äŒŒããããã³ã¬ãŒã¿ããæã€ããšã®äžè¬çãªåä»ãã¯ãåŒã®å察åŽã«è¡šç€ºãããŸãã
@ Matthias247ããŒã¿ãåçšããå¿
èŠãããå Žåã¯ã確ãã«ãè€æ°ã®await
ã¹ããŒãã¡ã³ããèªç±ã«äœ¿çšããŠãã ããã ãã ããå€ãã®å Žåãåã«ããŒã¿ã移åããå¿
èŠããããã³ã³ãããŒã¿ã¯ãã®ããã«å®å
šã«æå¹ã§ãããããå¹ççãªã³ãŒãã«ã³ã³ãã€ã«ãããå¯èœæ§ããããŸãã å®å
šã«æé©åãããããšããããŸãã
ç¹°ãè¿ããŸãããæ¬åœã®åã¯ç©äºãçµã¿åãããããšã«ãããŸãã ããã»ã©è€éãªããšãããæ£ããæ¹æ³ã¯ãããŸããã ãã®ããããã®æ§æã®ãã€ã¯ã·ã§ãã£ã³ã°ã¯ãä»ã®èšèªããã®æ°ãããŠãŒã¶ãŒãå©ããããä¿å®å¯èœã§ããã©ãŒãã³ã¹ãé«ããããããã®ã«åœ¹ç«ããªãå Žåã¯ããŸãã«ãã®ããã«èããŠããŸãã 80ïŒ
ã®ç¢ºçã§ãæ§æãäœã§ãããåçŽãªå
ç©ã䜿çšããŠæãå®å®ããããã©ãŒãã³ã¹ã®é«ãAPIãæäŸããããã«ã async
/ await
觊ããããšããã§ããªããšæããŸãã
ãã®ç¹ã§ããã¬ãã£ãã¯ã¹ããŒã¯ãŒãawait
ããã³/ãŸãã¯æ··åãã¯ãawait!(...)
/ .await!()
ã¯ãæãèªã¿ãããã䜿ãæ
£ããããããã°ãããããªãã·ã§ã³ã§ãã
@andreytkachenko
ç§ã¯ããªãã®æçš¿ãèŠãŠãå®éãç§ãã芪ãã¿ããããã«ã€ããŠèããä»ãå®å šã«åæããŸãã芪ãã¿ãããã«ã¯2ã€ã®ã¿ã€ãããããšæããŸãã
awaitæ§æããå€ãã®awaitã䜿çšããåæ§ã®èšèªã®ããã«èŠããŸãã Javascriptã¯ããã§ã¯ããªã倧ãããã³ãã¥ããã£ãšããŠã®WASMæ©èœã«éåžžã«é¢é£ããŠããŸãã
2çªç®ã®ã¿ã€ãã®èŠªãã¿ãããã¯ãåæã³ãŒãã®ã¿ãæ±ãéçºè ã«ã³ãŒãã芪ãã¿ãããèŠããããšã§ãã awaitã®æ倧ã®ç¹åŸŽã¯ãéåæã³ãŒããLOOKåæã«ããããšã ãšæããŸãã ããã¯å®éãjavascriptãå®éã«ééã£ãŠããããšã®1ã€ã§ããããã¯ãäž»ã«åæéçºè ã«ãšã£ãŠãŸã£ããç°è³ªã«èŠãããã§ãŒã³ãããé·ãæ£èŠåãããŠããããšã§ãã
javascript asyncã®æ代ããç§ãæäŸãããããšã®1ã€ã¯ãæ¯ãè¿ã£ãŠã¿ããšéçºè ãšããŠç§ã«ãšã£ãŠã¯ããã«äŸ¿å©ã ã£ãã®ã¯ãpromise / futureãã°ã«ãŒãåããæ©èœã§ããã Promise.allïŒp1ïŒïŒãp2ïŒïŒïŒãªã®ã§ãäœæ¥ãç°¡åã«éº»çºãããããšãã§ããŸãã thenïŒïŒãã§ãŒã³ã¯ãåžžã«Javascriptã®éå»ã®çŽæã®åé¿ã§ããããç§ãèãããšãããªãå€é¢šã§äžå¿ èŠã§ãã
ç§ã¯å€åãã®åŸ ã€ãšããèããæäŸããããšæããŸãã ãéåæã³ãŒããšåæã³ãŒãã®éããæå°éã«æããããã«ããŠãã ããã
@novacrazyéåæé¢æ°ã¯ãimpl Future
ã¿ã€ããè¿ããŸãããïŒ Future
ãã¬ã€ãã«awaitã¡ãœãããè¿œå ã§ããªãçç±ã¯äœã§ããïŒ ãã®ããã«ïŒ
pub fn await(self) -> Self::Output {
await self
}
...
@XXç§ãç解ããŠããããã«ãRustã®async
é¢æ°ã¯ããžã§ãã¬ãŒã¿ãŒã䜿çšããŠã¹ããŒããã·ã³ã«å€æãããŸãã ãã®èšäºã¯è¯ã説æã§ãã ãããã£ãŠã await
ãæ©èœããã«async
é¢æ°ãå¿
èŠã§ããããã«ãããã³ã³ãã€ã©ãŒã¯äž¡æ¹ãæ£ããå€æã§ããŸãã await
ã¯ã async
éšåããªããšæ©èœããŸããã
Future
ã¯wait
ã¡ãœããããããŸããããã¯ããªããææ¡ãããã®ãšäŒŒãŠããŸãããçŸåšã®ã¹ã¬ããããããã¯ããŸãã
@skade ã
ããããã³ãŒãã¹ã¿ã€ã«ãåæšè«ã«ã©ã®ããã«åœ±é¿ããå¯èœæ§ããããŸããïŒ é£éåããã³åœä»€åã§èšè¿°ãããåãã³ãŒãã«éãã¯èŠãããŸããã ã¿ã€ãã¯å®å šã«åãã§ããå¿ èŠããããŸãã ãããã¬ãŒãããããç解ã§ããªãå Žåãããã¯ã³ãŒãã§ã¯ãªããããã¬ãŒã§ééããªãåé¡ã§ãã
@ skade ã @ Matthias247 ã
ã³ã³ãããŒã¿ã䜿çšãããšãæ©èœãã§ãŒã³ã®å
é ã«1ã€ã®äžæç¹ãããŒã¯ãããŸãã ä»ã®ãã¹ãŠã¯å
éšã§æé»çã«ãªããŸãã ããã¯ãæé»ã®mut
å ŽåãšãŸã£ããåãåé¡ã§ããããã¯ãå人çã«ã¯Rustã®æ倧ã®æ··ä¹±ç¹ã®1ã€ã§ããã äžéšã®APIã¯å
ç©ãè¿ããŸãããä»ã®APIã¯å
ç©ã®çµæãè¿ããŸã-ç§ã¯ãããæãã§ããŸããã ãµã¹ãã³ã·ã§ã³ãã€ã³ãã¯ãå¯èœã§ããã°æ瀺çã§ããå¿
èŠããããé©åã«æ§æå¯èœãªæ§æã¯ã
@ I60R let
ãã€ã³ãã£ã³ã°ã¯ãåæšè«ãžã®ãžã£ã³ã¯ã·ã§ã³ãã€ã³ãã§ããããšã©ãŒå ±åã«åœ¹ç«ã¡ãŸãã
@novacrazy
ãããã£ãŠãawaitã§åäœããã«ã¯éåæé¢æ°ãå¿ èŠã§ã
ããã¯æ»ãå€ã®åã§è¡šçŸã§ããŸããïŒ äŸãã°ãæ»ãå€ã®åãããããšãimpl Future + Async
ã®ä»£ããã«ã impl Future
ã
@skadeã¡ãœããåŒã³åºãæ§æã®.
ã¯ãŸã£ããåãç®çãæãããšãã€ãæã£ãŠããŸãã
@dpc
CïŒã§ã¯ãRustã®å Žåã»ã©å€ãã®é£é/é¢æ°åã³ãŒããååŸã§ãããšã¯æããŸããã ãããšãç§ã¯ééã£ãŠããŸããïŒ ããã«ãããCïŒéçºè /ãŠãŒã¶ãŒã®çµéšã¯èå³æ·±ããã®ã«ãªããŸãããå¿ ãããRustã«é©çšã§ãããšã¯éããŸããã OcamlãHaskellãšå¯Ÿæ¯ã§ãããããã®ã«ãšæããŸãã
ããªãã¯éãšåããããå€ããåŸãã LINQã³ãŒããèŠããšãããã衚瀺ãããŸãã
å žåçãªéåæã³ãŒãã¯æ¬¡ã®ããã«ãªããŸãã
async Task<List<IGroping<int, PageMetadata>>> GetPageMetadata(string url, DbSet<Page> pages)
{
using(var client = new HttpClient())
using(var r = await client.GetAsync(new Uri(url)))
{
var content = await r.Content.ReadAsStringAsync();
return await pages
.Where(x => x.Content == content)
.Select(x => x.Metadata)
.GroupBy(x => x.Id)
.ToListAsync();
}
}
ãŸãã¯ãããäžè¬çãª
let a = await!(service_a);
let b = await!(some_method_on(a, some, other, params));
let c = await!(combine(somehow, a, b));
åŒã³åºããé£éãããã®ã§ã¯ãªããå€æ°ã«å²ãåœãŠãŠããããªãããã®æ¹æ³ã§äœ¿çšããŸãã ããªããborrowcheckerãæ±ããšããããã¯ç¹ã«çå®ã§ãã
ç§ã¯ããªããäžã€ã®ç¶æ³ã§å
ç©ãé£éãããããšãã§ããããšã«åæããããšãã§ããŸãã é話äžã«çºçããå¯èœæ§ã®ãããšã©ãŒãåŠçããå Žåã äŸïŒ let a = await!(service_a)?
ã ããã¯ãpostfixã®ä»£æ¿ãåªããŠããå¯äžã®ç¶æ³ã§ãã ç§ã¯ãããããã§å©çãåŸãã®ãèŠãããšãã§ããŸããããããç§ã¯ããããã¹ãŠã®çæãäžåããšã¯æããŸããã
å¥ã®çç±ïŒ impl Add for MyFuture { ... }
ãšlet a = await a + b;
ã©ãã§ããïŒ
postfixawaitããŒã¯ãŒãã®ã³ã³ããã¹ãã§
let x = (0..10)
.map(some_computation)
.collect() : Result<Vec<_>, _>
.unwrap()
.map(other_computation) : Vec<usize>
.into() : Rc<[_]>;
æ¥å°ŸèŸawaitããŒã¯ãŒããšéåžžã«ãã䌌ãŠããŸãã
let foo = alpha() await?
.beta await
.some_other_stuff() await?
.even_more_stuff() await
.stuff_and_stuff();
æ£ãããã©ãŒããããããŠããªãå Žåãåãæ¬ ç¹ããããŸãã
foo.iter().map(|x| x.bar()).collect(): Vec<_>.as_ref()
client.get("https://my_api").send() await.unwrap().json() await.unwrap()
Type Ascription RFCã®ãã«ã飲ã¿èŸŒãå Žåã¯ãäžè²«æ§ãä¿ã€ããã«fut await
ã飲ã¿èŸŒãå¿
èŠããããšæããŸãã
ãšããã§ããããæå¹ãªæ§æã§ããããšããåç¥ã§ãããïŒ
fn main() {
println
!("Hello, World!");
}
ããã§ããå®éã®ã³ãŒãã§ã¯ãããçºçããããšã¯ãããŸããã§ããã
å°ãäœè«ãããŠãã ããã @BenoitZugmeyerã«ãã£ãŠææ¡ãããŠããexpr!macro
ãŸãã¯expr@macro
ããããã¯expr.macro!()
ãšããŠãå®è¡ã§ããŸãã æåã®ãªãã·ã§ã³ãæãŸãããšæããŸãã ããããè¯ãã¢ã€ãã¢ãã©ããã¯ããããŸããããæ¥å°ŸèŸãåŸ
ã£ãŠããéã«ã¢ãããã¯ãªè§£æ±ºçã§ã¯ãªãäžè¬çãªæŠå¿µãæœåºãããå Žåã¯ãå°ãªããšãæ¥å°ŸèŸãã¯ããæœåšçãªè§£æ±ºçãšããŠèããå¿
èŠããããŸãã
await
ãæ¥å°ŸèŸãã¯ãã«ãããšããŠããããã¯éæ³ã®ãã¯ãïŒ compile_error!
ïŒã§ããããšã«æ³šæããŠãã ããã ãã ãã @ jplatteããã®ä»ã®äŒæ¥ã¯ããããåé¡ã§ã¯ãªãããšããã§ã«ç¢ºç«ããŠããŸãã
ãã®ã«ãŒãã«è¡ãå Žåãç§ã¯æåã«postfixãã¯ããã©ã®ããã«æ©èœããããæ£ç¢ºã«ç¢ºç«ãã次ã«await
ã®ã¿ãéæ³ã®postfixãã¯ããšããŠèš±å¯ããåŸã§ç¬èªã«å®çŸ©ãããpostfixãã¯ããèš±å¯ããŸãã
åå¥è§£æ/æ§æ解æã«é¢ããŠã¯ãããã¯åé¡ã«ãªãå¯èœæ§ããããŸãã expr!macro
ãšãã³ã³ãã€ã©ã¯expr!
ãšãããã¯ããããããã®åŸã«ç¡å¹ãªæåmacro
ããããšèãããããããŸããã ãã ãã expr!macro
ã¯ãå
èªã¿ã§lexã§ããã¯ãã§ããã expr
åŸã«!
ãç¶ãããã®çŽåŸã«identifier
ããããšãäœããæ¥å°ŸèŸãã¯ãã«ãªããŸãã expr!macro
圢åŒãåãããšãã§ãããšä»®å®ããŸãã
é ã®ãŠã£ãºãã«ãåŸçœ®ãã¯ãã®ãããã®ä»ã®ãŠãŒã¹ã±ãŒã¹ãæãã€ããã ãã ãããã¹ãŠãã«ã¹ã¿ã ãã¯ãã§å®è£ ã§ãããšã¯éããªãããããã®ãªã¹ããéåžžã«åœ¹ç«ã€ãã©ããã¯ããããŸããã
stream!await_all
ïŒã¹ããªãŒã ãåŸ
æ©ããããoption!or_continue
ïŒ option
ãNoneã®å Žåãã«ãŒããç¶è¡ããŸãmonad!bind
ïŒååã«ãã€ã³ãããã«=<<
ãå®è¡ããå Žåstream!await_all
ããã«ãããå ç©ã ãã§ãªãã¹ããªãŒã ãåŸ ã€ããšãã§ããŸãã
event_stream("ws://some.stock.exchange/usd2eur")
.and_then(|exchange_response| {
let exchange_rate = exchange_response.json()?;
stream::once(UpdateTickerAction::new(exchange_rate.value))
})
ïŒ async
-stream-esqueãããã¯å
ïŒãšåçã«ãªããŸãïŒ
let exchange_rate = event_stream("ws://some.stock.exchange/usd2eur")
!await_all
.json()?;
UpdateTickerAction::new(exchange_rate.value)
option!or_continue
ããã«ããããªãã·ã§ã³ã®ã©ããã解é€ãããããNone
å Žåã¯ãã«ãŒããç¶è¡ã§ããŸãã
loop {
let event = match engine.event() {
Some(event) => event,
None => continue,
}
let button = match event.button() {
Some(button) => button,
None => continue,
}
handle_button_pressed(button);
}
ãšåçã«ãªããŸãïŒ
loop {
handle_button_pressed(
engine.event()!or_continue
.button()!or_continue
);
}
monad!bind
ããã«ãããããªãçŽ æŽãªïŒã€ãŸãè¡šçŸäžå¿ã®ïŒæ¹æ³ã§ã¢ãããååŸã§ããŸãã Rustã«ã¯ãŸã ã¢ããã®ãããªãã®ã¯ãªããRustã«è¿œå ãããŠã売ãããŠããŸããã ããã§ããããããè¿œå ããå Žåã¯ããã®æ§æã圹ç«ã€å¯èœæ§ããããŸãã
ãããã以äžãåããŸããã
nameDo :: IO ()
nameDo = do putStr "What is your first name? "
first <- getLine
putStr "And your last name? "
last <- getLine
let full = first ++ " " ++ last
putStrLn ("Pleased to meet you, " ++ full ++ "!")
次ã®ããã«ãªããŸãã
do {
putStr("What is your first name? ")!bind;
let first = getLine()!bind;
putStr("And your last name? ")!bind;
let last = getLine()!bind;
let full = first + " " + &last
putStrLn("Pleased to meet you, " + &full + "!")!bind;
}
ãŸãã¯ã let
ãå°ãªããããã€ã³ã©ã€ã³åïŒ
do {
putStr("What is your first name? ")!bind;
let first = getLine()!bind;
putStr("And your last name? ")!bind;
putStrLn(
"Pleased to meet you, " + &first + " " + &getLine()!bind + "!"
)!bind;
}
ç§ã¯ããã«ã€ããŠéåžžã«åãããŠããŸãã ç§ã®è³ã®æ°åŠè
ã®éšåã¯ã await
äžè¬åããã解決çãèŠã€ããããšæã£ãŠãããæ¥å°ŸèŸãã¯ãã¯ããããéæããæ¹æ³ãããããŸããã ç§ã®è³ã®å®çšçãªéšåã¯æ¬¡ã®ããã«èããŠããŸãããã¯ãã·ã¹ãã ããŸã 誰ãç解ããŠããªãèšèªãããããäœãã®ã¯ãªãã§ããã
ãã ãã ?
ãšawait
ãããéåžžã«äŸ¿å©ãªæ¥å°ŸèŸæŒç®åã®2ã€ã®äŸããããŸãã å°æ¥è¿œå ããããã®ãããããç§ãèšåãããã®ã«äŒŒããã®ãèŠã€ãããã©ãããŸããïŒ ããããäžè¬åããã°ãèªç¶ã«Rustã«è¿œå ã§ããŸãã ããã§ãªãå Žåã¯ãæ¯åããã«å¥ã®æ§æãèãåºãå¿
èŠããããŸããããã«ãããæ¥å°ŸèŸãã¯ããããèšèªãè¥å€§åããå¯èœæ§ããããŸãã
çããã¯ã©ãæããŸããïŒ
@EyeOfPython
ç§ã¯éåžžã«ãã䌌ãã¢ã€ãã¢ãæãã€ããŸãããRustã®æ¥å°ŸèŸãã¯ãã¯æéã®åé¡ã§ãã
ndarray
ã¹ã©ã€ã¹ãæ±ããšãã¯ãæ¯åããã«ã€ããŠèããŠããŸãã
let view = array.slice(s![.., ..]);
ããããã¯ããã«è¯ãã§ããã
let view = array.slice![.., ..];
// or like you suggested
let view = array!slice[.., ..];
// or like in PHP
let view = array->slice![.., ..];
ãŸãã _with
ãŸãã¯_else
æ¥å°ŸèŸãä»ãããã®ã®ããã«ãå€ãã®ã³ã³ãããŒã¿ããªããªãå¯èœæ§ããããŸãã
opt!unwrap_or(Error::new("Error!"))?; //equal to .unwrap_or_else(||Error::new("Error!"));
@EyeOfPython @andreytkachenko postfixãã¯ãã¯çŸåšRustã®æ©èœã§ã¯ãªãã
ããã¯RFCã®è°è«ã§ã¯ãªããå®è£ ããå¿ èŠã®ããåãå ¥ããããRFCã®è°è«ã§ãã
ãã®ãããããã§ãããã«ã€ããŠèª¬æããããéåææ§æãææ¡ãããããããšã¯çŸå®çã§ã¯ãªããšæããŸãã ããã¯ããã«æ©èœãå€§å¹ ã«é ãããã§ãããã
ãã®ãã§ã«å€§èŠæš¡ãªè°è«ãæå¶ããããã«ãããã§ããããè°è«ããããšã¯åœ¹ã«ç«ããªããšæããŸãããããã¯è°è«ãããåé¡ã®å€ã«ãããšèŠãªãããšãã§ããŸãã
ã¡ãã£ãšèããŠã¿ãŠãã ããããã®ã¹ã¬ããã¯ç¹ã«await
ã察象ãšããŠããŸãããä»åŸã¯yield
åŒã«ã€ããŠããŸã£ããåãè°è«ãè¡ããããšæããŸããããããåæ§ã«é£éããå¯èœæ§ããããŸãã äžè¬åã§ããæ§æãèŠããã®ã§ãããèŠãç®ã¯åãã§ãã
ããã§ãã¯ãã䜿çšããªãçç±ïŒ
stream.await_all
ã¯ã³ã³ãããŒã¿ã®å®ç§ãªãŠãŒã¹ã±ãŒã¹ã§ãoption.or_continue
ãš_else
ã³ã³ãããŒã¿ã®çœ®ãæãã¯ãnullåäœæŒç®åã®å®ç§ãªãŠãŒã¹ã±ãŒã¹ã§ãmonad.bind
ã¯if-let
ãã§ãŒã³ã®å®ç§ãªãŠãŒã¹ã±ãŒã¹ã§ãndarray slicing
ã¯ã const
ãžã§ããªãã¯ã®å®ç§ãªãŠãŒã¹ã±ãŒã¹ã§ã?
æŒç®åã«çåãæããããŸã@collinanderson
åæ§ã«é£éããå¯èœæ§ããããŸã
ãªãå°çäžã§ããããé£éããå¯èœæ§ããããšæããŸããïŒ äžèšã®println
äŸã®ããã«ãå®éã®ã³ãŒãã§ã¯çºçããŸããã
@Pzixelæçµçã«Generator::resume
ãå€ããšãå¯èœæ§ãé«ãããã yield expr
ã¯é()
ã¿ã€ãã«ãªããŸãã
@vlaff await
ãTypeAscriptionãšäžèŽããŠããå¿
èŠããããšããè°è«ãã¯ã£ãããšããããŸããã ãããã¯éåžžã«ç°ãªããã®ã§ãã
ãŸããã¿ã€ãã¢ã¯ãªãã·ã§ã³ã¯ç¹°ãè¿ãè©Šè¡ãããæ©èœã®1ã€ã§ããããããæåãããšããä¿èšŒã¯ãããŸããã ç§ã¯ããã«å察ããããããŸããããTAã¯å°æ¥ã®RFCã§ãããããã¯ãã§ã«ææ¡ãããŠããæ§æã§åãå ¥ããããŠããæ©èœã«ã€ããŠã®è°è«ã§ãã
å€ãã®ã³ã¡ã³ããèªãã§ããªãåŸ ã€ã®ãã«ã€ããŠããã«èŠçŽãè¿œå ããããã«ïŒïŒ...ïŒã¯éåžžã«çæ³çãªãã¹ã«èŠããŸãïŒ
åŸ ã€ïŒ ããã§ã¯ãã¯ãã¯ãã§ã«ãããŸããåé¡ã¯ãã§ãŒã³ã«ã€ããŠã§ãã
èããã°èããã»ã©ãæ¥å°ŸèŸãããèŠããŸãã äŸãã°ïŒ
let a = foo await;
let b = bar await?;
let c = baz? await;
let d = booz? await?;
let e = kik? + kek? await? + kuk? await?;
// a + b is `impl Add for MyFuture {}` which alises to `a.select(b)`
ä»»æã®ã¬ãã«ã®ãã¹ããèš±å¯ããèªã¿åãå¯èœã§ãã ?
ããã³å°æ¥ã®ãªãã¬ãŒã¿ãŒãšã·ãŒã ã¬ã¹ã«é£æºããŸãã æ°èŠåå
¥è
ã«ãšã£ãŠã¯å°ãç°è³ªã«èŠããŸãããææ³äžã®å©çããããäžåãå¯èœæ§ããããŸãã
äž»ãªçç±ã¯ã await
ã¯é¢æ°åŒã³åºãã§ã¯ãªããåå¥ã®ããŒã¯ãŒãã§ããå¿
èŠãããããã§ãã éèŠããããããç¬èªã®ãã€ã©ã€ããšããã¹ãå
ã®é
眮ãèšå®ããå¿
èŠããããŸãã
@ Pzixel ã @ HeroicKatora ã @ skade
ããšãã°ãPythonã®yield
ãšyield from
åŒãyield
ã®çµæãšãªãå€ãæäŸã§ããŸãã ããã¯@valffã®æå³ã§ãããåã®åž°å±ãšã¯äœã®é¢ä¿ããããŸããã ãããã£ãŠã yield
ã!
ãŸãã¯()
以å€ã®ã¿ã€ãã«ãªããŸãã
ã³ã«ãŒãã³ã®ãã€ã³ãããã yield
ãšawait
äž¡æ¹ãã³ã«ãŒãã³ãäžæåæ¢ããïŒæçµçã«ïŒå€ãè¿ãããšãã§ããŸãã ãããã¯åãã³ã€ã³ã®äž¡é¢ã«ãããªãã®ã§ã
ãããŠãå¥ã®æ§æã®å¯èœæ§ã_square-brackets-with-keyword_ãæšãŠãŠããããéšåçã«åŒ·èª¿ããŸãïŒæ§æã®åŒ·èª¿è¡šç€ºã«yield
ã䜿çšïŒïŒ
let body: MyResponse = client.get("http://api").send()[yield]?.into_json()[yield]?
ãæ¥å°ŸèŸããŒã¯ãŒããã¯ç§ã«ãšã£ãŠæãçã«ããªã£ãŠããŸãã future-expressionãšawait
åºåã空çœä»¥å€ã®æåã䜿çšããæ¥å°ŸèŸãç§ã«ã¯æå³ããããŸããããããã«ã¯æå³ããããŸããã ããã¯ã¡ãœããçšã§ããã await
ã¯ã¡ãœããã§ã¯ãªãããã§ãã ãã ãããã¬ãã£ãã¯ã¹ããŒã¯ãŒããšããŠawait
ãå¿
èŠãªå Žåã¯ãããããã®ãã®ããã§ãŒã³ããã人ã®ããã«await self
ãåŒã³åºãã ãã®ãã¬ã€ããŸãã¯ã¡ãœããã®@XXææ¡ã奜ãã§ãïŒããããã¡ãœããã«await
ãšããååãä»ããããšã¯ã§ããŸããwait
ã ãã§ååã ãšæããŸãïŒã å人çã«ã¯ãé·ããã§ãŒã³ã¯èªã¿ã«ããããã¬ãã£ãã¯ã¹ãŸãã¯ãã¹ããã£ãã¯ã¹ãæ©èœããããããã§ãŒã³ããšã§ã¯ãªããè¡ããšã«åŸ
æ©ããããšã«ãªããŸãã
[ç·šé] wait
ãã§ã«ååšããæªæ¥ãé»ãã§ããããšãå¿ããã®ã§ããã®èããããéããŠãã ããã
@rolandç§ã¯ç¹ã«ãããåç §ããŠãããã¿ã€ãã®åž°å±ã«ã€ããŠèª¬æããŠããŸãïŒ //github.com/rust-lang/rust/issues/57640#issuecomment -456023146
@rolandsteinerã ããããªãã¯æžã
let body: MyResponse = client.get("http://api").send() await?.into_json() await?;
ç§ãããã次ã®ããã«æžããšãïŒ
let response = client.get("http://api").send() await?;
let body: MyResponse = response.into_json() await?;
@skadeãããããªãã¯ç§ãæã£ãŠããã®ãšã¯éãã³ã¡ã³ããæå³ããŸãããããããªããã ïŒstuck_out_tongueïŒ
@Pzixelæçµçã«
Generator::resume
ãå€ããšãå¯èœæ§ãé«ããããyield expr
ã¯é()
ã¿ã€ãã«ãªããŸãã
ãããã£ãŠã
yield
ã!
ãŸãã¯()
以å€ã®ã¿ã€ãã«ãªããŸãã
@ valff ã @ rolandsteiner yield
ãåéå€ãè¿ãå¯èœæ§ã¯äœããšæããŸããããã¯ããžã§ãã¬ãŒã¿ãŒã®æ§æãç¹æ§ãæäœããã®ãé¢åã«ãªãããšãªããéçã«åæå®ãããèšèªã«é©åãããã®ã¯å°é£ã§ãã å±¥æŽæžåŒæ°ãæã€å
ã®ãããã¿ã€ãã§ã¯ãããŒã¯ãŒãgen arg
ã䜿çšããŠãã®åŒæ°ãåç
§ããŠããŸããããã®ãããªãã®ã¯ãIMOã§ããŸãæ©èœããå¯èœæ§ãã¯ããã«é«ããªããŸãã ãã®èŠ³ç¹ããã yield
ã¯()
è¿ãã®ã§ã await
ã®è°è«ã«ããŸã圱é¿ãäžããªãã¯ãã§ãã
async
ã¯ãã¬ãã£ãã¯ã¹æŒç®åã§ããããã await
ã¯ãã¬ãã£ãã¯ã¹æŒç®åã§ããå¿
èŠããããšæããŸãïŒ yield
ããã¬ãã£ãã¯ã¹ã«ãªããšæããŸãïŒã ãŸãã¯ãéåžžã®æ¹æ³ãšããŠäœ¿çšããæ¥å°ŸèŸã®äœçœ®ã§äœ¿çšããŸãã
ãã ããããã§ãã¹ãŠã®ãã€ã¯ã·ã§ãã£ã³ã°ãå®è¡ããŠããããã§ã¯ãããŸãããRustã®ä»ã®èª°ãæã£ãŠããªãæ¥å°ŸèŸããŒã¯ãŒããæ€èšããã®ã¯ãªãã§ããïŒ ããã¯èšèªããšãŠãå¥åŠã«ããã§ãããã
ãŸããå ç©ãé£éããããšããªããããé¢çœãã®ããããããŸãã ããããé£éãåŸ ã£ãŠããŸããïŒ ããã¯ã©ãããæå³ã§ããïŒ æ°ããæªæ¥ãè¿ãæªæ¥ïŒ Rustã«äžçŽåžæ°ãšããŠãã®ã€ãã£ãªã ãæããããã®ã¯æ¬åœã«äžè¬çãªã€ãã£ãªã ã§ããïŒ ç§ãã¡ãæ¬åœã«ãããæ°ã«ãããªããç§ã¯ç§ãã¡ããã¹ãã ãšæããŸãïŒ
foo.await()
ïŒã ããã¯å¥åŠãªæ¥å°ŸèŸããŒã¯ãŒããå°å
¥ãããç§ãã¡ã¯çãããäœãæå³ããããç¥ã£ãŠããŸãã ãããšé£éããããšãã§ããŸãããŸããå人çãªæèŠãè¿°ã¹ãããã«ãæ¥å°ŸèŸã®ããŒã¯ãŒãäœçœ®ã«ããawait
ã¯å«ãã§ãã
ãã¬ãã£ãã¯ã¹await
ã¯ãä»ã®èšèªã§äœ¿çšãããŠããçç±ããããŸããããã¯èªç¶èšèªãšäžèŽããŸãã ããªãã¯ãããªãã®å°çãåŸ
ã€ããšã¯èšããªãã JavaScriptãæžããã®ã§ãããå°ãåèŠããããããããŸããã
ãŸãã await
ãã§ãŒã³ã¯é倧è©äŸ¡ãããŠãããšæããŸãã å°æ¥ã®ã³ã³ãããŒã¿ã«å¯Ÿããasync/await
ã®äŸ¡å€ã¯ã if
ã match
ãªã©ã®æšæºèšèªæ§é ãå©çšããŠéåæã³ãŒããé çªã«èšè¿°ã§ããããšã§ãã ããªãã¯ãšã«ããããªãã®åŸ
æ©ãåå²ããããšæãã§ãããã
async/await
éæ³ã®æ§æãäœããããªãã§ãã ãããããã¯ãèšèªã®ããäžéšã«ãããŸããã ææ¡ãããã¡ãœããæ§æïŒã€ãŸãã foo.await()
ïŒã¯ãIMOãéåžžã®ã¡ãœããåŒã³åºãã«å¯ŸããŠçŽäº€ããããŠãããéæ³ã®ããã«å€ããŠããŸãã proc-macro
æ©æ¢°ãèšçœ®ãããŠããã®ã§ããã®èåŸã«é ããŠã¿ãŸãããïŒ
é¢æ°ã®å®çŸ©ã§async
ã§ã¯ãªãawait
ããŒã¯ãŒãã䜿çšããã®
await fn foo(future: impl Future<Output = i32>) -> i32 {
future
}
ãã®await fn
ã¯ã async
ã³ã³ããã¹ãã§ã®ã¿åŒã³åºãããšãã§ããŸãã
async {
let n = foo(bar());
}
ãããŠã let n = (await foo(bar()));
è±ç³ããŸãã
次ã«ã await
ããŒã¯ãŒãã«å ããŠããã¬ã€ãFuture
ã¯ãæ¥å°ŸèŸã®äœçœ®ã§await
ããžãã¯ã䜿çšããããã®await
ã¡ãœãããå®è£
ã§ããŸãã
async {
let n = bar().awaited();
}
ãŸãã誰ããç§ã«çºé»æ©ãšã®é¢ä¿ã説æã§ããŸããïŒ
async
/await
ãããžã§ãã¬ãŒã¿ãŒãïŒå®å®åãããŠããŠãïŒå®è£ ãããåã«å®è£ ãããŠããããšã«é©ããŠããŸãã
@phaazonãžã§ãã¬ãŒã¿ãŒãasync
/ await
å
éšå®è£
ã®è©³çŽ°ãšããŠRustã«è¿œå ãããŸããã ããããå®å®ãããçŸåšã®èšç»ã¯ãããŸããããããŠããããå¯èœã«ãªãåã«ãããã¯ãŸã éå®éšçãªRFCãå¿
èŠãšããŸãã ïŒå人çã«ã¯å®å®ããããã®ã§ãããå°ãªããšã1ã2幎ã¯é¢ããŠããããã§ããããããã async
/ await
ãå®å®ããŠãå®å®ãããŸã§RFCãããªãã§ããããããã«é¢ããããã€ãã®çµéšïŒã
@XXé¢æ°å®çŸ©ã§await
ã䜿çšãããšã async
ã®ã»ãã³ãã£ã¯ã¹ãç Žã£ãŠãããšæããŸãã åºæºãå®ããŸããããã
@phaazonãããasync
ã»ãã³ãã£ã¯ã¹ãã©ã®ããã«å£ããããã詳现ã«æå®ã§ããŸããïŒ
ã»ãšãã©ã®èšèªã¯async
ã䜿çšããŠéåæã«ãªããã®ãå°å
¥ãã await
ããããåŸ
ã¡ãŸãã ãããã£ãŠã await
代ããã«async
ã¯ãç§ã«ã¯ã¡ãã£ãšå¥åŠã§ãã
@phaazonãããã代ããã§ã¯ãããŸããããããã«å ããŠã å®å šãªäŸïŒ
async fn bar() -> i32 {
5 // will be "converted" to impl Future<Output = i32>
}
await fn foo(future: impl Future<Output = i32>) -> i32 {
future // will be "converted" to i32 in async context
}
async {
let a = await bar(); // correct, a == 5
let b = foo(bar()); // correct, b == 5
}
let c = foo(bar()); // error, can't call desugaring statement `await foo(bar())`
ãããæå¹ã§ããå Žåããã§ãŒã³ã§äœ¿çšããããã®await-methodãå®è£ ããããšãå¯èœã«ãªããŸãã
async {
let n = first().awaited()?.second().awaited()?;
// let n = (await (await first())?.second())?;
}
ç§ã®æèŠã§ã¯ãpostfixãããŸãã«ãéæ³ã®ããã«ãæãããèšèªã«æ
£ããŠããªãã®ãåŸ
ã£ãŠãããã©ããã¯åé¡ã§ã¯ãããŸããã ã¡ãœããæ§æ.await()
ãŸãã¯.await!()
ãæ¡çšããå Žåã Future
ã¯.await()
ãŸãã¯.await!()
ã¡ãœãããããããšã説æããã ãã§ããæå³ã®ããå Žåã«ããããåŸ
ã€ããã«äœ¿çšããããšãã§ããŸãã äžåºŠãèŠãããšããªããŠãã5åãããŠèããã°ç解ããã®ã¯ããã»ã©é£ããããšã§ã¯ãããŸããã
ããã«ãprefixããŒã¯ãŒãã䜿çšãããšã次ã®ãããªã¯ã¬ãŒããäœæã§ããªããªããŸãïŒçŸåšã詳现ãåŠçããã€ã³ãã©ã¹ãã©ã¯ãã£ããªããããäžå®å šãªæ¬äŒŒã³ãŒãïŒã
trait AwaitChainable {
fn await(self) -> impl Future;
}
impl<T: Future> AwaitChainable for T {
fn await(self) -> impl Future {
await self
}
}
ããããã°ãå¿ èŠã«å¿ããŠpostfixãåŸ ã€ããšãã§ããŸãã ã€ãŸãããããã©ããããããäžå¯èœã§ãããã³ã³ãã€ã©ã«ãã£ãŠéæ³ã®ããã«æ¥å°ŸèŸåŸ æ©ãå®è£ ããå¿ èŠãããå Žåã§ããäžèšã®äŸã®ãããªãã®ã䜿çšããŠããããäž»ã«ã©ã®ããã«æ©èœãããã説æã§ããŸãã åŠã¶ã®ã¯é£ããããšã§ã¯ãªãã§ãããã
@ivandardiç§ãåãããšãèããŸããã ãããããã®å®çŸ©
fn await(self) -> impl Future {
await self
}
é¢æ°ãasync
contextã§ã®ã¿åŒã³åºãããšãã§ãããšã¯èšã£ãŠããŸããã
@XXãããç§ãèšã£ãããã«ãå£ããæ¬äŒŒã³ãŒããç¡èŠããŸãïŒPIã«ã¯çŸåšãæ£ããæ§æãšç¹æ§ãããã«æžã蟌ãæ¹æ³ã調ã¹ãããã®ã€ã³ãã©ã¹ãã©ã¯ãã£ããããŸãã:(éåæã§ã®ã¿åŒã³åºãå¯èœã«ãããã®ãæžãããšæ³åããŠãã ããã³ã³ããã¹ãã
@ XX ã @ ivandardiå®çŸ©ã«await
ã¯async
ã³ã³ããã¹ãã§ã®ã¿æ©èœããŸãã ãããã£ãŠãããã¯éæ³ã§ãã
fn await(self) -> impl Future {
await self
}
ããã¯éããªã
async fn await(self) -> impl Future {
await self
}
ããã¯ã次ã®ãããªasync
ã³ã³ããã¹ãã§ã®ã¿åŒã³åºãããšãã§ããŸãã
await future.await()
ã©ã®ãããªçš®é¡ãç®çå šäœãæã¡è² ãããŸãã
ãããæ©èœãããå¯äžã®æ¹æ³ã¯ã async
å®å
šã«å€æŽããããšã§ããããã¯ããŒãã«ããå€ããŠããŸãã
@ivandardiç§ã®ããŒãžã§ã³ã®ãã®é²åïŒ
fn await(self) -> T { // How to indicate using in async-context only?
await self
}
`` `é
await fn awaitïŒselfïŒ-> T {//éåæããã§ã«ååŸãããŠãããã
èªåãåŸ
ã€
}
```rust
await fn await(self) -> T {
self // remove excess await
}
@CryZe @XXãªãããªãã¯ç§ãããŒã€ã³ã°ããŠããã®ã§ããïŒ ç§ã¯æ£ããã
@XXäœãããããšããŠããããšã¯ãéåæã®æå³ãå€æŽããŠãå®å
šã«åŸ
ã€ããšã§ãïŒããšãã°ãäœæawait
æèãããäœãšãéãasync
ã³ã³ããã¹ãïŒã èšèªéçºè
ããã®ãµããŒãã¯ããŸãåŸãããªããšæããŸã
@EyeOfPythonãã®å®çŸ©ã¯æåŸ ã©ããã«æ©èœããŸããïŒ
async fn await(self) -> impl Future {
await self
}
ããå¯èœæ§ãé«ãïŒ
#[call_only_in_async_context_with_derived_await_prefix]
fn await(self) -> impl Future {
self
}
ãããæ¶ç©ºã®ç䌌æ§æã§ããããšãç¡èŠãããããç§ã¯å察祚ãæããŠããŸãã åºæ¬çã«åœŒãã®ãã€ã³ãã¯ãRustãèšèªãç解ã§ããDrop and Copyã®ãããªç¹å¥ãªç¹æ§ãè¿œå ã§ãããšããããšã§ããããã«ãããåã«å¯ŸããŠ.awaitïŒïŒãåŒã³åºãæ©èœãè¿œå ãããawaitããŒã¯ãŒããšåãããã«åãšå¯Ÿè©±ããŸãã ãŸããè³æ祚/å察祚ã«ãã£ãŠèŠèŠåããããããªäž»èŠ³çãªææ ã«åºã¥ããã®ã§ã¯ãªãã客芳çãªè§£æ±ºçãèŠã€ããããšãéèŠã§ãããããæ祚ã¯ãšã«ããRFCã«ã¯ç¡é¢ä¿ã§ãããšèŠãªãããŸãã
ãã®ã³ãŒããäœããã¹ããããããŸããã ããããããã¯asyncawaitãçŸåšã©ã®ããã«æ©èœããããšã¯äœã®é¢ä¿ããããŸããã æ°ã«ãªãå Žåã¯ããã®ã¹ã¬ããããé€å€ããå°çšã®RFCãäœæããŠãã ããã
@CryZeãã®ã¿ã€ããå©çšå¯èœã§ãã ããã¯æªæ¥ãšåŒã°ããŠããŸãã ãããŠãasync / awaitã¯ãéåæã³ãŒãã®å€æã®ã¿ã察象ãšããã¡ã«ããºã ã§ããããšããã£ãšåã«åæãããŸããã ããã¯ãäžè¬çãªãã€ã³ãè¡šèšãæå³ãããã®ã§ã¯ãããŸããã
@ivandariããªãã®æ¥å°ŸèŸãåŸ ã€ã®ã§ã¯ãªããæ°ããæªæ¥ãåµé ããŸãã ããã¯æ¬è³ªçã«æçé¢æ°ã§ãã éåžžã®é¢æ°ã§ã¯ãªããããæé»çã«åŸ ã€ããšã¯ã§ããŸããã
@ Matthias247圌ããææ¡ããããšããŠããã®ã¯ãã¡ãœããåŒã³åºãã®æ§æãæã€æ¥å°ŸèŸãåŸ æ©ãããæ¹æ³ã§ããã ããããã°ãRustã¯ãïŒã§è¡ã£ãããã«ãïŒã@ã...ãªã©ã®ä»»æã®æ°ããèšå·ãå°å ¥ããå¿ èŠããããŸããã æŒç®åããããŠããã§ãããªãèªç¶ã«èŠããŸãïŒ
let result = some_operation().await()?.some_method().await()?;
ãããã£ãŠãã³ã³ãã€ã©ãéåžžã®awaitããŒã¯ãŒãïŒãã®å Žåã¯ãŸã£ããå¿
èŠãããŸããïŒãšåãããã«èªèããéåæãå€æãããFutureç¹æ§ã®ç¹å¥ãªçš®é¡ã®ã¡ãœãããäœããã®æ¹æ³ã§åŸ
æ©ãããšããã¢ã€ãã¢ã«ãªããŸãããããããžã§ãã¬ãŒã¿ãŒã«ã³ãŒãããŸãã ããããã°ã await some_future()?
ã§å·Šå³ã§ã¯ãªããå·Šããå³ãžã®é©åãªè«çå¶åŸ¡ãããŒãåŸãããå¥åŠãªæ°ããã·ã³ãã«ãå°å
¥ããå¿
èŠã¯ãããŸããã
ïŒã€ãŸããtl; drïŒã¡ãœããåŒã³åºãã®ããã«èŠããŸãããå®éã«ã¯æ¥å°ŸèŸãåŸ ã£ãŠããŸãïŒ
åŸçœ®æ§æãèæ
®ããŠæ瀺çã«èšåãããŠããªãããšã¯ããšã©ãŒãšãªãã·ã§ã³ã®ã³ã³ãããŒã¿ã®æ®åã§ãã ãããã¯ãéãåŸ
ã£ãŠãããã¹ãŠã®èšèªãšæãç°ãªãå Žæã§ã-èªåãã¬ãŒã¹ããã¯ã®ä»£ããã«ã .map_err()?
ãŸãã
ç¹ã«æ¬¡ã®ãããªãã®ïŒ
let result = await reqwest::get(..).send();
let response = result.map_err(|e| add_context(e))?;
let parser = await response.json();
let parsed = parser.map_err(|e| add_context(e))?;
èªã¿ã«ããïŒã©ã®æ¥å°ŸèŸæ§æãèæ ®ããããã¯æ°ã«ããªãïŒïŒ
let parsed = reqwest::get(..)
.send() await
.map_err(add_context)?
.json() await
.map_err(add_context)?;
ãã®ããã©ã«ãã®ãã©ãŒãããã«ã¯ãå€å€æ°ã¢ãããŒããããå€ãã®è¡ããããŸãã è€æ°ã®åŸ æ©ããªãåŒã¯ãpostfix-awaitã䜿çšããŠåçŽæ¹åã®ã¹ããŒã¹ãå°ãªãããå¿ èŠãããããã§ãã
ç§ã¯ä»éåæã³ãŒããæžããŠããŸãããããã§ç§ã¯ç¡ç¥ãã話ããŠãããç©ã¿éããŠç³ãèš³ãããŸãã-ãããå®éã«åé¡ã§ãªããªããããã¯çŽ æŽãããã§ãã ãšã©ãŒåŠçãç°ãªãæ¹æ³ã§è¡ãä»ã®èšèªã«äŒŒããããã«ãé©åãªãšã©ãŒåŠçã人éå·¥åŠçã§ãªãããããããŸããã
ã¯ãããããç§ã®èšãããããšã§ãã ç¶æ³ã«å¿ããŠããã¬ãã£ãã¯ã¹ãšãã¹ããã£ãã¯ã¹ã®ã©ã¡ãã䜿çšããããéžæã§ããã®ã§ãäž¡æ¹ã®é·æããããŸãã
@XXããããŠãŒã¶ãŒã³ãŒãã§è¡šçŸã§ããªãå Žåã¯ãã³ã³ãã€ã©ã䜿çšããŠãã®æ©èœãå®è£ ããå¿ èŠããããŸãã ããããæ¥å°ŸèŸãã©ã®ããã«æ©èœããããç解ãããšããç¹ã§ã¯ãè¡šé¢çãªç解ã§ãã£ãŠãã以åã«æçš¿ãã説æã¯åŒãç¶ãæ©èœããŸãã
@ CryZe ã @ XX ã
äžèŠã¹ã ãŒãºã«èŠããŸãããRustã®å²åŠãšã¯å®å
šã«äžèŽããŸããã ã§ãsort
ã€ãã¬ãŒã¿ã®æ¹æ³ã¯è¿ããŸããself
é
åãæ瀺çã«ããããã«ãšäŒæ©ã¡ãœããã®åŒã³åºããã§ãŒã³ãã ãã ããéåžžã®é¢æ°åŒã³åºããšåºå¥ãã€ããªãå®å
šã«æé»çãªæ¹æ³ã§ã圱é¿ãå°ãªããã®ãå®è£
ãããããšãæåŸ
ããŸãã IMOã®å¯èœæ§ã¯ãããŸããã
ã¯ãããããç§ã®èšãããããšã§ãã ç¶æ³ã«å¿ããŠããã¬ãã£ãã¯ã¹ãšãã¹ããã£ãã¯ã¹ã®ã©ã¡ãã䜿çšããããéžæã§ããã®ã§ãäž¡æ¹ã®é·æããããŸãã
ãªããããç®æšã§ãªããã°ãªããªãã®ã§ããïŒ Rustã¯ãä»ã®ãã¹ãŠã®å¶åŸ¡ãããŒïŒããšãã°ã break
ã continue
ã if
ãªã©ïŒã§ããããµããŒãããŠããŸããããããã¯å¯èœæ§ããããŸããç¹å®ã®æèŠã§ã¯èŠæ ããããŸãã
äžè¬ã«ã await
ã¯éåžžã«ç¹å¥ã§ãããéåžžã®ã¡ãœããåŒã³åºãã§ã¯ãªãããšãçããã«æãåºãããããšæããŸãã
!Unpin
ã§ããå¿
èŠãããçç±ã§ãããæ¢åã®ã³ã³ãããŒã¿ãšã¡ã«ããºã ã®ããã€ãã«å€ãã®äžäŸ¿ãåŒãèµ·ãããŸãã async
ã¡ãœããããUnpin
å
ç©ãçæããå¯èœæ§ããããŸãããå°æ¥ã¯åŸ
æ©ãè¶
ããŠåçšããŸããã ãã ãã await
ã衚瀺ãããªãå Žåãããã¯çºçããŸããã@Pzixel @lnicola
CïŒã®äŸã¯å®å
šã«å¿
é ã§ãããRustã§ããèŠãããæ©èœçãªã¹ã¿ã€ã«ã®ãã³ã°ãã§ãŒã³ã®ãããªãã®ã§ã¯ãããŸããã ãã®LINQæ§æã¯åãªãDSLã§ãããç§ãå°ãã°ãŒã°ã«ã§èª¿ã¹ãfoo().bar().x().wih_boo(x).camboom().space_flight();
ãããªãã®ã§ã¯ãªããCïŒã³ãŒãäŸã¯ãã»ãšãã©ã®äžè¬çãªããã°ã©ãã³ã°èšèªãšåæ§ã«ã100ïŒ
å¿
é ã«èŠããŸãã ã ãããããã©ã³ã°Xãããããšããã ç解ããããšã¯ã§ããŸããããªããªããããã¯ãŸã£ããåãã§ã¯ãªãããã§ãã
IMOãã¬ãã£ãã¯ã¹è¡šèšã¯ãåœä»€åã®ã³ãŒãã£ã³ã°ã«å®å šã«é©åããŸãã ããããRustã¯äž¡æ¹ã®ã¹ã¿ã€ã«ããµããŒãããŠããŸãã
@skade
æ©èœçãªã¹ã¿ã€ã«ã®åé¡ã«ã€ããŠã®ããªãã®ïŒãããŠä»ã®ïŒã³ã¡ã³ãã®ããã€ãã«åæããŸããã ç°¡æœã«ããããã«ãã©ã¡ããäžæ¹ã匷ã奜ã人ãããããšã«åæããŸãããã
@ Matthias247ããããèŠãç®ä»¥å€ã«ç¹å¥ãªçç±ããããŸãã Rustãé£éãä¿é²ããããã§ãã ãããŠãããããä»ã®å¶åŸ¡ãããŒã¡ã«ããºã ã«ã¯æ¥å°ŸèŸã®æ§æããªãã®ã«ããªãç¹å¥ãªãã®ãåŸ
ã€å¿
èŠãããã®ã§ããïŒããšèšããããããŸããã ãŸããããã¯ééã£ãè©äŸ¡ã§ãã æ¥å°ŸèŸã®å¶åŸ¡ãããŒããããŸãã ãããã¯ãç§ãã¡ãåŒã³åºãã¡ãœããã®å
éšã«ãããŸãã Option::unwrap_or
ã¯ãæ¥å°ŸèŸã®äžèŽã¹ããŒãã¡ã³ããå®è¡ãããããªãã®ã§ãã Iterator::filter
ã¯ãåŸçœ®ifã¹ããŒãã¡ã³ããå®è¡ãããããªãã®ã§ãã å¶åŸ¡ãããŒãé£éæ§æèªäœã®äžéšã§ã¯ãªããšããçç±ã ãã§ãæ¥å°ŸèŸã®å¶åŸ¡ãããŒããŸã ãªããšããæå³ã§ã¯ãããŸããã ãã®èŠ³ç¹ã§ã¯ãæ¥å°ŸèŸawaitãè¿œå ããããšã¯ãå®éã«ã¯ç§ãã¡ãæã£ãŠãããã®ãšäžèŽããŸãã ãã®å Žåã Iterator
åäœã«äŒŒããã®ã䜿çšããããšãã§ããçã®æ¥å°ŸèŸãåŸ
æ©ããã代ããã«ã Future::await_or
ãããªåŸ
æ©ã³ã³ãããŒã¿ã䜿çšããããšãã§ããŸãã ãããã«ãããæ¥å°ŸèŸãåŸ
ã€ããšã¯èŠãç®ã ãã®åé¡ã§ã¯ãªããæ©èœæ§ãšç掻ã®è³ªã®åé¡ã§ãã ããã§ãªããã°ããŸã try!()
ãã¯ãã䜿çšããŠããã§ãããïŒ
@dpc
CïŒã®äŸã¯å®å šã«å¿ é ã§ãããRustã§ããèŠãããæ©èœçãªã¹ã¿ã€ã«ã®ãã³ã°ãã§ãŒã³ã®ãããªãã®ã§ã¯ãããŸããã ãã®LINQæ§æã¯åãªãDSLã§ãããfooïŒïŒãbarïŒïŒãxïŒïŒãwih_booïŒxïŒ.camboomïŒïŒãspace_flightïŒïŒ;ã®ãããªãã®ã§ã¯ãããŸããã ç§ã¯å°ãã°ãŒã°ã«ã§èª¿ã¹ãŸããããCïŒã®ã³ãŒãäŸã¯ãã»ãšãã©ã®äžè¬çãªããã°ã©ãã³ã°èšèªãšåãããã«ã100ïŒ å¿ é ã«èŠããŸãã ã ãããããã©ã³ã°Xãããããšããã ç解ããããšã¯ã§ããŸããããªããªããããã¯ãŸã£ããåãã§ã¯ãªãããã§ãã
ããã¯çå®ã§ã¯ãããŸãããïŒ pollyãªã©ã®ãã¬ãŒã ã¯ãŒã¯ã確èªã§ããŸãïŒãããã«ã€ããŠã¯è°è«ããŸããã äž¡æ¹ã®èšèªã§åãæ°ã®é£éã³ãŒãã衚瀺ãããŸãã ããããå®éã«ã¯ãã¹ãŠãç°ãªããã®ããããŸãã ãããŠããã¯Try
ç¹æ§ãšåŒã°ããŸãã CïŒã«ã¯ããã«äŒŒããã®ããªãããã await
ãã€ã³ããè¶
ããŠäœãããããšã¯æ³å®ãããŠããŸããã äŸå€ãçºçããå Žåãããã¯èªåçã«ã©ãããããçºä¿¡è
ã®ããã«çºçããŸãã
?
æŒç®åãæåã§äœ¿çšããå¿
èŠãããRustã®å Žåã¯ããã§ã¯ãããŸããã
await
ãã€ã³ããè¶
ãããã®ãå¿
èŠãªå Žåã¯ããçµåãæŒç®åawait?
äœæããããèšèªã«ãŒã«ãæ¡åŒµãããªã©ããå¿
èŠããããŸãããŸãã¯ãæ¥å°ŸèŸãåŸ
ã€ã ãã§ãç©äºãããèªç¶ã«ãªããŸãïŒå°ãç°è³ªãªæ§æã§ããã誰ãæ°ã«ããŸããïŒïŒ
ã§ããããç§ã¯çŸåšãããå®è¡å¯èœãªè§£æ±ºçãšããŠæ¥å°ŸèŸãåŸ
ã£ãŠãããšèããŠããŸãã ç§ãæã£ãŠããå¯äžã®ææ¡ã¯ã await()
ãawait!()
ã§ã¯ãªããå°çšã®ã¹ããŒã¹åºåãã®ããŒã¯ãŒãã§ããã¹ãã§ãã
éåžžã®.awaitïŒïŒã¡ãœãããæ£åœåããæ£åœãªçç±ãæãã€ãããšæããŸãã ããªããããã«ã€ããŠèãããªãã°ãããã¯ä»ã®ãããã¯ã®æ¹æ³ãšäœãå€ããã¯ãããŸããã .awaitïŒïŒã¡ãœãããåŒã³åºããšãïŒããããã°ãªãŒã³ïŒã¹ã¬ããã®å®è¡ãåæ¢ããããæç¹ã§å®è¡äžã®ã©ã³ã¿ã€ã ãã¹ã¬ããã®å®è¡ãåéããŸãã ãããã£ãŠãMutexãã£ãã«ãŸãã¯stdãã£ãã«ã®ãããã䜿çšããŠããå Žåã§ãããã¹ãŠã®ç®çãšç®çã§æ¬¡ã®ããã«ãªããŸãã
let result = my_channel().recv()?.iter().map(...).collect();
ãŸãã¯ãã®ãããªæªæ¥ïŒ
let result = my_future().await()?.iter().map(...).collect();
éãã¯ãããŸããã ãããã¯äž¡æ¹ãšãããããã®recvïŒïŒ/ awaitïŒïŒã§å®è¡ããããã¯ããäž¡æ¹ãšãåãæ¹æ³ã§ãã§ãŒã³ããŸãã å¯äžã®éãã¯ãawaitïŒïŒãOSã®ãããŒãŠã§ã€ãã¹ã¬ããã§ã¯ãªãå¥ã®ãšã°ãŒãã¥ãŒã¿ã§å®è¡ãããŠããå¯èœæ§ãããããšã§ãïŒãã ããã·ã³ã°ã«ã¹ã¬ããã®ãšã°ãŒãã¥ãŒã¿ã®å Žåã¯éåžžã«ãããããŸãïŒã ãããã£ãŠã倧éã®ãã§ãŒã³ãæããšã©ãŸãããããšã¯ããŸã£ããåãããã«äž¡æ¹ã«åœ±é¿ãåãŒããããããå®éã®ç³žããã®åºãªã糞ããã«ã€ãªããã¯ãã§ãã
ãã ããããã§ã®ç§ã®ãã€ã³ãã¯ããã®ã³ãŒããæžããŠãã人ã®èŠ³ç¹ããã¯ã.recvïŒïŒãš.awaitïŒïŒã«å€§ããªéãã¯ãªããã©ã¡ããå®è¡ããããã¯ããçµæãå©çšå¯èœã«ãªããšæ»ãã¡ãœããã§ãããšããããšã§ãã ã ãããã£ãŠããã¹ãŠã®æå³ãšç®çã®ããã«ãããã¯ã»ãšãã©éåžžã®æ¹æ³ã§ãããæ¬æ ŒçãªããŒã¯ãŒããå¿ èŠãšããŸããã Mutexãšstdã®ãã£ãã«ã®recvãŸãã¯lockããŒã¯ãŒãããããŸããã
ãã ããrustcã¯æããã«ã³ãŒãå šäœããžã§ãã¬ãŒã¿ãŒã«å€æããããšèããŠããŸãã ããããããã¯èšèªã®èŠ³ç¹ããå®éã«æå³çã«å¿ èŠã§ããïŒ å®éã®OSã¹ã¬ããããããã¯ããããšã§awaitãå®è£ ããrustcã®ä»£æ¿ã³ã³ãã€ã©ãäœæã§ãããšç¢ºä¿¡ããŠããŸãïŒéåæfnãå ¥åãããšãã¹ã¬ãããçæãããåŸ æ©ãããšãã®ã¹ã¬ããããããã¯ãããŸãïŒã ããã¯éåžžã«åçŽã§é ãå®è£ ã§ãããæå³çã«ã¯ãŸã£ããåãããã«åäœããŸãã ãããã£ãŠãå®éã®rustcãåŸ æ©ããžã§ãã¬ãŒã¿ãŒã«å€ãããšããäºå®ã¯æå³çã«å¿ èŠã§ã¯ãããŸããã ãããã£ãŠãå®éã«ã¯ã.awaitïŒïŒã¡ãœããã®åŒã³åºãããžã§ãã¬ãŒã¿ãŒã«å€æããrustcã¯ãrustcã®å®è£ ã®è©³çŽ°ãæé©åãããã®ãšèŠãªãããšãã§ãããšäž»åŒµããŸãã ããããã°ã.awaitïŒïŒãå®å šãªã¡ãœããã®äžçš®ã§ãããå®å šãªããŒã¯ãŒãã§ã¯ãªãããšãæ£åœåã§ããŸãããããã§ãrustcã§ãã¹ãŠããžã§ãã¬ãŒã¿ãŒã«å€æããããšãã§ããŸãã
@CryZeã¯.recv()
ãšã¯ç°ãªããããã°ã©ã å
ã®ä»ã®å Žæããawait
ãå®å
šã«äžæã§ãã await
暪ã®ã³ãŒãã¯å®è¡ãããŸããã ããã¯å€§ããªéãã§ããããããawait
æé»çã«å®è¡ããŠã¯ãªããªãæã䟡å€ã®ããçç±ã§ãã
@ I60Rããã¯ããŒã¯ãŒããšããŠåŸ ã€ãããæçœã§ãã å¿ èŠã«å¿ããŠãIDEã§ãåãæ¹æ³ã§åŒ·èª¿è¡šç€ºã§ããŸãã ããŒã¯ãŒããæ¥å°ŸèŸã®äœçœ®ã«ç§»åããã ãã§ããããã§ã¯ãå®éã«ã¯èŠéãã«ãããšæããŸãïŒå®è¡ãåæ¢ããäœçœ®ã«ããããïŒã
ã¯ã¬ã€ãžãŒãªã¢ã€ãã¢ïŒæé»ã®åŸ æ©ã å¥ã®ã¹ã¬ããã«ç§»åããŸãããããã¯ããã¹ããã£ãã¯ã¹ãšãã¬ãã£ãã¯ã¹ã®è°è«ã§ãã§ã«å¿ããããŠããããã§ãã
@CryZe
éåžžã®.awaitïŒïŒã¡ãœãããæ£åœåããæ£åœãªçç±ãæãã€ãããšæããŸãã ããªããããã«ã€ããŠèãããªãã°ãããã¯ä»ã®ãããã¯ã®æ¹æ³ãšäœãå€ããã¯ãããŸããã
https://github.com/rust-lang/rust/issues/57640#issuecomment-456147515ãããäžåºŠãèªã¿
@ Matthias247ãããã¯éåžžã«è¯ãç¹ã§ããç§ã¯ããããéããããã§ãã
é¢æ°ãã¡ã³ããŒããŸãã¯ãã®ä»ã®æé»ã®åŸ æ©ãäœæããããšã«é¢ãããã®ãã¹ãŠã®è©±ã¯ãåºæ¬çã«ç¡å¹ã§ãã ããã¯è¡åã§ã¯ãªããå€é©ã§ãã
ã³ã³ãã€ã©ãŒã¯ãé«ã¬ãã«ã§ãããŒã¯ãŒããŸãã¯ãã¯ããä»ããŠãåŸ æ©åŒãç¹å¥ãªãžã§ãã¬ãŒã¿ãŒyieldåŒã«å€æãããã®å Žã§åçšããã®ä»ã®ãã®ãåŠçããŸãã
ããã¯æ瀺çã§ãã
ããŒã¯ãŒããšããŠã§ããã ãèŠæ ããããããæããã«ãã¯ãã䜿çšããŠã³ãŒããçæããå¿ èŠããããŸãã
éæ³ã®æ¹æ³ãç¹æ§ãã¡ã³ããŒãªã©ã¯ãç¹ã«æ°ãããŠãŒã¶ãŒã«ãšã£ãŠã¯ã誀解ã誀解ãéåžžã«ç°¡åã§ãã
ãã¬ãã£ãã¯ã¹ããŒã¯ãŒãawaitãŸãã¯ãã¬ãã£ãã¯ã¹ãã¯ãawaitã¯ããããè¡ãããã®æãåãå ¥ããããæ¹æ³ã®ããã«æãããŸããããã¯ãä»ã®å€ãã®èšèªããã®ããã«è¡ãã®ãšåãããã«çã«ããªã£ãŠããŸãã ç§ãã¡ã¯ãããè¯ãããããã«ç¹å¥ã§ããå¿ èŠã¯ãããŸããã
@novacrazy
éæ³ã®æ¹æ³ãç¹æ§ãã¡ã³ããŒãªã©ã¯ãç¹ã«æ°ãããŠãŒã¶ãŒã«ãšã£ãŠã¯ã誀解ã誀解ãéåžžã«ç°¡åã§ãã
ãããæ¡åŒµã§ããŸããïŒ ããå
·äœçã«ã¯ãå¯èœã§ããã°.await!()
ããªã¢ã³ãã«ã€ããŠã
ç§ã®æèŠã§ã¯ã foo.await!()
ãæã£ãŠããããšã¯ãç¹ã«é©åãªæ§æã®åŒ·èª¿è¡šç€ºã䜿çšããŠèªãã®ã¯é£ãããããŸãããããã¯ç¡èŠããŠã¯ãªããŸããã
ããã®æå³ã誀解ããŠããŸããïŒ äœãæ¬è³ªçã«æ¬¡ã®ãšããã§ãïŒã¿ã€ãmystakesãç¡èŠããŠãã ããïŒïŒ
trait Future {
fn await!(self) -> Self::Item {
await self
}
}
å¥åawait this_foo
ãšthis_foo.await!()
ã¯ãŸã£ããåãã§ãã ããã«ã€ããŠèª€è§£ãããããã®ã¯äœã§ããïŒ
ãããŠãæ°ãããŠãŒã¶ãŒã®ãããã¯ã«ã€ããŠïŒæ°ãããŠãŒã¶ãŒã¯äœã«ïŒ ããã°ã©ãã³ã°äžè¬ããŸãã¯èšèªãšããŠã®Rustã®æ°èŠãŠãŒã¶ãŒã§ãããããã°ã©ãã³ã°èšèªã®ããã¯ã°ã©ãŠã³ãããããŸããïŒ åè ã®å Žåã圌ããéåæããã°ã©ãã³ã°ã«æãåºããšã¯æããªãããã§ãã åŸè ã®å Žåãæ··ä¹±ããããšãªããïŒäžèšã§èª¬æããããã«ïŒåŸçœ®åŸ æ©ã®ã»ãã³ãã£ã¯ã¹ã説æããæ¹ãç°¡åã§ãã
ãããã¯ããã¬ãã£ãã¯ã¹awaitã®ã¿ãè¿œå ãããå Žåãç§ãç¥ã£ãŠããããšã¯ããã©ãŒã ã®Rustã³ãŒããå ¥åãšããŠåãåãããã°ã©ã ã®äœæãåæ¢ããããšã¯ãããŸããã
foo.bar().baz().quux().await!().melo().await!()
ãããŠãããã«å€æããŸã
await (await foo.bar().baz().quux()).melo()
@ivandardi
.await!()
ã¯å Žåã«ãã£ãŠã¯äŸ¿å©ã§ããããã次ã®ããã«await!(...)
ãšäžç·ã«æ©èœããŸãã
macro_rules! await {
// prefix
($fut:expr) => {...}
// postfix
($self:Self) => { await!($self) }
}
ãã ããæ¥å°ŸèŸã¡ãœããã®ãã¯ãã¯çŸåšååšãããååšããªãå¯èœæ§ããããŸãã
ãããå°æ¥ã®å¯èœæ§ã§ãããšèããå Žåã¯ãä»ã®ãšãããã¯ãawait!(...)
ã䜿çšãããããå®è£
ããããšãã«å°æ¥çã«æ¥å°ŸèŸãè¿œå ããã ãã§ãã
äž¡æ¹ã®ãã¯ãã䜿çšããã®ãçæ³çã§ãããå°æ¥çã«æ¥å°ŸèŸãã¯ããå®è£
ããäºå®ããªãå Žåã¯ããã¬ãã£ãã¯ã¹ããŒã¯ãŒãawait
ãããããæåã®çã§ãã
@novacrazyç§ã¯ããã«åæããããšãã§ããããã¯ç§ã®æåã®ææ¡ã§ãã ä»ã®ãšããawait!()
ãè¿œå ããæ¥å°ŸèŸãã©ãŒã ãç解ããå¿
èŠããããŸãã åŸçœ®ãã¯ãã®å¯èœæ§ã«ã€ããŠã話ãåãå¯èœæ§ããããŸãããŸããèšèªã§åŸçœ®ãã¯ããå®å
šã«ãµããŒãããåã«ãåŸçœ®.await!()
ããã®èšèªã«ã¢ãããã¯ã«è¿œå ã§ãããã©ããã«ã€ããŠã話ãåããŸãã ?
ãšTry
ç¹æ§ã§èµ·ãã£ãããšã®ããã«ãæåã«ç¹å¥ãªã±ãŒã¹ãšããŠè¿œå ããããã®åŸãããäžè¬çãªã±ãŒã¹ã«æ¡åŒµãããŠããŸãã 決å®ãããšãã«æ³šæããå¿
èŠãããå¯äžã®ããšã¯ãäžè¬çãªæ¥å°ŸèŸãã¯ãæ§æãã©ã®ããã«èŠãããã§ããããã¯ãå¥ã®è°è«ã«å€ãããããããŸããã
ãã¬ãã£ãã¯ã¹ããŒã¯ãŒãawaitãŸãã¯ãã¬ãã£ãã¯ã¹ãã¯ãawaitã¯ããããè¡ãããã®æãåãå ¥ããããæ¹æ³ã®ããã«æãããŸããããã¯ãä»ã®å€ãã®èšèªããã®ããã«è¡ãã®ãšåãããã«çã«ããªã£ãŠããŸãã
ããã¯æããã«_å®è¡å¯èœ_ã§ãããç§ã¯ããã«ã€ããŠ2ã€ã®è°è«ããèŠããŠãããã説åŸåããããšã¯æããŸããã
poll
ã®ä»£ããã«å®è¡ãããŠããã¢ããããŒã»å段ã®ç·šawait
ãéãæ ¹æ¬çã«ç°ãªã£ãŠããã®ã§ãèšèªawait
ããã®ã奜ããªäººawait
så
ã®foo(aFuture.await, bFuture.await)
ã圌ãã¯æ¥é èŸã§ãããã®ããã«?
ã¹ãã£ã³ããŠããŸããç§ã¯äœãèŠèœãšããŠãŸããïŒ
ããè°è«ãããŸãããããã¯ãã¹ãŠã»ãŒåãã ãã ã£ããšããããç§ã¯ããŸããç§ãã¡ãæ¬åœã«æ°ã«ããªãã®ãªããä»ã®ã¿ããªããã£ãŠããããšããã£ãã»ããããããšçµ¶å¯Ÿã«åæããã§ãããã ããããç§ãã¡ã¯ããã«ãããšã¯æããŸããã
@scottmcmã¯ããã
ãããã£ãŠãèªã¿ãããã芪ãã¿ããããä¿å®æ§ãããã©ãŒãã³ã¹ã®é©åãªãã©ã³ã¹ãèŠã€ããå¿
èŠããããŸãã ãããã£ãŠãæåŸã®ã³ã¡ã³ãã®ç§ã®ã¹ããŒãã¡ã³ãã¯åœãŠã¯ãŸããŸããå°æ¥ãåŸçœ®ã¡ãœãããã¯ãïŒ .await!()
ïŒãè¿œå ããå Žåã¯ããã¯ãawait!()
ã䜿çšããããéå±ãªãã¬ãã£ãã¯ã¹ããŒã¯ãŒãawait
ãè¿œå ããŸãããã以å€ã®å Žåã¯
éå±ã¯è¯ãã®ã§ãç§ã¯éå±ãšèšããŸãã ãããã䜿çšããŠã³ãŒããäœæãããšãã¯ãæ§æèªäœã«æ³šæãæããªãããã«ããŸãã
f.await()
ãé©åã§ãªãå Žåã¯ããã¬ãã£ãã¯ã¹æ§æã䜿çšããŸãã
ãŠãŒã¶ãŒãšããŠãç§ã䜿çšããèšèªã«æ§æèŠåãããã€ãããããšãé¡ã£ãŠããŸãããããã®èŠåã䜿çšãããšããããäœãããŠããã®ãã確å®ã«æšæž¬ã§ããŸãã ãã¡ãã¡ã§äŸå€ã§ã¯ãããŸããã Rustã§ã¯ã async
ãæåã«ãããæåã®await
ãäŸå€ã§ã¯ãããŸããã ãã ãã f await
ãæçš¿ããŒã¯ãŒããã©ãŒã ã¯æ¬¡ã®ããã«ãªããŸãã f.await
ã¯ãã£ãŒã«ãã¢ã¯ã»ã¹ã®ããã«èŠããŸãããäŸå€ã§ãã f.await!()
ã¯ãèšèªã«æ¥å°ŸèŸãã¯ãã衚瀺ãããããšããªããäŸå€ãšããŠãä»ã«ã©ã®ãããªå Žåã«é©ããŠãããããããŸããã ãããã®æ§æã1åéãã®äŸå€ã§ã¯ãªãã«ãŒã«ã«ãªãæ¹æ³ã«ã€ããŠã¯åçããããŸããã
äŸå€ãçºçããå ŽåããããçŽæçã«ç解ã§ããããšãé¡ã£ãŠããŸãã äŸãšããŠ?
ãåãäžããŸããããã¯ãä»ã®èšèªã§ã¯é »ç¹ã§ã¯ãªããããäŸå€ãšèŠãªãããšãã§ããŸãã f()?.map()
compute fïŒïŒãšã»ãšãã©åãããã«èªã¿åããŸããããã®çµæã¯è¯ãçµæã§ããïŒ ããã®?
ã¯ããèªäœã説æããŠããŸãã ãããã f await
ããªãæ¥å°ŸèŸãªã®ãã f.await
await
ã¯ãã£ãŒã«ãã f.await!()
ããã¯ãããã®äœçœ®ã«è¡šç€ºãããçç±ãå°ããŸãã å°ãªããšãäžèŠããã ãã§ã¯ã説åŸåã®ããçŽæçãªæèŠã¯åŸãããŸããã
æåã®ãã€ã³ããæ¡åŒµããŠãRustã¯ã·ã¹ãã èšèªã«ãªããããšèããŠããŸãã ããã§ã®äž»èŠãªãã¬ãŒã€ãŒã§ããC / C ++ / Go / Javaã¯ããã¹ãŠããäžå¯æ¬ ã§ãã ãŸããã»ãšãã©ã®äººã¯åœä»€åèšèªãHaskellã§ã¯ãªãC / Python / Javaãªã©ã§ãã£ãªã¢ãéå§ãããšæããŸããã·ã¹ãã éçºè ã次äžä»£éçºè ã«Rustãæ¡çšããããã«èª¬åŸãããšæããŸãããRustã¯æåã«åœä»€åã§ããŸãæ©èœãã次ã«æ©èœçã§ããå¿ èŠããããŸããéåžžã«æ©èœçã§ããããªãã¿ã®ããåœä»€çãªæèŠã¯ãããŸããã
ãã§ãŒã³ãåå²ããŠæ°è¡ã«æžãã®ã¯æªãããšã§ã¯ãªããšæããŸãã åé·ã§ã¯ãããŸããã æ瀺çã§ãã
ãã£ã¹ã«ãã·ã§ã³ãã©ã®ããã«ããæ¹åããå¥ã®æ¹åã«ç¶ç¶çã«ç§»åãããïŒãã¬ãã£ãã¯ã¹ãšãã¹ããã£ãã¯ã¹ïŒãèŠããšã await
ããŒã¯ãŒãã«åé¡ããããå®å
šã«æ€åããå¿
èŠããããšãã匷ãæèŠããããŸããã 代ããã«ãçŸåšã®ã¹ã¬ããã§å
¬éããããã¹ãŠã®æèŠã®äžã§éåžžã«è¯ã劥åç¹ã«ãªããšæã次ã®æ§æãææ¡ããŸãã
// syntax below is exactly the same as with prefix `await`
let response = go client.get("https://my_api").send();
let body: MyResponse = go response.into_json();
æåã®ã¹ãããã§ã¯ãç¹å®ã®äžéšæ§é ã®åŠçã§ãšã©ãŒãçºçããããšãªããéåžžã®ãã¬ãã£ãã¯ã¹æŒç®åãšåãããã«å®è£ ããŸãã
// code below don't compiles because `?` takes precedence over `go`
let response = go client.get("https://my_api").send()?;
let body: MyResponse = go response.into_json()?;
2çªç®ã®ã¹ãããã§ã¯ãé©åãªãšã©ãŒåŠçãå¯èœã«ããé 延ãã¬ãã£ãã¯ã¹æŒç®åæ§æãå®è£ ããŸãã
// now `go` takes precedence over `?` if present
let response = client.get("https://my_api").go send()?;
let body: MyResponse = response.go into_json()?;
ããã§å šéšã§ãã
次ã«ãããå€ãã®ã³ã³ããã¹ããæäŸããããã€ãã®è¿œå ã®äŸãèŠãŠã¿ãŸãããã
// A
if db.go is_trusted_identity(recipient.clone(), message.key.clone())? {
info!("recipient: {}", recipient);
}
// B
match db.go load(message.key)? {
Some(key) => key,
None => {
return Err(/* [...] */);
}
};
// C
let mut res = client.get(&script_src)
.header("cookie", self.cookies.read().as_header_value())
.header("user-agent", USER_AGENT)
.go send()?
.error_for_status()?;
// D
let mut res: InboxResponse = client.get(inbox_url)
.headers(inbox_headers)
.go send()?
.error_for_status()?
.go json()?;
// E
let mut res: Response = client.post(url)
.multipart(form)
.headers(headers.clone())
.go send()?
.error_for_status()?
.go json()?;
// F
async fn request_user(self, user_id: String) -> Result<User> {
let url = format!("users/{}/profile", user_id);
let user = self.go request(url, Method::GET, None, true)?
.res.go json::<UserResponse>()?
.user
.into();
Ok(user)
}
// G
async fn log_service(&self) -> T {
let service = self.myService.foo();
go self.logger.log("beginning service call");
let output = go service.exec();
go self.logger.log("foo executed with result {}.", output));
output
}
// H
async fn try_log(message: String) -> Result<usize, Error> {
let logger = go acquire_lock();
let length = logger.go log_into(message)?;
go logger.timestamp();
Ok(length)
}
// I
async fn await_chain() -> Result<usize, Error> {
go (go partial_computation()).unwrap_or_else(or_recover);
}
/// J
let res = client.get("https://my_api").go send()?.go json()?;
ã·ã³ã¿ãã¯ã¹ãã€ã©ã€ããæå¹ã«ãªã£ãŠããã¹ãã€ã©ãŒããŒãžã§ã³ã®äžã«é ãããŠããŸã
// A
if db.as is_trusted_identity(recipient.clone(), message.key.clone())? {
info!("recipient: {}", recipient);
}
// B
match db.as load(message.key)? {
Some(key) => key,
None => {
return Err(/* [...] */);
}
};
// C
let mut res = client.get(&script_src)
.header("cookie", self.cookies.read().as_header_value())
.header("user-agent", USER_AGENT)
.as send()?
.error_for_status()?;
// D
let mut res: InboxResponse = client.get(inbox_url)
.headers(inbox_headers)
.as send()?
.error_for_status()?
.as json()?;
// E
let mut res: Response = client.post(url)
.multipart(form)
.headers(headers.clone())
.as send()?
.error_for_status()?
.as json()?;
// F
async fn request_user(self, user_id: String) -> Result<User> {
let url = format!("users/{}/profile", user_id);
let user = self.as request(url, Method::GET, None, true)?
.res.as json::<UserResponse>()?
.user
.into();
Ok(user)
}
// G
async fn log_service(&self) -> T {
let service = self.myService.foo();
as self.logger.log("beginning service call");
let output = as service.exec();
as self.logger.log("foo executed with result {}.", output));
output
}
// H
async fn try_log(message: String) -> Result<usize, Error> {
let logger = as acquire_lock();
let length = logger.as log_into(message)?;
as logger.timestamp();
Ok(length)
}
// I
async fn await_chain() -> Result<usize, Error> {
as (as partial_computation()).unwrap_or_else(or_recover);
}
/// J
let res = client.get("https://my_api").as send()?.as json()?;
IMOãã®æ§æã¯ãããããé¢ã§ä»ã®æ§æãããåªããŠããŸãã
âäžè²«æ§ïŒRustã³ãŒãå
ã§ã¯éåžžã«ææ©çã«èŠããã³ãŒãã¹ã¿ã€ã«ãå£ãå¿
èŠã¯ãããŸãã
âæ§æå¯èœæ§ïŒãã§ãŒã³ããšã©ãŒåŠçãªã©ã®ä»ã®Rustæ©èœãšããŸãçµ±åã§ããŸã
âã·ã³ãã«ãïŒçãã説æçã§ãç解ãããããæäœãããã
âåå©çšæ§ïŒé
延ãã¬ãã£ãã¯ã¹æŒç®åã®æ§æã¯ãä»ã®ã³ã³ããã¹ãã§ã圹ç«ã¡ãŸã
âããã¥ã¡ã³ãïŒåŒã³åºãåŽã®ãã£ã¹ããããã©ããã«æµããæ»ããŸã§åŸ
æ©ããããšãæå³ããŸã
â芪ãã¿ãããïŒãã§ã«ãªãã¿ã®ãããã¿ãŒã³ãæäŸããŸããããã¬ãŒããªããå°ãªããªããŸã
âèªã¿ãããïŒå¹³æãªè±èªãšããŠèªã¿ãåèªã®æå³ãæªããªã
âå¯èŠæ§ïŒãã®äœçœ®ã«ãããã³ãŒãã®ã©ããã«åœè£
ããããšãéåžžã«å°é£ã«ãªããŸã
âå°éå¯èœæ§ïŒéåžžã«ç°¡åã«ã°ãŒã°ã«ã§æ€çŽ¢ã§ããŸã
âååã«ãã¹ãæžã¿ïŒgolangã¯æè¿äººæ°ããããæ§æã¯äŒŒãŠããŸãã
âé©ãïŒãã®æ§æã誀解ãããä¹±çšãããããã®ã¯é£ãã
âæºè¶³åºŠïŒå°ãã®åŠç¿ã®åŸããã¹ãŠã®ãŠãŒã¶ãŒã¯çµæã«æºè¶³ããŸã
ç·šéïŒ @ivandardiã以äžã®ã³ã¡ã³ãã§ææããããã«ãããã€ãã®ããšãæ確ã«ããå¿ èŠããããŸãïŒ
1.ã¯ãããã®æ§æã¯å°ãèŠã¥ããã§ãããåæã«ãèªã¿ãããã®åé¡ããªãæ§æãããã§çºæããããšã¯äžå¯èœã§ãã go
æ§æã¯ããã¬ãã£ãã¯ã¹äœçœ®ã§ã¯ãã¬ãã£ãã¯ã¹await
ãšãŸã£ããåãã§ãããé
延äœçœ®ã§ã¯ãã¹ããã£ãã¯ã¹await
ãããIMOãèªã¿ããããããããã§ã¯ããã»ã©éªæªã§ã¯ãªãããã§ããäŸãã°ïŒ
match db.go load(message.key) await {
Some(key) => key,
None => {
return Err(/* [...] */);
}
};
ããã§ã await
ã¯ãããŸãã«èŠããæ¢åã®ãã¹ãŠã®ããŒã¯ãŒããšã¯ç°ãªãçµåæ§ãæã£ãŠããŸãããå°æ¥çã«await
ãããã¯ãå®è£
ããããšã決å®ããå Žåããããã«ãŒã«ãªãå¯èœæ§ããããŸãã
2. RFCãäœæãããé 延ãã¬ãã£ãã¯ã¹æŒç®åãæ§æãå®è£ ããã³å®å®åããå¿ èŠããããŸãã ãã®æ§æã¯éåæã³ãŒãã«åºæã®ãã®ã§ã¯ãããŸããããéåæã§äœ¿çšããããšãäž»ãªåæ©ã«ãªããŸãã
3. ãé 延ãã¬ãã£ãã¯ã¹æŒç®åãæ§æã§ã¯ã次ã®çç±ã§ããŒã¯ãŒããéèŠã«ãªããŸãã
ãšã«ããã await
代ããã«go
await
䜿ãå§ããŠã2022幎çã§ååãå€æŽããããšã¯ããªãå¯èœã§ãã ãã®æãŸã§ãç°ãªãããŒã¯ãŒããŸãã¯æŒç®åãçºæãããå¯èœæ§ãéåžžã«é«ãã§ãã ãŸããååã®å€æŽã¯ãŸã£ããå¿
èŠãªããšå€æããããšãã§ããŸãã await
ãèªã¿ãããããšãããããŸããã
go
代ããã«await
䜿çšãããã¹ãã€ã©ãŒããŒãžã§ã³ã®äžã«é ãããŠããŸã
// A
if db.await is_trusted_identity(recipient.clone(), message.key.clone())? {
info!("recipient: {}", recipient);
}
// B
match db.await load(message.key)? {
Some(key) => key,
None => {
return Err(/* [...] */);
}
};
// C
let mut res = client.get(&script_src)
.header("cookie", self.cookies.read().as_header_value())
.header("user-agent", USER_AGENT)
.await send()?
.error_for_status()?;
// D
let mut res: InboxResponse = client.get(inbox_url)
.headers(inbox_headers)
.await send()?
.error_for_status()?
.await json()?;
// E
let mut res: Response = client.post(url)
.multipart(form)
.headers(headers.clone())
.await send()?
.error_for_status()?
.await json()?;
// F
async fn request_user(self, user_id: String) -> Result<User> {
let url = format!("users/{}/profile", user_id);
let user = self.await request(url, Method::GET, None, true)?
.res.await json::<UserResponse>()?
.user
.into();
Ok(user)
}
// G
async fn log_service(&self) -> T {
let service = self.myService.foo();
await self.logger.log("beginning service call");
let output = await service.exec();
await self.logger.log("foo executed with result {}.", output));
output
}
// H
async fn try_log(message: String) -> Result<usize, Error> {
let logger = await acquire_lock();
let length = logger.await log_into(message)?;
await logger.timestamp();
Ok(length)
}
// I
async fn await_chain() -> Result<usize, Error> {
await (as partial_computation()).unwrap_or_else(or_recover);
}
/// J
let res = client.get("https://my_api").await send()?.await json()?;
å察祚ãæããããã«ããã«ããå Žåã¯ã次ã®ããšã確èªããŠãã ããã
@ I60R
ç§ã¯ããã«ããã€ãã®äžæºãæã£ãŠããŸãã
match db.go load(message.key)? {
Some(key) => key,
None => {
return Err(/* [...] */);
}
};
ããã¯å°ãç®ã§è§£æããã®ãé£ããã§ãã äžèŠã db.go
ã§äžèŽããŠãããšæããããããŸãããããã以äžã®ãã®ãããããããŒããããããŸãããããŒãã¯dbã®ã¡ãœããã§ãããšèšããŸãã ã¡ãœããã¯åžžã«ããããå±ãããªããžã§ã¯ãã®è¿ãã«ãããã¡ãœããéã«ã¹ããŒã¹ãããŒã¯ãŒãã®äžæããªããããæ§æã¯äž»ã«æ©èœããŸããã
第äºã«ãããªãã®ææ¡ã§ã¯ããæ®ã眮ããã¬ãã£ãã¯ã¹æŒç®åæ§æããšã¯äœããå®çŸ©ããå Žåã«ãã£ãŠã¯æåã«èšèªã§äžè¬åããå¿ èŠããããŸãã ãã以å€ã®å Žåã¯ãéåæã³ãŒãã«ã®ã¿äœ¿çšããããã®ã«ãªããããªãåŸçœ®ãã¯ãã䜿çšããªãã®ããã®èª¬æã«æ»ããŸãã ããŸãã«ãã
第äžã«ãããŒã¯ãŒãã¯ãŸã£ããéèŠã§ã¯ãªããšæããŸãã ãã ããããŒã¯ãŒãã¯2018幎ççšã«äºçŽãããŠããããã await
ãåªå
ããå¿
èŠããããŸããã go
ããŒã¯ãŒãã¯ãææ¡ãããåã«ããã詳现ãªcrates.ioæ€çŽ¢ãå®è¡ããå¿
èŠã¯ãããŸããã
è°è«ãã©ã®ããã«ããæ¹åããå¥ã®æ¹åã«ç¶ç¶çã«ç§»åãããïŒæ¥é èŸãšæ¥å°ŸèŸïŒãèŠããšãawaitããŒã¯ãŒãã«äœãåé¡ããããå®å šã«æ€åããå¿ èŠããããšãã匷ãæèŠããããŸããã
ïŒåïŒæé»çã«åŸ ã€ããšãã§ãããã¹ãŠãããŸãããã§ãããããéåæé¢æ°ã®å šäœçãªãã€ã³ãã¯å®è£ ã®è©³çŽ°ãé ããŠããããæ£ããèŠããããšã§ãããšããäºå®ã«ãããããããRustã³ãã¥ããã£ã§ã¯å£²ãè¡ããæªãã§ãããiooneããããã¯ãããããªãã®ã§ãã
@dpcã€ãŸããåæé»çãªåŸ
æ©ãšãã³ãŒãã»ã¯ã·ã§ã³ãæ瀺çã«unsafe
䌌ããã®ã§ãã
let mut res: Response = await { client.post(url)
.multipart(form)
.headers(headers.clone())
.send()?
.error_for_status()?
.json()?
};
await
ãããã¯å
ã®ãã¹ãŠãèªåçã«åŸ
æ©ãããå Žæã 代ããã«ãã§ãŒã³å
šäœãåŸ
ã€ããšãã§ããã®ã§ãããã«ãããåŸçœ®ããã§ãŒã³ãåŸ
ã€å¿
èŠããªããªããŸãã ãããåæã«ããã®åœ¢ãæãŸãããã©ããã¯ããããŸããã ãã¶ããä»ã®èª°ããããã«å¯ŸããŠæ¬åœã«æ£åœãªçç±ãèŠã€ããããšãã§ããŸãã
@dpcéåæé¢æ°ã®ãã€ã³ãã¯ã詳现ãé衚瀺ã«ããããšã§ã¯ãªãããã
ã©ã®èšèªã§ããéåæé¢æ°ãšåæé¢æ°ãæ··åããããšã¯ãããŸããã ã¹ããŒããã·ã³ãææžãããã®ã§ã¯ãªããæäœã®ã·ãŒã±ã³ã¹ãããèªã¿ãããä¿å®ãããã圢åŒã§æŽçããããšã ããç®çã§ãã
ãŸãã @ ivandardiã®äŸã«ç€ºãããŠããæé»ã®Future
ã³ã³ãããŒã¿ã䜿çšã§ããªããªããŸããããã¯ããã§ã«ç€ºããããã«ãäŸç¶ãšããŠéåžžã«åŒ·åã§ãã Future
ãååŸããŠåŸ
ã€ããšã¯ã§ããŸãããããã¯ãéåžžã«éå¹ççã§ãã
ãæ瀺çãªããªãã¿ã®ãèªã¿ããããä¿å®æ§ãããã³ããã©ãŒãã³ã¹ïŒãã¬ãã£ãã¯ã¹ããŒã¯ãŒãawait
ãã¯ãawait!()
æœåšçã«postfixã®ãã¯ãã§ã .await!()
å°æ¥ã€ã³ã
@novacrazyçæ³çãªæ§æãéžæããããšããŠããç¶æ³ã«ãã£ãŠã¯ã«ã¹ã¿ã å ç©ãšã³ã³ãããŒã¿ã䜿çšããããšæããŸãã ãããããœããã«éæšå¥šã«ãªãå¯èœæ§ããããšããèãã¯ãRustã®å šäœçãªæ¹åæ§ã«çåãæããããŸãã
ãã¡ãããã³ã³ãããŒã¿ãåŒãç¶ã䜿çšã§ããŸããéæšå¥šã«ãªããã®ã¯ãããŸããã
ããã¯?
ãšåãç¶æ³ã§ããæ°ããã³ãŒãã¯éåžž?
䜿çšããŸããïŒã³ã³ãããŒã¿ãŒãããåªããŠããããïŒãOption / Resultã³ã³ãããŒã¿ãŒã¯åŒãç¶ã䜿çšã§ããŸãïŒ or_else
ãããªãã¡ã³ããŒãªãã®ã䜿çšã§ããŸãïŒ
ç¹ã«ãasync / awaitã¯map
ãšand_then
ãå®å
šã«çœ®ãæããããšãã§ããŸããããããã¡ã³ããŒãªFutureã³ã³ãããŒã¿ã¯åŒãç¶ã䜿çšã§ããŸãïŒä»åŸã䜿çšã§ããŸãïŒã
ããªããäžããäŸã¯ãã³ã³ãããŒã¿ãšæ¯èŒããŠãŸã ã²ã©ãããã«èŠããŸãã
ç§ã¯ããã¯æããŸãããæšæºã®Rustæ©èœã䜿çšããŠããã®ã§ãã¯ããã«æ確ã ãšæããŸãã
æ確ãã¯æåæ°ã«ã€ããŠã¯ãã£ãã«ãããŸããããããã¯ç²Ÿç¥çãªæŠå¿µãšé¢ä¿ããããŸãã
postfix await
ãããšãããã«èŠæ ããè¯ããªããŸãã
some_op().await?
.another_op().await?
.final_op().await
ããªãã¯ãããããªãã®ãªãªãžãã«ãšæ¯èŒããããšãã§ããŸãïŒ
some_op()
.and_then(|v| v.another_op())
.and_then(|v2| v2.final_op())
ãžã§ãã¬ãŒã¿ã䜿çšãããšããªãŒããŒããããå°ãé ããªããããå€ãã®ãã·ã³ã³ãŒããçæãããŸãã
ãªãasync / awaitããäœåãªãªãŒããŒãããããããšäž»åŒµããã®ã§ããïŒ ãžã§ãã¬ãŒã¿ãŒãšasync / awaitã¯ã©ã¡ããããŒãã³ã¹ãã§å€§å¹ ã«æé©åãããããã«ç¹å¥ã«èšèšãããŠããŸãã
ç¹ã«ãasync / awaitã¯ãFutureã³ã³ãããŒã¿ãŒãšãŸã£ããåãããã«ãé«åºŠã«æé©åãããã¹ããŒããã·ã³ã«ã³ã³ãã€ã«ãããŸãã
ãããã®ãžã§ãã¬ãŒã¿ã¹ãã²ããã£ã¹ããŒããã·ã³ãå éšã§äœæããã®ã§ã¯ãªãã
ãã¥ãŒãã£ãŒã³ã³ãããŒã¿ãŒã¯ããã³ãããã®äžã«ãã¹ãã²ããã£ã¹ããŒããã·ã³ããäœæããŸããããã¯ãŸãã«åœŒããè¡ãããã«èšèšããããã®ã§ãã
ãããã¯åºæ¬çã«async / awaitãšäœãå€ããã¯ãããŸããã
[å°æ¥ã®ã³ã³ãããŒã¿]ã¯ãããå¹ççãªã³ãŒãã«ã³ã³ãã€ã«ãããå¯èœæ§ããããŸãã
誀ã£ãæ å ±ãåºããã®ã¯ãããŠãã ããã ç¹ã«ãasync / awaitã¯Futureã³ã³ãããŒã¿ããããŸãã
ãŠãŒã¶ãŒããã¬ãã£ãã¯ã¹ããŒã¯ãŒãã«æºè¶³ããŠããªãããšãå€æããå Žåã¯ã2019/2020ãšãã£ã·ã§ã³ã§å€æŽã§ããŸãã
ä»ã®äººãèšã£ãŠããããã«ããšãã£ã·ã§ã³ã¯ãç§ãã¡ã奜ããªãšãã«äœãæ£æçãªãã®ã§ã¯ãªããïŒæ©ããŠãïŒæ°å¹Žããšã«ã®ã¿çºçããããã«ç¹å¥ã«èšèšãããŠããŸãã
ãããŠ@Centrilãææããããã«ãåŸã§ããã眮ãæããããã ãã«æªãæ§æã
çŸåšãè°è«ã®ããŒã¹ã¯ããªãéãã§ãã ãã®ãããç©äºãé ããã人ã ãè¿œãã€ãããšãã§ããããã«ããããã«ãç§ã¯åé¡ãäžæçã«ããã¯ããŸããã 1æ¥ä»¥å ã«ããã¯ã解é€ãããŸãã ãã®éã¯ããªãã¹ã建èšçã«ãªãããåªããŠãã ããã
1æ¥åŸã«åé¡ã®ããã¯ã解é€ããŸã...ãã§ã«ææãããŠããªãããšãæ€èšãããããã¯ã«ã€ããŠã³ã¡ã³ããæ®ããŠãã ããïŒããšãã°ãããã¯æé»ã®åŸ æ©ããã®ä»ã®ç¯å²å€ã®ããšãæ€èšããå Žæã§ã¯ãããŸããïŒã
ããã¯é·ãã¹ã¬ããã ã£ãã®ã§ãããã«åã蟌ãŸããŠããæãèå³æ·±ãã³ã¡ã³ãã®ããã€ãã匷調ããŸãããã
@mehcodeã¯ããã¬ãã£ãã¯ã¹ãšãã¹ããã£ãã¯ã¹ã®äž¡æ¹ã®äœçœ®ã«await
ãå«ãåºç¯ãªå®äžçã®ã³ãŒããæäŸããŠãããŸããïŒ https ïŒ
@Centrilã¯ã await!(expr)
ãå®å®ãããããšã¯ãæè¡çè² åµãæ
æã«è¿œå ããããšã«ãªããšèª¬åŸåãæã£ãŠäž»åŒµããŸããïŒ https ïŒ
@valffã¯ã expr await
postfixããŒã¯ãŒãæ§æãäžè¬åãããã¿ã€ãã®èª¬æã«æããããã«é©åããããšãç§ãã¡ã«æãåºããhttps ïŒ
@quodlibetorã¯ãErrorããã³Optionã³ã³ãããŒã¿ã®æ§æå¹æãRustã«åºæã§ããããšã匷調ããåŸçœ®æ§æãæ¯æãããšäž»åŒµããŠããŸãïŒ https ïŒ
äžæ¥ã®çµããã«ãlangããŒã ã¯ããã«é»è©±ããããå¿ èŠããããŸãã ã³ã³ã»ã³ãµã¹ã«ã€ãªããå¯èœæ§ã®ããå ±éã®æ ¹æ ãç¹å®ããããã«ãåŸçœ®æ§æã®éèŠãªåé¡ã«é¢ããlangããŒã ã¡ã³ããŒã®è¿°ã¹ãããç«å ŽãèŠçŽãããšåœ¹ç«ã€ã§ãããã
@Centrilã¯ãåŸawait!(expr)
ãå®å®ãããããããŸããã
@cramertjã¯ãæ¥å°ŸèŸæ§æãç¹ã«expr await
æ¥å°ŸèŸããŒã¯ãŒãæ§æã®ãµããŒãã
@joshtriplettã¯ãæ¥å°ŸèŸæ§æã®è¡šæããæ¥é èŸããŒãžã§ã³ãæäŸãã
@scottmcmã¯ãåŸçœ®æ§æã®ãµããŒãã
@withoutboatsã¯ããã¯ãæ§æãå®å®ããã¯expr await
æ¥å°ŸèŸããŒã¯ãŒãæ§æããå®éã®ã·ã§ãããã§ãããšèŠãªããŸãã
@ aturon ã @ eddyb ã @ nikomatsakis ãããã³@pnkfelixã¯ãåé¡ïŒ57640ãŸãã¯ïŒ50547ã§æ§æã«é¢ããç«å ŽããŸã è¡šæããŠããŸããã
ãããã£ãŠãã¯ã/ãããã®çããç解ããããã«å¿ èŠãªããšïŒ
ãã¬ãã£ãã¯ã¹æ§æã䜿çšããå Žåããã®ã³ã¡ã³ãã«èŠãããããã«ã人ã
ãæãåãå
¥ããŠãããšç§ãæãã2ã€ã®äž»èŠãªåè£ããããŸããæçšãšæçœã§ãã await!()
ã«å¯Ÿããè°è«ã¯ããªã匷ãã®ã§ãç§ã¯ãããé€å€ããããšèããŠããŸãã ãããã£ãŠãæçšãªæ§æãšæçœãªæ§æã®ã©ã¡ããå¿
èŠããå€æããå¿
èŠããããŸãã ç§ã®æèŠã§ã¯ãäžè¬çã«æ¬åŒ§ã®å°ãªãæ§æã䜿çšããå¿
èŠããããŸãã
ãããŠãæ¥å°ŸèŸã®æ§æã«é¢ããŠã¯ãããã¯ããªãããŒã§ãã ã¹ããŒã¹ä»ãã®æ¥å°ŸèŸawait
ããŒã¯ãŒãã«ã€ããŠã匷åãªè°è«ããããŸãã ããããããã¯ã³ãŒãã®ãã©ãŒãããæ¹æ³ã«å€§ããäŸåããŸãã ã³ãŒãã®ãã©ãŒããããäžé©åãªå Žåãã¹ããŒã¹ãå«ãæ¥å°ŸèŸawait
ããŒã¯ãŒãã¯éåžžã«èŠæ ããæªããªãå¯èœæ§ããããŸãã ãããã£ãŠãæåã«ããã¹ãŠã®Rustã³ãŒããrustfmtã§æ£ãããã©ãŒããããããrustfmtãåäžè¡ã«åãŸãå Žåã§ããåžžã«ãã§ãŒã³åŸ
æ©ãç°ãªãè¡ã«åå²ããããšãæ³å®ããå¿
èŠããããŸãã ãããã§ããã°ããã®æ§æã¯éåžžã«åé¡ãããŸãããããã¯ãèªã¿ããããšåäžè¡ãã§ãŒã³ã®éäžã®ã¹ããŒã¹ãšã®æ··åã®åé¡ã解決ããããã§ãã
ãããŠæåŸã«ãæ¥é èŸãšæ¥å°ŸèŸã®äž¡æ¹ã䜿çšããå Žåã¯ãäž¡æ¹ã®æ§æã®ã»ãã³ãã£ã¯ã¹ãç解ããŠæžãçããããããäºãã«ã©ã®ããã«çžäºäœçšããäžæ¹ãä»æ¹ã«ã©ã®ããã«å€æããããã確èªããå¿ èŠããããŸãã postfixãŸãã¯prefixawaitã®ã©ã¡ããéžæããŠããã³ãŒãã®å®è¡æ¹æ³ã¯å€ãããªãããããããå®è¡ã§ããã¯ãã§ãã
ç§ã®æèããã»ã¹ãšãè¡šé¢æ§æã®ææ¡ã«ã©ã®ããã«ã¢ãããŒãããŠè©äŸ¡ããããæ確ã«ããããã await
ã
ãããç§ãæã£ãŠããç®æšã§ãïŒéèŠæ§ã®é åºãªãã§ïŒïŒ
await
ã¯ãå°æ¥ã®èšèªèšèšãå¯èœã«ããããã®ããŒã¯ãŒãã®ãŸãŸã«ããå¿
èŠããããŸãã?
ããã³äžè¬çãªã¡ãœããã§ããŸãæ§æã§ããããã«é£éå¯èœã§ããå¿
èŠããããŸãã æå³ã®ãã现ååã§ã¯ãªããããããªãäžæçãªlet
ãã€ã³ãã£ã³ã°ã匷å¶çã«äœæããã¹ãã§ã¯ãããŸãããgrep
ã«ãªããããã¯ãã§ããç§ã®ç®æšã®ããã€ããå®çŸ©ããïŒãããŠããããå¿ãã...ïŒã®ã§ãããã«ãããã«é¢ããããã€ãã®ææ¡ã®èŠçŽãšç§ã®è©äŸ¡ããããŸãïŒ
await
ãããŒã¯ãŒããšããŠä¿æãããšã await!(expr)
ãŸãã¯expr.await!()
ã©ã¡ãã§ãã£ãŠãããã¯ãããŒã¹ã®æ§æã䜿çšããããšãå°é£ã«ãªããŸãã ãã¯ãæ§æã䜿çšããã«ã¯ããã¯ããšããŠã®await
ãããŒãã³ãŒããããŠåå解決ãšçµ±åãããªãïŒã€ãŸãã use core::await as foo;
ãäžå¯èœã«ãªãïŒãã await
ãããŒã¯ãŒããšããŠå®å
šã«æŸæ£ãããŸãã
ãã¯ãã¯ããŠãŒã¶ãŒã¹ããŒã¹ã§æ§æãçºæããããšãç®çãšããŠãããããæããã«äžæµã§ã¯ãªãæèŠãæã£ãŠãããšæããŸãã æè¡çãªãã€ã³ãã§ã¯ãããŸãããããã®ãããªèšèªã®äžå¿çãªæ§æã§ãã¯ãæ§æã䜿çšãããšãæŽç·ŽãããŠããªãå°è±¡ãäžããŸãã ééããªãã .await
ãš.await()
æ§æããæããã¡ãŒã¹ãã¯ã©ã¹ã®æ§æã§ã¯ãããŸããã ãããããã¯ããæããã»ã©äºæµã§ã¯ãããŸããã
ãã§ãŒã³ã容æã«ããããšããé¡æã¯ããã¬ãã£ãã¯ã¹æ§æã®åäœãäœäžãããŸããããã¹ããã£ãã¯ã¹æ§æã¯ãã¡ãœãããã§ãŒã³ãç¹ã«?
ã§èªç¶ã«æ§æãããŸãã
await
ããŒã¯ãŒããæ¥å°ŸèŸããã¬ãã£ãã¯ã¹ããã¯ããªã©ã§äœ¿çšãããŠããå Žåãã°ã¬ããã³ã°ãæãç°¡åã§ããã·ãžã«ããŒã¹ã®æ§æã䜿çšãããŠããå Žåãããšãã°#
ã @
ã ~
ãgrepãé£ãããªããŸãã éãã¯å€§ãããããŸãããã .await
ã¯ã await
ãawait
ããããããã«ç°¡åã«grepã§ããŸããã©ã¡ããã³ã¡ã³ãã«åèªãšããŠå«ãŸããŠããå¯èœæ§ãããããã§ããã .await
ã
await
ã¯èŠããããç¹ã«æ§æã匷調衚瀺ãããŠããã®ã«å¯Ÿããå°ç« ã¯äžç®ã§èŠã€ããã®ãé£ããå¯èœæ§ããããŸãã .await
ãŸãã¯ä»ã®æ¥å°ŸèŸã®æ§æã¯äžç®ã§èŠã€ããã®ãé£ããããæ¥å°ŸèŸawait
ã¯èªã¿ããããæªãããšã瀺åãããŠããŸãã ããããç§ã®èŠè§£ã§ã¯ã @ scottmcmã¯ãçµæã®å
ç©ã¯äžè¬çã§ããã .await?
ã¯ããèªäœã«ç¹å¥ãªæ³šæãåŒãã®ã«åœ¹ç«ã€ãšæ£ããè¿°ã¹ãŠããŸãã ããã«ãScottã¯ãæ¥é èŸawait
ã¯ã¬ãŒãã³ãã¹æã«ã€ãªãããåŒã®éäžã§åŸ
æ©ããæ¥é èŸã¯æ¥å°ŸèŸãããèªã¿ããããªããšè¿°ã¹ãŠããŸãã ?
æŒç®åã®åºçŸã«ãããRustããã°ã©ããŒã¯ãã§ã«è¡æ«ã
.await
ãš.await()
ã®åªå
é äœã¯ãå®å
šã«äºæž¬å¯èœã§ããããšã§æ³šç®ã«å€ããŸãã ãããã¯ããã£ãŒã«ãã¢ã¯ã»ã¹ããã³ã¡ãœããåŒã³åºãã®å¯Ÿå¿ç©ãšããŠæ©èœããŸãã æ¥å°ŸèŸãã¯ãã¯ãããããã¡ãœããåŒã³åºããšåãåªå
é äœãæã¡ãŸãã äžæ¹ããã¬ãã£ãã¯ã¹await
ã¯ã ?
ïŒã€ãŸãã await (expr?)
ïŒã«å¯ŸããŠäžè²«æ§ããããäºæž¬å¯èœã§ã圹ã«ç«ããªãåªå
é äœãæã£ãŠããããåªå
é äœãäžè²«æ§ããªããæçšã§ãïŒã€ãŸãã (await expr)?
ïŒã å°ç« ã«ã¯ãåžæããåªå
é äœãä»ããããšãã§ããŸãïŒããšãã°ã ?
ããçŽæããšãããšïŒã
2012幎ã @ nikomatsakisã¯ããµã€ã¢ã³ãã€ãã³ãžã§ãŒã³ãºãããããã®åããšããããIDEã®éæ³ãã©ã®ããã«æäŸããããããããŸããæã£ãŠããããšãææããŸããïŒpã56ïŒ ã ãããã®åã¯å€ãã®äžè¬çãªèšèªïŒJavaãCïŒãC ++ãªã©ïŒã«ååšãããããããã«ããããããã«å°éãããããšãçèã®èšæ¶ã«æµžéããŸãã ãã®ç¿æ
£ãããã«åŒ·åã§ãããã説æããããã«ã @ scottmcmã«ããReïŒerã䜿çšãã
CïŒã«ã¯æ¥å°ŸèŸããããŸããã ããã§ããããã¯éåžžã«äŸ¿å©ãªã®ã§ãæå¹ãªæ§æã§ã¯ãªããªãŒãã³ã³ããªãŒããªã¹ãã«è¡šç€ºãããŸãã ãã ãã .await
ãè¡šé¢æ§æã§ãªãå Žåã .aw
ãè©Šãããšã¯ãç§ãå«ããŠå€ãã®äººã«ã¯èµ·ãããªããããããŸããã ãããããªããIDEãšã¯ã¹ããªãšã³ã¹ãžã®ã¡ãªãããæ€èšããŠãã ããã await expr
ããã³expr await
æ§æã¯ããã®å©ç¹ãæäŸããŸããã
å°ç« ã¯ããããããŸã銎æã¿ããªãã§ãããã ãã¬ãã£ãã¯ã¹await
ã¯ãCïŒãJSãªã©ã«ç²ŸéããŠãããšããå©ç¹ããããŸãããã ãããããã¯await
ãš?
ãå¥åã®æäœã«åé¢ããŸããããRustã¯åé¢ããŸãã ãŸãã await expr
ããexpr.await
移è¡ããã®ãç°¡åã§ã¯ãããŸããããã®å€æŽã¯ãå°ç« ã䜿çšããå Žåã»ã©æ¥é²çã§ã¯ãããŸããã ããã«ãåè¿°ã®ããããã¯ãŒã«ããã .await
ã¯ã expr.
ãšå
¥åãããªãŒãã³ã³ããªãŒããããã¢ããã®æåã®ãªãã·ã§ã³ãšããŠawait
ã衚瀺ããããšã§åŠç¿ãããå¯èœæ§ããããŸãã
å°ç« ã¯æžãããããåªãã人éå·¥åŠãæäŸããŸãã ãã ãã .await
ã¯å
¥åã«æéãããããŸãããæžã蟌ã¿ãããŒãããã«æ¹åã§ããããããã¯ãŒãä»å±ããŠããŸãã let
ã¹ããŒãã¡ã³ãã«å²ã蟌ãå¿
èŠããªãããã人éå·¥åŠãåäžããŸãã ãã¬ãã£ãã¯ã¹await
ããŸãã¯ããã«æªãããšã«await!(..)
ãããããã¯ãŒãšãã§ãŒã³æ©èœã®äž¡æ¹ãäžè¶³ããŠããŸãã .await
ã .await()
ãããã³.await!()
æ¯èŒãããšãæåã®ãªãã¡ãŒã¯æãç°¡æœã§ãã
ãã¹ãŠã®ç®æšãåæã«éæããã®ã«æé©ãªæ§æã¯ãªãããããã¬ãŒããªããè¡ãå¿
èŠããããŸãã ç§ã«ãšã£ãŠãæãã¡ãªãããããããã¡ãªãããæãå°ãªãæ§æã¯.await
ã§ãã ç¹ã«ããã§ãŒã³åã§ããããŒã¯ãŒããšããŠawait
ãä¿æããgreppableã§ãããããããã¯ãŒãåããŠãããããåŠç¿å¯èœã§äººéå·¥åŠçã§ãããæãããªåªå
é äœããããæçµçã«èªã¿åãå¯èœã§ãïŒç¹ã«ãé©åãªãã©ãŒããããšåŒ·èª¿è¡šç€ºã䜿çšïŒã
@Centrilããã€ãã®è³ªåãã¯ãªã¢ããããã ãã«ã ãŸããæ¥å°ŸèŸã ããåŸ
ã¡ãããšããããšã確èªãããã®ã§ããã 次ã«ããã£ãŒã«ãã¢ã¯ã»ã¹ã§ãã.await
ã®äºéæ§ã«ã©ã®ããã«ã¢ãããŒãããŸããïŒ .await
ããã®ãŸãŸäœ¿çšããŠãåé¡ãããŸãããããããšããããã§äœããã®æäœãè¡ãããŠããããšã瀺ãããã«ãæ¬åŒ§ä»ãã®.await()
ãåªå
ããå¿
èŠããããŸããïŒ ãããŠç¬¬äžã«ã .await
æ§æã§ã¯ããããããŒã¯ãŒãã«ãªãã®ã§ããããããããšãåãªãããã£ãŒã«ãã¢ã¯ã»ã¹ãèå¥åã«ãªãã®ã§ããããã
ãŸããæ¥å°ŸèŸã ããåŸ ã¡ãããšããããšã確èªãããã®ã§ããã
ããã å°ãªããšãä»ã¯ã
次ã«ããã£ãŒã«ãã¢ã¯ã»ã¹ã§ãã
.await
ã®äºéæ§ã«ã©ã®ããã«ã¢ãããŒãããŸããïŒ
ããã¯ããããªæ¬ ç¹ã§ãã ãããã®åã«ã¯å€§ããªå©ç¹ããããŸãã ãã®åºå¥ã¯ãç¹ã«ããŒã¯ãŒãã匷調衚瀺ãããæ§æãé »ç¹ã«äœ¿çšãããããããŠãŒã¶ãŒãããã«ç¿åŸã§ãããšç§ãä¿¡ããŠãããã®ã§ãã ããã«ãã¹ã³ãããææããããã«ã .await?
ãæãäžè¬çã§ãããç¶æ³ãããã«ç·©åããã¯ãã§ãã ãŸããããšãã°fn
å Žåãšåãããã«ãrustdocã«await
æ°ããããŒã¯ãŒããšã³ããªãè¿œå ããã®ãç°¡åã§ãã
.await
ããã®ãŸãŸäœ¿çšããŠãåé¡ãããŸãããããããšããããçš®ã®æäœãããã§è¡ãããŠããããšã瀺ãããã«ãæ¬åŒ§ä»ãã®.await()
ãåªå ããå¿ èŠããããŸããïŒ
ç§ã¯ããŒã«ã®ãªã.await
ã奜ã¿ãŸã()
; æåŸã«()
ããããšãã»ãšãã©ã®å ŽåãäžèŠãªå¡©ã®ããã«èŠãããŠãŒã¶ãŒããã®æ¹æ³ãæ¢ãåŸåã匷ããªããšæããŸãã
ãããŠç¬¬äžã«ã
.await
æ§æã§ã¯ããããããŒã¯ãŒãã«ãªãã®ã§ããããããããšãåãªãããã£ãŒã«ãã¢ã¯ã»ã¹ãèå¥åã«ãªãã®ã§ããããã
await
ã¯ããŒã¯ãŒãã®ãŸãŸã§ãã ããããã .
åŸã«await
çºçãããšãã«ãšã©ãŒãçºçããªãããã«libsyntaxãå€æŽããASTãŸãã¯HIRã«äžãããšãã«å¥ã®æ¹æ³ã§è¡šçŸããŸã...ããããããã¯äž»ã«å®è£
ã®è©³çŽ°ã§ãã
ãã¹ãŠãã¯ãªã¢ããŠãããŠããããšãïŒ ð
ãã®æç¹ã§éèŠãªåé¡ã¯ãæ¥å°ŸèŸæ§æãè¿œæ±ãããã©ããã«ããããã§ãã ãããæ¹åæ§ãªãã確ãã«ã©ã¡ãã«çµã蟌ãããšãã§ããŸãã éšå±ãèªãã§ãæ¥å°ŸèŸæ§æã®æ¯æè ã®ã»ãšãã©ã¯ãæ¥é èŸæ§æãããåççãªæ¥å°ŸèŸæ§æãåãå ¥ããŸãã
ãã®ã¹ã¬ããã«å ¥ããšãæ¥å°ŸèŸã®æ§æã¯åŒ±è ã®ããã§ããã ããããããã¯4人ã®langããŒã ã¡ã³ããŒã®æ確ãªæ¯æãš5人ç®ããã®éæŸæ§ãåŒãä»ããŸããïŒä»ã®4人ã¯ãããŸã§æ²é»ããŠããŸããïŒã ããã«ãããã§ã³ã¡ã³ãããŠããå¹ åºãã³ãã¥ããã£ããããªãã®æ¯æãéããŠããŸãã
ããã«ãåŸçœ®æ§æã®æ¯æè ã¯ããããRustã«ãšã£ãŠæè¯ã®éã§ãããšããæ確ãªç¢ºä¿¡ãæã£ãŠããããã§ãã ãã®æ¯æãåãæ¶ãã«ã¯ããããŸã§ã«é²ãã è°è«ã«å¯Ÿããããã€ãã®æ·±ãåé¡ãŸãã¯èª¬åŸåã®ããåè«ãå¿ èŠã§ããããã«æãããã
ãããèãããšã確ãã«ãã®ã¹ã¬ãããå¯æ¥ã«ãã©ããŒããŠãã@withoutboatsãšãä»ã®4人ã®langããŒã ã¡ã³ããŒãã
ãã£ãšã @ Centrilããã§ã«ã³ã¡ã³ãããŠããããšã«æ°ã¥ããã®ã§ãæž æœãã®ããã«æçš¿ãé衚瀺ã«ããŸãã
@ivandardiæçš¿ã®ç®æšïŒ1ïŒãèãããšã loop {}
ãæ§é äœãªãã©ã«åŒã§ã¯ãªãã®ãšåãããã«ãawaitã¯åŒãç¶ãããŒã¯ãŒãã§ããããããã£ãŒã«ãã¢ã¯ã»ã¹ã«ãªãããšã¯ãªããšããã®ãç§ã®ç解ã§ãã ãããŠãããæ確ã«ããããã«åŒ·èª¿è¡šç€ºãããããšãæåŸ
ããŸãïŒhttps://github.com/rust-lang/rust-enhanced/issues/333ãSublimeã§è¡ãã®ãåŸ
ã£ãŠããããã«ïŒã
ç§ã®1ã€ã®æžå¿µã¯ãåŸ
æ©æ§æãå¥ã®ã¢ã¯ã»ã¹ã®ããã«èŠããããšã§ã2015幎çã®ã³ãŒãããŒã¹ã§æ°ä»ããªããã¡ã«æ··ä¹±ãçããå¯èœæ§ãããããšã§ãã ïŒ2015ã¯ãæå®ãããŠããªãå Žåãä»ã®èª°ãã®ãããžã§ã¯ããéãå Žåãªã©ã®ããã©ã«ãã§ããïŒ await
ãã£ãŒã«ãããªãå ŽåïŒããã³ååšããå Žåã¯èŠåïŒã2015ãšãã£ã·ã§ã³ã«æ確ãªãšã©ãŒãããéããç§ã¯æããŸãããã¯ïŒCentrilã®çŽ æŽãããè°è«ãšãšãã«ïŒããŒã¯ãŒããã£ãŒã«ãïŒãŸãã¯ã¡ãœããïŒã«ã€ããŠã®ç§ã®å人çãªå¿é
ãåãé€ããŸãã
ããããããŠç§ãã¡ãããã«ããéã«ç§ãã¡ã決å®ããªããã°ãªããªãããšã®1ã€ã¯ãrustfmtããããã©ã®ããã«ãã©ãŒãããããããšããããšã§ãã
let val = await future;
let val = await returns_future();
let res = client.get("https://my_api").await send()?.await json()?;
await
-ãã§ãã¯Â¹åªå
é äœïŒ await
åŸã®ã¹ããŒã¹ã¯ãæ®ã眮ãäœçœ®ã§ã¯æ確ã«ãªããŸããã ãã ãã次ã®ã³ãŒããšãŸã£ããåãã§ãïŒ client.get("https://my_api").await_send()?.await_json()?
ã ãã¹ãŠã®è±èªã話ã人ã«ãšã£ãŠãããã¯ä»ã®ãã¹ãŠã®ææ¡ãããããã«èªç¶ã§ã
²ããããã¯ãŒïŒæ¬¡ã«.
ã ?
ãŸãã¯;
ãå
¥åããåŸãã¡ãœããåŒã³åºãã®å·ŠåŽã«await
ã移åããã«ã¯ãIDEã®è¿œå ãµããŒããå¿
èŠã«ãªããŸãã å®è£
ããã®ã¯ããã»ã©é£ããããšã§ã¯ãªãããã§ã
³ç¿åŸã容æïŒæ¥é èŸã®äœçœ®ã§ã¯ãããã°ã©ããŒã«ã¯ãã§ã«éŠŽæã¿ããããŸãã 延æãããäœçœ®ã§ã¯ãæ§æãå®å®ããåŸã¯æããã§ã
ãããããã®æ§æã®æ倧ã®ãã€ã³ãã¯ãéåžžã«äžè²«æ§ãããããšã§ãã
?
æããã«åªå
ãããŸã*説æã¯ã¹ãã€ã©ãŒã®äžã«é ãããŠããŸã
postfixããªã¢ã³ãã§ã¯ãã©ã®é¢æ°ãasync
ããã暪軞ã§æ¬¡ã«await
çºçããå Žæãäºæž¬ããã®ã¯å°é£ã§ãã
let res = client.get("https://my_api")
.very_long_method_name(param, param, param).await?
.short().await?;
æ®ã眮ãããªã¢ã³ãã§ã¯ãã»ãšãã©ã®å Žååãã§ãã
let res = client.get("https://my_api")
.await very_long_method_name(param, param, param)?
.await short()?;
ã¯ãããŸãããã åŸ
æ©ãšæ¬¡ã®ã¡ãœããåŒã³åºãã®éã«ïŒ ãæ°ã«å
¥ã
get().await?.json()
ã
2019幎1æ23æ¥æ°Žææ¥ã05ïŒ06 I60R < [email protected]ã¯æ¬¡ã®ããã«æžããŠããŸãã
val =æªæ¥ãåŸ ã€;
let res = client.getïŒ "httpsïŒ// my_api"ïŒãawait sendïŒïŒ?. await jsonïŒïŒ?;
- åŸ æ©ã䜿çšããŸã-ãã§ãã¯
- ãã¡ãŒã¹ãã¯ã©ã¹-ãã§ãã¯
- é£é-ãã§ãã¯
- ã°ã¬ããã³ã°-ãã§ãã¯
- éå°ç« -ãã§ãã¯
- åªå é äœ-¹ãã§ãã¯
- ããããã¯ãŒ-²ãã§ãã¯
- ç¿åŸãç°¡å-³ãã§ãã¯
- 人éå·¥åŠç-ãã§ãã¯
¹åªå é äœïŒã¹ããŒã¹ããããšãæ®ã眮ãäœçœ®ã§ã¯ãããã«ãããªããŸãã ãããããã¯
次ã®ã³ãŒããšãŸã£ããåãã§ãïŒclient.getïŒ "httpsïŒ// my_api
"ïŒ.await_sendïŒïŒïŒã await_jsonïŒïŒ?.ãã¹ãŠã®è±èªã話ã人ã«ãšã£ãŠã¯ããã«å€ãã®
ä»ã®ãã¹ãŠã®ææ¡ãããèªç¶Â²ããããã¯ãŒïŒIDEãåŸ æ©ããããã®è¿œå ãµããŒããå¿ èŠã«ãªããŸã
ã®åŸã®ã¡ãœããåŒã³åºãã®å·ŠåŽã ãŸãã¯ïŒ 次ã«å ¥åããŸãã ããŸãã«ããªãããã§ã
å®è£ ãé£ãã³ç¿åŸã容æïŒæ¥é èŸã®äœçœ®ã§ã¯ãããã°ã©ããŒã«ã¯ãã§ã«éŠŽæã¿ããããŸãã
ãããŠã延æãããäœçœ®ã§ã¯ããã®æ§æãå®å®ãã
ãããããã®æ§æã®æ倧ã®ãã€ã³ãã¯ãéåžžã«
äžè²«æ§ïŒ
- ããããã£ãžã®ã¢ã¯ã»ã¹ãšæ··åããããšã¯ã§ããŸãã
- ããã¯æããã«åªå ãããŸããïŒ
- åžžã«åããã©ãŒãããã«ãªããŸã
- ããã¯äººéã®èšèªãšäžèŽããŸã
- ã¡ãœããåŒã³åºãã§ã®å¯å€æ°Žå¹³ãªã«ã¬ã³ã¹ã®åœ±é¿ãåããŸãã
é**説æã¯ã¹ãã€ã©ãŒã®äžã«é ãããŠããŸã
postfixããªã¢ã³ãã§ã¯ãã©ã®é¢æ°ãéåæã§ããããäºæž¬ããã®ã¯å°é£ã§ãã
暪軞ã§æ¬¡ã«çºçããawaitã¯ã©ãã«ãªããŸãããres = client.getïŒ "httpsïŒ// my_api"ïŒ
.very_long_method_name(param, param, param).await? .short().await?;
æ®ã眮ãããªã¢ã³ãã§ã¯ãã»ãšãã©ã®å Žååãã§ãã
res = client.getïŒ "httpsïŒ// my_api"ïŒ
.await very_long_method_name(param, param, param)? .await short()?;
â
ããªããèšåãããã®ã§ããªãã¯ãããåãåã£ãŠããŸãã
ãã®ã¡ãŒã«ã«çŽæ¥è¿ä¿¡ããGitHubã§è¡šç€ºããŠãã ãã
https://github.com/rust-lang/rust/issues/57640#issuecomment-456693759 ã
ãŸãã¯ã¹ã¬ããããã¥ãŒãããŸã
https://github.com/notifications/unsubscribe-auth/AIA8Ogyjc8LW6teZnXyzOCo31-0GPohTks5vGAoDgaJpZM4aBlba
ã
ãŸããrustfmtãã©ã®ããã«ãã©ãŒããããããã決å®ããå¿ èŠããããŸãã
ããã¯https://github.com/rust-dev-tools/fmt-rfcsã®ãã¡ã€ã³ã§ããããããã®åé¡ã§ã¯ãããã¯ããå€ããŠãããšèšããŸãã ã©ããªä¿®æ£æ§ãšåªå é äœãéžæãããŠãããããšäžèŽããäœãããããšç¢ºä¿¡ããŠããŸãã
@ I60R
let res = client.get("https://my_api").await send()?.await json()?;
ããã¯ã©ã®ããã«ç¡æã®é¢æ°é¢æ°ãæ¢ããŸããïŒ ç§ãæ£ããèªãã§ãããšããããããã¯å®éã«ã¯æ¥é èŸawait
ã§ãã
ããã¯ãCïŒèšèªããŒã ã®çµéšãããã»ã©æ©ãä¿¡çšããŠã¯ãããªãããšã瀺ããŠãããšæããŸãã ãã€ã¯ããœããã¯ãŠãŒã¶ããªãã£ã®ç 究ã«å€ãã®èæ ®ãæã£ãŠããŸããããã§ã¯ã1è¡ã®ã³ãŒããšãRustãä»ã®ãã¹ãŠã®èšèªãšã¯ç°ãªãæ§æãæã€ã®ã«ååãªã»ã©ç¹å¥ã§ãããšããåæã«åºã¥ããŠæ±ºå®ãäžããŠããŸãã ç§ã¯ãã®åæã«åæããŸãã-ç§ã¯äžèšã®LINQãšæ¡åŒµã¡ãœãããCïŒã§æ®åããŠãããšè¿°ã¹ãŸããã
ãã ãã
.await
ãè¡šé¢æ§æã§ãªãå Žåã«ã.aw
ãè©Šãããšã¯ãç§ãå«ããŠå€ãã®äººã«ã¯èµ·ãããªããããããŸããã
ãä»ã®èšèªã«ç²ŸéããŠãã人ã«ã¯èµ·ãããªããšæããŸãããããã¯ããŠãããå®äºãããã¢ããã«await
ãšFuture
äž¡æ¹ã®ã¡ãœãããå«ãŸãããšæããŸããïŒ
[...]ããã§ã¯ã1è¡ã®ã³ãŒããšãRustãä»ã®ãã¹ãŠã®èšèªãšã¯ç°ãªãæ§æãæã€ã®ã«ååãªã»ã©ç¹å¥ã§ãããšããåæã«åºã¥ããŠæ±ºå®ãäžããŠããŸãã ç§ã¯ãã®åæã«åæããŸãã[...]
@lnicolaããªããä»ã®äººããããèŠéããå Žåã«åããŠææãããã ãã§ãïŒã³ã¡ã³ãã®å€§æŽªæ°Žã§èŠéããã¡ã§ãïŒïŒ https ïŒ
å®éã®è£œåã³ãŒãããã®ããã€ãã®å®éã®äŸã
äžèšã®@Centrilã®ã³ã¡ã³ããèãããšãæã匷ã競åã®ããæ¥å°ŸèŸãªãã·ã§ã³ã¯ã expr await
æ¥å°ŸèŸããŒã¯ãŒãæ§æãšexpr.await
æ¥å°ŸèŸãã£ãŒã«ãæ§æã§ããããã§ãïŒãããããæ¥å°ŸèŸã¡ãœããæ§æã¯ãŸã åºãŠããŸããïŒã
@Centrilã¯ãpostfixããŒã¯ãŒããšæ¯èŒããŠãpostfixãã£ãŒã«ãã¯ããããã®åãã®æ©æµãåããŠãããšäž»åŒµããŠããŸã
éã«ã @ cramertjã¯ãpostfixããŒã¯ãŒãæ§æãã¡ãœããåŒã³åºãããã£ãŒã«ãã¢ã¯ã»ã¹ã§ã¯ãªãããšãæ確ã«ããããšã«åºã¥ããŠããã®æ§æãæ¯æãããšäž»åŒµããŠããŸãã @withoutboatsã¯ãpostfixããŒã¯ãŒããpostfixãªãã·ã§ã³ã®äžã§æãããç¥ãããŠãããšäž»åŒµããŠããŸãã
ããããã®åãã«é¢ããŠã¯ãIDEããããã®åŸã®è£å®ãšããŠawait
ãæäŸããè£å®ãéžæããããšãã«åã«ããããåé€ã§ããããšãèæ
®ããå¿
èŠããããŸãã ååã«ã¹ããŒããªIDEïŒRLSãªã©ïŒã¯ãæªæ¥ã«æ°ã¥ããã¹ããŒã¹ã®åŸã«await
ãæäŸããããšããã§ããŸãã
postfixãã£ãŒã«ããšã¡ãœããã®ãªãã·ã§ã³ã¯ãpostfixããŒã¯ãŒããšæ¯èŒããŠããããŸããã®ããã«ãå察æèŠã«å¯ŸããŠãã倧ããªè¡šé¢ç©ãæäŸããããã§ãã postfixããŒã¯ãŒãã«å¯Ÿããpostfixãã£ãŒã«ã/ã¡ãœããã®ãµããŒãã®äžéšã¯ãã¡ãœãããã§ãŒã³ã«ã¹ããŒã¹ãååšããããšã«å¯Ÿããããããªäžå®ããæ¥ãŠããããã«æããããããpostfixããŒã¯ãŒãïŒ foo.bar() await
ãšãã@valffã®èŠ³å¯ã確èªããŠé¢äžããå¿
èŠããããŸãã foo.bar() await
ïŒã¯ãäžè¬åãããã¿ã€ãã®ã¢ã¯ãªãã·ã§ã³ïŒ foo.bar() : Result<Vec<_>, _>
ïŒãããé©ãããšã§ã¯ãããŸããã ã©ã¡ãã®å Žåãããã®ã¹ããŒã¹ã§åºåãããéå¥ã®åŸãé£éãç¶ããŸãã
@ ivandardi ã @ lnicola ã
æè¿ã®ã³ã¡ã³ããæŽæ°ããŠãç¡æã®é¢æ°åŒã³åºãã®äŸããããŸããã ããå€ãã®äŸãå¿ èŠãªå Žåã¯ãç§ã®åã®ã³ã¡ã³ãã®æåŸã®ãã¿ãã¬ãåç §ã§ããŸã
future.await?
察future await?
ãè°è«ããããã«..ã
ããŸãè°è«ãããŠããªãã®ã¯ãã¡ãœãããã§ãŒã³ã®èŠèŠçãªã°ã«ãŒãåãŸãã¯grepã§ãã
æ€èšããŠãã ããïŒæ§æã®åŒ·èª¿è¡šç€ºã«ã¯await
ã§ã¯ãªãmatch
ïŒ
post(url).multipart(form).send().match?.error_for_status()?.json().match?
ãšæ¯èŒããŠ
post(url).multipart(form).send() match?.error_for_status()?.json() match?
ç§ã¯èŠèŠçã«ããããã®ç¬¬1ã®ãã§ãŒã³ãã¹ãã£ã³ãããšawait
ç§ã¯æ確ãã€è¿
éã«èå¥send().await?
ãæã
ã¯çµæåŸ
ã£ãŠããããšããããsend()
ã
ãã ãã2çªç®ã®ãã§ãŒã³ã§await
ãèŠèŠçã«ã¹ãã£ã³ãããšãæåã«await?.error_for_status()
ã衚瀺ãããããã¯ã¢ããããŠããsend() await
æ¥ç¶ããå¿
èŠããããŸãã
ã¯ãããããã®åãè°è«ã®ããã€ãã¯äžè¬åãããã¿ã€ãã®åž°å±ã«é©çšãããŸãããããã¯ãŸã åãå
¥ããããŠããæ©èœã§ã¯ãããŸããã ç§ã¯ããæå³ã§ã¿ã€ãã¢ã¯ãªãã·ã§ã³ã奜ãã§ããã_general_åŒã®ã³ã³ããã¹ãã§ã¯ïŒãããŸãã§ããïŒã芪ã§ã©ããããå¿
èŠããããšæããŠããŸãã ããããããã¯ãã®è°è«ã§ã¯ãã¹ãŠãããã¯ããå€ããŠããŸãã ãŸããã³ãŒãããŒã¹ã®await
ã®éã¯ãåã®åž°å±ã®éããã倧å¹
ã«å€§ãããªããšãã倧ããªå€åãããããšã«ã泚æããŠãã ããã
Generalized Type Ascriptionã¯ãåå¥ã®æŒç®å:
䜿çšããŠãåãå±æ§ä»ãåŒã«ãã€ã³ãããŸãã ä»ã®äºé
æŒç®åãšåãããã«ããããèªããšã2ã€ã®åŒãåäžã®ããªãŒã§ããããšãïŒèŠèŠçã«ïŒæããã«ãªããŸãã future await
ã¯æŒç®åããªããæåã®ååãããŒã¯ãŒãã§ããå Žåãé€ããŠãæŒç®åã§åºåãããŠããªã2ã€ã®ååããã£ãã«è¡šç€ºãããªãããã future_await
ãšééããããã¡ã§ãïŒäŸå€ãé©çšãããŸãããããã§ã¯ãããŸããïŒãç§ã¯æ¥é èŸæ§æã奜ããšèšããŸãããããã§ã¯ãããŸããïŒã
å¿
èŠã«å¿ããŠããããè±èªãšæ¯èŒããŠãã ããããã€ãã³ïŒ -
ïŒã䜿çšããŠãåèªãèŠèŠçã«ã°ã«ãŒãåããŸãã
ããã¯ãCïŒèšèªããŒã ã®çµéšãããã»ã©æ©ãä¿¡çšããŠã¯ãããªãããšã瀺ããŠãããšæããŸãã
ããã§ã¯ããããªã«éãããšãä¿¡çšã§ããªããã¯å ¬å¹³ã§ã¯ãªããšæããŸãã ããã§ã¯ãasync / await RFCèªäœã§çºçããã®ãšåãããšãèµ·ãã£ãŠãããšæããŸãããããäžæ¹åã§è¡ãããçç±ãæ éã«æ€èšãããã©ã³ã¹ãåãããã«åŸããããã©ãããå€æããŸãã CïŒããŒã ã¯ã次ã®1ã€ã§æ瀺çã«èšåãããŠããŸãã
await
ã®ã¢ã€ãã¢ã¯ãå°æ¥ã§ã¯ãªãå®éã«çµæã欲ãããšããããšã ãšæããŸãã
ãããã£ãŠãawaitæ§æã¯ãrefãæ§æã®ããã«ãªããŸãã
let future = task()
ã ãlet await result = task()
ãããã£ãŠããã§ãŒã³ã®å Žåã¯ãã©ã¡ãããå®è¡ããå¿ èŠããããŸã
task().chained_method(|future| { /* do something with future */ })
ã ã
task().chained_method(|await result| { /* I've got the result */ })
- foo.await // NOT a real field
- foo.await() // NOT a real method
- foo.await!() // NOT a real macro
ãããã¯ãã¹ãŠé£éã§ããŸãæ©èœãããã¹ãŠãå®éã®ãã£ãŒã«ã/ã¡ãœãã/ãã¯ãã§ã¯ãªãçæãæã£ãŠããŸãã
ãã ããããŒã¯ãŒããšããŠã®await
ã¯ãã§ã«ç¹å¥ãªãã®ã§ãããããç¹å¥ãªãã®ã«ããå¿
èŠã¯ãããŸããã
æãåçŽãªfoo.await
éžæããå¿
èŠããããŸãã ããã§ã¯ã ()
ãš!()
äž¡æ¹ãåé·ã§ãã
@liigo
- foo await // IS neither field/method/macro,
// and clearly seen as awaited thing. May be easily chained.
// Allow you to easily spot all async spots.
@mehcode
æåã®ãã§ãŒã³ãèŠèŠçã«ã¹ãã£ã³ããŠåŸ æ©ãããšããsendïŒïŒãawaitãæ確ãã€è¿ éã«èå¥ããŸããïŒ sendïŒïŒã®çµæãåŸ ã£ãŠããããšã確èªããŠãã ããã
æªæ¥ãã©ãã«æ§ç¯ãããã©ãã§ãããåŸ ãããããèŠãã®ãã¯ããã«ç°¡åãªã®ã§ãç§ã¯ã¹ããŒã¹ãããŒãžã§ã³ããã£ãšå¥œãã§ãã äœãèµ·ãããã確èªããã®ã¯ã¯ããã«ç°¡åã§ããç§èŠ
ãããåºåãã䜿çšãããšãã¡ãœããåŒã³åºãã«éåžžã«ãã䌌ãŠããŸãã ã³ãŒãã®åŒ·èª¿è¡šç€ºã¯ããŸã圹ã«ç«ã¡ãŸããããåžžã«å©çšã§ãããšã¯éããŸããã
æåŸã«ããã§ãŒã³ã¯äž»ãªãŠãŒã¹ã±ãŒã¹ã§ã¯ãªããšæããŸãïŒ ?
ãé€ããã foo await?
ã¯å¯èœãªéãæ確ã§ãïŒã
post(url).multipart(form).send().match?
vs
post(url).multipart(form).send() match?
åŸè ãã¯ããã«ã¹ãªã ãªimoã«èŠãããšããã
ãããã£ãŠã future await
ãšfuture.await
ã«çµã蟌ãã å Žåãéæ³ã®ãããããããªãã·ã§ã³ã«ããããšã¯ã§ããŸããïŒ äººã
ã欲ãããã®ãéžã¶ããšãã§ããããã«ããããŠæãéèŠãªããšã«ãè°è«ããããŠåé²ããŠãã ããïŒ
ãªãã·ã§ã³ã®æ§æããã£ãŠã害ã¯ãããŸãããRustã«ã¯ãã®ãããªäŸããããããããŸãã æãããç¥ãããŠããã®ã¯æåŸã®ã¹ãã¬ãŒã¿ãŒïŒ ;
ãŸãã¯,
ãªã©ãæåŸã®ã¢ã€ãã ã®åŸã (A,B,)
ïŒã¯ã»ãšãã©ãªãã·ã§ã³ã§ãã ãããããªãã·ã§ã³ã«ã§ããªããšãã匷ãçç±ã¯ããããŸããã§ããã
Nightlyã§ãããå®è¡ãããšã³ã·ã¹ãã ã«ã©ã¡ããæé©ãã決å®ãããã®ã¯è¯ãææã ãšæããŸãã 奜ã¿ã®ã¹ã¿ã€ã«ãé©çšããããã®ç³žããã䜿çšããŠãã«ã¹ã¿ãã€ãºå¯èœã«ããããšãã§ããŸãã
次ã«ãStableã«çéžããåã«ãã³ãã¥ããã£ã®äœ¿çšç¶æ³ã確èªããã©ã¡ãããéžæããããäž¡æ¹ãæ®ããã決å®ããŸãã
ç§ã¯ããã¯ãããã®æ©èœã«å¯ŸããŠäžæµã§ãããšã¯æããããªããšããèãã«å®å
šã«åæããŸããïŒããããããã®ãããªã³ã¢æ©èœãšã¯èŠãªããŸããïŒã await!()
ã«é¢ãã以åã®ã³ã¡ã³ããå床匷調ããããšæããŸãawait!()
ïŒãã¬ãã£ãã¯ã¹ããã¹ããã£ãã¯ã¹ãã«é¢ä¿ãªãïŒã¯ãå®éã®ãã¯ããã§ã¯ãããŸããããçµå±ããã¹ããã£ãã¯ã¹ãã¯ãã§ããããããã¯ããã®ã§ã¯ãªãããã®æ©èœãã§ããã ãæ©ãå®å®ãããããšæã人ãå€ããããšæããŸãã Rustã«ãŽã£ããã§ãã
ãããã«ããããã®ã¹ã¬ããã1æ¥ããã¯ããŠãããŸã圹ã«ç«ããªãã£ãã®ã§ãä»ããç»é²ã解é€ããŸãã ç§ã®ãã€ã³ãã®1ã€ã«çŽæ¥è¿ä¿¡ããå Žåã¯ãé æ ®ãªãç§ã«èšåããŠãã ããã
.
ããæ§æã«å¯Ÿããç§ã®äž»åŒµã¯ã await
ã¯ãã£ãŒã«ãã§ã¯ãªãããããã£ãŒã«ãã®ããã«èŠããã¹ãã§ã¯ãªããšããããšã§ãã æ§æã®åŒ·èª¿è¡šç€ºãšå€ªåã®ãã©ã³ãã䜿çšããŠããããã¯ã©ããããããç¹å¥ãªãã£ãŒã«ãã®ããã«èŠããŸããã«ã¹ã¿ã ãã©ãŒãããã§ãã .
åŸã«åèªãç¶ãããšã¯ãã£ãŒã«ãã¢ã¯ã»ã¹ã«åŒ·ãé¢é£ããŠããããããã£ãŒã«ãã§ã¯ãªãããšã匷調ã§ããŸããã
Intellij IDEAã§å©çšå¯èœãªæ¥å°ŸèŸè£å®æ©èœã®ãããªãã®ã䜿çšããããšã§ã .
è£å®ã§ããŸããŸãªæ§æã匷åã§ãããããIDEçµ±åãæ¹åããããã«.
ã§æ§æã䜿çšããçç±ããããŸããã
await
ãå¶åŸ¡ãããŒã®ããŒã¯ãŒããšããŠèªèããå¿
èŠããããŸãã Postfix await
ã䜿çšããããšã匷ã決å®ããå Žåã¯ã .
ãªãããªã¢ã³ããæ€èšããå¿
èŠããããŸãã次ã®ãã©ãŒããããäžç·ã«äœ¿çšããŠãäžæã®å¯èœæ§ãããããããã³ã°ãã€ã³ãããã匷調ããããšãææ¡ããŸãã
async fn request_user(self, user_id: String) -> Result<User> {
let url = format!("users/{}/profile", user_id);
let user = self.request(url, Method::GET, None, true)
await?.res.json::<UserResponse>()
await?.user
.into();
Ok(user)
}
ãã®ä»ã®äŸ
// A
if db.is_trusted_identity(recipient.clone(), message.key.clone())
await? {
info!("recipient: {}", recipient);
}
// B
match db.load(message.key)
await? {
Some(key) => key,
None => {
return Err(/* [...] */);
}
};
// C
let mut res = client.get(&script_src)
.header("cookie", self.cookies.read().as_header_value())
.header("user-agent", USER_AGENT)
.send()
await?.error_for_status()?;
// D
let mut res: InboxResponse = client.get(inbox_url)
.headers(inbox_headers)
.send()
await?.error_for_status()?
.json()
await?;
// E
let mut res: Response = client.post(url)
.multipart(form)
.headers(headers.clone())
.send()
await?.error_for_status()?
.json()
await?;
ã·ã³ã¿ãã¯ã¹ãã€ã©ã€ãä»ã
async fn request_user(self, user_id: String) -> Result<User> {
let url = format!("users/{}/profile", user_id);
let user = self.request(url, Method::GET, None, true)
yield?.res.json::<UserResponse>()
yield?.user
.into();
Ok(user)
}
// A
if db.is_trusted_identity(recipient.clone(), message.key.clone())
yield? {
info!("recipient: {}", recipient);
}
// B
match db.load(message.key)
yield? {
Some(key) => key,
None => {
return Err(/* [...] */);
}
};
// C
let mut res = client.get(&script_src)
.header("cookie", self.cookies.read().as_header_value())
.header("user-agent", USER_AGENT)
.send()
yield?.error_for_status()?;
// D
let mut res: InboxResponse = client.get(inbox_url)
.headers(inbox_headers)
.send()
yield?.error_for_status()?
.json()
yield?;
// E
let mut res: Response = client.post(url)
.multipart(form)
.headers(headers.clone())
.send()
yield?.error_for_status()?
.json()
yield?;
ããã¯ããã©ãŒãããã«é¢ãã@ivandardiãã€ã³ããžã®åçã«ããªããŸãã
åŸçœ®ã®ããããã¹ãŠã®äŸã¯ããããããããã«
æ¯èŒããŸãïŒæ§æã®åŒ·èª¿è¡šç€ºã®ããã«match
ãawait
ãã®ãšããŠïŒïŒ
post(url)?.multipart(form).send()?.match?.error_for_status()?.json().match?
ã«
let value = await post(url)?.multipart(form).send()?.error_for_status()
.and_then(|resp| resp.json()) // and then parse JSON
// now handle errors
éäžã§åŸ
æ©ãäžè¶³ããŠããããšã«æ°ã¥ããŸãããïŒ ãªããªããé£éã¯éåžžãããè¯ãAPIèšèšã«ãã£ãŠè§£æ±ºã§ããããã§ãã send()
ããããšãã°200以å€ã®ã¹ããŒã¿ã¹ã¡ãã»ãŒãžãããŒããšã©ãŒã«å€æããããã®è¿œå ã®ã¡ãœãããå«ãã«ã¹ã¿ã futureãè¿ãå Žåãè¿œå ã®åŸ
æ©ã¯å¿
èŠãããŸããã çŸåšãå°ãªããšãreqwest
ã§ã¯ãã€ã³ãã¬ãŒã¹ã§å®è¡ãããæ°ããæªæ¥ã§ã¯ãªããåçŽãªResult
ãçæããŠããããã«èŠããŸããããããããã§ã®åé¡ã®åå ã§ãã
ç§ã®æèŠã§ã¯ãé£éãåŸ
ã£ãŠããã®ã¯åŒ·ãã³ãŒãã®èãã§ããã .await
ãŸãã¯.await()
ã¯å€ãã®æ°èŠãŠãŒã¶ãŒãæ··ä¹±ãããé¢çœãããããŸããã .await
ç¹ã«PythonãŸãã¯PHPã®ãããªãã®ã®ããã«æããŸãããã®å Žåãå€æ°ã¡ã³ããŒãžã®ã¢ã¯ã»ã¹ã¯éæ³ã®ããã«ç¹å¥ãªåäœãããå¯èœæ§ããããŸãã
await
ã¯ããç¶è¡ããåã«ããããåŸ
ã€ãã§ã¯ãªããã次ã«ããããåŸ
ã€ããšèšã£ãŠãããã®ããã«ãåãã£ãŠæçœã§ããå¿
èŠããããŸãã åŸè
ã¯æåéãand_then
ã³ã³ãããŒã¿ã§ãã
ããã«ã€ããŠèãããã1ã€ã®æœåšçãªæ¹æ³ã¯ã async
/ await
åŒãšå
ç©ãã€ãã¬ãŒã¿ãŒã®ããã«èããããšã§ãã 圌ãã¯ãäž¡æ¹ã®æ æ°ãããŠããå€ãã®ç¶æ
ãæã€ããšãã§ããïŒæ§æã§çµäºããããšãã§ããŸãfor-in
ã€ãã¬ãŒã¿ã®ããã await
å
ç©ã®ããïŒã ããã«ãããããªæ£èŠè¡šçŸãšããŠã€ãã¬ãŒã¿ããã§ãŒã³åããããã®æ§ææ¡åŒµãææ¡ããŸãããïŒ ãããã¯é£éã«ã³ã³ãããŒã¿ã䜿çšããéåææäœ/å°æ¥ã¯åãããšãè¡ãå¿
èŠãããã1åã ãçµäºããŸãã ããã¯ããªãããŸããããŸãã
æåŸã«ããããŠæãéèŠãªããšãšããŠãé¢æ°ã®æåã®ããã€ãã®ã€ã³ãã³ããåçŽæ¹åã«ã¹ããã³ã°ããŠãéåææäœãçºçããå Žæãæ確ã«ç¢ºèªã§ããããã«ããããšæããŸãã ç§ã®ããžã§ã³ã¯ããã»ã©çŽ æŽããããã®ã§ã¯ãããŸãããã©ã€ã³ã®æåŸã§åŸ ã£ãããéäžã§ç«ã¡åŸçããããããšãç©äºãéåžžã«é£ãããªããçã®å ç©ã«å®å šã«ãšã©ãŸãå¯èœæ§ããããŸãã
ã³ã¡ã³ãããåã«ããã®ããã°æçš¿ãèªãã§
Async / awaitã¯å©äŸ¿æ§ã§ã¯ãããŸããã ã³ã³ãããŒã¿ãåé¿ããããšã§ã¯ãããŸããã
ããã¯ãã³ã³ãããŒã¿ã§ã¯äžå¯èœãªæ°ããããšãå¯èœã«ããããšã§ãã
ãããã£ãŠãã代ããã«ã³ã³ãããŒã¿ã䜿çšããŸãããããšããææ¡ã¯ãããã¯ããå€ããŠãããå¥ã®å Žæã§è°è«ããå¿ èŠããããŸãã
éäžã§åŸ æ©ãäžè¶³ããŠããããšã«æ°ã¥ããŸãããïŒ ãªããªããé£éã¯éåžžãããè¯ãAPIèšèšã«ãã£ãŠè§£æ±ºã§ããããã§ãã
å®éã®éåæã®äŸã§ã¯ãããããªãã§ãŒã³ã¯åŸãããŸããã å®éã®äŸïŒ
req.into_body().concat2().and_then(move |chunk| {
from_slice::<Update>(chunk.as_ref())
.into_future()
.map_err(|_| {
...
})
.and_then(|update| {
...
})
.and_then(move |(user, file_id, chat_id, message_id)| {
do_thing(&file_id)
.and_then(move |file| {
if some_cond {
Either::A(do_yet_another-thing.and_then(move |bytes| {
...
if another_cond {
...
Either::A(
do_other_thing()
.then(move |res| {
...
}),
)
} else {
Either::B(future::ok(()))
}
}))
} else {
Either::B(future::ok(()))
}
})
.map_err(|e| {
...
})
})
// ...and here we unify both paths
.map(|_| {
Response::new(Body::empty())
})
.or_else(Ok)
})
ã³ã³ãããŒã¿ã¯ããã§ã¯åœ¹ã«ç«ã¡ãŸããã å
¥ãåã¯åé€ã§ããŸãããç°¡åã§ã¯ãããŸããïŒ2åè©ŠããŸããã倱æããŸããïŒã æåŸã«ããããã®Either:A(Either:A(Either:A(...)))
ããããŸãã
OTOH async / awaitã§ç°¡åã«è§£æ±ºã§ããŸãã
@Pauanã¯ç§ãæçš¿ãçµããåã«ãããæžããŠããŸãã ã ããããã§ããã ã³ã³ãããŒã¿ã«ã€ããŠã¯èšåããªãã§ãã ããã async/await
ã¯åãããã«èŠããã¹ãã§ã¯ãããŸããã ãããããªãããã¯åé¡ãããŸãããèæ
®ãã¹ããã£ãšéèŠãªããšããããŸãã
ç§ã®ã³ã¡ã³ãã«å察祚ãæããŠããã³ã³ãããŒã¿ã¯ãã䟿å©ã«ã¯ãªããŸããã
ã¿ã€ãã¢ã¯ãªãã·ã§ã³ã³ã¡ã³ããèªãã§ããããawait
ãšã©ã®ããã«çµã¿åããããããèããŠããŸããã äžéšã®äººã
ã.await
ãŸãã¯.await()
ãæ··ä¹±ãããã¡ã³ããŒãã£ãŒã«ã/ã¡ãœããã¢ã¯ã»ã¹ãšããŠæã£ãŠããäºçŽãèãããšãäžè¬çãªãascriptionãæ§æããªãã·ã§ã³ã«ãªãã®ã§ã¯ãªãããšæããŸãïŒã€ãŸãããgive me what await
ãè¿ãããŸã "ïŒã
æ§æã®åŒ·èª¿è¡šç€ºã«await
ã«yield
ã䜿çšãã
let result = connection.fetch("url"):yield?.collect_async():yield?;
ã¿ã€ãã¢ã¯ãªãã·ã§ã³ãšçµã¿åãããŠãäŸïŒ
let result = connection.fetch("url") : yield?
.collect_async() : yield Vec<u64>?;
å©ç¹ïŒèŠæ ããããïŒIMHOïŒããã£ãŒã«ã/ã¡ãœããã¢ã¯ã»ã¹ãšã¯æ§æãç°ãªããŸãã
çæïŒã¿ã€ãã¢ã¯ãªãã·ã§ã³ïŒïŒïŒãšã®æœåšçãªç«¶åãçè«çã«ã¯è€æ°ã®ã¢ã¯ãªãã·ã§ã³ãå¯èœïŒ
foo():yield:yield
ç·šéïŒ 2ã€ã®ã¢ã¯ãªãã·ã§ã³ã䜿çšãããšãçµã¿åãããäŸã®æ¹ãè«ççã§ããããšãããããŸããã
let result = connection.fetch("url") : yield?
.collect_async() : yield : Vec<u64>?;
@Pauanãã®ããã°æçš¿ãéå°ã«é©çšããããšã¯äžé©åã§ãã ã³ã³ãããŒã¿ã¯ãawaitæ§æãšçµã¿åãããŠé©çšããŠã説æãããŠããåé¡ãåé¿ã§ããŸãã
äžå¿çãªåé¡ã¯åžžã«ãã¹ããŒã³å¯èœãªæªæ¥ã¯'static
ã§ãªããã°ãªããªããšããããš'static
ã§ã¯ãªãæªæ¥ã«ãªã£ãŠããŸããŸããã ãããã 'static
æªæ¥ãåŸ
ã£ãŠããããªããããéåæfnã¯'static
ã¯ãããŸããã ãããã£ãŠã次ã®ãããªããšãã§ããŸãã
`` `é
//ã¹ã©ã€ã¹ïŒïŒ[T]
x = await future.and_thenïŒ| i | ifã¹ã©ã€ã¹.containsïŒiïŒ{async_fnïŒsliceïŒ}ïŒ;
ããã§ãç§ã¯ãŸã£ããã³ã¡ã³ãããªãããšãèšç»ããŠããŸããããããç§ã¯å€ãã®éåæã³ãŒããæžããªã誰ãããã®ããã€ãã®ã¡ã¢ãè¿œå ãããã£ãã§ãããããããã§ããããèªãŸãªããã°ãªããŸããïŒ
await
ã¯ãã¯ããã«æ°ã¥ããããã§ãã ããã¯ãæåŸ
ããŠããå ŽåïŒ async
fnã®å
éšïŒãŸãã¯å€éšïŒãã¯ãæ¬äœã®åŒïŒã®äž¡æ¹ã§ããawait
ã¯ãä»ã®ããŒã¯ãŒããã»ãšãã©ãŸãã¯ãŸã£ãããªããã§ãŒã³ã§ããç®ç«ã€å¯èœæ§ããããŸãã ããããä»ã®å¶åŸ¡æ§é ãšåæ§ã®ã¯ããŒãžã£ããããšããã«ã awaits
ã¯ç®ç«ããªããªããèŠèœãšãããããªããŸãã.await
ãç䌌ãã£ãŒã«ããšããŠéåžžã«å¥åŠã ãšæããŸãã ããã¯ç§ã«ãšã£ãŠéèŠãªä»ã®åéãšã¯ãŸã£ããç°ãªããŸããç§ã¯ããã¯ããšããŠã®await!()
ãäžæµã ãšã¯æããªãããšããææ
ãå
±æããŸããã ãã¯ãã¯Rustã®å®å
šã«äžæµã®åžæ°ã§ãã ãŸããããŠãŒã¶ãŒã³ãŒãã§æ§æãçºæãããããã ãã®ãã®ã§ã¯ãããŸããã å€ãã®ããã«ãã€ã³ããã¯ãã¯ããŠãŒã¶ãŒå®çŸ©ã§ã¯ãªãããã«åãªãæ§æäžã®çç±ã§ã¯ãããŸããã format!()
ã¯ãã³ã³ãã€ã©ã«éçã«åãã§ãã¯ãããã©ãŒãããæååã®èœåãäžããããã«ãããŸãã include_bytes!()
ããŠãŒã¶ãŒå®çŸ©ã§ã¯ãªããåãªãæ§æäžã®çç±ã§ååšããŸããããããæ§ææ¡åŒµã§ããå¿
èŠããããããã¯ãã§ããããããã³ã³ãã€ã©ãŒå
ã§ç¹å¥ãªããšãè¡ããããã§ããŸããã§ãããã³ã¢èšèªæ©èœãšããŠè¿œå ããã«ãä»ã®æ¹æ³ã§åççã«èšè¿°ããŸãã
ãããŠãããã¯ç§ã®ãã€ã³ãã®äžçš®ã§ãããã¯ãã¯ãã³ã³ãã€ã©ã®éæ³ãçµ±äžãããé©ãã¹ãæ¹æ³ã§å°å ¥ããã³é衚瀺ã«ããããã®å®ç§ãªæ¹æ³ã§ã
ã§ããããç¹å¥ãªããŒã¯ãŒãã®å¿ èŠæ§ã¯ãŸã£ããããããŸããã ãšã¯èšããã®ã®ããããããŒã¯ãŒãã«ãªãã®ã§ããã°ãããã¯åãªãããŒã¯ãŒãã§ããã¯ãã§ããç§ã¯ããããã£ãŒã«ãã«åœè£ ããåæ©ãæ¬åœã«ç解ããŠããŸããã ããã¯ééã£ãŠããããã«æããŸããããã¯ãã£ãŒã«ãã¢ã¯ã»ã¹ã§ã¯ãªãããã£ãŒã«ãã¢ã¯ã»ã¹ã®ããã«ãªã¢ãŒãã§ããããŸããïŒããšãã°ãç ç³ã䜿ã£ãã²ãã¿ãŒ/ã»ãã¿ãŒã¡ãœãããšã¯ç°ãªããŸãïŒã®ã§ãããã1ã€ãšããŠæ±ãããšã¯ãä»æ¥ã®èšèªã§ã®ãã£ãŒã«ãã®åäœãšççŸããŸãã
@ H2CO3 await!
ãã¯ãã¯ã次ã®2ã€ã®ããããã£ãé€ããŠããã¹ãŠã®æãŸããæ¹æ³ã«é©ããŠããŸãã
if/while/...
ãããã¯ããäžæ¬åŒ§ãåé€ããŸããïŒç§ã¯ä¿¡ããŠããŸãïŒã éèŠã§ãªãATMã«èŠãããããããŸããããå®éã«ã¯ããã§ãasync
ãããŒã¯ãŒãã§ããé察称æ§ã Asyncã¯ãã¡ãœããæ¬äœã§1ã€ã®ãã¯ããèš±å¯ããããã倧ããªããšãè¡ãå¿
èŠããããŸãã ãã以å€ã®å Žåã¯ãé¢æ°ã®äžã«ãã#[async]
å±æ§ã§ããå¯èœæ§ããããŸãã å±æ§ã§ã¯ãããã¯ãªã©ã§äœ¿çšã§ããªãããšã¯ç解ããŠããŸããã await
ããŒã¯ãŒãã«ééããå¯èœæ§ããããŸãã ãã®æåŸ
ã¯ãç¥ã£ãŠããä»ã®èšèªã§ã®çµéšã«ãã£ãŠåŒãèµ·ãããããããããŸããããç§ã¯ãããååšãããšåŒ·ãä¿¡ããŠããŸãã 察åŠãããŠããªãå¯èœæ§ããããŸãããèæ
®ããå¿
èŠããããŸãããã以å€ã®å Žåã¯ãé¢æ°ã®äžã«ãã
#[async]
å±æ§ã§ããå¯èœæ§ããããŸãã
é·ãéããã§ããããããŠãããè¡ãã®ãèŠãŠãã¿ãŸããã #[async]
å±æ§ã¯å®å
šã«æ£åžžã«æ©èœããå±æ§ã®ãããªæç¶ãåãã¯ããå®å®ããŠããã®ã«å¯Ÿããå¥ã®ããŒã¯ãŒããå°å
¥ããŸããããã¯ããŸã ããã£ãŠããŠããæ§æçã«ãæå³çã«ãä»ã®èšèªãšäžè²«æ§ããããŸãã ïŒãããŠç¹å¥ã«åŠçãããïŒã³ã³ãã€ã©ãŒã«ãã£ãŠã
@ H2CO3ãŠãŒã¶ãŒã®èŠ³ç¹ãããã¯ããšããŠawait
ã䜿çšããç®çãŸãã¯å©ç¹ã¯äœã§ããïŒ ããã°ã©ã ãå
éšã®ãããŒãå¶åŸ¡ããããã«å€æŽããçµã¿èŸŒã¿ãã¯ãã¯ãããŸããïŒ
@ I60Rå©ç¹ã¯ãèšèªã®ä»ã®éšåãšã®çµ±äžæ§ã§ããããããã£ãŠãããèªäœããããããã¹ãŠã®æè·ç©ã§ãããã«å¥ã®ããŒã¯ãŒãã«ã€ããŠå¿é ããå¿ èŠããããŸãããããšãã°ãåªå é äœãšã°ã«ãŒãåã¯ããã¯ãåŒã³åºãã§æããã§ãã
2çªç®ã®éšåãé¢é£ããçç±ãããããŸããâäœãæ°ããããšãããçµã¿èŸŒã¿ãã¯ãã¯ãããŸãããïŒ å®éãã»ãšãã©ãã¹ãŠã®çµã¿èŸŒã¿ãã¯ãã¯ãã³ã³ãã€ã©ã®ãµããŒããªãã§ã¯ïŒåçç/å¹ççã«/ãªã©ïŒéæã§ããªããå¥åŠãªãããšãããŠãããšæããŸãã await!()
ã¯ããã®ç¹ã§æ°ãã䟵å
¥è
ã§ã¯ãããŸããã
以åã¯æé»çãªåŸ æ©ãææ¡ããŸããããæè¿ã§ã¯
ã³ãã¥ããã£ã¯æ瀺çãªåŸ æ©ãéåžžã«åŒ·ãæ¯æããŠããããã§ãïŒç§ã¯ãããå€ããããšãæãã§ããŸããâŠïŒã ãã ããæ瀺æ§ã®ç²åºŠãå®åæãäœæãããã®ã§ãïŒã€ãŸããåãåŒã§äœåºŠããããå¿ èŠãšããããšã§å®åæãäœæãããããã§ãïŒã
[èŠåïŒæ¬¡ã®ææ¡ã¯ç©è°ãéžãã§ããããããããå¿ããã®ãã£ã³ã¹ãäžããŠãã ãã]
ã³ãã¥ããã£ã®ã»ãšãã©ã劥åããŠãéšåçã«æé»ã®åŸ æ©ããèš±å¯ãããã©ããç¥ãããã§ããïŒ ãã¶ããåŒãã§ãŒã³ããšã«1åã®èªã¿åãåŸ æ©ã¯ãååã«æ瀺çã§ããïŒ
await response = client.get("https://my_api").send()?.json()?;
ããã¯ãå€ã®æ§é åã«äŒŒããã®ã§ãããç§ã¯ãããåŒã®æ§é åãšåŒãã§ããŸãã
// Value de-structuring
let (a, b, c) = ...;
// De-sugars to:
let _abc = ...;
let a = _abc.0;
let b = _abc.1;
let c = _abc.2;
// Expression de-structuring
await response = client.get("https://my_api").send()?.json()?;
// De-sugards to:
// Using: prefix await with explicit precedence
// Since send() and json() return impl Future but ? does not expect a Future, de-structure the expression between those sub-expressions.
let response = await (client.get("https://my_api").send());
let response = await (response?.json());
let response = response?;
md5-eeacf588eb86592ac280cf8c372ef434
```rust
// If needed, given that the compiler knows these expressions creating a, b are independent,
// each of the expressions would be de-structured independently.
await (a, b) = (
client.get("https://my_api_a").send()?.json()?,
client.get("https://my_api_b").send()?.json()?,
);
// De-sugars to:
// Not using await syntax like the other examples since await can't currently let us do concurrent polling.
let a: impl Future = client.get("https://my_api_a").send();
let b: impl Future = client.get("https://my_api_b").send();
let (a, b) = (a.poll(), b.poll());
// return if either a or b is NotReady;
let a: impl Future = a?.json();
let b: impl Future = b?.json();
let (a, b) = (a.poll(), b.poll());
// return if either a or b is NotReady;
let (a, b) = (a?, b?);
ãŸãããåŒãã§ãŒã³ããšã«1åèªã¿åãã®ã¯ååã«æ瀺çã§ããå¯èœæ§ãé«ãããšãããã³ã¢ã¢ã€ãã¢ã®ä»ã®å®è£ ã«ãæºè¶³ããŠããŸãã ãã€ã©ãŒãã¬ãŒããæžããã ãã§ãªãã誰ããæãããç¥ã£ãŠãããã¬ãã£ãã¯ã¹ããŒã¹ã®æ§æã§ãã§ãŒã³ãå¯èœã«ããããã§ãã
@yazaddaruvalaäžèšã®èŠåããããŸããã®ã§ã泚æããŠãã ããã
ã³ãã¥ããã£ã®ã»ãšãã©ã劥åããŠãéšåçã«æé»ã®åŸ æ©ããèš±å¯ãããã©ããç¥ãããã§ããïŒ ãã¶ããåŒãã§ãŒã³ããšã«1åã®èªã¿åãåŸ æ©ã¯ãååã«æ瀺çã§ããïŒ
Vec<Future>
äœããã¹ãã§ããïŒawait response = client.get("https://my_api").send()?.json()?.parse_as::<Vec<String>>()?.map(|x| client.get(x))?;
ãã¹ããããåŒã³åºãããšã«await
ãå®è¡ããå¿
èŠããããŸããïŒ ããããã1è¡ã®ã³ãŒãã§awaitãæ©èœãããããšãã§ããŸãïŒãããã£ãŠããã¹ããããmapFunc
ã¯åŸ
æ©ãããŸããïŒãããã®åäœãç Žãã®ã¯ç°¡åãããŸãã awaitã1ã€ã®ã³ãŒãè¡ã§æ©èœããå Žåããå€ã®æœåºããªã©ã®ãªãã¡ã¯ã¿ãªã³ã°ã¯ãããå£ããŸãã
@yazaddaruvala
ããªããæå³ããŠããããšã¯ã ?
ãããåªå
ããããã¬ãã£ãã¯ã¹awaitã§ãããletããŒã¯ãŒãã®ä»£ããã«awaitã䜿çšããŠã³ã³ããã¹ããå€æŽãããã¹ãŠã®impl Future <_iãæ¯ããããå¯èœæ§ãããããšãç解ããŠããŸããïŒ = "7">åŸ
ã£ãŠæ»ã£ãŠããŸããïŒ
以äžã®3ã€ã®ã¹ããŒãã¡ã³ãã®æå³ã¯åçã§ãã
// foo.bar() -> Result<impl Future<_>, _>>
let a = await foo.bar()?;
let a = await (foo.bar()?);
await a = foo.bar()?;
ãããŠã以äžã®2ã€ã®ã¹ããŒãã¡ã³ãã¯åçã§ãã
// foo.bar() -> impl Future<Result<_, _>>
await a = foo.bar()?;
let a = await (foo.bar())?;
æ§æãçæ³çãã©ããã¯ããããŸãããããæé»ã®ã³ã³ããã¹ããåŸ ã€ãã«å€æŽãããããŒã¯ãŒãããããšããã¬ãã£ãã¯ã¹ããŒã¯ãŒãã®åé¡ãå°ãªããªãå¯èœæ§ããããŸãã åæã«ãå¿ èŠãªãšãã«awaitã䜿çšãããå Žæããããã现ããå¶åŸ¡ã§ããããã«ããŸãã
ç§ã®æèŠã§ã¯ãçãã¯ã³ã©ã€ããŒã®æ¥é èŸawaitã«ã¯ãä»ã®å€ãã®ããã°ã©ãã³ã°èšèªãšå€ãã®äººéã®èšèªã®äž¡æ¹ã«é¡äŒŒããŠãããšããå©ç¹ããããŸãã æçµçã«awaitãæ¥å°ŸèŸã®ã¿ã«ããããšã決å®ãããå Žåãç§ãåŸããŠãããšæãããšãã«ã Await!()
ãã¯ãïŒãŸãã¯åæ§ã®åœ¢åŒãããŒã¯ãŒããšè¡çªããªããã®ïŒã䜿çšããããšã«ãªããšæããŸããè±èªã®æã®æ§é ã«ç²ŸéããŠãããšãã³ãŒãã®èªã¿åã/æžã蟌ã¿ã®ç²Ÿç¥çãªãªãŒããŒããããæžããã®ã«åœ¹ç«ã¡ãŸãã ããé·ãé£éåŒã®æ¥å°ŸèŸåœ¢åŒã«ã¯æ確ãªäŸ¡å€ããããŸãããç§ã®æ瀺çã«å®¢èŠ³çäºå®ã«åºã¥ããŠããªãèŠè§£ã¯ãæ¥é èŸã®äººéã®è€éãã話ãèšèã«ãã£ãŠå©æãããŠããã®ã§ã1ã€ã®åœ¢åŒã ããæã€ããšã®åçŽãã®å©ç¹ã¯äž¡æ¹ãæã€ããšã®æœåšçãªã³ãŒãã®æ確ããæ確ã«äžåã£ãŠããŸããã å°ãªããšãçŸåšã®ã³ãŒãã®ãã£ã³ã¯ã«æãé©åãªæ¹ãããã°ã©ããŒãéžæããããšãä¿¡é ŒããŠãããšä»®å®ããŸãã
@Pzixel
ç§ã¯ãã³ãã¥ããã£ã®ã»ãšãã©ãéšåçãæé»çãäœããæãã§ãããšã¯æããŸããã Rustãã€ãã£ãã®ã¢ãããŒãã¯ãããã¹ãŠãæ瀺ããããããªãã®ã§ãã
ç§ã¯ãããåãããã«èŠãŠããŸããã ç§ã¯ãããåžžã«æ瀺çããã³æé»çãªåŠ¥åã§ãããšæããŸãã äŸãã°ïŒ
ãã§ãŒã³ã®ãã¹ãŠã®å©ç¹ãåãããåŒ/ã¹ããŒãã¡ã³ãããšã«1åã ãawait
ã䜿çšããããšã¯ãæ瀺çãªå®åæãšåæžå®åæã®éã®éåžžã«åççãªåŠ¥åç¹ã§ãã
ããè€éãªã·ããªãªã§ã¯ããŸãæ©èœããŸããã ã³ã³ãã€ã©ã¯Vecã§äœããã¹ãã
ïŒ await response = client.get("https://my_api").send()?.json()?.parse_as::<Vec<String>>()?.map(|x| client.get(x))?;
ã³ã³ãã€ã©ã¯ãšã©ãŒã«ãªãã¯ãã ãšç§ã¯äž»åŒµããŸãã æšæž¬ã§ããªã倧ããªã¿ã€ãã®éãããããŸãã äžæ¹ã Vec<impl Future>
ã¯ããã®ã¹ã¬ããã®ã©ã®æ§æã§ã解決ãããŸããã
// Given that json() returns a Vec<imple Future>,
// do I use .await on the `Vec`? That seems odd.
// Given that the client.get() returns an `impl Future`,
// do I .await inside the .map? That wont work, given Iterator methods are not `async`
client.get("https://my_api").send().await?.json()[UNCLEAR]?.parse_as::<Vec<String>>()?.map(|x| client.get(x)[UNCLEAR])?;
Vec<impl Future>
ã¯æªãäŸã§ãããšç§ã¯äž»åŒµããŸããããã§ãªããã°ãææ¡ããããã¹ãŠã®æ§æãåãæšæºã«ä¿ã€å¿
èŠããããŸãã äžæ¹ãç§ãææ¡ãããpartial-implicit awaitãæ§æã¯ãéåžžã®æ¥å°ŸèŸãŸãã¯ãã¬ãã£ãã¯ã¹await let (a, b) = (client.get("a") await?, client.get("b") await?);
ã䜿çšããawait (a, b) = (client.get("a")?, client.get("b")?);
ãããªããè€éãªã·ããªãªã§ã¯ãçŸåšã®ææ¡ãããããŸãæ©èœããŸãã -æé»çãªããŒãžã§ã³ã¯ãã³ã³ãã€ã©ãé©åã«è±ç³ããããšã§åæã«å®è¡ã§ããŸãïŒå
ã®æçš¿ã§ç€ºããããã«ïŒã
2011幎ã«ãCïŒã®async
æ©èœããŸã ãã¹ãäžã§ãã£ããšãã«ã await
ããã¬ãã£ãã¯ã¹æŒç®åã§ããããšã«ã€ããŠè³ªåããCïŒèšèªPMããå¿çãåãåããŸããã Rustããã¬ãã£ãã¯ã¹æŒç®åã䜿çšãã¹ããã©ããã«ã€ããŠã®è°è«ãããã®ã§ããã®å¿çãããã«æçš¿ããããšã¯äŸ¡å€ããããããããªããšæããŸããã ãªããawaitãã¯æ¥å°ŸèŸæŒç®åã§ã¯ãªãæ¥é èŸæŒç®åãªã®ã§ããïŒ ïŒ
ãæ³åã®ãšãããawaitåŒã®æ§æã¯ãçŸåšã®ç¶æ³ã決å®ããåã®å€§ããªè°è«ã®ãã€ã³ãã§ãã:-)ã ãã ããæ¥å°ŸèŸæŒç®åã«ã€ããŠã¯ããŸãèæ ®ããŠããŸããã§ããã æ¥å°ŸèŸïŒHPèšç®æ©ãšããã°ã©ãã³ã°èšèªForthãåç §ïŒã«ã¯ãååãšããŠç©äºãåçŽã«ããå®éã«ã¯è¿ã¥ãã«ãããèªã¿ã«ããããäœãããããŸãã å€åããã¯æ°åŠè¡šèšãåäŸãšããŠç§ãã¡ãæŽè³ããæ¹æ³ã§ã...
ãã¬ãã£ãã¯ã¹æŒç®åïŒæåéãåœä»€åã®ãã¬ãŒããŒ-ããããå®è¡ããŠãã ããïŒãïŒãã¯ããã«çŽæçã§ããããšãééããªãããããŸããã ç§ãã¡ã®åé æŒç®åã®ã»ãšãã©ã¯ãã§ã«æ¥é èŸãä»ããŠãããawaitã¯ããã«é©åããããã§ãã ã¯ããããã¯è€éãªåŒã§æººããŸãããäŸãã°é¢æ°é©çšãæ¥å°ŸèŸã§ã¯ãªããšããäºå®ã®ããã«ãäžè¬çã«è©äŸ¡é åºãããã§ãã æåã«åŒæ°ïŒå³åŽã«ãããŸãïŒãè©äŸ¡ããŠãããé¢æ°ïŒå·ŠåŽã«ãããŸãïŒãåŒã³åºããŸãã ã¯ããCïŒã®é¢æ°é©çšæ§æã«ã¯ãã§ã«æ¬åŒ§ãçµã¿èŸŒãŸããŠãããšããéãããããŸãããåŸ æ©ããå Žåã¯éåžžãæ¬åŒ§ãåé€ã§ããŸãã
ç§ãåºãèŠãŠããïŒãããŠç§èªèº«ãæ¡çšããŠããïŒã®ã¯ãå€ãã®äžæå€æ°ã䜿çšããã¹ã¿ã€ã«ã§ãã ç§ã¯å¥œãåŸåããããŸã
var bResult = await A().BAsync(); var dResult = await bResult.C().DAsync(); dResult.E()
ãŸãã¯ãã®ãããªãã®ã äžè¬ã«ãç§ã¯éåžžãæãåçŽãªåŒãé€ããŠãã¹ãŠã§è€æ°ã®åŸ æ©ãåé¿ãïŒã€ãŸãããããã¯ãã¹ãŠåãé¢æ°ãŸãã¯æŒç®åãžã®åŒæ°ã§ããããããåé¡ãããŸããïŒãåŸ æ©åŒãæ¬åŒ§ã§å²ãããšãé¿ããäž¡æ¹ã®ãžã§ãã«è¿œå ã®ããŒã«ã«ã䜿çšããããšã奜ã¿ãŸãã ã
æå³ããããŸããïŒ
Mads TorgersenãCïŒèšèªPM
CïŒéçºè ãšããŠã®ç§ã®å人çãªçµéšã§ã¯ãæ§æã«ãã£ãŠãã®ã¹ã¿ã€ã«ã®è€æ°ã®ã¹ããŒãã¡ã³ãã䜿çšããããã«ãªããéåæã³ãŒãã¯åæã³ãŒããããèªã¿åããšæžã蟌ã¿ãã¯ããã«åä»ã«ãªããŸãã
@yazaddaruvala
ç§ã¯ãããåãããã«èŠãŠããŸããã ç§ã¯ãããåžžã«æ瀺çããã³æé»çãªåŠ¥åã§ãããšæããŸã
ããã¯ãŸã æçœã§ãã ãšããã§ããããã¯ã«é¢ããè¯ãèšäºããªã³ã¯ããããšãã§ããŸãã
ã³ã³ãã€ã©ã¯ãšã©ãŒã«ãªãã¯ãã ãšç§ã¯äž»åŒµããŸãã æšæž¬ã§ããªã倧ããªã¿ã€ãã®éãããããŸãã äžæ¹ãVecã®äŸ
ãã®ã¹ã¬ããã®ã©ã®æ§æã§ã解決ãããŸããã
ãªããšã©ãŒã«ãªãã®ã§ããããïŒ Vec<impl future>
ãæã£ãŠããŠãäžç·ã«åå ã§ããŠããããã§ãã ããªãã¯çç±ããªãè¿œå ã®å¶éãææ¡ããŸãã
ç§ã¯Vecã
ããã¯æªãäŸã§ããããã§ãªãå Žåã¯ãææ¡ããããã¹ãŠã®æ§æãåãæšæºã«ä¿ã€å¿ èŠããããŸãã
ãã¹ãŠã®ã±ãŒã¹ã調ã¹ãå¿ èŠããããŸãã ããŸããããªããç¥ã£ãŠããããšã«ãã誰ããããæžããªããã®ã§ãç§ãã¡ã¯ãšããžã±ãŒã¹ãåã«ç¡èŠããããšã¯ã§ããŸããã èšèªèšèšã¯ãäž»ã«ãšããžã±ãŒã¹ã«é¢ãããã®ã§ãã
@chescockç§ã¯ããªãã«åæããŸãããåã«èšãããããã«ãRustã¯ããã§CïŒãšéåžžã«å€§ããªéãããããŸãïŒCïŒã§ã¯(await FooAsync()).Bar()
æžãããšã¯ãããŸããã ããããRustã§ã¯ããããŸãã ãããŠãç§ã¯?
ã«ã€ããŠè©±ããŠããã CïŒã§ã¯ãéåæåŒã³åºããä»ããŠäŒæãããæé»ã®äŸå€ããããŸãã ãããããã³ãå Žåã¯ãæ瀺çã«ããŠãé¢æ°ã®çµæãåŸ
ã£ãåŸã«?
ãæžã蟌ãå¿
èŠããããŸãã
ãã¡ããããŠãŒã¶ãŒã«æžã蟌ã¿ãäŸé Œããããšãã§ããŸã
let foo = await bar();
let bar = await foo?.baz();
let bar = bar?;
ããããããã¯ãããã¯ããã«å¥åŠã§ã
let foo = await? bar();
let bar = await? foo.baz();
ããã¯ã¯ããã«èŠæ ããããŸããã await
ãš?
doint (await expr)?
æ°ããçµã¿åãããå°å
¥ããå¿
èŠããããŸãã ããã«ãä»ã®æŒç®åãããå Žåã¯ã await?&@#
ãšèšè¿°ããŠããã¹ãŠã®çµã¿åãããå®å
šã«æ©èœãããããšãã§ããŸã...å°ãè€éã«èŠããŸãã
ãããããã®åŸãæ¥å°ŸèŸãšããŠåŸ æ©ããã ãã§ãçŸåšã®èšèªã«èªç¶ã«é©åããŸãã
let foo = bar() await?;
let bar = foo.baz() await?;
çŸåšã await?
ã¯2ã€ã®å¥ã
ã®ããŒã¯ã³ã§ããããããã¯å®å
šã«æ©èœããŸãã await?&@#
ã䜿çšããããšãã§ããã³ã³ãã€ã©èªäœã«ãããã³ã°ããå¿
èŠã¯ãããŸããã
ãã¡ããããã¬ãã£ãã¯ã¹ã®æ¹æ³ãããå°ãå¥åŠã«èŠããŸãããèšãããŠããããã«ãããã¯ãã¹ãŠRust / CïŒã®éãã«é¢ãããã®ã§ãã CïŒãšã¯ã¹ããªãšã³ã¹ã䜿çšããŠãããŒã¯ãŒããåé¢ãããŠããå¯èœæ§ãé«ãæ瀺çãªåŸ æ©æ§æãå¿ èŠã§ããããšã確èªã§ããŸãããåãæ¹æ³ãç²ç®çã«ãã©ã£ãŠRust / CïŒã®éããç¡èŠããã¹ãã§ã¯ãããŸããã
ç§ã¯é·ãéãã¬ãã£ãã¯ã¹await
ææ¡è
ã§ãããCïŒèšèªã®éçºè
ããããã¯ã«æåŸ
ããŸããïŒ2011幎ãããæ°ããæ
å ±ããããŸãðïŒããä»ã§ã¯ãã¹ããã£ãã¯ã¹await
ã ãšæããŸã
æ¯æ©ããããšãå¿ããªãã§ãã ãããããè¯ãæ¹æ³ãèŠã€ãã£ãããåŸã§ããçŽãããšãã§ããŸãã
次ã®çµã¿åããã§äž¡æ¹ã®äžçãæ倧éã«æŽ»çšã§ããå¯èœæ§ãããããšã«æ°ã¥ããŸããã
async
ããŒã¯ãŒããããçµã¿åããããšãã³ã³ãã€ã©ã®éæ³ãªãã§æ¥å°ŸèŸ.await!()
ãã¯ããå®è£
ã§ããŸãã
ä»ã®ãšãããæ¥å°ŸèŸ.await!()
ãã¯ãã«ã¯ã³ã³ãã€ã©ã®éæ³ãå¿
èŠã§ãã ãã ãã await
ããŒã¯ãŒãã®ãã¬ãã£ãã¯ã¹ããªã¢ã³ããå®å®åãããŠããå Žåãããã¯åœãŠã¯ãŸããŸããããã¹ããã£ãã¯ã¹.await!()
ãã¯ãã¯ãåŒæ°ïŒåŒïŒã®ãã¬ãã£ãã¯ã¹ãä»ãããã¯ããšããŠç°¡åã«å®è£
ã§ããŸãã await
ããŒã¯ãŒãã䜿çšããŠããã¹ãŠãæ¬åŒ§ã§å²ã¿ãŸãã
ãã®ã¢ãããŒãã®å©ç¹ïŒ
await
ããŒã¯ãŒããå©çšå¯èœã§ãããä»ã®èšèªãããã®æ§æã«ç²ŸéããŠãããŠãŒã¶ãŒãã¢ã¯ã»ã¹ã§ããŸãã.await!()
ãããããã§ãŒã³ã®ç¶æ³ãããã¬ãã£ãã¯ã¹æ§æãæ±ãã«ãããã®ä»ã®ç¶æ³ã§äœ¿çšã§ããŸãã.or_else!(continue)
ïŒã§ã䜿çšã§ããŸãïŒãã以å€ã®å Žåã¯ãåã®åŒãæ±ãã«ããèªã¿ã«ããæ¹æ³ã§ã©ããããå¿
èŠããããŸãïŒãawait
ããŒã¯ãŒãã¯ããã¹ããã£ãã¯ã¹ãã¯ãã®å®è£
ãåŸ
ããã«ãæ¯èŒçè¿
éã«å®å®åã§ããŸãïŒãšã³ã·ã¹ãã ã®éçºãå¯èœã«ãªããŸãïŒã ããããäžé·æçã«ã¯ãåŸçœ®æ§æãåŸ
æ©ããå¯èœæ§ãæ®ããŠãããŸãã@ nicoburns ã @ H2CO3 ã
await!()
ã.or_else!(continue)
ãããªå¶åŸ¡ãããŒæŒç®åããã¯ããšããŠå®è£
ããã¹ãã§ã¯ãããŸããããŠãŒã¶ãŒã®èŠ³ç¹ããã¯ãããããæå³ã®ããçç±ããªãããã§ãã ãšã«ãããäž¡æ¹ã®åœ¢åŒã§ããŠãŒã¶ãŒã¯ãŸã£ããåãæ©èœãæã¡ãäž¡æ¹ãåŠç¿ããå¿
èŠããããŸããããããã®æ©èœããã¯ããšããŠå®è£
ãããå Žåãããã«ãŠãŒã¶ãŒã¯ããªãæ£ç¢ºã«ãã®ããã«å®è£
ãããã®
await
åã«è¿œå ã®.
ãè¿œå ããå ŽåãšãŸã£ããåãçãã§ããå¿
èŠãããŸããã ãã¯ãã¯ããã¡ãŒã¹ãã¯ã©ã¹ã®å¶åŸ¡ãããŒãæš¡å£ããããšã¯ã§ããŸããããã¯ãã¯ã圢åŒãç°ãªãããŠãŒã¹ã±ãŒã¹ãç°ãªãã匷調衚瀺ãç°ãªããåäœãç°ãªããèªèããŸã£ããç°ãªããŸãã
.await!()
ãš.or_else!(continue)
äž¡æ¹ã®æ©èœã«ã¯ãçŸããæ§æãåããé©åã§äººéå·¥åŠçãªãœãªã¥ãŒã·ã§ã³ãååšããŸãã await
ããŒã¯ãŒããšnone
åäœæŒç®åã§ãã äžè¬çã§ããã£ãã«äœ¿çšããããæ¥å°ŸèŸãã¯ãã®ããã«èŠèŠãããã®ã§ã¯ãªããããããå®è£
ããããšããå§ãããŸãã
ãã¯ãã䜿çšããçç±ã¯ãããŸããã format!()
ãããªè€éãªãã®ã¯ãªãã include_bytes!()
ããã«ãã£ãã«äœ¿çšãããªããã®ããããŸããããŸããã«ã¹ã¿ã DSLããããŸããããŠãŒã¶ãŒã³ãŒãã®éè€ãåé€ãããããšããããŸããã varargã®ãããªæ§æã¯å¿
èŠãããŸãããèŠãç®ãç°ãªããã®ã¯å¿
èŠãããŸããããŸããå¯èœã§ãããšããçç±ã ãã§ãã®æ¹æ³ã䜿çšããããšã¯ã§ããŸããã
ãŠãŒã¶ãŒã®èŠ³ç¹ããã¯ãããè¡ãæå³ã®ããçç±ããªããããå¶åŸ¡ãããŒæŒç®åããã¯ããšããŠå®è£ ããã¹ãã§ã¯ãããŸããã
try!()
ã¯ãã¯ããšããŠå®è£
ãããŸããã ããã«ã¯å®å
šã«è¯ãçç±ããããŸããã
await
ããã¯ãã«ããçç±ã«ã€ããŠã¯ããã§ã«èª¬æããŸãããæ¢åã®æ©èœã§ãç®æšãéæã§ããå Žåã¯ãæ°ããèšèªèŠçŽ ã¯å¿
èŠãããŸããã
format!()
ãããªè€éãªãã®ã¯ãããŸãã
ç§ã¯éãããã«é Œã¿ãŸãïŒ format!()
ã¯è€éãã«ã€ããŠã§ã¯ãªããã³ã³ãã€ã«æã®ãã§ãã¯ã«ã€ããŠã§ãã ã³ã³ãã€ã«æã®ãã§ãã¯çšã§ãªãå Žåã¯ãé¢æ°ã§ããå¯èœæ§ããããŸãã
ã¡ãªã¿ã«ãç§ã¯ãããæ¥å°ŸèŸãã¯ãã§ããã¹ãã ãšã¯ææ¡ããŸããã§ããã ïŒç§ã¯ãããã¹ãã§ã¯ãªããšæããŸããïŒ
ã©ã¡ãã®æ©èœã«ããçŸããæ§æãåããé©åã§äººéå·¥åŠçãªãœãªã¥ãŒã·ã§ã³ãååšããŸã
ãã¹ãŠã®é¢æ°åŒã³åºãããããŒå¶åŸ¡åŒããŸãã¯ãã€ããŒãªäŸ¿å©ãªæ©èœã«ç¬èªã®éåžžã«ç¹å¥ãªæ§æãäžããã¹ãã§ã¯ãããŸããã ããã¯ãçç±ããªãæ§æã§ãã£ã±ãã®è¥å€§åããèšèªãããããã ãã§ãããããã¯ãçŸãããã®æ£å察ã§ãã
ïŒç§ã¯ã§ããããšãèšããŸãã;ç§ã¯ãã以äžè³ªåã®ãã®åŽé¢ã«çããã€ããã¯ãããŸãããïŒ
@nicoburns
次ã®çµã¿åããã§äž¡æ¹ã®äžçãæ倧éã«æŽ»çšã§ããå¯èœæ§ãããããšã«æ°ã¥ããŸããã
- ãã¬ãã£ãã¯ã¹
await
ããŒã¯ãŒã- äžè¬çãªæ¥å°ŸèŸãã¯ãæ©èœ
ããã«ã¯ãçŸåšã®å®éã®ããŒã¯ãŒãã§ã¯ãªãã await
ãã³ã³ããã¹ãããŒã¯ãŒãã«ããå¿
èŠããããŸãã ç§ãã¡ã¯ãããã¹ãã§ã¯ãªããšæããŸãã
ãããåããããšãã³ã³ãã€ã©ã®éæ³ãªãã§æ¥å°ŸèŸ
.await!()
ãã¯ããå®è£ ã§ããŸãã
ããã¯ã foo await
ãfoo.await
ïŒç¹ã«åŸè
ïŒãããå®è£
çã«è€éãªãœãªã¥ãŒã·ã§ã³ã§ãã ãããšåããããããŸã ãéæ³ãããããŸãã äŒèšæäœãè¡ã£ããšããã§ãã
ãã®ã¢ãããŒãã®å©ç¹ïŒ
- æ¥é èŸ
await
ããŒã¯ãŒãã䜿çšå¯èœã§ãããä»ã®èšèªãããã®æ§æã«ç²ŸéããŠãããŠãŒã¶ãŒãã¢ã¯ã»ã¹ã§ããŸãã
åŸã§.await!()
ãè¿œå ããå Žåã¯ããŠãŒã¶ãŒã«åŠç¿å
容ãæäŸããã ãã§ïŒ await foo
ãšfoo.await!()
äž¡æ¹ïŒããŠãŒã¶ãŒã¯ãã©ã¡ãã䜿çšããã°ãããããšå°ããŸãããã€.."ã ããã¯ãåäžã®ãœãªã¥ãŒã·ã§ã³ã®ããã«ã foo await
ãŸãã¯foo.await
ãããè€éãã®äºç®ã䜿ãæãããŠããããã§ãã
- åŸçœ®ãã¯ãã¯ãåæ§ã®çç±ã§å¶ç¶ã«ãåŸçœ®ãã¯ãæ§æãå¿ èŠãªä»ã®ç¶æ³ïŒ
.or_else!(continue)
ïŒã§ã䜿çšã§ããŸãïŒãã以å€ã®å Žåã¯ãåã®åŒãæ±ãã«ããèªã¿ã«ããæ¹æ³ã§ã©ããããå¿ èŠããããŸãïŒã
æ¥å°ŸèŸãã¯ãã«ã¯äŸ¡å€ããããèšèªã«è¿œå ããå¿
èŠããããšæããŸãã ãã ããããã¯await
ingã«äœ¿çšããå¿
èŠããããšããæå³ã§ã¯ãããŸããã ãã£ãããããã«ã .or_else!(continue)
ããæ¥å°ŸèŸãã¯ãã圹ç«ã€å Žæã¯ä»ã«ããããããããŸãã
- ãã¬ãã£ãã¯ã¹
await
ããŒã¯ãŒãã¯ããã¹ããã£ãã¯ã¹ãã¯ãã®å®è£ ãåŸ ããã«ãæ¯èŒçè¿ éã«å®å®åã§ããŸãïŒãšã³ã·ã¹ãã ã®éçºãå¯èœã«ãªããŸãïŒã ããããäžé·æçã«ã¯ãåŸçœ®æ§æãåŸ æ©ããå¯èœæ§ãæ®ããŠãããŸãã
ãéãããå¯èœæ§ãæ®ããããšã«ã¯äŸ¡å€ããããŸããã æ§æãIDEãšã¯ã¹ããªãšã³ã¹ãªã©ã®æ¥å°ŸèŸã®äŸ¡å€ã¯ãä»æ¥ç¥ãããŠããŸãã ãä»æ¥ã¯await foo
å®å®ãããææ¥ã¯foo.await!()
åæã«éããããšã
@ H2CO3
try!()
ã¯ãã¯ããšããŠå®è£ ãããŸããã ããã«ã¯å®å šã«è¯ãçç±ããããŸããã
try!(..)
ã¯éæšå¥šã«ãªããŸãããããã¯ãç¹ã«æ¥å°ŸèŸããªãããããã®èšèªã«ã¯é©ããªããšå€æããããšãæå³ããŸãã ãããè°è«ãšããŠäœ¿ãããšã¯-ç§ãã¡ãããŠã¯ãããªãããšä»¥å€ã«-å¥åŠã«æããŸãã ããã«ã try!(..)
ã¯ãã³ã³ãã€ã©ããã®ãµããŒããªãã§
ã¡ãªã¿ã«ãç§ã¯ãããæ¥å°ŸèŸãã¯ãã§ããã¹ãã ãšã¯ææ¡ããŸããã§ããã ïŒç§ã¯ãããã¹ãã§ã¯ãªããšæããŸããïŒ
await
ã¯ããã¹ãŠã®ã·ã³ã°ã«..ãã§ã¯ãããŸãããç¹ã«ããã€ããŒãªäŸ¿å©ãªæ©èœã§ã¯ãããŸããã ããããè¿œå ãããŠããã®ã¯äž»èŠãªèšèªæ©èœã§ãã
@phaylon
ããã«ãææ³ã®è€éåãšãããããŒã«ã«ããããåé¡ã«ã€ããŠã®æè¿ã®è°è«ãèžãŸãããšãIDE /ãšãã£ã¿ãŒãç©äºãæ£ããè¡ãããšã«äŸåããã®ã¯è¯ãèãã§ã¯ãªããããããŸããã
æ§æfoo.await
ã¯ãRustãé©åã«ãµããŒãããŠããããã«èŠãããšãã£ã¿ãŒã¯ããã§ã«.ident
圢åŒãç解ããŠãããããããŒã«ã®åé¡ãæžããããšãç®çãšããŠããŸãã ç·šéè
ãããå¿
èŠãããã®ã¯ãããŒã¯ãŒãã®ãªã¹ãã«await
ãè¿œå ããããšã ãã§ãã ããã«ãåªããIDEã«ã¯ãã§ã«.
åºã¥ãã³ãŒãè£å®ããããŸãããããã£ãŠãRLSïŒãŸãã¯åçã®ãã®...ïŒãæ¡åŒµããŠããŠãŒã¶ãŒã.
å
¥åãããšãã®æåã®ææ¡ãšããŠawait
ãæäŸããæ¹ãç°¡åãªããã§ãã .
my_future
åŸã®.
my_future
ã
ææ³ã®è€éåã«é¢ããŠã¯ãæ§æã§.await
ããµããŒãããããšã¯æ¬è³ªçã«.$ident
ã解æãã ident == keywords::Await.name()
ãšã©ãŒãçºçããªãããšãèãããšã .await
ãå®éã«ææ³ãè€éåããå¯èœæ§ã¯æãäœããªããŸãã ident == keywords::Await.name()
ã
æ§æfoo.awaitã¯ãRustãé©åã«ãµããŒãããŠããããã«èŠãããšãã£ã¿ãŒã¯ããã§ã«.ident圢åŒãç解ããŠãããããããŒã«ã®åé¡ãæžããããšãç®çãšããŠããŸãã ç·šéè ãããå¿ èŠãããã®ã¯ãããŒã¯ãŒãã®ãªã¹ãã«åŸ æ©ãè¿œå ããããšã ãã§ãã ããã«ãåªããIDEã«ã¯ãã«åºã¥ãã³ãŒãè£å®ããã§ã«ãããŸãã -ãããã£ãŠãRLSïŒãŸãã¯åçã®ãã®...ïŒãæ¡åŒµããŠããŠãŒã¶ãŒãå ¥åãããšãã®æåã®ææ¡ãšããŠåŸ æ©ãæäŸããæ¹ãç°¡åãªããã§ãã my_futureã®åŸã
ç§ã¯ãããææ³ã®è°è«ãšå¯Ÿç«ããŠããããšã«æ°ã¥ããŸããã ãããŠãåé¡ã¯ä»ã ãã§ã¯ãªãã5ã10ã20幎åŸã«æ°åã®çãçµãŠã§ãã ãã ãããæ°ã¥ãã®ããšãšæããŸãããããŒã¯ãŒãã匷調衚瀺ãããŠããŠããä»ã®ããŒã¯ãŒããå«ãŸããŠãããšãåŸ æ©ãã€ã³ããèŠéããããå¯èœæ§ãããããšã«ã泚æããŠãã ããã
ææ³ãè€éã«ããããšã«é¢ããŠã¯ãæ§æã§.awaitããµããŒãããããšã¯æ¬è³ªçã«ã$ identã解æããident == keys :: Await.nameïŒïŒã§ãšã©ãŒãçºçããªãããšãèãããšã.awaitãå®éã«ææ³ãè€éã«ããå¯èœæ§ã¯æãäœããªããŸãã
åèªã¯ãã§ã«ææ³ã§å®å
šã«ãµããŒããããŠããã®ã§ã await!(future)
ã«å±ãããšæããŸãã
@Centril try!
ã¯ã ?
æŒç®åãããå³å¯ã«å®è¡ã§ãããããæçµçã«åé·ã«ãªããŸããã ããã¯ãèšèªã«ãµãããããªãããšããããšã§ã¯ãããŸããã ããããããªãã¯ãããæ°ã«å
¥ããªããããããŸããããç§ã¯ãããåãå
¥ããŸãã ããããç§ã«ãšã£ãŠãããã¯å®éã«ã¯Rustãçºæããæé«ã®ãã®ã®ã²ãšã€ã§ãããã»ãŒã«ã¹ãã€ã³ãã®1ã€ã§ããã ãããŠãã³ã³ãã€ã©ã®ãµããŒããªãã§å®è£
ãããŠããããšã¯ç¥ã£ãŠããŸãããå¶åŸ¡ãããŒãå®è¡ãããã©ãããè°è«ãããšãã«ããããã©ã®ããã«é¢é£ããã®ãããããŸããã é¢ä¿ãªããããã§ãã
awaitã¯ããã¹ãŠã®ã·ã³ã°ã«..ãã§ã¯ãããŸããã
ããããããã§èšåãããŠããä»ã®ãã®ïŒããšãã°ã or_else
ïŒã¯ããã§ãããããŠç§ã®ãã€ã³ãã¯ãšã«ããäž»èŠãªæ©èœã«ãŸã åœãŠã¯ãŸããŸãã æ§æãè¿œå ããããã ãã«æ§æãè¿œå ããããšã¯å©ç¹ã§ã¯ãªããããããäžè¬çãªã±ãŒã¹ã§ãã§ã«æ©èœãããã®ãããå Žåã¯åžžã«ãæ°ããè¡šèšæ³ãçºæãããããåªå
ããå¿
èŠããããŸãã ïŒãã¯ãã«å¯Ÿããä»ã®è°è«ã¯ãããããã¯æ¥å°ŸèŸã§ã¯ãªãããšããããšã§ããããèªäœã®æ¥å°ŸèŸæŒç®åã§ããã®ãåŸ
ã€ããšã®å©ç¹ã¯ãã³ã¹ããæ£åœåããã»ã©é«ããªããšæããŸããå
¥ãåé¢æ°åŒã³åºããçã延ã³ãŸããããã¹ãããããã¯ããããã€ãèšè¿°ããåŸããåæ§ã«åé¡ãããŸãããïŒ
2019幎1æ23æ¥æ°Žææ¥09:59:36 PM +0000ã«ãMazdakFarrokhzadã¯æ¬¡ã®ããã«æžããŠããŸãã
- åŸçœ®ãã¯ãã¯ãåæ§ã®çç±ã§å¶ç¶ã«ãåŸçœ®ãã¯ãæ§æãå¿ èŠãªä»ã®ç¶æ³ïŒ
.or_else!(continue)
ïŒã§ã䜿çšã§ããŸãïŒãã以å€ã®å Žåã¯ãåã®åŒãæ±ãã«ããèªã¿ã«ããæ¹æ³ã§ã©ããããå¿ èŠããããŸãïŒãæ¥å°ŸèŸãã¯ãã«ã¯äŸ¡å€ããããèšèªã«è¿œå ããå¿ èŠããããšæããŸãã ãã ããããã¯
await
ingã«äœ¿çšããå¿ èŠããããšããæå³ã§ã¯ãããŸããã ãã£ãããããã«ã.or_else!(continue)
ããæ¥å°ŸèŸãã¯ãã圹ç«ã€å Žæã¯ä»ã«ããããããããŸãã
.await!()
ã䜿çšããäž»ãªçç±ã¯ããã¯ãã®ããã«èŠããããšã§
å¶åŸ¡ãããŒã«åœ±é¿ãäžããå¯èœæ§ãããããšã¯æããã§ãã
.await
ã¯ãã£ãŒã«ãã¢ã¯ã»ã¹ã®ããã«èŠãã .await()
ã¯é¢æ°ã®ããã«èŠããŸã
åŒã³åºããããã³ãã£ãŒã«ãã¢ã¯ã»ã¹ãé¢æ°åŒã³åºããå¶åŸ¡ã«åœ±é¿ãäžããããšã¯ã§ããŸãã
ãããŒã .await!()
ã¯ãã¯ãã®ããã«èŠãããã¯ãã¯å¶åŸ¡ã«åœ±é¿ãäžãã
ãããŒã
@joshtriplettæšæºçãªæå³ã§ã®å¶åŸ¡ãããŒã«ã¯åœ±é¿ããŸããã ããã¯ããããŒãã§ãã«ãŒãå®çŸ©ãããããã«å ç©ã§æ©èœããããšãæ£åœåããããã®åºæ¬çãªäºå®ã§ãïŒãããŠãã³ã¯ãã®æ¹æ³ã®çç±ã§ãïŒã ããŒã«ã«é¢æ°ã®å®è¡ã®èŠ³ç¹ããã¯ãawaitã®å®è¡ã¯ä»ã®ã»ãšãã©ã®é¢æ°åŒã³åºããšåãã§ãã äžæãããšããããç¶è¡ããã¹ã¿ãã¯ã«æ»ãå€ããããŸãã
ç§ã¯ãããææ³ã®è°è«ãšå¯Ÿç«ããŠããããšã«æ°ã¥ããŸããã ãããŠãåé¡ã¯ä»ã ãã§ã¯ãªãã5ã10ã20幎åŸã«æ°åã®çãçµãŠã§ãã
ãããäœãæå³ããã®ãããããŸããã
åèªã¯ãã§ã«ææ³ã§å®å šã«ãµããŒããããŠããã®ã§ã
await!(future)
ã«å±ãããšæããŸãã
ç§ã¯ç解ããŠããŸãããçŸæç¹ã§ã¯ããã®æ§æã«ã¯ä»ã«ãå€ãã®æ¬ ç¹ããããããäºå®äžé€å€ãããŠãããšæããŸãã
@Centril
try!
ã¯ã?
æŒç®åãããå³å¯ã«å®è¡ã§ãããããæçµçã«åé·ã«ãªããŸããã ããã¯ãèšèªã«ãµãããããªãããšããããšã§ã¯ãããŸããã ããããããªãã¯ããã_奜ã_ã§ã¯ãªããããããŸããããç§ã¯ãããåãå ¥ããŸãã
Rust 2018ã§try!(expr)
ãæžã蟌ãããšã¯æ瀺çã«éæšå¥šã§ãããããã«é£ãããšã©ãŒã§ããç§ãã¡ã¯ãŸãšããŠããããããšã決å®ãããããäžé©åãšèŠãªãããŸããã
.await!()
ã䜿çšããäž»ãªçç±ã¯ããã¯ãã®ããã«èŠããããšã§ãå¶åŸ¡ãããŒã«åœ±é¿ãäžããå¯èœæ§ãããããšãæããã«ãªãããã§ãã
.await
ã¯ãã£ãŒã«ãã¢ã¯ã»ã¹ã®ããã«èŠãã.await()
ã¯é¢æ°åŒã³åºãã®ããã«èŠãããã£ãŒã«ãã¢ã¯ã»ã¹ãé¢æ°åŒã³åºããå¶åŸ¡ãããŒã«åœ±é¿ãäžããããšã¯ã§ããŸããã
ç§ã¯åºå¥ã¯ããŠãŒã¶ãŒãç¹ã«ãšããŠãæ¯èŒç容æã«åŠã¶ããšãã§ããŸãäœãã§ãããšä¿¡ããŠ.await
éåžžãç¶ã?
ïŒé¢æ°ããŒã«ã«å¶åŸ¡ãããŒã§ãïŒã é¢æ°åŒã³åºãã«é¢ããŠã¯ãåè¿°ã®ããã«ãã€ãã¬ãŒã¿ã¡ãœããã¯å¶åŸ¡ãããŒã®äžåœ¢æ
ã§ãããšèšã£ãŠãéèšã§ã¯ãããŸããã ããã«ããã¯ããå¶åŸ¡ãããŒã«åœ±é¿ãäžããããããããšãã£ãŠãããã¯éããŸããã å€ãã®ãã¯ãã¯ããã§ã¯ãããŸããïŒäŸïŒ dbg!
ã format!
ã...ïŒã .await!()
ãŸãã¯.await
ãå¶åŸ¡ãããŒã«åœ±é¿ãäžãããšããçè§£ïŒ @HeroicKatoraã®ã¡ã¢ã«?
ãããã¯ããã«åŒ±ãæå³ã§ïŒã¯ã await
ãšããåèªããæµããŸãã
@Centril
ããã«ã¯ãçŸåšã®å®éã®ããŒã¯ãŒãã§ã¯ãªããã³ã³ããã¹ãããŒã¯ãŒããåŸ æ©ãããå¿ èŠããããŸãã ç§ãã¡ã¯ãããã¹ãã§ã¯ãªããšæããŸãã
ã€ãŒã¯ã ããã¯å°ãçãã§ãã ããããããã¯ãã¯.wait!()
ã.awaited!()
ãããªå¥ã®ååãæã€å¯èœæ§ããããŸãïŒåŸè
ã¯ãåã®åŒã«é©çšãããããšãæ確ã«ãªããããéåžžã«äŸ¿å©ã§ãïŒã
ããããçµã¿åããããšãã³ã³ãã€ã©ã®éæ³ãªãã§æ¥å°ŸèŸ.awaitïŒïŒïŒãã¯ããå®è£ ã§ããŸããã
ããã¯ãfoo awaitãŸãã¯foo.awaitïŒç¹ã«åŸè ïŒãããå®è£ çã«è€éãªãœãªã¥ãŒã·ã§ã³ã§ãã ãããšåããããããŸã ãéæ³ãããããŸãã äŒèšæäœãè¡ã£ããšããã§ãã
ããã«ãtryïŒïŒ..ïŒã¯ãã³ã³ãã€ã©ãŒã®ãµããŒããªãã§å®çŸ©ãããŠããŸãã
ãŸãããã¬ãã£ãã¯ã¹await
ããŒã¯ãŒããšãã¹ããã£ãã¯ã¹ãã¯ããããå Žåã .await!()
ïŒããããå¥ã®ååïŒãã³ã³ãã€ã©ãµããŒããªãã§å®è£
ã§ããŸãããïŒ ãã¡ããã await
ããŒã¯ãŒãèªäœã«ã¯ãããªãã®éã®ã³ã³ãã€ã©ããžãã¯ãå¿
èŠã§ãããããã¯åã«ãã¯ãã®çµæã«é©çšããã try!()
ãšã®é¢ä¿ãšåãã§ãã return
ããŒã¯ãŒãã
åŸã§.awaitïŒïŒïŒãè¿œå ããå Žåã¯ããŠãŒã¶ãŒã«åŠç¿å 容ãæäŸããã ãã§ïŒawait fooãšfoo.awaitïŒïŒïŒã®äž¡æ¹ïŒããŠãŒã¶ãŒã¯ããã€ã©ã¡ãã䜿çšããã°ãããããšå°ããŸãã ããã¯ãåäžã®ãœãªã¥ãŒã·ã§ã³ã®ããã«fooawaitãŸãã¯foo.awaitãããè€éãã®äºç®ã䜿ãæãããŠããããã§ãã
ããããŠãŒã¶ãŒã«è¿œå
ãRustã®æªæ¥ãåŸ
ã€ã«ã¯ã await foo.bar();
ãšfoo.bar().await!()
2ã€ã®æ¹æ³ããããŸããã©ã¡ãã䜿çšãããã¯æäœã®å¥œã¿ã§ãããå®è¡ãããŒã«éãã¯ãããŸãããã
ãéãããå¯èœæ§ãæ®ããããšã«ã¯äŸ¡å€ããããŸããã æ§æãIDEãšã¯ã¹ããªãšã³ã¹ãªã©ã®æ¥å°ŸèŸã®äŸ¡å€ã¯ãä»æ¥ç¥ãããŠããŸãã
ããã¯æ¬åœã§ãã ç§ã®èãã§ã¯ãç§ãã¡ã®å®è£ ãå°æ¥ãããçµ±äžãããèšèªãæã€å¯èœæ§ãéããªãããã«ããããšãããéèŠã ãšæããŸãã
ãããäœãæå³ããã®ãããããŸããã
ããã»ã©éèŠã§ã¯ãããŸããã ããããäžè¬çã«ã¯ãæ§æãæ確ã§ã匷調衚瀺ãé©åã§ãªãå Žåã«ããç§ã¯ããã奜ã¿ãŸãã ãããã£ãŠã git diff
ããã®ä»ã®ãã®ãããªã³ã³ããã¹ãã§ã¯ç©äºãéç«ã£ãŠããŸãã
çè«çã«ã¯ããã§ãããããŠäºçŽ°ãªããã°ã©ã ã«ã€ããŠã¯ããã§ãããå®éã«ã¯ããã°ã©ããŒ
ãããã®ãµã¹ãã³ããã€ã³ããã©ãã«ããããç¥ãå¿
èŠããããŸãã
ç°¡åãªäŸãšããŠããµã¹ãã³ããã€ã³ããè¶ããŠRefCellãä¿æãã
ããã°ã©ã ã®åäœã¯ãRefCellããã£ãå Žåãšã¯ç°ãªããŸãã
ãµã¹ãã³ããã€ã³ãã®åã«ãªãªãŒã¹ãããŸãã 倧èŠæš¡ãªããã°ã©ã ã§ã¯
ãã®ãããªç¡æ°ã®åŸ®åŠãªç¹ãçŸåšã®æ©èœã
äžæåæ¢ã¯éèŠãªæ
å ±ã§ãã
14:21 HeroicKatoraã§æ°Žææ¥ã2019幎1æ23æ¥ã«ã¯[email protected]
æžããŸããïŒ
@joshtripletthttps ïŒ//github.com/joshtriplettã³ã³ãããŒã«ã«ã¯åœ±é¿ããŸãã
æšæºçãªæå³ã§ã®æµãã ããã¯ããããæ£åœåããããã®åºæ¬çãªäºå®ã§ã
åãå ¥ããã§ãã«ãŒã¯ãå®çŸ©ãããŠããããã«å ç©ã§æ©èœããã¯ãã§ãã ã®èŠ³ç¹ãã
ããŒã«ã«é¢æ°ã®å®è¡ãawaitã®å®è¡ã¯ãä»ã®é¢æ°åŒã³åºããšåãã§ããâ
ããªããèšåãããã®ã§ããªãã¯ãããåãåã£ãŠããŸãã
ãã®ã¡ãŒã«ã«çŽæ¥è¿ä¿¡ããGitHubã§è¡šç€ºããŠãã ãã
https://github.com/rust-lang/rust/issues/57640#issuecomment-456989262 ã
ãŸãã¯ã¹ã¬ããããã¥ãŒãããŸã
https://github.com/notifications/unsubscribe-auth/ABGmeqcr2g4olxQhH9Fb9r6g3XRaFUu2ks5vGOBkgaJpZM4aBlba
ã
2019幎1æ23æ¥æ°Žææ¥02:26:07 PM -0800ã«ãMazdakFarrokhzadã¯æ¬¡ã®ããã«æžããŠããŸãã
.await!()
ã䜿çšããäž»ãªçç±ã¯ããã¯ãã®ããã«èŠããããšã§ãå¶åŸ¡ãããŒã«åœ±é¿ãäžããå¯èœæ§ãããããšãæããã«ãªãããã§ãã
.await
ã¯ãã£ãŒã«ãã¢ã¯ã»ã¹ã®ããã«èŠãã.await()
ã¯é¢æ°åŒã³åºãã®ããã«èŠãããã£ãŒã«ãã¢ã¯ã»ã¹ãé¢æ°åŒã³åºããå¶åŸ¡ãããŒã«åœ±é¿ãäžããããšã¯ã§ããŸãããåºå¥ã¯ããŠãŒã¶ãŒãæ¯èŒçç°¡åã«åŠã¶ããšãã§ãããã®ã ãšæããŸã
ãªã圌ãã¯ããªããã°ãªããªãã®ã§ããïŒ
ãã®åºå¥ã¯ãç¹ã«.awaitã®åŸã«éåžžã¯ïŒãç¶ãããããŠãŒã¶ãŒãæ¯èŒçç°¡åã«åŠç¿ã§ãããã®ã ãšæããŸãã ïŒããã¯é¢æ°ããŒã«ã«å¶åŸ¡ãããŒã§ãïŒã
å€ãã®å Žåãããã§ãããåžžã«ã§ã¯ãããŸãããæ§æã¯ãããã§ãªãå Žåã§ã確å®ã«æ©èœããã¯ãã§ãã
é¢æ°åŒã³åºãã«é¢ããŠã¯ãåè¿°ã®ããã«ãã€ãã¬ãŒã¿ã¡ãœããã¯å¶åŸ¡ãããŒã®äžåœ¢æ ã§ãããšèšã£ãŠãéèšã§ã¯ãããŸããã
return
ãŸãã¯?
ïŒãŸãã¯break
ïŒãšåãæ¹æ³ã§ã¯ãããŸããã é¢æ°åŒã³åºãããããåŒã³åºããé¢æ°ãã2ã¬ãã«æ»ãããšãã§ãããïŒRustã«äŸå€ããªãçç±ã®1ã€ã¯ããããé©ãã¹ãããšã§ãããšããçç±ã ãã§ãïŒããŸãã¯åŒã³åºãã®ã«ãŒãããæãåºãããšãã§ããã°ãéåžžã«é©ãã§ããããé¢æ°ã
ããã«ããã¯ããå¶åŸ¡ãããŒã«åœ±é¿ãäžããå¯èœæ§ããããããšãã£ãŠãããã圱é¿ãäžãããšã¯éããŸããã å€ãã®ãã¯ãã¯ããã§ã¯ãããŸããïŒäŸãã°ãdbgïŒãformatïŒã...ïŒã .awaitïŒïŒïŒãŸãã¯.awaitãå¶åŸ¡ãããŒã«åœ±é¿ãäžãããšããçè§£ïŒ @HeroicKatoraã®ã¡ã¢ã«ãããšïŒãããã¯ããã«åŒ±ãæå³ã§ïŒã¯ãawaitãšããåèªèªäœããæµããŸãã
ç§ã¯ããããŸã£ãã奜ãã§ã¯ãããŸããã å¶åŸ¡ãããŒã«åœ±é¿ãäžããããšã¯ãéåžžã«éèŠãªå¯äœçšã§ãã éåžžãããè¡ãããšãã§ããªãã³ã³ã¹ãã©ã¯ããšã¯ç°ãªãæ§æ圢åŒãæã€å¿
èŠããããŸãã Rustã§ãããå®è¡ã§ããæ§é ã¯ãããŒã¯ãŒãïŒ return
ã break
ã continue
ïŒãæŒç®åïŒ ?
ïŒãããã³ãã¯ãïŒ1ã€ã«è©äŸ¡ããããšã«ããïŒã§ããä»ã®åœ¢åŒã®ïŒã äŸå€ãè¿œå ããŠæ°Žãæ¿ãããã®ã¯ãªãã§ããïŒ
@ejmahleréåžžã®é¢æ°åŒã³åºããšæ¯èŒããŠãRefCellã®ä¿æãã©ã®ããã«ç°ãªããããããŸããã ãŸããå éšé¢æ°ãåãRefCellãååŸãããå ŽåããããŸãã ããããæœåšçãªã³ãŒã«ã°ã©ãå šäœãããã«ææ¡ã§ããªããšãã倧ããªåé¡ãæ±ããŠãã人ã¯ããªãããã§ãã åæ§ã«ãã¹ã¿ãã¯ã®æ¯æžã«é¢ããåé¡ã¯ãæäŸãããã¹ã¿ãã¯ã¹ããŒã¹ã«æ³šéãä»ããå¿ èŠããããšããç¹å¥ãªæžå¿µã¯ãããŸããã ããã§ã®æ¯èŒã¯ã³ã«ãŒãã³ã«ãšã£ãŠæå©ã§ãïŒ ã€ã³ã©ã€ã³åãããŠããªãå Žåãéåžžã®é¢æ°åŒã³åºããããèŠãããããå¿ èŠããããŸããïŒ ã©ã€ãã©ãªã«é¢ãããã®ãŸããŸãå°é£ã«ãªãåé¡ãææ¡ããã«ã¯ãæ瀺çãªæ«å°ŸåŒã³åºããå¿ èŠã§ããïŒ
çãã¯ãç§èŠã§ãããRefCellã䜿çšããŠåŸ ã€ãšãã®æ倧ã®ãªã¹ã¯ã¯äžæ £ãã§ãã äžèšã®ä»ã®åé¡ãããŒããŠã§ã¢ããæœè±¡åã§ããå Žåãããã°ã©ããŒãšããŠã®ç§ãã¡ãã粟æ»ãããå Žåãé€ããŠãæ©çãŸããã€ã³ãå šäœã§RefCellãªã©ãä¿æããªãããšãåŠã¶ããšãã§ãããšä¿¡ããŠããŸãã
2019幎1æ23æ¥æ°Žææ¥ãååŸ10æ30å10ç§+0000ã«ããšãªãªããããŒã©ãŒã¯æ¬¡ã®ããã«æžããŠããŸãã
çè«çã«ã¯ããã§ãããããŠäºçŽ°ãªããã°ã©ã ã«ã€ããŠã¯ããã§ãããå®éã«ã¯ããã°ã©ããŒ
ãããã®ãµã¹ãã³ããã€ã³ããã©ãã«ããããç¥ãå¿ èŠããããŸãã
ïŒ+1ïŒ
@HeroicKatora
éèŠãªéãã¯ãæ€æ»ããå¿
èŠã®ããã³ãŒãã®éãæ°ã§ã
ããªãã説æããªããã°ãªããªãå¯èœæ§ã ããã°ã©ããŒã¯ãã§ã«æ
£ããŠããŸã
圌ããåŒã³åºããã®ãããã§ãã¯ããRefCellã䜿çšããŠããªãããšã確èªããŸã
ã¢ãŠãã ããããåŸ
ã£ãŠãããšãåäžã®åŒã³åºãã¹ã¿ãã¯ãæ€æ»ãã代ããã«ã
åŸ
æ©äžã«å®è¡ãããå
容ã®å¶åŸ¡-æåéãã
ããã°ã©ã ãå®è¡ãããå¯èœæ§ããããŸãã ç§ã®çŽæã«ãããšãå¹³åçãªããã°ã©ããŒã¯
ãã®å¯èœæ§ã®ççºã«å¯ŸåŠããããã®èšåãã¯ããã«å°ãªãããã
ããã»ã©é »ç¹ã«å¯ŸåŠããå¿
èŠã¯ãããŸããã
ã²ãŒã å
ã®éèŠãªæ
å ±ã§ãããµã¹ãã³ããã€ã³ãã®å¥ã®äŸã«ã€ããŠã¯
ããã°ã©ãã³ã°ã§ã¯ãéåžžãåéããããšãç®çãšããã³ã«ãŒãã³ãäœæããŸã
ãã¬ãŒã ããšã«1åãå±¥æŽæžããšã«ã²ãŒã ã®ç¶æ
ãå€æŽããŸãã èŠèœãšããã
ãããã®ã³ã«ãŒãã³ã®1ã€ã§ãã€ã³ããäžæåæ¢ãããšãã²ãŒã ãå£ãããŸãŸã«ãªãå¯èœæ§ããããŸã
è€æ°ã®ãã¬ãŒã ã®ç¶æ
ã
ãããã¯ãã¹ãŠããè³¢ããªããå°ãªãããããšèšãããšã§å¯ŸåŠã§ããŸãã
ãã¡ããééããã§ããããã®ã¢ãããŒãã¯æŽå²çã«ã¯æ©èœããŸããã
14:44ãžã§ã·ã¥ã»ããªãã¬ããã§æ°Žææ¥ã2019幎1æ23æ¥ã«ã¯[email protected]
æžããŸããïŒ
2019幎1æ23æ¥æ°Žææ¥ãååŸ10æ30å10ç§+0000ã«ããšãªãªããããŒã©ãŒã¯æ¬¡ã®ããã«æžããŠããŸãã
çè«çã«ã¯ããã§ãããããŠäºçŽ°ãªããã°ã©ã ã«ã€ããŠã¯ããã§ãããå®éã«ã¯ããã°ã©ããŒ
ãããã®ãµã¹ãã³ããã€ã³ããã©ãã«ããããç¥ãå¿ èŠããããŸããïŒ+1ïŒ
â
ããªããèšåãããã®ã§ããªãã¯ãããåãåã£ãŠããŸãã
ãã®ã¡ãŒã«ã«çŽæ¥è¿ä¿¡ããGitHubã§è¡šç€ºããŠãã ãã
https://github.com/rust-lang/rust/issues/57640#issuecomment-456995913 ã
ãŸãã¯ã¹ã¬ããããã¥ãŒãããŸã
https://github.com/notifications/unsubscribe-auth/ABGmep05nhZizdE5xil4FsnpONJCxqn-ks5vGOXhgaJpZM4aBlba
ã
éèŠãªæ å ±ã§ãããµã¹ãã³ããã€ã³ãã®å¥ã®äŸãšããŠãã²ãŒã ããã°ã©ãã³ã°ã§ã¯ãéåžžããã¬ãŒã ããšã«1ååéããããšãç®çãšããã³ã«ãŒãã³ãèšè¿°ããåéãããã³ã«ã²ãŒã ã®ç¶æ ãå€æŽããŸãã ãããã®ã³ã«ãŒãã³ã®1ã€ã§ãµã¹ãã³ããã€ã³ããèŠèœãšããšãã²ãŒã ãè€æ°ã®ãã¬ãŒã ã§å£ããç¶æ ã®ãŸãŸã«ãªãå¯èœæ§ããããŸãã
ããŒãSlotMapã«ãããããããšãã¡ã¢ãªããªãŒã¯ããŸãã èšèªèªäœã¯ãæ¬è³ªçã«ãããæ¯æŽããŸããã ç§ãèšãããã®ã¯ãåŸ æ©ãæŒ ç¶ãšååã«èŠããªããšããããªãã®äŸïŒãããããŒã¯ãŒãã§ããéãããã®çºçã¯äžæã§ããïŒã¯ãä»ã®æ©èœã§ã¯çºçããŠããªãåé¡ã«äžè¬åãããŠããªãããã§ãã èšèªãããã«æäŸããæ©èœã«ã€ããŠã¯ãåŸ ã€ã®ã§ã¯ãªããç¬èªã®æ©èœãè¡šçŸã§ããããã«ããæ¹æ³ã«ã€ããŠè©äŸ¡ããå¿ èŠããããšæããŸãã ããŒã«ãè©äŸ¡ããŠããé©çšããŸãã ã²ãŒã ã®ç¶æ ã®è§£æ±ºçãææ¡ããããã«ååã«å¯ŸåŠããæ¹æ³ïŒã²ãŒã ã®ç¶æ ãå®éã«å¿ èŠãªéããã§ãã¯ããããšãè¿ãã©ãããŒãäœæããŸããéåæã䜿çšãããšããã®åå ã®ããã«ç¬èªã®ç¶æ ãåçšã§ããŸãã ãã®åºååãããã³ãŒãã§ä»ã®äººãåŸ ã£ãŠããããšãçŠæ¢ããŸãã
RefCellã®ç¶æ ã®æ¥å¢ã¯ãä»ã®å Žæã§äœ¿çšãããŠããªãããšã確èªããªãã£ãããã§ã¯ãªãããã®äžå€æ¡ä»¶ã«äŸåããŠããããšãç¥ããããµã€ã¬ã³ãã«è¿œå ããä»ã®ã³ãŒããã€ã³ãããçºçããŸãã ãããã¯åãæ¹æ³ã§å¯ŸåŠãããããã¥ã¡ã³ããã³ã¡ã³ããæ£ããã©ããã³ã°ã§ãã
RefCell
ä¿æããããšã¯ãioããããã¯ãããšãã«Mutex
ããããšãšå€§å·®ãããŸããã ãããã¯ããããããã°ãé£ããããããã°ãé£ãããããããã¯ãçºçããå¯èœæ§ããããŸãã ããã§ããæ瀺çãªblock
ããŒã¯ãŒãã§ããããã³ã°æäœã«æ³šéãä»ããããšã¯ãããŸããã :)ã
éåæé¢æ°éã§RefCell
å
±æãããšãäžè¬çãªãŠãŒã¶ããªãã£ïŒ !Send
ïŒã倧å¹
ã«å¶éããããããäžè¬çã§ã¯ãªããšæããŸãã ãŸãã RefCell
ã¯äžè¬çã«é¿ãã䜿çšããå Žåã¯ã§ããã ãçæéåããå¿
èŠããããŸãã
ã§ãããã誀ã£ãŠéäŒç¹ãè¶
ããŠRefCell
æã«å
¥ããããšã¯å€§ããããšã§ã¯ãªããšæããŸãã
ãããã®ã³ã«ãŒãã³ã®1ã€ã§ãµã¹ãã³ããã€ã³ããèŠèœãšããšãã²ãŒã ãè€æ°ã®ãã¬ãŒã ã§å£ããç¶æ ã®ãŸãŸã«ãªãå¯èœæ§ããããŸãã
ã³ã«ãŒãã³ãšéåæé¢æ°ã¯å¥ã®ãã®ã§ãã yield
æé»çã«ããããšããŠããã®ã§ã¯ãããŸããã
ããã§ãããŒã¯ãŒãæ§æã§ã¯ãªããã¯ãæ§æã奜ã人ãžïŒãã¯ãã§ããå¿
èŠãããããšãæå³ããawait
ã«ã€ããŠèª¬æããŠãã ããããŸããããšãã°ã while
ãšã¯ã©ã®ããã«éãã®ãã説æããŠãã ããããã while!
ãã¯ãmacro_rules!
ã ãã䜿çšããŠããç¹å¥ãªå€§æåå°æåã¯ãŸã£ãã䜿çšããŸããïŒã
ç·šéïŒããã¯ã¬ããªãã¯ã§ã¯ãããŸããã ç§ã¯æ¬åœã«ãã®ãããªããšã«èå³ããããŸããç§ãæåã«åŸ ã€ããšãæãã§ããã®ãšåãããã«ïŒCïŒã®ããã«ïŒãRFCã¯ããã§ã¯ãªããšç§ã«ç¢ºä¿¡ãããŸããã
ããã§ãããŒã¯ãŒãæ§æã§ã¯ãªããã¯ãæ§æã奜ã人ãžïŒããããã¯ãã§ããã¹ãã§ããããšãæå³ããawaitãšã¯äœãããããŠããããããšãã°ããã°ããã®éã ã£ããããããªãwhileãšã©ã®ããã«éãã®ãã説æããŠãã ããïŒ ãã¯ãïŒmacro_rulesã ãã䜿çšããŠãïŒ;ç¹å¥ãªã±ãŒã¹ã¯ãŸã£ãããããŸããïŒã
ç§ã¯ãã®æšè«ã«ã»ãŒåæããŸãããã¬ãã£ãã¯ã¹æ§æã«ããŒã¯ãŒãã䜿çšããããšæããŸãã
ãã ããäžèšã§æŠèª¬ããããã«ïŒhttps://github.com/rust-lang/rust/issues/57640#issuecomment-456990831ïŒãæ¥å°ŸèŸæ§æçšã®æ¥å°ŸèŸãã¯ãïŒãããã.awaited!()
ã䜿çšããããšã«è³æã§ã.awaited!()
ã¯ãååããã¬ãã£ãã¯ã¹ããŒã¯ãŒããšè¡çªããªãããã«ããŸãïŒã ç§ã®èãã¯ãäžæ¹åã«ãã䜿çšã§ããªãããŒã¯ãŒãã䜿çšããããšã§ç©äºãç°¡åã«ãªãããã¯ãã®ããªãšãŒã·ã§ã³ãããã«ç¯çŽããããšããããšããããŸãããäž»ã«ç§ãèŠãéãã誰ãæ¥å°ŸèŸãæãä»ãããšãã§ããŸããã§ããç§ãåãå
¥ãããããšæãããŒã¯ãŒãæ§æïŒ
foo.bar().await
ãšfoo.bar().await()
ã¯æè¡çã«ã¯ããŒã¯ãŒãã§ããããã£ãŒã«ãã¢ã¯ã»ã¹ãŸãã¯ã¡ãœããåŒã³åºãã®ããã«èŠãããã®ãããªå¶åŸ¡ãããŒå€æŽæ§é ããã®ããã«é衚瀺ã«ããå¿
èŠã¯ãªããšæããŸããfoo.bar() await
ã¯ãç¹ã«foo.bar() await.qux()
ãããªãããªãé£éã§ã¯ãæ··ä¹±ãæããŸãã ç§ã¯ãã®ãããªæ¥å°ŸèŸãšããŠäœ¿çšãããããŒã¯ãŒããèŠãããšããããŸããïŒããããååšããããšã¯ç¢ºãã§ãããå®éã«ã¯ããã®ããã«æ©èœããããŒã¯ãŒãã«ã€ããŠç¥ã£ãŠããèšèªã§ã®åäžã®äŸãèããããšã¯ã§ããŸããïŒã ãããŠãç§ã¯ã®awaitãé©çšããããã®ããã«ãããã¯éåžžã«çŽããããèªã¿èŸŒã¿ãšæããŸãqux()
ãŸããfoo.bar()
ãfoo.bar()@await
ãŸãã¯ãã®ä»ã®å¥èªç¹ãæ©èœããå¯èœæ§ããããŸãã ããããããã¯ç¹ã«ããããšã§ã¯ãªããããªãã¢ãããã¯ãªæããããŸãã ç§ã¯å®éããã®æ§æã«é倧ãªåé¡ã¯ãªããšæããŸãïŒäžèšã®ãªãã·ã§ã³ãšã¯ç°ãªããŸãïŒã ã·ãžã«ãè¿œå ãå§ãããšããã©ã³ã¹ãã«ã¹ã¿ã æ§æãæŸæ£ããããããã¯ãã«ãªãæ¹åã«åŸãããã«æããŸããæ°ããèããèæ ®äºé ã埮調æŽããŸãããã以åã®ã¢ã€ãã¢ãããäžåºŠç¹°ãè¿ããŸãããã®åŸãæ²é»ãå®ãããšããŸãã
ããŒã¯ãŒããšããŠã®await
ã¯ããšã«ããasync
é¢æ°å
ã§ã®ã¿æå¹ã§ãããããä»ã®å Žæã§èå¥åawait
ãèš±å¯ããå¿
èŠããããŸãã å€æ°ã®ååãawait
å€åŽã®ç¯å²ã«ã¯ãå
ããã¢ã¯ã»ã¹ããããšãã§ããªãasync
ãããçã®èå¥åãšããŠäœ¿çšãããŠããªãéããããã¯ã ãŸãã¯ãããšãã°ã await!
ãã¯ãã
ããã«ããã®ãããªããŒã¯ãŒããé©å¿ãããããšã§ãç§ã®èŠç¹ãå¯èœã«ãªããŸãã次ã®ããã«ããžã§ãã¬ãŒã¿ãŒãšéåæé¢æ°ã®æ··åãšãããã³ã°ãèš±å¯ããå¿ èŠããããŸãã
// imaginary generator syntax stolen from JavaScript
fn* my_generator() -> T {
yield some_value;
// explicit return statements are only included to
// make it clear the generator/async functions are finished.
return another_value;
}
// `await` keyword would not be allowed here, but the `yield` keyword is
#[async]
fn* my_async_generator() -> Result<T, E> {
let item = some_op().await!()?; // uses the `.await!()` macro
// which would really just use `yield` internally, but with the pinning API
// same as the current nightly macro.
yield future::ok(item.clone());
return Ok(item);
}
// `yield` would not be allowed here, but the `await` keyword is.
async fn regular_async() -> Result<T, E> {
let some_op = async || { /*...*/ };
let item = await? some_op();
return Ok(item);
}
ããã¯ããã¡ã³ããŒãªããšããããéåžžã«äžçŽã®ãŠãŒã¶ãŒã«ã¯ååã«ééçã§ãããšæããŸãããæ°èŠããã³äžçšåºŠã®ãŠãŒã¶ãŒã¯å¿
èŠãªãã®ã ãã䜿çšã§ããŸãã 2ãš3ã¯ã yield
ã¹ããŒãã¡ã³ããªãã§äœ¿çšããå Žåãå®è³ªçã«åãã§ãã
ãŸãããã¬ãã£ãã¯ã¹await?
ã¯ãéåææäœã®çµæã«?
ãè¿œå ããããã®åªããçç¥åœ¢ã ãšæããŸãããããã¯å¿
ãããå¿
èŠã§ã¯ãããŸããã
postfixãã¯ããå
¬åŒã®ãã®ã«ãªã£ãå ŽåïŒç§ã¯ãããªãããšãé¡ã£ãŠããŸãïŒã await!(...)
ãš.await!()
äž¡æ¹ãäžç·ã«ååšããå¯èœæ§ããããç¹å®ã®ãŠãŒã¹ã±ãŒã¹ãšã¹ã¿ã€ã«ã«å¯ŸããŠã3ã€ã®åçã®åŸ
æ©æ¹æ³ãå¯èœã«ãªããŸãã ãããèªç¥çãªãŒããŒããããè¿œå ãããšã¯æããªããããã倧ããªæè»æ§ãå¯èœã«ããã ããã
çæ³çã«ã¯ã async fn
ãš#[async] fn*
ã¯ãåºç€ãšãªããžã§ãã¬ãŒã¿ãŒãéåæã¹ããŒããã·ã³ã«å€æããããã®å®è£
ã³ãŒããå
±æããããšããã§ããŸãã
ãããã®åé¡ã«ãããçã«å¥œãŸããã¹ã¿ã€ã«ã¯1ã€ããªãããšãæããã«ãªããŸããããã®ãããç§ãæåŸ ã§ããæåã®æ¹æ³ã¯ãã¯ãªãŒã³ã§æè»æ§ããããèªã¿ããããè€éãã®ã¬ãã«ã«ç°¡åã«ã¢ãããŒãã§ããããã«ããããšã§ãã äžèšã®ã¹ããŒã ã¯å°æ¥ã®è¯ã劥åç¹ã ãšæããŸãã
ããŒã¯ãŒããšããŠã®
await
ã¯ããšã«ããasync
é¢æ°å ã§ã®ã¿æå¹ã§ãããããèå¥åãä»ã®å Žæã§åŸ æ©ã§ããããã«ããå¿ èŠããããŸãã
è¡ççãªãã¯ããèãããšããããRustã§å®çšçãã©ããã¯ããããŸããã ç§ãåŒã³åºãå Žåfoo!(x.await)
ãŸãã¯foo!(await { x })
ãããæãã§ãããšãexpr
ãç§ã¯ããããšã®æçœãªãããã¹ãã ãšæãawait
ãªã-æãŸããããŒã¯ãŒãawait
ãã£ãŒã«ããŸãã¯await
æ§é äœãªãã©ã«åŒãšãã£ãŒã«ãåæåã®çç¥åœ¢-åæã¡ãœããã§ãã
3ã€ã®åçã®æ¹æ³ã§åŸ æ©ã§ããŸã
ãããããé¡ãããŸãã ïŒå°ãªããšãcore
ãæããã«ã人ã
ã¯èªåã®ã³ãŒãã§ãã¯ããäœæã§ããŸããå¿
èŠã«å¿ããŠïŒ
çŸæç¹ã§ã¯ãæ¥å°ŸèŸ.awaitïŒïŒïŒãã¯ãã«ã¯ã³ã³ãã€ã©ã®éæ³ãå¿ èŠã§ãã ãã ããawaitããŒã¯ãŒãã®ãã¬ãã£ãã¯ã¹ããªã¢ã³ããå®å®åãããŠããå Žåãããã¯åœãŠã¯ãŸããŸãããpostfix.awaitïŒïŒïŒãã¯ãã¯ãåŒæ°ïŒåŒïŒã®åã«awaitããŒã¯ãŒããä»ããŠã©ãããããã¯ããšããŠç°¡åã«å®è£ ã§ããŸããæ¬åŒ§å ã®ãã¹ãŠã
ãããåæ§ã«åœãŠã¯ãŸããŸãããç°¡åã§ãã -éã®æ¹åïŒ .await
ããŒã¯ãŒãæ§æãå®å®ããããšãæ¥å°ŸèŸãååã«å«ããªå Žåã¯ããã§ã«awaited!()
ãã¬ãã£ãã¯ã¹ãã¯ããäœæã§ããŸãã
è€æ°ã®èš±å¯ãããããªã¢ã³ãïŒãã¬ãã£ãã¯ã¹ããã¹ããã£ãã¯ã¹ãªã©ïŒãè¿œå ãããšããã¢ã€ãã¢ã¯å«ãã§ããããŠãŒã¶ãŒãå°ããçç±ãšã¯å°ãç°ãªããŸãã ç§ã¯ããªã倧ããªäŒç€Ÿã§åããŠãããã³ãŒãã¹ã¿ã€ã«ããããäºãã¯æ¬ç©ã§ãã æ確ã§æ£ãããã©ãŒã ã1ã€ã ã䜿çšããããšæããŸãã çµå±ã®ãšããããã®ç¹ã«é¢ããŠã¯pythonã®Zenãæ£ãããããããŸããã
è€æ°ã®èš±å¯ãããããªã¢ã³ãïŒãã¬ãã£ãã¯ã¹ããã¹ããã£ãã¯ã¹ãªã©ïŒãè¿œå ãããšããã¢ã€ãã¢ã¯å«ãã§ããããŠãŒã¶ãŒãå°ããçç±ãšã¯å°ãç°ãªããŸãã ç§ã¯ããªã倧ããªäŒç€Ÿã§åããŠãããã³ãŒãã¹ã¿ã€ã«ããããäºãã¯æ¬ç©ã§ãã æ確ã§æ£ãããã©ãŒã ã1ã€ã ã䜿çšããããšæããŸãã çµå±ã®ãšããããã®ç¹ã«é¢ããŠã¯pythonã®Zenãæ£ãããããããŸããã
ããªããèšã£ãŠããããšãããããŸãã ãã ããããã°ã©ããŒãawait!()
ãããªããšãè¡ãç¬èªã®ãã¯ããå®çŸ©ããã®ãæ¢ããæ¹æ³ã¯ãããŸããã 䌌ããããªæ§é äœã¯åžžã«å¯èœã§ãã ãšã«ããå®éã«ã¯ããŸããŸãªããªãšãŒã·ã§ã³ããããŸãã
ãŸããå°ãªããšãããã¯ãšã©ãŒã«ãªãã®ã§ã await!(...)
ã§ã¯ãããŸããã ãããããŠãŒã¶ãŒãmacro_rules! wait { ($e:expr) => { e.await }; }
ãå®çŸ©ãããããwait!(expr)
ãšããŠäœ¿çšãããšãæããã«å調ã«èŠããããã«æ代é
ãã«ãªãå¯èœæ§ããããŸãã ããã«ããããšã³ã·ã¹ãã ã®å€åã®å¯èœæ§ã倧å¹
ã«æžå°ãããŠãŒã¶ãŒãåŠç¿ããã¹ã¿ã€ã«ãå°ãªããªããŸãã ãããã£ãŠã @ yasammezã®ãã€ã³ãã¯é©åã ãšæããŸãã
@Centril誰ããæªãããšããããã®ãªãã圌ãã¯ã»ãšãã©æ¢ããããŸããã _await!()
ãŸãã¯awai!()
ã©ãã§ããïŒ
ãŸãã¯ãUnicodeèå¥åãæå¹ã«ãªã£ãŠããå Žåã¯ã à wait!()
ãŸãã
..ã
@earthengineç®æšã¯ãããŸããŸãªäººã
ãæ
æã«å¥åŠãªããšãããã®ãé²ãããšã§ã¯ãªããã³ãã¥ããã£ã®èŠç¯ãèšå®ããããšã§ãïŒã¹ã¿ã€ã«ãªã³ããrustfmt
è¡ãã®ãšåæ§ïŒã ããã§ã¯ç¢ºçãæ±ã£ãŠããŸããã _await!()
ãããªããšãã絶察çãªä¿èšŒã§ã¯ãããŸããã
åæ¥å°ŸèŸæ§æã®åŒæ°ãèŠçŽããŠç¢ºèªããŸãããã
__ expr await
ïŒpostfixããŒã¯ãŒãïŒ__ïŒPostfixããŒã¯ãŒãæ§æã¯ããã§ã«äºçŽããawait
ããŒã¯ãŒãã䜿çšããŸãã Awaitã¯éæ³ã®ãããªå€åã§ãããããŒã¯ãŒãã䜿çšãããšããããé©åã«ç®ç«ãããããšãã§ããŸãã ãã£ãŒã«ãã¢ã¯ã»ã¹ãã¡ãœãããŸãã¯ãã¯ãåŒã³åºãã®ããã«ã¯èŠããªãã®ã§ããããäŸå€ãšããŠèª¬æããå¿
èŠã¯ãããŸããã ããã¯ãçŸåšã®è§£æã«ãŒã«ããã³?
æŒç®åã«ããé©åããŸãã ã¡ãœãããã§ãŒã³ã®ã¹ããŒã¹ã¯ãäœããã®åœ¢ã§åãå
¥ããããå¯èœæ§ãé«ãRFCã§ããGeneralized TypeAscriptionãããééããªãæªããããŸãawait
ãªãŒãã³ã³ããªãŒããæäŸããããã«ããã«éæ³ããããå¿
èŠããããããããŸããã ç¹ã«await
ãåè¡ãçµäºããããã«ã³ãŒãããã©ãŒããããããŠããªãå Žåãã¡ãœãããã§ãŒã³ã®ã¹ããŒã¹ãç
©ããããããšæãããããããŸããïŒ @withoutboatsã¯ãããå©ç¹ãããããªããšäž»åŒµããŠããŸããïŒã å¥ã®ã¢ãããŒãããšã£ãå Žåã«äœ¿çšãåé¿ã§ããå¯èœæ§ã®ããããŒã¯ãŒãã䜿çšããŸãã
__ expr.await
ïŒæ¥å°ŸèŸãã£ãŒã«ãïŒ__ïŒæ¥å°ŸèŸãã£ãŒã«ãã®æ§æã¯ããããã®åãã掻çšããŸã-ãã§ãŒã³ã§èªç¶ã«èŠããæããIDEãä»ã®æäœïŒãªã©ïŒãå®è¡ããã«await
ããªãŒãã³ã³ããªãŒãã§ããããã«ããŸããããã
__ expr.await()
ïŒåŸçœ®ã¡ãœããïŒ__ïŒåŸçœ®ã¡ãœããã®æ§æã¯åŸçœ®ãã£ãŒã«ãã«äŒŒãŠããŸãã éã«ã ()
åŒã³åºãæ§æã¯ããããã¯äœããããŸãããšèªè
ã«ç€ºããŸãã ããŒã«ã«ã§èŠããšãããããã³ã°ã¡ãœããã®åŒã³åºãããã«ãã¹ã¬ããããã°ã©ã ã§å®è¡ãããã®ãšã»ãŒåãæ¹æ³ã§await
ã®éæ³ã®æ¯ãèããã¡ãœãããšããŠåœè£
ãããšæ··ä¹±ããå¯èœæ§ããããŸãã await
ã¯ãSchemeã®call/cc
ãé¢æ°ã§ããã®ãšåãéå®çãªæå³ã§ã®ã¡ãœããã§ãããšèšããŸãã æ¹æ³ãšããŠã Future::await(expr)
ãUFCSãšäžè²«ããŠ
__ expr.await!()
ïŒæ¥å°ŸèŸãã¯ãïŒ__ïŒæ¥å°ŸèŸãã¯ãæ§æã¯ãåæ§ã«ããããã®åãã掻çšããŸã!
bangã¯ããããã¯äœãéæ³ãããããããããªããããšã瀺ããŠããŸãã æ¬ ç¹ãšããŠã¯ãããã¯ããã«ãã€ãºãå€ãããã¯ãã¯éæ³ããããŸãããéåžžã await
ããã«åšå²ã®ã³ãŒãã«éæ³ããããŸããã ãŸããæ¬ ç¹ãšããŠãæ±çšã®æ¥å°ŸèŸãã¯ãæ§æãæšæºåãããšä»®å®ãããšã await
ãããŒã¯ãŒããšããŠæ±ãç¶ããããšã«åé¡ãçããå¯èœæ§ããã
__ expr@
ã expr#
ã expr~
ãããã³ãã®ä»ã®åäžæåèšå·__ïŒ ?
å Žåãšåæ§ã«åäžæåã䜿çšãããšãç°¡æœããæ倧åãããããããæ¥å°ŸèŸã®æ§æãäœæãããŸããããèªç¶ã«èŠããŸãã ?
åæ§ã«ã await
ãã³ãŒãã«æµžéãå§ããå Žåããã®ç°¡æœãã«æè¬ãããããããŸããã æ¬ ç¹ãšããŠã¯ãã³ãŒãã«await
æ£ããããšããèŠçãåé¡ã«ãªããŸã§ããããŠåé¡ã«ãªããªãéãããã®ãããªæ§æãæ¡çšããããšã«åºæã®ãã¬ãŒããªãã«ã€ããŠã³ã³ã»ã³ãµã¹ã圢æãããã®ãèŠãã®ã¯å°é£ã§ãã
ãããã®èŠçŽæçš¿ã@traviscrossã«æè¬ããããã«ãæçš¿ãããããšæããŸããã ãããã¯äžè²«ããŠããæžãããããã¯ãã¹ãªã³ã¯ãããŠããŸãã ãããããé¡ãããŸãã ïŒããŒãïŒ
FïŒã®ãããªããã€ãæŒç®åããè¿œå ãããšããŠãŒã¶ãŒã¯ãã¬ãã£ãã¯ã¹ãŸãã¯ãã¹ããã£ãã¯ã¹ã®ããããã䜿çšã§ããããã«ãªããšæããŸãïŒæ瀺çãªæ§æã®éãããããŸãïŒã
// use `|>` for instance, Rust can choose other sigils if there are conflicts with current syntax
await expr
expr |> await
// and we can use this operator on normal function calls too
f(g(h(x)))
x |> h |> g |> f
// this is more convenient than "postfix macro"
x.h!().g!().f!()
@traviscrossãã°ãããèŠçŽã fut@await
ããã«ãå°ç« ãšããŒã¯ãŒãã®çµã¿åããã«ã€ããŠãããã€ãã®è°è«ããããŸããããã®ã¹ã¬ããã«ã¢ã¯ã»ã¹ãã人ã
ã®ããã«ãããã«ãããè¿œå ããŸãã
ãã®æ§æã®é·æãšçæãããã«èšèŒããŸããã @earthengineã«ãããšã ~
ãªã©ã @
以å€ã®ã·ãžã«ãå¯èœã§ãã @BenoitZugmeyerã¯@await
æ¯æããåŸçœ®ãã¯ãala expr!await
ãè¯ãèããã©ãããå°ããŸãã @dpcã¯ã @await
ã¯ã¢ãããã¯ãããŠããã§ã«æã£ãŠãããã®ãšããŸãçµ±åã§ããªããšäž»åŒµããŠããŸãããŸããRustã¯ãã§ã«å°ç« ãå€ãã§ãã @cenwangumassã¯ãã¢ãããã¯ããã@newpavlovã«ãããšã await
éšåã¯ãç¹ã«å°æ¥ä»ã®åæ§ã®ããŒã¯ãŒããè¿œå ããªãå Žåã¯ãåé·ã«æãããšã®ããšã§ãã @nicoburnsã¯ãæ§æã¯æ©èœããå¯èœæ§ããããåé¡ã¯ããã»ã©å€ããªããã解決çãšããŠã¯ããŸãã«ãã¢ãããã¯ã§ãã
@traviscrossçŽ æŽãããèŠçŽïŒ
ç§ã®æèŠã§ã¯ãææªããæé«ã®é ã«0.02 $ïŒ
await
ããããšãããŸã圹ã«ç«ã¡ãŸããã ããããããããæžãããã fn
ãŸãã¯extern
æžãã ãã§ãã æçšãªã¡ãœãã/ãã£ãŒã«ãã®ä»£ããã«ããŒã¯ãŒãã«ãã£ãŠææ¡ããããããè¿œå ã®è£å®ã¯äœããªããããããã«æªãã§ããasync
ãããŒã¯ãŒãã§ããé察称æ§ãæå³ããŸãrustfmt
ãããšãããã¯ããã«éèŠã§ã¯ãªããªããŸãããã®ç¬éãæ¥ãã®ãç±å¿ã«åŸ ã£ãŠãã人ãšããŠãããã«ç§ã®0.02ãã«ããããŸãã
ã»ãšãã©ã®å Žåã @ Pzixelã«åæãtry!()
/ã®ããã«ããªãã·ã§ã³ãšããŠäž¡æ¹ãæäŸãããšããæå³ã§ãã ?
ãã¢ã æ確ã«ããããã«ã ?
ãããtry!()
ãæ¯æãã人ã
ããŸã ããã®ãèŠãŠããŸããããã®ç¹å®ã®ã±ãŒã¹ã§ã¯ãã³ãŒãã®å€èŠ³ã«ã€ããŠäœããã®ä»£çåºãæã€ããšã¯ãçæã§ã¯ãªãé·æã ãšæããŸãã ã2ã€ã®ç°ãªãæ§æãç ç²ã«ããŠãã
ç¹ã«ã await
postfixããŒã¯ãŒãã¯ãéåæã³ãŒããæ瀺çãªäžé£ã®ã¹ããããšããŠèšè¿°ããå Žåã«æé©ã§ãã
let val1 = my_async() await;
...
let val2 = another_async(val1) await;
...
let val3 = yet_another_async(val2) await;
äžæ¹ãå žåçãªRust-yã¡ãœãããã§ãŒã³ã¹ã¿ã€ã«ã§ã¯ã代ããã«ãã£ãšè€éãªãã®ã䜿çšããããšããå§ãããŸãã
let my_final_value = commit(get_some_data()
.and_then(|s| get_another_data(s))
.or_else(|s| report_error(s))~);
ãã®å Žåãç§ãã¡ãæªæ¥ãæ±ã£ãŠããããšã¯æèãããã§ã«ããªãæããã§ããã await
ããŒããŒãã®åé·æ§ã¯åé·ã§ãããšæããŸãã æ¯èŒïŒ
let my_final_value = commit(get_some_data()
.and_then(|s| get_another_data(s))
.or_else(|s| report_error(s)) await);
åäžèšå·ã®æ¥å°ŸèŸæ§æã«ã€ããŠç§ãæ°ã«å
¥ã£ãŠãããã1ã€ã®ç¹ã¯ãèšå·ãåŒã«ããããšã§ãããïŒç§å人ãšããŠã¯ïŒç¬ç«ããawait
ã¯å°ã...倱ãããŠããŸãïŒ :)
ç§ãèšãããšããŠããã®ã¯ã await
ã¯ã¹ããŒãã¡ã³ãã®æ¹ãèŠæ ããããã®ã«å¯Ÿããåäžèšå·ã®æ¥å°ŸèŸã¯åŒã®æ¹ãèŠæ ãããããšããããšã ãšæã
ãšã«ããããããã¯ç§ã®èãã§ãã
ããã¯ãã§ã«ãã¹ãŠã®èªè»¢è»è±èœã¹ã¬ããã®æ¯ã§ããããããããŸã§èšåãããŠããªãå¥ã®å°ç« ãè¿œå ããããšæããŸããïŒ ->
ã
åŸãé¢æ°ã®æ»ãå€ã®å宣èšããã®->
ããã©ãŒãªã³ã°ãããšããèãã§ããããã¯ãé¢æ°ãasync
ãããããåŸ
æ©äžã®æ»ãå€ã®åã§ãã
async fn send() -> Result<Response, HttpError> {...}
async fn into_json() -> Result<Json, EncodingError> {...}
let body: MyResponse = client.get("http://api").send()->?.into_json()->?;
äžèšã§ã¯ãé¢æ°å®£èšã«èšè¿°ãããŠããããã«ã send()->
ããååŸããã®ã¯Result<Response, HttpError>
ã§ãã
äžèšã®è°è«ã®ã»ãšãã©ãèªã¿ãææ¡ããããªãã·ã§ã³ãæ°æ¥éçèããåŸããããã¯ç§ã®0.02ãã«ã§ãã ç§ã®æèŠã«éã¿ãäžããçç±ã¯ãããŸãã-ç§ã¯ã€ã³ã¿ãŒãããäžã§ãã ã®ã©ã³ãã ãªäººã§ãã è°è«ã«ãã€ãºãè¿œå ããªãããã«æ³šæããŠããã®ã§ããããããã以äžã³ã¡ã³ãããããšã¯ãããŸããã
ç§ã¯æ¥å°ŸèŸã®å°ç« ã奜ãã§ãã åŸçœ®ã·ãžã«ã«ã¯åªå é äœããããä»ã®èšèªãšäžè²«ããŠãããšæããŸãã ç§ã¯ç¹å®ã®å°ç« ãã©ã®ããã«äœ¿ããããã«ã€ããŠç¹ã«å¥œã¿ã¯ãããŸãã-説åŸåã®ãããã®ã¯ãããŸããããããã¯èŠªãã¿ã蟌ããŠèãããšæããŸãã å°ç« ã¯ãä»ã®æ¥å°ŸèŸãªãã·ã§ã³ãšæ¯èŒããŠæå°ã®ãã€ãºãå°å ¥ããŸãã
åŸ
ã€ããã«.
ïŒãã§ãŒã³ããå ŽåïŒã->
ã«çœ®ãæãããšããèãã¯æ°ã«ããŸããã ããã§ãç°¡æœã§ææ§ãã¯ãããŸãããã ?
ãšåãã³ã³ããã¹ãã§äœ¿çšã§ãããã®ã欲ããã§ãã
ç§ã¯æ瀺ãããä»ã®æ¥å°ŸèŸãªãã·ã§ã³ã匷ãå«ããŸãã await
ã¯ãã£ãŒã«ãã§ãã¡ãœããã§ããªããããå¶åŸ¡ãããŒæ§é ããã®ããã«è¡šç€ºãããããã®èšèªã®ä»ã®éšåãšå®å
šã«ççŸããŠããããã«æããŸãã ãã®èšèªã«ã¯æ¥å°ŸèŸã®ãã¯ããããŒã¯ãŒãããªããããäžè²«æ§ããªãããã§ãã
ç§ããã®èšèªã«äžæ
£ãã§ããããå®å
šã«ç¥ããªãå Žåã .await
ãŸãã¯.await()
ã¯ç¹å¥ãªèšèªæ©èœã§ã¯ãªããåã®ãã£ãŒã«ããŸãã¯ã¡ãœããã§ãããšæããŸã-ã®å Žåã®ããã«ãŠãŒã¶ãŒã«è¡šç€ºãããèšèªã®ä»ã®ãã¹ãŠã®ãã£ãŒã«ããšã¡ãœããã çµéšãç©ãã åŸã .await!()
ãéžæãããå ŽåããŠãŒã¶ãŒã¯ç¬èªã®ãã¬ãã£ãã¯ã¹ãã¯ããå®çŸ©ããæ¹æ³ãåŠç¿ããããšããå¯èœæ§ããããŸãïŒç¬èªã®ãã¬ãã£ãã¯ã¹ãã¯ããå®çŸ©ããæ¹æ³ãåŠç¿ããã®ãšåãã§ãïŒã ãã®ãŠãŒã¶ãŒãå°ç« ãèŠãå Žåãããã¥ã¡ã³ããæ€çŽ¢ããå¿
èŠããããããããŸãããïŒ ?
ïŒãä»ã®ãã®ãšæ··åããã .await()
å®çŸ©ãèŠã€ããã®ã«æéãç¡é§ã«ããŸããããŸãã¯ãã£ãŒã«ã.await
ããã¥ã¡ã³ãã
ãã¬ãã£ãã¯ã¹await { .. }
奜ãã§ãã ãã®ã¢ãããŒãã«ã¯æ確ãªåªå
é äœããããŸãããåé¡ããããŸãïŒãã§ã«è©³çŽ°ã«èª¬æãããŠããŸãïŒã ããã«ãããããããã³ã³ãããŒã¿ã®äœ¿çšã奜ã人ã«ãšã£ãŠã¯æçã ãšæããŸãã ã¡ãœãããã§ãŒã³ã§ã¯äººéå·¥åŠçã§ã¯ãªãããããããå®è£
ãããå¯äžã®ãªãã·ã§ã³ã«ãªãããšã¯æãŸãããããŸããããæ¥å°ŸèŸã®å°ç« ãããŸãè£å®ãããšæããŸãã
ç§ã¯ä»ã®ãã¬ãã£ãã¯ã¹ãªãã·ã§ã³ãå«ãã§ãããããã¯èšèªã®ä»ã®å¶åŸ¡ãããŒæ§é ãšäžè²«æ§ããããšã¯æããŸããã postfixã¡ãœãããšåæ§ã«ãprefixé¢æ°ã«ã¯äžè²«æ§ããªããå¶åŸ¡ãããŒã«äœ¿çšãããèšèªã«çµã¿èŸŒãŸããŠããä»ã®ã°ããŒãã«é¢æ°ã¯ãããŸããã å¶åŸ¡ãããŒã«äœ¿çšããããã¯ãããããŸããïŒ try!(..)
é€ããŠãããè¯ã解決çãã€ãŸãæ¥å°ŸèŸã®å°ç« ããããããããã¯éæšå¥šã§ãïŒã
ç§ã®å¥œã¿ã®ã»ãšãã©ãã¹ãŠã¯ãïŒç§ã«ãšã£ãŠïŒèªç¶ã§äžè²«ããŠãããšæãããã®ã«èŠçŽãããŸãã ã©ã¡ãã®ãœãªã¥ãŒã·ã§ã³ãéžæããå Žåã§ããå®å®åããåã«å®éšã®æéãäžããå¿ èŠããããŸããå®éã®çµéšãããæšæž¬ãããã©ã¡ãã®ãªãã·ã§ã³ãæé©ããå€æããã®ã«ã¯ããã«é©ããŠããŸãã
ãŸã£ããç°ãªãæèŠãæã€å¯èœæ§ã®ãããµã€ã¬ã³ãããžã§ãªãã£ãååšããå¯èœæ§ãããããšãèæ ®ãã䟡å€ããããŸã-ãããã®è°è«ã«åŸäºãã人ïŒç§ãå«ãïŒã¯ãå¿ ããããã¹ãŠã®RustãŠãŒã¶ãŒã代衚ããŠããããã§ã¯ãããŸããïŒããã¯è»œåŸ®ãªãã®ã§ã¯ãããŸãããšã«ããäžå¿«ïŒã
tl; dr Postfix sigilsã¯ãïŒåªå
é äœã®ããã«ïŒåŸ
æ©ãè¡šçŸããèªç¶ãªæ¹æ³ã§ãããç°¡æœã§äžè²«æ§ã®ããã¢ãããŒãã§ãã ãã¬ãã£ãã¯ã¹await { .. }
ãšãã¹ããã£ãã¯ã¹@
è¿œå ããŸãïŒã³ã³ããã¹ãã§ã¯?
ãšããŠäœ¿çšã§ããŸãïŒã Rustãå
éšçã«äžè²«ããŠããããšãç§ã«ãšã£ãŠæãéèŠã§ãã
@SamuelMoriarty
ãã®å Žåãç§ãã¡ãæªæ¥ãæ±ã£ãŠããããšã¯æèãããã§ã«ããªãæããã§ãããawaitããŒããŒãã®åé·æ§ã¯åé·ã§ãããšæããŸãã æ¯èŒïŒ
ç³ãèš³ãããŸããããäžç®ã§~
ãèŠã€ããããšããã§ããŸãã
ã·ãžã«ã«å¯Ÿãããã1ã€ã®ãã€ã³ãã¯ãRustãJã«ãªãããšã§ããäŸïŒ
let res: MyResponse = client.get("https://my_api").send()?@?.json()?@?;`
?@?
ã¯ãããšã©ãŒãŸãã¯å°æ¥ãè¿ãå¯èœæ§ã®ããé¢æ°ã§ããããšã©ãŒãããå Žåã¯ãåŒã³åºãå
ã«äŒæãããŠåŸ
æ©ããå¿
èŠããããŸãããè¡šããŸãã
ãã£ãšæ¬²ãã
let res: MyResponse = client.get("https://my_api").send()? await?.json()? await?;`
@rolandsteiner
ããã¯ãã§ã«ãã¹ãŠã®èªè»¢è»è±èœã¹ã¬ããã®æ¯ã§ããããããããŸã§èšåãããŠããªãå¥ã®å°ç« ãè¿œå ããããšæããŸããAFAICTïŒ->ã
ææ³ãæèäŸåã«ããããšã¯ãç©äºãè¯ãããã®ã§ã¯ãªããæªãããã ãã§ãã ãšã©ãŒãæªåããã³ã³ãã€ã«æéãé ããªããŸãã
->
ã«ã¯å¥ã®æå³ãããã async/await
ãåŠçããå¿
èŠã¯ãããŸããã
æ¥é èŸawait { .. }
ãšãå¯èœã§ããã°æ¥å°ŸèŸ!
å°ç« ããå§ãããŸãã
æå笊ã¯ãå
ç©ã®æ æ°ã埮åŠã«åŒ·èª¿ããŸãã æå笊ã®ä»ããã³ãã³ããäžãããããŸã§ããããã¯å®è¡ãããŸããã
äžèšã®äŸã¯æ¬¡ã®ããã«ãªããŸãã
let res: MyResponse = client.get("https://my_api").send()?!?.json()?!?;
éåæã®çµéšãã»ãšãã©ãªããRustã®éåæé¢æ°ãšã³ã·ã¹ãã ã®çµéšããªããããç§ã®æèŠãé©åã§ãªãå Žåã¯ç³ãèš³ãããŸããã
ãããã .send()?!?.json()?!?;
ããã®ãããªä»ã®çµã¿åãããèŠããšãå°ç« ããŒã¹ã®ææ¡ãç§ã«ã¯ééã£ãŠããããã«èŠããåºæ¬çãªçç±ãããããŸãã
ãŸãã ?!?
ã ?~?
ã ?->?
ã©ãã§ãã£ãŠããé£éããã·ãžã«ã¯ããã«èªããªããªãããã«æããŸãã ããã¯ãåå¿è
ãã€ãŸãããã1ã€ã®ããšã§ããã1人ã®ãªãã¬ãŒã¿ãŒãè€æ°ã®ãªãã¬ãŒã¿ãŒããæšæž¬ããŸãã æ
å ±ããã£ããè©°ãŸã£ãŠããŸãã
第äºã«ãäžè¬çã«ãåŸ
æ©ãã€ã³ãã¯ãšã©ãŒäŒæãã€ã³ããããäžè¬çã§ã¯ãªããããéèŠã§ãããšç§ã¯æããŠããŸãã åŸ
æ©ãã€ã³ãã¯ãå¥ã®ã¹ããŒãžã«é¢é£ä»ããããããã€ããŒãã©ã³ã¹ãã©ãŒã¡ãŒã·ã§ã³ãã§ã¯ãªãïŒç¹ã«ããã€ããŒãã©ã³ã¹ãã©ãŒã¡ãŒã·ã§ã³ã®1ã€ãã§ã¯ãªãïŒãããèªäœã§ãã§ãŒã³ã®ã¹ããŒãžã«ãªãã«å€ããã»ã©éèŠã§ãã ãã¬ãã£ãã¯ã¹ããŒã¯ãŒã圢åŒã ãã§ã倧äžå€«ã ãšæããŸããïŒãã§ãŒã³ãå£ãã®ãã»ãŒåŒ·å¶ããŸãïŒãäžè¬çã«ã¯å¶éãå³ãããããšæããŸãã ç§ã®çæ³çãªãªãã·ã§ã³ã¯ããããã.await!()
ã¡ãœããã®ãããªãã¯ãã§ãããå°æ¥çã«ã¯ãã¯ãã·ã¹ãã ãæ¡åŒµããŠã¡ãœããã®ãããªãŠãŒã¶ãŒãã¯ããèš±å¯ããå¯èœæ§ããããŸãã
ç§ã®æèŠã§ã¯ãå®å®åã®æå°ããŒã¹ã©ã€ã³ã¯ãã¬ãã£ãã¯ã¹æŒç®åawait my_future
ã§ãã ä»ã®ãã¹ãŠãç¶ãããšãã§ããŸãã
expr....await
ã¯ãåŸ
æ©ãããŸã§é²è¡äžã®äœãã®ã³ã³ããã¹ããåæ ããrustlangæŒç®åãšäžèŽããŸãã ãŸããasyncawaitã¯äžŠåãã¿ãŒã³ã§ããawaitã¯ã¡ãœãããŸãã¯åæ§ã®ããããã£ãšããŠè¡šçŸã§ããŸããã
ç§ã¯await!(foo)
奜ãåŸåããããŸãããããããããšã§äºçŽãåãæ¶ãå¿
èŠãããã2021幎ãŸã§ãªãã¬ãŒã¿ãŒãšããŠã®å°æ¥ã®äœ¿çšãäžå¯èœã«ãªããšä»ã®äººãææããŠããã®ã§ã await { foo }
ç§ã®å¥œã¿ãšããŠã åŸçœ®åŸ
ã¡ã«ã€ããŠã¯ãç¹ã«æèŠã¯ãããŸããã
æé»ã®åŸ æ©ã«ã€ããŠè©±ãã®ã«æé©ãªå Žæã§ã¯ãªããããããŸããããæ瀺çãªæé»ã®åŸ æ©ã®ãããªãã®ã¯æ©èœããŸããïŒ ãããã£ãŠãæåã«ãã¬ãã£ãã¯ã¹ãçéžãåŸ æ©ããŸãã
await { future }?
ãããŠåŸã§ã次ã®ãããªãã®ãè¿œå ããŸã
let result = implicit await { client.get("https://my_api").send()?.json()?; }
ãŸãã¯
let result = auto await { client.get("https://my_api").send()?.json()?; }
æé»ã¢ãŒããéžæãããšã {}
éã®ãã¹ãŠãèªåçã«åŸ
æ©ãããŸãã
ããã«ããã await
æ§æãçµ±äžããããã¬ãã£ãã¯ã¹åŸ
æ©ããã§ãŒã³ãããã³å¯èœãªéãæ瀺çãªå¿
èŠæ§ã®ãã©ã³ã¹ãåããŸãã
ãã¬ãã£ãã¯ã¹ãæé©ã§ã¯ãªãå Žæã®äŸã調æ»ããããã«ã rg --type csharp '[^ ]await'
ã決å®ããŸããã ãããã®ãã¹ãŠãå®ç§ã§ãããšã¯éããªãå¯èœæ§ããããŸããããããã¯ã³ãŒãã¬ãã¥ãŒãçµãå®éã®ã³ãŒãã§ãã ïŒç¹å®ã®ãã¡ã€ã³ã¢ãã«ã®ãã®ãåé€ããããã«ãããã«ãµãã¿ã€ãºãããäŸãïŒ
(await response.Content.ReadAsStringAsync()).Should().Be(text);
FluentAssertionsããéåžžã®MSTest assert_eq!
Assert.Equal
ãããåªããæ¹æ³ãšããŠäœ¿çšããŸãã
var previous = (await branch.ListHistoryAsync(timestampUtc, null, cancellationToken, 1)).HistoryEntries.SingleOrDefault();
ãèŠãŠãç§ã¯æ¬åœã«ãããã1ã€ã ãå¿ èŠã ã£ãããšãããã®äžè¬çãªããšã¯ãããã®æã§ãã
id = id ?? (await this.storageCoordinator.GetDefaultWidgetAsync(cancellationToken)).Identity;
å¥ã®ãç§ã¯1ã€ã®ããããã£ã ããå¿
èŠã§ãããã ïŒäœè«ã§ããããRustãCancellationToken
å¿
èŠãšããªãããšãå¬ããæããŸããïŒ
var pending = (await transaction.Connection.QueryAsync<EventView>(command)).ToList();
人ã
ãRustã§èšåããã®ãšåã.collect()
ã
foreach (var key in changes.Keys.Intersect((await neededChangesTask).Keys))
ç§ã¯ããããpostfixããŒã¯ãŒãã奜ãã ãšæã£ãŠããŸãããããã®åŸã«rustfmtæ¹è¡ããããŸãïŒååšããå Žåã¯?
åŸïŒãããã®ããã«èãããšãæ¹è¡ã¯äžè¬çã«è¯ããªããšæããŸãã
else if (!await container.ExistsAsync())
ãã¬ãã£ãã¯ã¹ãå®éã«åœ¹ç«ã€çãããã®ã®1ã€ã
var response = (HttpWebResponse)await request.GetResponseAsync();
ããã€ãã®ãã£ã¹ãããããŸãããããã¡ãããã£ã¹ãã¯RustãåŸçœ®ã§ãCïŒãæ¥é èŸã§ããå¥ã®å Žæã§ãã
using (var response = await this.httpClient.SendAsync(requestMsg))
ãã®1ã€ã®ãã¬ãã£ãã¯ã¹ãšãã¹ããã£ãã¯ã¹ã¯é¢ä¿ãããŸããããå¥ã®èå³æ·±ãéãã ãšæããŸããCïŒã«ã¯Drop
ããªããããå€ãã®ãã®ãå€æ°ã«å
¥ããããé£éãããªãããšã«ãªããŸãã
@scottmcmã®äŸã®ããã€ãã¯ãããŸããŸãªæ¥å°ŸèŸã®ããªã¢ã³ãã§éã³ãŠããŸãã
// keyword
response.content.read_as_string()) await?.should().be(text);
// field
response.content.read_as_string()).await?.should().be(text);
// function
response.content.read_as_string()).await()?.should().be(text);
// macro
response.content.read_as_string()).await!()?.should().be(text);
// sigil
response.content.read_as_string())@?.should().be(text);
// sigil + keyword
response.content.read_as_string())@await?.should().be(text);
// keyword
let previous = branch.list_history(timestamp_utc, None, 1) await?.history_entries.single_or_default();
// field
let previous = branch.list_history(timestamp_utc, None, 1).await?.history_entries.single_or_default();
// function
let previous = branch.list_history(timestamp_utc, None, 1).await()?.history_entries.single_or_default();
// macro
let previous = branch.list_history(timestamp_utc, None, 1).await!()?.history_entries.single_or_default();
// sigil
let previous = branch.list_history(timestamp_utc, None, 1)@?.history_entries.single_or_default();
// sigil + keyword
let previous = branch.list_history(timestamp_utc, None, 1)@await?.history_entries.single_or_default();
// keyword
id = id.or_else_async(async || self.storage_coordinator.get_default_widget_async() await?.identity) await?;
// field
id = id.or_else_async(async || self.storage_coordinator.get_default_widget_async().await?.identity).await?;
// function
id = id.or_else_async(async || self.storage_coordinator.get_default_widget_async().await()?.identity).await()?;
// macro
id = id.or_else_async(async || self.storage_coordinator.get_default_widget_async().await!()?.identity).await!()?;
// sigil
id = id.or_else_async(async || self.storage_coordinator.get_default_widget_async()@?.identity)@?;
// sigil + keyword
id = id.or_else_async(async || self.storage_coordinator.get_default_widget_async()@await?.identity)@await?;
ïŒèšæ£ããŠããã@ Nemo157ã«æè¬ããŸãïŒ
// keyword
let pending = transaction.connection.query(command) await.into_iter().collect::<Vec<EventView>>();
// field
let pending = transaction.connection.query(command).await.into_iter().collect::<Vec<EventView>>();
// function
let pending = transaction.connection.query(command).await().into_iter().collect::<Vec<EventView>>();
// macro
let pending = transaction.connection.query(command).await!().into_iter().collect::<Vec<EventView>>();
// sigil
let pending = transaction.connection.query(command)@.into_iter().collect::<Vec<EventView>>();
// sigil + keyword
let pending = transaction.connection.query(command)@await.into_iter().collect::<Vec<EventView>>();
ç§ã«ãšã£ãŠããããèªãã åŸã @
å°ç« ã¯ãç¹ã«?
åã§ã¯èŠããªããããããŒãã«ããå€ããŠããŸãã
ãã®ã¹ã¬ããã®èª°ããStreamã®awaitããªã¢ã³ãã«ã€ããŠè°è«ããŠããã®ãèŠãããšããããŸããã ç§ã¯ãããç¯å²å€ã§ããããšãç¥ã£ãŠããŸãããç§ãã¡ã¯ããã«ã€ããŠèããã¹ãã§ããïŒ
Streamsã§ã®åŸ æ©ã劚ãããã®ã§ããããšãå€æããå Žåãããã¯æ®å¿µãªããšã§ãã
// keyword
id = id.or_else(|| self.storage_coordinator.get_default_widget_async() await?.identity);
ãã®ãããªã¯ããŒãžã£å
ã§await
䜿çšããããšã¯ã§ããŸãããéåæã¯ããŒãžã£ãåãã Future
èªäœãè¿ãOption
è¿œå ã®æ¡åŒµã¡ãœãããå¿
èŠã«ãªããŸãïŒã§æ¡åŒµã¡ãœããã®ã·ã°ããã£ãæå®ããããšã¯äžå¯èœã ãšç§ãä¿¡ããç¬éã§ãããããŸãããã°ãããæç¹ã§éåæã¯ããŒãžã£ã䜿çšã§ããããã«ããæ¹æ³ãåŸãããã§ãããïŒ ã
// keyword
id = id.or_else_async(async || self.storage_coordinator.get_default_widget_async() await?.identity) await?;
ïŒãŸãã¯ãã³ã³ãããŒã¿ã®ä»£ããã«if let
ã䜿çšããã³ãŒãã®ããçŽæ¥çãªç¿»èš³ïŒ
@ Nemo157ã¯ãããããç§ãã¡ã¯ããããè¿œå ã®é¢æ°ãªãã§ãããè¡ãããšãã§ããŸãïŒ
id = ok(id).transpose().or_else(async || self.storage_coordinator.get_default_widget_async() await?.identity) await?;
ãããã if let
ã¢ãããŒãã¯ãç§ã«ã¯ç¢ºãã«èªç¶ãªããã§ãã
ç§ã«ãšã£ãŠããããèªãã åŸã@ sigilã¯ããŒãã«ããå€ããŠããŸããããã¯ãç¹ã«ïŒã®åã§ã¯èŠããªãããã§ãã
代æ¿ã®ã³ãŒã匷調衚瀺ã¹ããŒã ãå¿ããªãã§ãã ãããç§ã«ãšã£ãŠããã®ã³ãŒãã¯æ¬¡ã®ããã«ãªããŸãã
å人çã«ã¯ãããã§ã®ãäžå¯èŠæ§ãã¯ã¹ã¿ã³ãã¢ãã³ã®?
ããã倧ããªåé¡ã§ã¯ãªããšæããŸãã
ãããŠãå·§åŠãªé
è²ã¯ãããããã«ç®ç«ãããããšãã§ããŸãïŒäŸãã°ã ?
ã¯ç°ãªãè²ã䜿çšããããšã«ãã£ãŠïŒã
@newpavlovå€éšããŒã«ïŒgitlab / githubã¬ãã¥ãŒã¿ããªã©ïŒã§é è²ãéžæããããšã¯ã§ããŸããã
ããã¯èšã£ãŠãããã€ã©ã€ãã ãã«é Œãã®ã¯è¯ãç¿æ £ã§ã¯ãããŸããã ä»ã®äººã¯ä»ã®å¥œã¿ãæã£ãŠãããããããŸããã
ããã«ã¡ã¯ã¿ããªãç§ã¯C ++ããæ¥ãæ°ããRuståŠç¿è ã§ãã ã®ãããªãã®ã§ã¯ãªãã³ã¡ã³ããããã ãã§ã
id = id.or_else_async(async || self.storage_coordinator.get_default_widget_async() await?.identity) await?;
ãŸãã¯
id = id.or_else_async(async || {
self.storage_coordinator.get_default_widget_async() await?.identity
}) await?;
åºæ¬çã«ç解ã§ããªãïŒ await
ã¯è¡ã®æåŸã«åãã£ãŠããã·ã¥ãããŸãããçŠç¹ã¯äž»ã«æåã«éäžããŸãïŒããã¯æ€çŽ¢ãšã³ãžã³ã䜿çšããå Žåãšåãã§ãïŒã
äœãã®ãããªãã®
id = await? id.or_else_async(async || {
let widget = await? self.storage_coordinator.get_default_widget_async();
widget.identity
});
ãŸãã¯
id = auto await {
id.or_else_async(async || { self.storage_coordinator.get_default_widget_async()?.identity })
}?;
以åã«ææ¡ããããã®ã¯ç§ã«ã¯ã¯ããã«è¯ãèŠããŸãã
åæããã æåã®æ°èªã¯ãã³ãŒããæ€çŽ¢çµæãããã¹ãã®æ®µèœãªã©ãã¹ãã£ã³ãããšãã«èª°ããæåã«ç®ã«ãããã®ã§ããããã«ãããããããçš®é¡ã®æ¥å°ŸèŸãããã«äžå©ã«ãªããŸãã
?
é
眮ã«ã€ããŠã¯ã await? foo
ã¯ååã«æ確ã§ãç°¡åã«ç¿åŸã§ãããšç¢ºä¿¡ããŠããŸãã
ãããä»å®å®ããã2幎é䜿çšããåŸããã§ãŒã³ã«ãã£ãšè¯ããã®ãæ¬åœã«å¿ èŠã ãšå€æããå ŽåãåŸçœ®ãã¯ããäžè¬çãªæ©èœãšèŠãªãããšãã§ããŸãã
@nicoburnsãå眮ã®äž¡æ¹ãæããŸãã
ç§ãã¡ã¯2ã€ã®ããšãããããšãã§ããŸãïŒ
await
ããŒã¯ãŒãïŒããšãã°ã ?
ããã匷åãªãã€ã³ãã£ã³ã°ãæã€ãã¬ãŒããŒã§ãããããã¯ããã»ã©éèŠã§ã¯ãããŸããïŒstd::Future
æ°ããã¡ãœãããããšãã°fn awaited(self) -> Self::Output { await self }
ã ãã®ååã¯ã block_on
ã blocking
ããŸãã¯ä»ã®èª°ããæãä»ãããè¯ããã®ã«ããããšãã§ããŸããããã«ããããåçŽãªããã¬ãã£ãã¯ã¹ã®äœ¿çšãšãã§ãŒã³ã®äž¡æ¹ãå¯èœã«ãªããã³ã³ããã¹ãããŒã¯ãŒããåŸ æ©ããå¿ èŠããªããªããŸãã
æè¡çã«ã¯ã2çªç®ã®ç®æ¡æžãã¯æ¥å°ŸèŸãã¯ãã䜿çšããŠå®è¡ããããšãã§ããŸãããã®å Žåã .awaited!()
ãšèšè¿°ããŸãã
ããã«ããã次ã®ãããªã³ãŒããå¯èœã«ãªããŸãã
let done = await delayed;
let value = await delayed_result?;
let value2 = await some.thing()?;
let value3 = some.other().thing().awaited()?;
let value4 = promise
.awaited()
.map_err(|e| e.into())?
.obtain_other_future()
.awaited();
ä»ã®åé¡ã¯ããŠããããã®ææ¡ã®äž»ãªãã€ã³ãã¯ã match
ãšåãããã«ãã¡ã«ããºã ã®åºæ¬çãªæ§æèŠçŽ ãšããŠawait
ããã³ã³ãããŒã¿ãŒã䜿çšããŠãå€ãã®å
¥åãçãããšãã§ããããã«ããããšã§ããããããçš®é¡ã®ããŒã¯ãŒããšäžæ¬åŒ§ã ããã¯ãåãæ¹æ³ã§æããããšãã§ããããšãæå³ãããšæããŸããæåã¯åçŽãªawait
ã次ã«æ¬åŒ§ãå€ãããã®ãé¿ããããã«ã .awaited()
ã䜿çšããŠé£éãããããšãã§ããŸãã
ãããã¯ãããéæ³ã®ããŒãžã§ã³ã§ã¯ã await
ããŒã¯ãŒããå®å
šã«åé€ããstd :: Futureã®éæ³ã®.awaited()
ã¡ãœããã«äŸåããããšãã§ããŸããããã¯ãä»ã®äººãç¬èªã®æªæ¥ãæžãããšã«ãã£ãŠå®è£
ããããšã¯ã§ããŸããããç§ã¯æããŸãããã¯ããªãçŽæã«åããç¹å¥ãªå Žåãå€ãããŸãã
std::Future
æ°ããã¡ãœãããããšãã°fn awaited(self) -> Self::Output { await self }
ïŒé¢æ°ãéæ³ã«ããããšãªãã«ïŒããã¯äžå¯èœã ãšç§ã¯ç¢ºä¿¡ããŠããŸãããªããªãããã®äžã§åŸ
ã€ã«ã¯async fn awaited(self) -> Self::Output { await self }
ã§ããå¿
èŠããããããã§ãããèªäœã¯await
å¿
èŠãããããã§ãã ãããŠãé¢æ°ãéæ³ã«ããããšãèããŠããã®ã§ããã°ãããã¯ããŒã¯ãŒãIMOã§ããå¯èœæ§ããããŸãã
Future::wait
ãã§ã«ååšããŸãïŒæããã«0.3ã«ã¯ãŸã ãããŸãããïŒïŒãããã¯ãã¹ã¬ããããããã¯ããå°æ¥ãå®è¡ããŸãã
åé¡ã¯ã_ await
ã®èŠç¹ã¯ãã¹ã¬ããããããã¯ããªãããšã§ãã åŸ
æ©ããæ§æããã¬ãã£ãã¯ã¹ã§ãããåŸçœ®ãªãã·ã§ã³ãå¿
èŠãªå Žåã¯ãã¡ãœããã§ã¯ãªãåŸçœ®ãã¯ãã§ããå¿
èŠããããŸãã
ãããŠãéæ³ã®ã¡ãœããã䜿çšãããšèšãå Žåã¯ãããã.await()
ãšåŒãã§ãã ãããããã¯ãããŒã¯ãŒãã¡ãœãããšéæ³ã®extern "rust-await-magic"
"realã®äž¡æ¹ãšããŠãã¹ã¬ããã§ãã§ã«äœåºŠã説æãããŠããŸãã ãfnã
ç·šéïŒscottmcm ninja'd meãšGitHubã¯ç§ã«éç¥ããŸããã§ããïŒã¢ãã€ã«ã®ããïŒïŒãããã§ããããæ®ãã€ããã§ãã
@scottmcm await
ãæ£åžžãšæãããé »åºŠãšæ¬¡åã®é »åºŠã調æ»ããããšãã§ããŸããïŒ æ¥é èŸãšæ¥å°ŸèŸã®é »åºŠæ°ã®èª¿æ»ã¯ãããã€ãã®è³ªåã«çããã®ã«åœ¹ç«ã€ãšæããŸãã
await
ã®æè¯ã®äœ¿çšäŸã¯client.get("https://my_api").send() await?.json() await?
äŸãšããŠå€ãã®æçš¿ã䜿çšãããŠããŸãã äœããéãããããããŸããããä»ã®ã±ãŒã¹ã¯ãããŸããïŒ ãã®è¡ãã³ãŒãããŒã¹å šäœã«é »ç¹ã«è¡šç€ºãããå Žåã¯ããã®è¡ãé¢æ°ã«æœåºãããšããã§ããããã
id = id.or_else_async(async || self.storage_coordinator.get_default_widget_async() await?.identity) await?;
圌ããããŠããããšã¯ããã¹ãŠã®éäŒç¹ãã¯ã£ãããšèŠããããã«ãæ瀺çã«ããã®ã§ã¯ãªãã await
æ£ç¢ºã«èŠèŠçã«é ãããšã§ãã
ç§ãã¡ã®çŠç¹ãäž»ã«æåã«éäžããŠããéïŒæ€çŽ¢ãšã³ãžã³ã䜿çšãããšãã®ããã«ïŒãåŸ æ©ã¯è¡ã®æåŸã«åãã£ãŠããã·ã¥ãããŸãã
ç§ã¯æããã«ã人ã ãFååã®ãã¿ãŒã³@ dowchris97
ãã ããã³ãŒãã«åããã¿ãŒã³ã䜿çšããããšã¯åœç¶ã®ããšã§ã¯ãããŸããã ããšãã°ãããŒãžäžã®ãã®ãã1ã€ã¯ã人ã
ã?
æ¢ãæ¹æ³ãšäžèŽããŠããããã«æãããããã await
æ¢ãå¯èœæ§ããããŸãã
æç¹ãã¿ãŒã³ã¯ãããã¹ãã®å€§ããªãã£ã³ã¯ãã¹ããããããªã³ã¯ãæ°åãç¹å®ã®åèªããŸãã¯ç¹åŸŽçãªåœ¢ç¶ïŒäœæã眲åãªã©ïŒã®åèªã®ã»ãããªã©ãç¹å®ã®ãã®ãæ¢ãããã«ã¹ãã£ã³ããããšã§æ§æãããŸãã
æ¯èŒã®ããã«ããããè¿ãããå Žåã®ãåãäŸãèŠãŠã¿ãŸãããResult
ã®ä»£ããã«impl Future
ïŒ
let id = id.try_or_else(|| Ok(self.storage_coordinator.try_get_default_widget()?.identity))?;
ãã®ãããªã³ãŒãã®Fååã®èªã¿åããã¿ãŒã³ã¯ã ?
ãèŠã€ããã®ã«åœ¹ç«ããã次ã®ããã«è€æ°ã®è¡ã«åå²ãããŠããå Žåã«ã圹ç«ããªãããšã¯æããã ãšæããŸãã
let id = id.try_or_else(|| {
let widget = self.storage_coordinator.try_get_default_widget()?;
Ok(widget.identity)
})?;
ããªãã«äŒŒã説æã¯ãæ¥å°ŸèŸã®äœçœ®ãããªã¿ãŒã³ãã€ã³ããã¯ã£ãããšèŠããããã«æ瀺çã«ããã®ã§ã¯ãªãã ?
æ£ç¢ºã«èŠèŠçã«é ããŠããããšäž»åŒµããããã«äœ¿çšã§ãããšæããŸããå
ã
�
ã«é¢ããæžå¿µã§ããããå®éã«ã¯åé¡ã§ã¯ãªãã£ãããã§ãã
ãããã£ãŠãå
šäœãšããŠã ?
ãã¹ãã£ã³ããããã«æ¢ã«ãã¬ãŒãã³ã°ãããŠããå Žæã«é
眮ããããšãã人ã
ã«ç¢ºå®ã«è¡šç€ºãããããã«ããããã®æè¯ã®æ¹æ³ã ãšæããŸãã ç§ã¯ééããªãã2ã€ã®ç°ãªãã¹ãã£ã³ãåæã«äœ¿çšããå¿
èŠããªãããšãæãã§ããŸãã
@scottmcm
ãã ããã³ãŒãã«åããã¿ãŒã³ã䜿çšããããšã¯åœç¶ã®ããšã§ã¯ãããŸããã ããšãã°ãããŒãžäžã®ãã®ãã1ã€ã¯ã人ã ã
?
æ¢ãæ¹æ³ãšäžèŽããŠããããã«æããããããawait
æ¢ãå¯èœæ§ããããŸããæç¹ãã¿ãŒã³ã¯ãããã¹ãã®å€§ããªãã£ã³ã¯ãã¹ããããããªã³ã¯ãæ°åãç¹å®ã®åèªããŸãã¯ç¹åŸŽçãªåœ¢ç¶ïŒäœæã眲åãªã©ïŒã®åèªã®ã»ãããªã©ãç¹å®ã®ãã®ãæ¢ãããã«ã¹ãã£ã³ããããšã§æ§æãããŸãã
ãŸããæç¹ãã¿ãŒã³ã䜿çšããããšã§ã³ãŒãããããã/ããéãç解ããã®ã«åœ¹ç«ã€ãšãã蚌æ ã確ãã«ãããŸããã ç¹ã«ã人éãæãäžè¬çã«Fååã®ãã¿ãŒã³ã䜿çšããå Žåã¯ãåŸã§èª¬æããŸãã
ãã®è¡ãäŸã«ãšããšãæç¹æš¡æ§ã䜿ãå§ããã®ã¯ãã€ã§ããããããŸã§èªãã ããšããªããšããŸãã
id = id.or_else_async(async || self.storage_coordinator.get_default_widget_async() await?.identity) await?;
ç§ã«ãšã£ãŠã¯ã async
ãèŠããšãã«å§ããæåã«await?
ã次ã«self.storage_coordinator.get_default_widget_async()
ã次ã«.identity
ãæçµçã«è¡å
šäœã«æ°ã¥ããŸãããéåæã§ãã ããã¯ééããªãç§ã奜ããªèªæžäœéšã§ã¯ãªããšæããŸãã çç±ã®1ã€ã¯ãç§ãã¡ã®æžèšèšèªã·ã¹ãã ã«ã¯ããã®ãããªã€ã³ã¿ãŒãªãŒããããåæ¹ãžã£ã³ããšåŸæ¹ãžã£ã³ãããªãããšã§ãã ãžã£ã³ããããšããã®è¡ãè¡ã£ãŠããããšã®ã¡ã³ã¿ã«ã¢ãã«ã®æ§ç¯ãäžæãããŸãã
æ¯èŒã®ããã«ããã®è¡ã¯äœãããŠããã®ã§ãããã©ããã£ãŠãããç¥ã£ãŠããŸããïŒ
id = await? id.or_else_async(async || {
let widget = await? self.storage_coordinator.get_default_widget_async();
widget.identity
});
await?
ã«éãããšããã«ãããã¯éåæã§ãããšãããããã¢ããããããŸããã 次ã«ã let widget = await?
èªã¿ãŸããããåé¡ãªãããããéåæã§ããããšãããããŸãããäœããèµ·ãã£ãŠããŸãã Fåã®ãã¿ãŒã³ãèžè¥²ããŠãããããªæ°ãããŸãã https://thenextweb.com/dd/2015/04/10/how-to-design-websites-that-mirror-how-our-eyes-work/ã«ãããšãFååãæãäžè¬çã«äœ¿çšããããã¿ãŒã³ã§ãã ããã§ãç§ãã¡ã¯äººéã®æ¬æ§ã«åã£ãã·ã¹ãã ãèšèšããã®ã§ããããããããšã
await? id.or_else_async(async || {
let widget1 = await? self.storage_coordinator.get_default_widget_async();
let result1 = do_some_wierd_computation_on(widget1.identity);
let widget2 = await? self.network_coordinator.get_default_widget_async();
let result2 = do_some_strange_computation_on(widget2.identity);
});
ç§ã¯è¡ãè¶ããŠawait?
ãæ¢ãããšã«ãªã£ãŠããŸããïŒ
let id = id.try_or_elseïŒ|| OkïŒself.storage_coordinator.try_get_default_widgetïŒïŒ?. identityïŒïŒ?;
ãã®ãããæ¯èŒã¯è¯ããªããšæããŸãã ãŸãã ?
ã¯ã¡ã³ã¿ã«ã¢ãã«ãããŸãå€ããŸããã 第äºã«ã ?
ã®æåã¯ãåèªéãååŸã«ãžã£ã³ãããå¿
èŠããªããšããäºå®ã«ãããŸãã .try_get_default_widget()?
?
ãèªãã ãšãã®æèŠã¯ããããããŸãããããã§è¯ãçµæãåŸãããŸããã§ãã ããã§ãããŸãã ãã®è¡ãç解ããããã«ä»ã®äœããèªãããã«æ»ãå¿
èŠã¯ãããŸããã
ãããã£ãŠãç§ã®å šäœçãªçµè«ã¯ãæ¥å°ŸèŸã¯ã³ãŒããæžããšãã«ããã€ãã®éãããå©äŸ¿æ§ãæäŸãããããããªããšããããšã§ãã ãã ããã³ãŒãã®èªã¿åãã«ã¯å€§ããªåé¡ãçºçããå¯èœæ§ããããæžã蟌ã¿ãããé »ç¹ã«çºçãããšç§ã¯äž»åŒµããŠããŸãã
ææ¡ãããrustfmt
ã¹ã¿ã€ã«ãšæ§æã®åŒ·èª¿è¡šç€ºïŒ while
-> async
ã match
-> await
ïŒã§ãããå®éã«ã©ã®ããã«èŠãããïŒ
while fn foo() {
identity = identity
.or_else_async(while || {
self.storage_coordinator
.get_default_widget_async().match?
.identity
}).match?;
}
ããªãã®ããšã¯ããããŸãããã match
ããã«èŠã€ããŸãã
ïŒãã@ CAD97 ãç§ã¯ãããä¿®æ£ããŸããïŒïŒ
@ dowchris97
?
ã¯ã¡ã³ã¿ã«ã¢ãã«ãå€æŽããªããšäž»åŒµããå Žåã await
ã¯ã³ãŒãã®ã¡ã³ã¿ã«ã¢ãã«ãå€æŽããªããšããç§ã®äž»åŒµã®äœãåé¡ã«ãªã£ãŠããŸããïŒ ïŒãããã以åã¯æé»ã®åŸ
æ©ãªãã·ã§ã³ã奜ãã çç±ã§ãããRustã«ã¯é©åã§ã¯ãªããšç¢ºä¿¡ããŠããŸããïŒ
å
·äœçã«ã¯ãé¢æ°ããããŒã®_beginning_ã§async
ãèªã¿åããŸãã é¢æ°ã倧ããããŠ1ã€ã®ç»é¢ã«åãŸããªãå Žåã¯ãã»ãŒç¢ºå®ã«å€§ããããŠã await
ãã€ã³ããèŠã€ããããããä»ã®å€§ããªèªã¿ãããã®åé¡ãçºçããŸãã
async
ã«ãªã£ããããã®ã³ã³ããã¹ããä¿æããå¿
èŠããããŸãã ãããããã®æç¹ã§åŸ
ã£ãŠããã®ã¯ãçŸåšã®å®è¡ãã¬ã€ã³ãããŒãã³ã°ããããšã«ãã£ãŠãé
延èšç®Future
ãçµæOutput
å€æããå€æã§ãã
ãããè€éãªã¹ããŒããã·ã³å€æãæå³ããããšã¯åé¡ã§ã¯ãããŸããã ãããå®è£
ã®è©³çŽ°ã§ãã OSã¹ã¬ãããšããããã³ã°ãšã®å¯äžã®éãã¯ãé
延èšç®ãåŸ
ã£ãŠããéãä»ã®ã³ãŒããçŸåšã®ã¹ã¬ããã§å®è¡ãããå¯èœæ§ãããããã Sync
ã¯ããã»ã©ä¿è·ãããªãããšã§ãã ïŒã©ã¡ãããšããã°ã async fn
ãæšè«ãããŠã¹ã¬ããã»ãŒãã§ã¯ãªãSend + Sync
ããã®èŠä»¶ãšããŠãããèªã¿ãŸãããïŒ
ã¯ããã«æ©èœæåã®ã¹ã¿ã€ã«ã§ã¯ããŠã£ãžã§ãããšçµæã¯æ¬¡ã®ããã«ãªããŸãïŒã¯ããããã¯ã¢ããã䜿çšããŠããªãããšãç¥ã£ãŠããŸããæ¬åœã®çŽç²ããªã©ã¯ç§ãèš±ããŸãïŒïŒ
let widget1 = await(get_default_widget_async(storage_coordinator(self)));
let result1 = do_some_wierd_computation_on(identity(widget1));
let widget2 = await(get_default_widget_async(network_coordinator(self)));
let result2 = do_some_strange_computation_on(identity(widget2));
ããããããã¯ããã»ã¹ãã€ãã©ã€ã³ãšã¯éã®é åºã§ãããããæ©èœçãªçŸ€è¡ã¯ããã€ãã©ã€ã³ãæŒç®å|>
ã
let widget1 = self |> storage_coordinator |> get_default_widget_async |> await;
let result1 = widget1 |> identity |> do_some_wierd_computation_on;
let widget2 = self |> network_coordinator |> get_default_widget_async |> await;
let result2 = widget2 |> identity |> do_some_strange_computation_on;
ãããŠãRustã§ã¯ããã®ãã€ãã©ã€ã³æŒç®åã¯.
ã§ãããã¡ãœããã¢ããªã±ãŒã·ã§ã³ãä»ããŠãã€ãã©ã€ã³åã§ãããã®ãšã¿ã€ãæåã®ã«ãã¯ã¢ããã®ã¹ã³ãŒããæäŸããŸãã
let widget1 = self.storage_coordinator.get_default_widget_async().await();
let result1 = widget1.identity.do_some_wierd_computation_on();
let widget2 = self.network_coordinator.get_default_widget_async().await;
let result2 = widget2.identity.do_some_strange_computation_on();
.
ã|>
ãšåãããã«ããŒã¿ã®ãã€ãã©ã€ã³åãšèãããšãRustã§ããèŠãããé·ããã§ãŒã³ã®æ¹ãçã«ããªã£ãŠããŸããé©åã«ãã©ãŒããããããšïŒCentrilã®äŸã®ããã«ïŒãããŒã¿ã«å€æã®åçŽãã€ãã©ã€ã³ãããã ããªã®ã§ãèªã¿ãããããèŠéããªãã
await
ã¯ããããã¯éåæã§ãããšã¯èšããŸããã async
ã¯ããã§ãã await
ã¯ã延æãããèšç®ãé§è»ããŠåŸ
ã€æ¹æ³ã§ãããRustã®ãã€ãã©ã€ã³ãªãã¬ãŒã¿ãŒãå©çšã§ããããã«ããããšã¯å®å
šã«çã«ããªã£ãŠããŸãã
ïŒãã@Centrilããªãã¯ãããasync fn
ïŒãŸãã¯while fn
ïŒã«ããã®ãå¿ããŸãããããã¯ç§ã®ãã€ã³ããããããèããŸãðïŒ
ãã¯ãåŒã³åºããåå®çŸ©ã§ãããã©ãã
m!(item1, item2)
ãšåãã§ã
item1.m!(item2)
ãã¬ãã£ãã¯ã¹ãšãã¹ããã£ãã¯ã¹ã®äž¡æ¹ã®ã¹ã¿ã€ã«ã§awaitã䜿çšã§ãã
await!(future)
ãããŠ
future.await!()
@ CAD97
await
ã¯ããããã¯éåæã§ãããšã¯èšããŸãããasync
ã¯ããã§ããawait
ã¯ã延æãããèšç®ãé§è»ããŠåŸ ã€æ¹æ³ã§ãããRustã®ãã€ãã©ã€ã³ãªãã¬ãŒã¿ãŒãå©çšã§ããããã«ããããšã¯å®å šã«çã«ããªã£ãŠããŸãã
ãããç§ã¯æ£ããç解ããŠãããšæããŸãããå³å¯ã«ã¯æžããŸããã§ããã
ç§ãããªãã®äž»åŒµãç解ããŠããŸãã ãããã確信ã¯æãŠãŸãããã await
ãåã«çœ®ãæ¹ãã¯ããã«è¯ããšæããŸãã
ç§ãç¥ã£ãŠãã|>
å¹³åã«ä»ã®langaugesã§äœ¿çšãããŠããä»ã®äœããããã¯ããªãçŽ æŽãããå€èŠ³ãšéåžžã«æ¥é èŸã®ä»£ããã«éã«ç§ã«ã¯ãªã¢await
ïŒ
// A
if |> db.is_trusted_identity(recipient.clone(), message.key.clone())? {
info!("recipient: {}", recipient);
}
// B
match |> db.load(message.key)? {
Some(key) => key,
None => {
return Err(/* [...] */);
}
};
// C
let mut res = |> client.get(&script_src)
.header("cookie", self.cookies.read().as_header_value())
.header("user-agent", USER_AGENT)
.send()?
.error_for_status()?;
// D
let mut res: InboxResponse =
|> client.get(inbox_url)
.headers(inbox_headers)
.send()?
.error_for_status()?
|> .json()?;
// E
let mut res: Response =
|> client.post(url)
.multipart(form)
.headers(headers.clone())
.send()?
.error_for_status()?
|> .json()?;
// F
async fn request_user(self, user_id: String) -> Result<User> {
let url = format!("users/{}/profile", user_id);
let user = |> self.request(url, Method::GET, None, true)?
|> .res.json::<UserResponse>()?
.user
.into();
Ok(user)
}
é åºã®èªã¿åãã«é¢ããè°è«ã¯ã ?
眮ãæããtry!()
?
æŒç®åã«ãåæ§ã«åœãŠã¯ãŸããŸãã çµå±ã®ãšããããããããããããããããªããããã¯éèŠã§ããããããã¯æ©ãæ»ããããããªãããéèŠã§ãã å®éã ?
ïŒãã®å
éšã¹ã¬ãããšãã®GitHubã®åé¡ãå«ãïŒãããããã€ã¯ã·ã§ããã®è°è«ã§ã¯ãå¯èŠæ§ã«é¢ããæžå¿µãç¹°ãè¿ãæèµ·ãããŸããã ããããã³ãã¥ããã£ã¯æçµçã«ãããæ¿èªããããšã«æ±ºãã人ã
ã¯ããã«æ
£ããŸããã åºæ¬çã«ãã³ãã¥ããã£ãå¯èŠæ§ã®éèŠæ§ã«ã€ããŠèããå€ãããšããçç±ã ãã§ã修食å?
ãšawait
åŒã®å察åŽã«è¡šç€ºãããããã«ãªãã®ã¯å¥åŠãªããšã§ãã
é åºã®èªã¿åãã«é¢ããè°è«ã¯ã
?
眮ãæããtry!()
?
æŒç®åã«ãåæ§ã«åœãŠã¯ãŸããŸãã çµå±ã®ãšããããããããããããããããªããããã¯éèŠã§ããããããã¯æ©ãæ»ããããããªãããéèŠã§ãã å®éã?
ïŒãã®å éšã¹ã¬ãããšãã®GitHubã®åé¡ãå«ãïŒãããããã€ã¯ã·ã§ããã®è°è«ã§ã¯ãå¯èŠæ§ã«é¢ããæžå¿µãç¹°ãè¿ãæèµ·ãããŸããã ããããã³ãã¥ããã£ã¯æçµçã«ãããæ¿èªããããšã«æ±ºãã人ã ã¯ããã«æ £ããŸããã åºæ¬çã«ãã³ãã¥ããã£ãå¯èŠæ§ã®éèŠæ§ã«ã€ããŠèããå€ãããšããçç±ã ãã§ã修食å?
ãšawait
åŒã®å察åŽã«è¡šç€ºãããããã«ãªãã®ã¯å¥åŠãªããšã§ãã
ããã¯å®éã«ã¯ããªãã®ã³ãŒããäœãããŠããã®ãã§ã¯ãããŸããã ããã¯ãã³ãŒããå®è¡ããŠããããšã®ã¡ã³ã¿ã«ã¢ãã«ãã¢ãã«ãç°¡åã«æ§ç¯ã§ãããã©ãããã·ã§ãã¯ããããã©ãããçŽæçãã©ããã«ã€ããŠã§ãã ãããã¯å€§ããç°ãªãå¯èœæ§ããããŸãã
ãã以äžè°è«ããããããŸããã ããã®å€ãã®äººã ããããæ¯æãããããããŸããããã³ãã¥ããã£ã¯æ¥å°ŸèŸã®è§£æ±ºçã«æ±ºçãã€ããã«ã¯ã»ã©é ããšæããŸãã ããããç§ã¯è§£æ±ºçããããããããªããšæããŸãïŒ
Mozillaã¯Firefoxãæ£ããæ§ç¯ããŠããŸããïŒ UI / UXããã¹ãŠã§ãïŒ ãã®åé¡ã«é¢ããçå£ãªHCIç 究ã¯ã©ãã§ããïŒ ãããã£ãŠãæšæž¬ã§ã¯ãªãããŒã¿ã䜿çšããŠããäºããæ¬åœã«èª¬åŸããããšãã§ããŸãã
@ dowchris97ãã®ã¹ã¬ããã§å®éã®ã³ãŒããæ¯èŒããäŸã¯2ã€ã ããããŸããããŒã¿ããŒã¹ãšreqwestã䜿çšããçŽ24kè¡ã®æ¯èŒãšãCïŒãããŒã¹ã®Rustæ§æãšã®æ£ç¢ºãªæ¯èŒã§ã¯ãªãçç±ã瀺ã1ã€ã®æ¯èŒ
ç·šéïŒååã«æ確ã§ãªãå Žåã§ããCïŒãPythonãC ++ãJavascriptã®ãããã«ããåç
§ã§ã¯ãªãå€ã§self
ãåãåãã¡ã³ããŒã¡ãœããããããŸããã C ++ã¯å³èŸºå€åç
§ã«æãè¿ãã§ããããã¹ãã©ã¯ã¿ã®é åºã¯Rustãšæ¯èŒããŠäŸç¶ãšããŠæ··ä¹±ããŠããŸãã
await
ãæ¥é èŸãšããŠåªããŠãããšããè°è«ã¯ãã³ãŒãã®ã¡ã³ã¿ã«ã¢ãã«ãã©ã®ããã«å€æŽããå¿
èŠããããã§ã¯ãªããæ¥é èŸããŒã¯ãŒãã¯ãããæ¥å°ŸèŸããŒã¯ãŒãããªãïŒæ¥é èŸãéã¯?
äŸç€ºãããŠããããã«ã·ãžã«ã䜿çšããŸãïŒã ãã®ããã await foo()
ã¯foo() await
ãããèªã¿ããããã¹ããŒãã¡ã³ãã®æåŸã«@
ã§ãããã«await
ãããã®ãå«ããªäººãããŸãã
åæ§ã®çç±ã§.await
䜿çšããå¥åŠãªæãïŒããã®ã§ããããæŒç®åã¯ãã¢ã¯ã»ã¹ãã£ãŒã«ããšïŒãããçŽç²ãªãã€ãã©ã€ã³æŒç®åãšã¿ãªãããšãã§ããªãçç±ãããïŒæ§é äœã®æ¹æ³ã«äœ¿çšããã.await
ã¯ãããããã¯ãæ§é äœã®ãã£ãŒã«ããšã¡ãœããã«ã¢ã¯ã»ã¹ããããããŸãã¯ãã£ãŒã«ãã§ãé¢æ°ã§ããªãawait
ã«ã¢ã¯ã»ã¹ããããã«äœ¿çšãããããšèšã£ãŠãããããªãã®ã§ãã
å人çã«ã¯ãæ¥é èŸawait
ãŸãã¯æ¥å°ŸèŸã®å°ç« ïŒ @
å¿
èŠã¯ãããŸããïŒã®ãããããèŠãããšæããŸãã
ã©ã¡ãããå®éã®Rustã³ãŒãã§ã¯ãæ¥å°ŸèŸã§åŸ ã€æ¹ãèªç¶ã«èŠããããšãããããŸãã
ããã¯è«äºã®çãšãªã声æã§ãã reqwestã®äŸã¯ãæ¥å°ŸèŸæ§æã®1ã€ã®ããŒãžã§ã³ã®ã¿ã瀺ããŠããŸãã
å¥ã®èšãæ¹ãããã°ããã®è°è«ã誰ããã£ãšå¥œãããšããæ祚ã«åž°çããå Žåã¯ãé¢æ°ã®åŒæ°ã§impl Trait
ã䜿ã£ããšãã®ããã«äººã
ãæå¥ãèšããªãããã«ãredditã§ããã«ã€ããŠèšåããŠãã ããã
@ eugene2kæ¥å°ŸèŸãRustããã°ã©ããŒã®ã¡ã³ã¿ã«ã¢ãã«ã«é©åãããã©ããã®åºæ¬çãªè°è«ã«ã€ããŠã¯ãã»ãšãã©ãŸãã¯ãã¹ãŠã®æ¥å°ŸèŸã®æ§æã¯ãæ¥é èŸãšæ¯èŒããŠã»ãŒåãã¹ã±ãŒã«ã§ãã æ¥é èŸãšæ¥å°ŸèŸã®éã»ã©ãæ¥å°ŸèŸã®ããªã¢ã³ãéã§èªã¿ãããã®å€§ããªéãã¯ãªããšæããŸãã ã»ãšãã©ã®äœ¿çšæ³ã§ã»ãã³ãã£ã¯ã¹ãçãããšçµè«ä»ããŠããæŒç®åã®åªå é äœã®äœã¬ãã«ã®æ¯èŒãåç §ããŠãã ããããããã£ãŠãã©ã®æŒç®åãæãæå³ãäŒããããéåžžã«éèŠã§ãïŒçŸåšãå®éã®é¢æ°åŒã³åºãæ§æã奜ã¿ãŸãããããã§ã¯ãããŸããïŒä»ã®ãã®ããã匷ã奜ã¿ãæã£ãŠããŸãïŒã
@ eugene2k Rustã§ã®æ±ºå®ã¯ãæ祚ã«ãã£ãŠè¡ãããããšã¯ãããŸããã ãã³ã¯æ°äž»äž»çŸ©ã§ã¯ãªããå®å䞻矩ã§ãã
ã³ã¢/ã©ã³ã°ããŒã ã¯ãããŸããŸãªè°è«ãèŠç¹ããã¹ãŠæ€èšããŠæ±ºå®ããŸãã ãã®æ±ºå®ã¯ãæ祚ã§ã¯ãªããïŒããŒã ã¡ã³ããŒéã®ïŒã³ã³ã»ã³ãµã¹ã«ãã£ãŠè¡ãããŸãã
RustããŒã ã¯ãã³ãã¥ããã£ã®å šäœçãªèŠæã絶察ã«èæ ®ã«å ¥ããŠããŸãããæçµçã«ã¯ãé·æçã«Rustã«æé©ãšæããããã®ã«åºã¥ããŠæ±ºå®ããŸãã
Rustã«åœ±é¿ãäžããæåã®æ¹æ³ã¯ãæ°ããæ å ±ãæ瀺ããããæ°ããè°è«ãããããæ°ããèŠç¹ã瀺ã
æ¢åã®è°è«ãç¹°ãè¿ãããããç§ããïŒãŸãã¯åæ§ã®ããšïŒãšèšã£ããããŠããææ¡ãåãå ¥ããããå¯èœæ§ã¯é«ããªããŸããã 人æ°ã«åºã¥ããŠææ¡ãåãå ¥ããããããšã¯ãããŸããã
ããã¯ããã®ã¹ã¬ããã®ããŸããŸãªè³æ/å察æ祚ããã©ã®ææ¡ãåãå ¥ãããããã«ã¯ãŸã£ããé¢ä¿ãªãããšãæå³ããŸãã
ïŒç§ã¯ããªãã«ç¹ã«èšåããŠããã®ã§ã¯ãªãããã®ã¹ã¬ããã®ãã¹ãŠã®äººã®ããã«ç©äºãã©ã®ããã«æ©èœãããã説æããŠããŸããïŒ
@Pauanã³ã¢/ã©ã³ã°ããŒã ã¯ããŸããŸãªææ¡ãæ€èšããŠæ±ºå®ãããšä»¥åã«èšãããŸããã ãããããã©ã¡ããèªã¿ããããããšãã決å®ã¯å人çãªæ±ºå®ã§ãã ææ決å®è ã«æ瀺ãããè«ççãªè°è«ã®éã¯ã圌ããæã奜ããã®ã«å¯Ÿãã圌ãã®å人çãªèŠæ¹ãå€ããããšã¯ãããŸããã ããã«ããããã¯äººã ãæ€çŽ¢çµæãèªãæ¹æ³ã§ããããããã®ãããªç 究ãè¡ãããããªã©ã®è°è«ã¯ã人ã ãããã奜ã¿ããããã¯ç°¡åã«äºãããããšã瀺ããŸããïŒããã¯æªãããšã§ã¯ãããŸããïŒã ææ決å®è ã®å¿ãå€ãããããããªãã®ã¯ã圌ããèããããªãã£ãæèã§åœŒãã®æ±ºå®ã®é©çšã®çµæãèŠãŠå«ãããšã§ãã ãããã£ãŠãããããã¹ãŠã®ã³ã³ããã¹ããæ€èšããããŒã ã®ææ決å®è ã1ã€ã®ã¢ãããŒãã奜ãäžæ¹ã§ãããŒã ã«å±ããŠããªãä»ã®ã»ãšãã©ã®ãŠãŒã¶ãŒãå¥ã®ã¢ãããŒãã奜ãå Žåãæçµçãªæ±ºå®ã¯ã©ããªãã§ããããã
ãããã£ãŠãããããã¹ãŠã®ã³ã³ããã¹ããæ€èšããããŒã ã®ææ決å®è ã1ã€ã®ã¢ãããŒãã奜ãäžæ¹ã§ãããŒã ã«å±ããŠããªãä»ã®ã»ãšãã©ã®ãŠãŒã¶ãŒãå¥ã®ã¢ãããŒãã奜ãå Žåãæçµçãªæ±ºå®ã¯ã©ããªãã§ããããã
決å®ã¯åžžã«ããŒã ã«ãã£ãŠè¡ãããŸãã éç®ã ããããã«ãŒã«ãæå³çã«èšèšãããæ¹æ³ã§ãã
ãŸããæ©èœã¯å€ãã®å ŽåãããŒã ã¡ã³ããŒã«ãã£ãŠå®è£ ãããŸãã ãŸããããŒã ã¡ã³ããŒã¯ã³ãã¥ããã£å ã§ä¿¡é Œã確ç«ããŠããŸãã ãããã£ãŠã圌ãã¯æ£åœãªæš©éãšäºå®äžã®æš©éã®äž¡æ¹ãæã£ãŠããŸãã
ç¶æ³ãå€åãïŒãããããã£ãŒãããã¯ã«åºã¥ããŠïŒãããŒã ã¡ã³ããŒãèããå€ããå Žåã圌ãã¯æ±ºå®ãå€ããããšãã§ããŸãã ããããããã§ãã決å®ã¯åžžã«ããŒã ã¡ã³ããŒã«ãã£ãŠè¡ãããŸãã
ããªããèšãããã«ã決å®ã¯ãã°ãã°ããçšåºŠã®äž»èŠ³ã䌎ãã®ã§ãã¿ããªãåã°ããããšã¯äžå¯èœã§ããã決å®ãäžããªããã°ãªããŸããã 決å®ãäžãããã«ãRustã䜿çšããã·ã¹ãã ã¯ãããŒã ã¡ã³ããŒãåæã«éããããšã«åºã¥ããŠããŸãã
Rustãå¥ã®æ¹æ³ã§ç®¡çãã
ïŒPSç§ã¯ã³ã¢ããŒã ãŸãã¯ã©ã³ã°ããŒã ã«å±ããŠããªãã®ã§ããã®æ±ºå®ã«æš©éããªãã®ã§ãããªããšåãããã«ã圌ãã«åŸãå¿ èŠããããŸãïŒ
@HeroicKatora
æ¥å°ŸèŸã®ããªãšãŒã·ã§ã³ã®éã«ã¯ãèªã¿ãããã®å€§ããªéãã¯ããŸããªããšæããŸã
åæããŸããã foo().await()?.bar().await()?
ã¯ã foo() await?.bar() await?
ãfoo()@?.bar()@?
ãããèªã¿ããããšæããŸããããã«ãããããããå®éã«ã¯ã¡ãœããã§ã¯ãªãã¡ãœããããããšãæªãåäŸãã§ããŠããŸãããã«æããŸãã
å¥ã®ã¢ã€ãã¢ãææ¡ããããšæããŸãã ãã¬ãã£ãã¯ã¹åŸ
æ©ã¯ä»ã®é¢æ°ãšãã§ãŒã³ããã®ã¯ç°¡åã§ã¯ãªãããšã«åæããŸãã ãã®æ¥å°ŸèŸã®æ§æã¯ã©ãã§ããïŒ foo(){await}?.bar()?{await}
ïŒ é¢æ°åŒã³åºããšæ··åããããšã¯ã§ããããã§ãŒã³ã§èªãã®ã¯ç°¡åãªããã§ãã
ãããŠãç§ãæžããããã«å¥ã®ææ¡ã 次ã®ã¡ãœããåŒã³åºãæ§æã«ã€ããŠèããŠã¿ãŸãããã
async fn request_user(self, user_id: String) -> Result<User> {
let url = format!("users/{}/profile", user_id);
let user = self.[await request(url, Method::GET, None, true)]?
.res.[await json::<UserResponse>()]?
.user
.into();
Ok(user)
}
ä»ã®ææ¡ã®äžã§ããããŠããŒã¯ã§ããçç±ïŒ
ããã§ã¯ãæ¡åŒµæ§ãæ倧ã®å©ç¹ã ãšæããŸãã ãã®æ§æã«ãããè€éã/æçšæ§ã®æ¯çãé«ããããRustã§ã¯äžè¬çãªåœ¢åŒã§ã¯äžå¯èœãªèšèªæ©èœãå®è£ ã§ããŸãã å¯èœãªèšèªæ§æã®ãªã¹ãã以äžã«ç€ºããŸãã
await
-ãããæ©èœããã¯ãã§ãïŒïŒlet result = api.method().[await returns_future()];
let cond = long.method().chain().[!is_empty()];
let val = something.[*returns_ref()];
// from https://users.rust-lang.org/t/pipe-results-like-elixir/11175/19
let deserialized: DataType =
Path::new("path/to/file.json")
.[File::open(&it)].expect("file not found")
.[serde_json::from_reader(it)].expect("error while reading json");
let sorted_vec = iter
.map(mapper)
.collect::<Vec<_>>()
.[sort(),];
consume(&HashMap::new(). [
insert("key1", val1),
insert("key2", val2),
]);
let sf = surface(). [
draw_circle(ci_dimens).draw_rectangle(rect_dimens).finish()?,
draw_something_custom().finish()?,
];
let x = long().method().[dbg!(it)].chain();
æ°ããçš®é¡ã®æ§æïŒããžãã¯ãã£ãŒã«ããæ¥å°ŸèŸãã¯ãããã©ã±ããïŒãå°å ¥ãããšããã®æ©èœã ãã®å Žåãããèšèªã«å€§ããªåœ±é¿ããããRFCãå¿ èŠã«ãªããšæããŸãã
ãã§ã«await
å€çšããŠãããªããžããªã¯ãããŸããïŒ ææ¡ããããã¹ãŠã®ã¹ã¿ã€ã«ã§ãã倧ããªãã£ã³ã¯ãæžãçŽããŠãããããã©ã®ããã«èŠããããã³ãŒããã©ãã»ã©ç解ã§ããããããããç解ã§ããããã«ããããšãææ¡ããŸãã
å¿ é ã®åºåãæåã§æžãçŽããŸãã
// A
if await {db.is_trusted_identity(recipient.clone(), message.key.clone())}? {
info!("recipient: {}", recipient);
}
// B
match await {db.load(message.key)} {
Some(key) => key,
None => {
return Err(/* [...] */);
}
};
// C
let mut res = await { client
.get(&script_src)
.header("cookie", self.cookies.read().as_header_value())
.header("user-agent", USER_AGENT)
.send()
}?.error_for_status()?;
// D
let mut res = await {client.get(inbox_url).headers(inbox_headers).send()}?.error_for_status()?;
let mut res: InboxResponse = await {res.json()}?;
// E
let mut res = await { client
.post(url)
.multipart(form)
.headers(headers.clone())
.send()
}?.error_for_status()?;
let res: Response = await {res.json()}?;
// F
async fn request_user(self, user_id: String) -> Result<User> {
let url = format!("users/{}/profile", user_id);
let (_, mut res) = await {self.request(url, Method::GET, None, true)}?;
let user = await {res.json::<UserResponse>()}?
.user
.into();
Ok(user)
}
await!()
ãšã»ãŒåãã§ãã ã ãããããã¯çŸããèŠããŸãïŒ await!()
ã1ã2幎䜿çšããã®ã«ãããã°ã©ãã³ã°èšèªã®æŽå²ã®ã©ãã«ãçŸããªãåŸçœ®åŸ
ã¡ãçªç¶äœãäžããã®ã¯ãªãã§ããã
ãããšã @ I60Rã®expr.[await it.foo()]
æ§æãšã³ã³ããã¹ãit
ããŒã¯ãŒãã¯éåžžã«åªããŠããŸãã ç§ã¯æŽŸæãªæ°ããæ§æã®ææ¡ã奜ãã ãšã¯æã£ãŠããŸããã§ããããããã¯æ¬åœã«çŽ æŽãããã§ããæ§æã¹ããŒã¹ã®å·§åŠãªäœ¿çšã§ãïŒIIRC .[
ã¯çŸåšã©ãã§ãæå¹ãªæ§æã§ã¯ãªãããïŒããããŠãã£ãšãããã解決ããã§ããããã åŸ
ã€ãããåé¡ã
ééããªãRFCãå¿
èŠã§ãããæè¯ã®éžæè¢ã§ã¯ãªãå¯èœæ§ãããããšã«åæããŸããã ããããããã¬ãã£ãã¯ã¹æŒç®åã¯ãã§ãŒã³ã«æ±ãã«ããããšããåé¡ã解決ããããã®ãªãã·ã§ã³ãããã€ãããããšãç¥ã£ãŠããã®ã§ãåœé¢ã¯await
ãã¬ãã£ãã¯ã¹æ§æã決å®ããåŽã®ãã1ã€ã®ãã€ã³ãã ãšæããŸããããäžè¬çãªæ¹æ³ã§ãå°æ¥çã«ã¯éåæ/åŸ
æ©ä»¥äžã®ã¡ãªããããããŸãã
ãããŠãç§ãæžããããã«å¥ã®ææ¡ã 次ã®ã¡ãœããåŒã³åºãæ§æã«ã€ããŠèããŠã¿ãŸãããã
async fn request_user(self, user_id: String) -> Result<User> { let url = format!("users/{}/profile", user_id); let user = self.[await request(url, Method::GET, None, true)]? .res.[await json::<UserResponse>()]? .user .into(); Ok(user) }
ä»ã®ææ¡ã®äžã§ããããŠããŒã¯ã§ããçç±ïŒ
* Square brackets makes precedence and scoping much cleaner. * Syntax is extensible enough to allow temporary bindings removal in other contexts as well.
ããã§ã¯ãæ¡åŒµæ§ãæ倧ã®å©ç¹ã ãšæããŸãã ãã®æ§æã«ãããè€éã/æçšæ§ã®æ¯çãé«ããããRustã§ã¯äžè¬çãªåœ¢åŒã§ã¯äžå¯èœãªèšèªæ©èœãå®è£ ã§ããŸãã å¯èœãªèšèªæ§æã®ãªã¹ãã以äžã«ç€ºããŸãã
1. Deferring of all prefix operators (including `await` - it's how it supposed to work):
let result = api.method().[await returns_future()]; let cond = long.method().chain().[!is_empty()]; let val = something.[*returns_ref()];
1. Pipeline operator functionality:
// from https://users.rust-lang.org/t/pipe-results-like-elixir/11175/19 let deserialized: DataType = Path::new("path/to/file.json") .[File::open(&it)].expect("file not found") .[serde_json::from_reader(it)].expect("error while reading json");
1. Overriding function return:
let sorted_vec = iter .map(mapper) .collect::<Vec<_>>() .[sort(),];
1. Wither functionality:
consume(&HashMap::new(). [ insert("key1", val1), insert("key2", val2), ]);
1. Chain splitting:
let sf = surface(). [ draw_circle(ci_dimens).draw_rectangle(rect_dimens).finish()?, draw_something_custom().finish()?, ];
1. Postfix macros:
let x = long().method().[dbg!(it)].chain();
æ¬åœã«ç解ã§ããªãã
@tajimahaããªãã®äŸãèŠããšãèªã¿ããããåŒãèµ·ããå¯èœæ§ã®ããããã©ã±ãããå€ããããåé¡ãåé¿ã§ãããããå¿
é ã®åºåãæåã䜿çšããå Žåã await {}
ã¯å®éã«ã¯await!()
ãããã¯ããã«åªããŠãããšæããŸãawait!()
æ§æã®åé¡ã
æ¯èŒïŒ
`` `cïŒ
await {foo.barïŒurlãfalseãqux.cloneïŒïŒïŒ};
with
```c#
await!(foo.bar(url, false, qux.clone()));
ïŒpsèšèªãcïŒã«èšå®ãããšãç°¡åãªäŸãšããŠasync
ãšawait
æ§æã®åŒ·èª¿è¡šç€ºãååŸã§ããŸããïŒ
@nicoburnsãã¯ãã§ã¯ã ()
ã {}
ããŸãã¯[]
ããããã䜿çšã§ããŸãã
@sgrifããã¯è¯ãç¹ã§ãã ãããŠããããäºå®ã§ããããããå¿ é ã®åºåãæåãå«ããã¬ãã£ãã¯ã¹ããŒã¯ãŒããã¯ãªãã·ã§ã³ãšããŠã»ãšãã©æå³ããªãããšããå§ãããŸãã ä»ã®ãã¯ããšã®äžè²«æ§ã倱ããããããåºæ¬çã«ã¡ãªããã¯ãããŸããã
ïŒFWIWãåŸçœ®ãã¯ãã@ I60Rã®æ¥å°ŸèŸã®ææ¡ãªã©ã®äžè¬çãªè§£æ±ºçãããªã¡ãŒã¿ãªãã®æ¥é èŸããæãçã«ããªã£ãŠãããšæããŸãããããããæ¢åã®ãã¯ãã«åºå·ããããªãã·ã§ã³ãå¢ããŠããŸã...ïŒ
ãå¿ é ã®åºåãæåãå«ããã¬ãã£ãã¯ã¹ããŒã¯ãŒããã¯ããªãã·ã§ã³ãšããŠã»ãšãã©æå³ããªãããšããå§ãããŸãã ä»ã®ãã¯ããšã®äžè²«æ§ã倱ããããããåºæ¬çã«ã¡ãªããã¯ãããŸããã
ãªããããã»ãšãã©æå³ããªããªãã®ãããããŠãªããã¯ããšåãæ§æãæããªãããŒã¯ãŒããåé¡ã«ãªãã®ã§ããïŒ
@tajimaha
ãå¿ é ã®åºåãæåãå«ããã¬ãã£ãã¯ã¹ããŒã¯ãŒããã¯ããªãã·ã§ã³ãšããŠã»ãšãã©æå³ããªãããšããå§ãããŸãã ä»ã®ãã¯ããšã®äžè²«æ§ã倱ããããããåºæ¬çã«ã¡ãªããã¯ãããŸããã
ãªããããã»ãšãã©æå³ããªããªãã®ãããããŠãªããã¯ããšåãæ§æãæããªãããŒã¯ãŒããåé¡ã«ãªãã®ã§ããïŒ
await
ããã¯ãã®å Žåãèšèªã«æ§æãè¿œå ããªããšããå©ç¹ããããŸãã ãããã£ãŠãèšèªã®è€éãã軜æžããŸãã ãã ããããŒã¯ãŒãã䜿çšããããšã«ã¯é©åãªè°è«ããããŸãã return
ã break
ã continue
ãããã³ãã®ä»ã®å¶åŸ¡ãããŒå€æŽæ§é ãããŒã¯ãŒãã§ãã ãã ãããããã¯ãã¹ãŠåºåãæåãªãã§æ©èœããããããããã®æ§æãšã®äžè²«æ§ãä¿ã€ããã«ã await
ãåºåãæåãªãã§æ©èœããå¿
èŠããããŸãã
å¿ é ã®åºåãæåã§åŸ æ©ããŠããå Žåã¯ã次ã®ããã«ãªããŸãã
// Macros using `macro!(foo);` syntax
format!("{}", foo);
println!("hello world");
// Normal keywords using `keyword foo;`
continue foo;
return foo;
// *and* the await keyword which is kind of in between the other two syntaxes:
await(foo);
await{foo};
ããã¯ã2ã€ã§ã¯ãªã3ã€ã®æ§æ圢åŒãèŠããŠããå¿ èŠããããããæ··ä¹±ãæãå¯èœæ§ããããŸãããŸããkeyword-with-mandatory-delimitersã¯ãã¯ãæ§æã«åãå©ç¹ããªããããæšæºã«åºå·ããæ¹ãæãŸãããšæããŸããåºåãæåãé©çšãããå Žåã®ãã¯ãæ§æïŒç§ã¯ãããã¹ãã ãšã¯ãŸã£ãã確信ããŠããŸããïŒã
ä»æ¥Rustã§å€ãã®éåæ/åŸ æ©ã䜿çšããŠãã人ãžã®è³ªåïŒé¢æ°/ã¡ãœãããšå€æ°/ãã£ãŒã«ããã©ã®ãããã®é »åºŠã§åŸ æ©ããŠããŸããïŒ
ç°å¢ïŒ
CïŒã§ã¯ã次ã®ãã¿ãŒã³ã«èŠçŽãããããšãè¡ãã®ãäžè¬çã§ããããšãç§ã¯ç¥ã£ãŠããŸãã
var fooTask = this.FooAsync();
var bar = await this.BarAsync();
var foo = await fooTask;
ããããã°ãäž¡æ¹ã䞊è¡ããŠå®è¡ãããŸãã ïŒããã§ã¯Task.WhenAll
ã䜿çšããå¿
èŠããããšèšã人ãããŸãããããã©ãŒãã³ã¹ã®éãã¯ãããã§ãããé
åã€ã³ããã¯ã¹ãééããå¿
èŠããããããã³ãŒããç
©éã«ãªããŸããïŒ
ããããããã¯ä»¥éã«ãŒã¹ãã«ãå®éã«ã¯ããã¹ãŠã§äžŠåã«å®è¡ãããŸããããšããã®ãç§ã®ç解ã poll
ã®ããã«fooTask
ãããŸã§åŒã°ããŸããã§ããbar
ãã®å€ãåŸããããããŠãããããã³ã³ãããŒã¿ã䜿çšããå¿
èŠããããŸã
let (foo, bar) = when_all!(
self.foo_async(),
self.bar_async(),
).await;
ããã§ãç§ã¯ãããªããåŸ ã€å¿ èŠã®ããå€æ°ãŸãã¯ãã£ãŒã«ãã«æªæ¥ãå®æçã«æã£ãŠããã®ãããããšãã»ãšãã©åžžã«åŒã³åºãåŒãåŸ ã£ãŠããã®ããèå³ããããŸãã åŸè ã®å Žåãå®éã«ã¯èª¬æããŠããªãpostfixããŒã¯ãŒãã®å°ããªãã©ãŒãããããªã¢ã³ãããããŸãïŒpostfixããŒã¯ãŒã_no-space_ã
ãããè¯ããã©ããã«ã€ããŠã¯ããŸãèããŠããŸããããã³ãŒãããã®ãŸãŸæžãããšã¯å¯èœã§ã
client.get("https://my_api").send()await?.json()await?
ïŒç§ãèšã£ãããã«ãç§ã¯å®éã«rustfmtã®è°è«ãããããããŸããããæ¥å°ŸèŸããŒã¯ãŒããå«ãçç±ã®1ã€ã¯ãèŠèŠçãªãã£ã³ã¯ãåå²ããã¹ããŒã¹ã§ãããïŒ
ããã䜿çšããå Žåã¯ã .await
æ§æã䜿çšããŠæŽ»çšããããšãã§ããŸã
ãããã®åã§ãã
ä»æ¥Rustã§å€ãã®éåæ/åŸ æ©ã䜿çšããŠãã人ãžã®è³ªåïŒé¢æ°/ã¡ãœãããšå€æ°/ãã£ãŒã«ããã©ã®ãããã®é »åºŠã§åŸ æ©ããŠããŸããïŒ
ããããRustã§ã¯ãå®éã«ã¯ãŸã£ãã䞊è¡ããŠå®è¡ãããªãããšãç解ããŠããŸã[...]
æ£ããã 以åãšåãã³ãŒãããŒã¹ããã次ã®äŸã瀺ããŸãã
let self__ = self_.clone();
let responses: Vec<Response> = {
let futures = all_ids.into_iter().map(move |id| {
self__.request(URL, Method::GET, vec![("info".into(), id.into())])
.and_then(|mut response| response.json().from_err())
});
await!(futures_unordered(futures).collect())?
};
async
ã¯ããŒãžã£ãŒã§ã¯ããŒãžã£ãŒãæžãçŽãå ŽåïŒ
let self__ = self_.clone();
let responses: Vec<Response> = {
let futures = all_ids.into_iter().map(async move |id| {
let mut res =
await!(self__.request(URL, Method::GET, vec![("info".into(), id.into())]))?;
Ok(await!(res.json())?)
});
await!(futures_unordered(futures).collect())?
};
.await
æ§æã«åãæ¿ããïŒãããŠããããã§ãŒã³ããïŒå ŽåïŒ
let self__ = self_.clone();
let responses: Vec<Response> =
futures_unordered(all_ids.into_iter().map(async move |id| {
Ok(self__
.request(URL, Method::GET, vec![("info".into(), id.into())]).await?
.json().await?)
}))
.collect().await?;
ãã§ã«é »ç¹ã«äœ¿çšããŠãããªããžããªã¯ãããŸããïŒ ææ¡ããããã¹ãŠã®ã¹ã¿ã€ã«ã§ãã倧ããªãã£ã³ã¯ãæžãçŽãããšãææ¡ããŸã
@gralpliæ²ããããšã«ãç§ããªãŒãã³ãœãŒã¹ã§äœ¿çšã§ãããã®ã¯ã await!
å€çšããŠããŸããã çŸæç¹ã§ã¯ãééããªãã¢ããªã±ãŒã·ã§ã³ã³ãŒãã«é©ããŠããŸãïŒç¹ã«éåžžã«äžå®å®ã§ãïŒã
let self__ = self_.clone();
let responses: Vec<Response> =
futures_unordered(all_ids.into_iter().map(async move |id| {
Ok(self__
.request(URL, Method::GET, vec![("info".into(), id.into())]).await?
.json().await?)
}))
.collect().await?;
ãããã®è¡ã¯ãæ¥å°ŸèŸãšãã§ãŒã³ã䜿ããããããšã«ãã£ãŠã³ãŒããã©ã®ããã«æ··ä¹±ããããæ£ç¢ºã«ç€ºããŠã
ãã¬ãã£ãã¯ã¹ããŒãžã§ã³ãèŠãŠã¿ãŸãããïŒ
let func = async move |id| {
let req = await { self.request(URL, Method::GET, vec![("info".into(), id.into())]) }?;
Ok(await(req.json())?)
}
let responses: Vec<Response> = await {
futures_unordered(all_ids.into_iter().map(func)).collect()
}?;
2ã€ã®ããŒãžã§ã³ã¯äž¡æ¹ãšã7è¡ã䜿çšããŸããã2çªç®ã®ããŒãžã§ã³ã®IMOã¯ããã¯ãªãŒã³ã§ãã å¿ é ã®åºåãæåã䜿çšããããã®2ã€ã®ãã€ã³ãããããŸãã
future
éšåãé·ãå Žåã await { future }?
ã¯ããããèŠããŸããã let req = await { self.request(URL, Method::GET, vec![("info".into(), id.into())]) }?;
åç
§ããŠãã ããawait(future)
ã䜿çšããæ¹ãããå ŽåããããŸãã Ok(await(req.json())?)
åç
§ããŠãã ããIMOã2ã€ã®ããªã¢ã³ããåãæ¿ããããšã«ããããã®ã³ãŒãã®å¯èªæ§ã¯ä»¥åãããã¯ããã«åäžããŠããŸãã
æåã®äŸã¯ãã©ãŒããããæ£ãããããŸããã rustfmtãããã次ã®ããã«ãã©ãŒããããããšã¯æããªã
ããã rustfmtãå®è¡ããŠãããã«ããäžåºŠæçš¿ããŠãã ããã
@ivandardi @mehcodeã§ããŸããïŒ .await
æ§æããã©ãŒãããããæ¹æ³ãããããŸããã ã³ãŒããã³ããŒããŸããã ããããšãïŒ
ãã®äŸã瀺ãããšãè¿œå ããããšæããŸãïŒ
client.get("https://my_api").send().await?.json().await?
let responses: Vec<Response> =
futures_unordered(all_ids.into_iter().map(async move |id| {
Ok(self__
.request(URL, Method::GET, vec![("info".into(), id.into())]).await?
.json().await?)
}))
.collect().await?;
ããã§ãéåæã¯ããŒãžã£ã¯ãã¹ãŠã®IDãåŠçããããé«ãã¬ãã«ã®å¶åŸ¡futures_unordered
ãšã¯äœã®é¢ä¿ããããŸããã ããããçµã¿åããããšããããç解ããèœåã倧å¹
ã«äœäžããŸãã
ç§ã®æçš¿ãããã¹ãŠãrustfmt
ãééããŸããïŒã³ã³ãã€ã«ããããã«ããã€ãã®å°ããªå€æŽãå ããããŠããŸãïŒã .await?
ãé
眮ããå Žæã¯ãŸã 決ãŸã£ãŠããããçŸåšãåŸ
æ©äžã®è¡ã®æåŸã«é
眮ããŠããŸãã
ä»ãç§ã¯ããããã¹ãŠããªãã²ã©ãããã«èŠããããšã«åæããŸãã ããã¯ç· ãåãã«æžãããã³ãŒãã§ãããäœããåãåºãããã«ã¯ã©ã³ãã³ã°ããæç人ã®éšå±ããããšãç©äºã¯ã²ã©ãèŠããã¯ãã§ãã
ç§ã¯ïŒããªãã®èŠ³ç¹ããïŒãã¬ãã£ãã¯ã¹ã®ä¹±çšãã¯ããã«æªãèŠããå¯èœæ§ãããããšãææããããšæããŸãïŒãã¡ããç§ã®æèŠã§ã¯ïŒïŒ
let responses: Vec<Response> = await!(futures_unordered(all_ids.into_iter().map(async move |id| {
Ok(await!(await!(self__
.request(URL, Method::GET, vec![("info".into(), id.into())]))?
.json())?)
}))
.collect())?;
ããã§ã¯ãå ç©v0.3ã§åŸç¥æµãšããã€ãã®æ°ããã¢ããã¿ãŒã䜿çšããŠã楜ããã§ãã¯ããã«åªãããã®ã«ããŸãããã
let responses: Vec<Response> = await? stream::iter(all_ids)
.then(|id| self.request(URL, Method::GET, vec![("info".into(), id.into())]))
.and_then(|mut res| res.json().err_into())
.try_buffer_unordered(10)
.try_collect();
let responses: Vec<Response> = await stream::iter(all_ids)
.then(|id| self.request(URL, Method::GET, vec![("info".into(), id.into())]))
.and_then(|mut res| res.json().err_into())
.try_buffer_unordered(10)
.try_collect()?;
let responses: Vec<Response> = await {
stream::iter(all_ids)
.then(|id| self.request(URL, Method::GET, vec![("info".into(), id.into())]))
.and_then(|mut res| res.json().err_into())
.try_buffer_unordered(10)
.try_collect()
}?;
let responses: Vec<Response> = stream::iter(all_ids)
.then(|id| self.request(URL, Method::GET, vec![("info".into(), id.into())]))
.and_then(|mut res| res.json().err_into())
.try_buffer_unordered(10)
.try_collect().await?;
let responses: Vec<Response> = stream::iter(all_ids)
.then(|id| self.request(URL, Method::GET, vec![("info".into(), id.into())]))
.and_then(|mut res| res.json().err_into())
.try_buffer_unordered(10)
.try_collect() await?;
ããã«ãã€ããŒãªãããã TryStreamExt::and_then
ã¯ãããŸãããããããããã¯ãã§ãã è²¢ç®ãããæéã®ãã人ã«ãšã£ãŠã¯ç°¡åãªPRã®ããã«èãããŸãã
ç¹°ãè¿ãã«ãªããŸããã await?
ã«å¯Ÿãã匷ãå«æªæãè¡šçŸããããšæããŸããé·ããã§ãŒã³ã§ã¯ãåŒã®æåŸã§æ¢ããŠæé·ãã?
ãå®å
šã«èŠå€±ãããã®åŒã誀ããããã_é¢æ°ãçµäº_ããå¯èœæ§ããããŸãã
ããã«ã fn foo() -> Result<impl Future<Output = Result<_>>>
ããããšã©ããªãããèããŠã await .... ?
ïŒäŸ¿å©ãªåªå
é äœïŒã«å¯Ÿããå«æªæã®é«ãŸããè¡šçŸããããšæããŸãã
// Is this an error? Does`await .. ?` bind outer-most to inner?
await foo()??
ç§ã¯ïŒããªãã®èŠ³ç¹ããïŒãã¬ãã£ãã¯ã¹ã®ä¹±çšãã¯ããã«æªãèŠããå¯èœæ§ãããããšãææããããšæããŸãïŒãã¡ããç§ã®æèŠã§ã¯ïŒïŒ
let responses: Vec<Response> = await!(futures_unordered(all_ids.into_iter().map(async move |id| { Ok(await!(await!(self__ .request(URL, Method::GET, vec![("info".into(), id.into())]))? .json())?) })) .collect())?;
Python javascriptã§ã¯ã人ã ã¯ããããå¥ã ã®è¡ã«æžãå¯èœæ§ãé«ããããããã¯å®éã«ã¯åé¡ã§ã¯ãããŸããã ç§ã¯å®éã«Pythonã§
await (await f)
ãèŠãããšããããŸããã
å¿ é ã®åºåãæåä»ãã®ãã¬ãã£ãã¯ã¹
let responses: Vec<Response> = await {
stream::iter(all_ids)
.then(|id| self.request(URL, Method::GET, vec![("info".into(), id.into())]))
.and_then(|mut res| res.json().err_into())
.try_buffer_unordered(10)
.try_collect()
}?;
ãããã³ã³ãããŒã¿ã®äœ¿çšã«æ»ã£ãŠããããã§ãã async / await
ãå°å
¥ãããã€ã³ãã¯ãå¿
èŠã«å¿ããŠãã®äœ¿çšéãæžããããšã§ãã
ãŸãããããæ¥å°ŸèŸãåŸ ã€ããšã®èŠç¹ã§ãã ããã¯Rustã§ãããããRustã¯é£éãä¿é²ããããã人ã ãããããå¥ã ã®è¡ã«æžã蟌ãå¯èœæ§ã¯äœããªããŸãã ãããŠãã®ããã«ã¯ãåœä»€ã®æµããåãè¡ã®æµãã«åŸãããã«ãæ¥å°ŸèŸã®æ§æã¯æ¬è³ªçã«å¿ é ã§ãã æ¥å°ŸèŸã®æ§æããªãå Žåã¯ãäžæçãªã³ãŒãããã§ãŒã³ãããŸãããæ¥å°ŸèŸãåŸ æ©ããŠããå Žåã¯ããã¹ãŠã1ã€ã®ãã§ãŒã³ã«æžããããšãã§ããŸãã
@ivandardi @mehcode async / awaitã§ã®
å ç©ããŒã¹ã®ãšã³ã·ã¹ãã ã§çµéšãšãŠãŒã¶ãŒãã£ãŒãããã¯ãåŸãåŸãç¹å®ã®äººéå·¥åŠäžã®èª²é¡ãçºèŠããŸããã åŸ æ©ãã€ã³ãéã§å ±æããå¿ èŠã®ããç¶æ ã䜿çšããããšã¯ãéåžžã«äººéå·¥åŠçã§ã¯ãªããã¢ãŒã¯ãŸãã¯çµåãã§ãŒã³ã®ãããããå¿ èŠã§ãããã³ã³ãããŒã¿ãŒã¯ãæåã§æªæ¥ãæžãããã人éå·¥åŠçã§ããããšããããããŸãããããã¹ããããã§ãŒã³ãããã³ãŒã«ããã¯ã®ä¹±éãªã»ããã«ã€ãªããããšããããããŸããã
...éåæIOã䜿çšããå€ãã®èšèªã§äžè¬çã«ãªã£ãŠããã·ã³ã¿ãã¯ã¹ã·ã¥ã¬ãŒïŒasyncããã³awaitããŒã¯ãŒãïŒã§äœ¿çšããŸãã
ãŠãŒã¶ãŒã®èŠ³ç¹ããã¯ãåæã³ãŒãã§ãããã®ããã«async / awaitã䜿çšã§ããé¢æ°ãšåŒã³åºãã«æ³šéãä»ããã ãã§æžã¿ãŸãã
ãããã£ãŠãasync awaitãå°å ¥ããããšã®å šäœçãªãã€ã³ãã¯ããã§ãŒã³ãæžãããéåæã³ãŒããåæã§ãããã®ããã«äœæããããšã§ãã é£éã¯ããã®RFCã§2åã ãèšåãããŠããããã¢ãŒã¯ãŸãã¯çµåé£éã®ãããããå¿ èŠããšããã¹ããããé£éã³ãŒã«ããã¯ã®ä¹±éãªã»ããã«ã€ãªããããšããããããŸããã ç§ã«ã¯ããŸãããžãã£ãã«èãããŸããã
é£éããããã£ãŠæ¥å°ŸèŸããŒã¯ãŒãã䞻匵ããã«ã¯ããã®RFCãå€§å¹ ã«æžãçŽãå¿ èŠããããããããŸããã
@tajimahaããªãã¯RFCã誀解ããŠããŸãã ç¹ã«Futureã³ã³ãããŒã¿ïŒ map
ã and_then
ãªã©ïŒã«ã€ããŠè©±ããŠããã®ã§ãããäžè¬çãªãã§ãŒã³ã«ã€ããŠã¯è©±ããŠããŸããïŒããšãã°ã impl Future
ãè¿ãã¡ãœããïŒã
async
ã¡ãœããã¯éåžžã«äžè¬çã§ãããšèšã£ãŠãéèšã§ã¯ãªãã®ã§ãé£éã¯ç¢ºãã«éåžžã«éèŠã§ãã
ããã«ãããã»ã¹ã誀解ããŠããŸããRFCãæžãçŽãå¿ èŠã¯ãããŸããã RFCã¯åºçºç¹ã§ãããä»æ§ã§ã¯ãããŸããã RFCã®ã©ããç³ã«èšå®ãããŠããŸããïŒãŸãããããã¹ãã§ã¯ãããŸããïŒïŒ
RFCããã»ã¹ã¯æµåçã§ãããããªãã瀺åããŠããã»ã©å³æ Œã§ã¯ãããŸããã RFCã«ã¯ãæ¥å°ŸèŸawait
ã«ã€ããŠè°è«ããããšã劚ãããã®ã¯ãããŸããã
ãŸããå€æŽã¯å ã®RFCã§ã¯ãªãå®å®åRFCã«åæ ãããŸãïŒãã§ã«åãå ¥ããããŠãããããå€æŽãããŸããïŒã
é£éããããã£ãŠæ¥å°ŸèŸããŒã¯ãŒãã䞻匵ããã«ã¯ããã®RFCãå€§å¹ ã«æžãçŽãå¿ èŠããããããããŸããã
ç§ã¯ããã§åè«ãèšã£ãŠããŸãã
RFCãäœæãããšãããããã1ã€ã®ããšãåœãŠã¯ãŸããŸãã 人ã
ã¯ç¹ã«ãåæã³ãŒãã§ãããã®ããã«async / awaitã䜿çšã§ãããæ°ããããŒã«ãæãã§ããŸããã æ§æã«åŸã£ãäŒçµ±ã¯ããã®çŽæãããããæããã§ãããã
ãããŠãããã§ããªããèŠããããã¯å°æ¥ã®ã³ã³ãããŒã¿ã§ã¯ãããŸããã
let responses: Vec<Response> =
futures_unordered(all_ids.into_iter().map(async move |id| {
Ok(self__
.request(URL, Method::GET, vec![("info".into(), id.into())]).await?
.json().await?)
}))
.collect().await?;
ããã§ããããããã¯ããã¹ããããã§ãŒã³ãããã³ãŒã«ããã¯ã®åä»ãªã»ããã«ã€ãªããããšããããããŸãããã
人ã ã¯ç¹ã«ãåæã³ãŒãã§ãããã®ããã«async / awaitã䜿çšã§ãããæ°ããããŒã«ãæãã§ããŸããã æ§æã«åŸã£ãäŒçµ±ã¯ããã®çŽæãããããæããã§ãããã
ãããã©ã®ããã«çå®ã§ãããã¯ããããŸãããæ¥é èŸawait
äž¡æ¹ããã®æ¬²æ±ãæºãããŸãã
å®éãæ¥å°ŸèŸawait
ãã¡ãœãããã§ãŒã³ïŒåæRustã³ãŒãã§éåžžã«äžè¬çã§ãïŒïŒã§ã¯éåžžã«èªç¶ã§ããããããããããã®æ¬²æ±ãããããæºãããŸãã
ãã¬ãã£ãã¯ã¹await
ã䜿çšãããšãå€ãã®äžæå€æ°ã倧å¹
ã«ä¿é²ãããŸãããããã¯æ
£çšçãªRustã¹ã¿ã€ã«ã§ã¯ãªãããšããããããŸãã
ããã§ããããããã¯ããã¹ããããã§ãŒã³ãããã³ãŒã«ããã¯ã®åä»ãªã»ããã«ã€ãªããããšããããããŸãããã
ã¯ããŒãžã£ã1ã€ã ã衚瀺ãããŸãããããã¯ã³ãŒã«ããã¯ã§ã¯ãªãã Iterator
map
ãåŒã³åºããŠããã ãã§ãïŒå
ç©ãšã¯ãŸã£ããé¢ä¿ãããŸããïŒïŒ
ãã¬ãã£ãã¯ã¹await
ãæ£åœåããããã«ãRFCã®åèªãã²ããããšããªãã§ãã ããã
RFCã䜿çšããŠãã¬ãã£ãã¯ã¹await
ãæ£åœåããã®ã¯éåžžã«å¥åŠã§ããããã¯ãRFCèªäœãæ§æãæçµçãªãã®ã§ã¯ãªããåŸã§æ±ºå®ããããšè¿°ã¹ãŠããããã§ãã ãã®æ±ºå®ã®æã¯ä»ã§ãã
決å®ã¯ããŸããŸãªææ¡ã®ã¡ãªããã«åºã¥ããŠè¡ãããŸããå ã®RFCã¯å®å šã«ç¡é¢ä¿ã§ãïŒæçšãªæŽå²çåç §ãšããŠã®å Žåãé€ãïŒã
@mehcodeã®ææ°ã®äŸã¯ãäž»ã«_stream_ã³ã³ãããŒã¿ã䜿çšããŠããããšã«æ³šæããŠãã ããïŒãããŠãå°æ¥ã®1ã€ã®ã³ã³ãããŒã¿ã¯ç°¡åã«éåæãããã¯ã«çœ®ãæããããšãã§ããŸãïŒã ããã¯ãåæã³ãŒãã§ã€ãã¬ãŒã¿ã³ã³ãããŒã¿ã䜿çšããã®ãšåãã§ãããããã«ãŒããããé©åãªç¶æ³ã§äœ¿çšã§ããŸãã
ããã¯è©±é¡ããå€ããŠããŸãããããã§ã®äŒè©±ã®ã»ãšãã©ã¯ã12人ã»ã©ã®ã³ã¡ã³ãæçš¿è ã«ãã£ãŠè¡ãããŠããŸãã ç§ããã®å·ãããéãããšãã®383ã®ã³ã¡ã³ãã®ãã¡ã88ã®ãŠããŒã¯ãªãã¹ã¿ãŒãããããŸããã§ããã ãããã®ã³ã¡ã³ããèªã¿ã«è¡ããªããã°ãªããªã人ãçãå°œãã/é床ã®è² æ ããããªãããã«ããããã«ãã³ã¡ã³ããã§ããã ã培åºããåã®ãã€ã³ãã®ç¹°ãè¿ãã§ã¯ãªãããšã確èªããããšããå§ãããŸãã
ã³ã¡ã³ãã®ãã¹ãã°ã©ã
HeroicKatora:(32)********************************
Centril:(22)**********************
ivandardi:(21)*********************
I60R:(21)*********************
Pzixel:(16)****************
novacrazy:(15)***************
scottmcm:(13)*************
EyeOfPython:(11)***********
mehcode:(11)***********
Pauan:(10)**********
XX:(9)*********
nicoburns:(9)*********
tajimaha:(9)*********
skade:(8)********
CAD97:(8)********
Laaas:(8)********
dpc:(8)********
ejmahler:(7)*******
Nemo157:(7)*******
yazaddaruvala:(6)******
traviscross:(6)******
CryZe:(6)******
Matthias247:(5)*****
dowchris97:(5)*****
rolandsteiner:(5)*****
earthengine:(5)*****
H2CO3:(5)*****
eugene2k:(5)*****
jplatte:(4)****
lnicola:(4)****
andreytkachenko:(4)****
cenwangumass:(4)****
richardanaya:(4)****
chpio:(3)***
joshtriplett:(3)***
phaylon:(3)***
phaazon:(3)***
ben0x539:(2)**
newpavlov:(2)**
comex:(2)**
DDOtten:(2)**
withoutboats:(2)**
valff:(2)**
darkwater:(2)**
tanriol:(1)*
liigo:(1)*
yasammez:(1)*
mitsuhiko:(1)*
mokeyish:(1)*
unraised:(1)*
mzji:(1)*
swfsql:(1)*
spacekookie:(1)*
sgrif:(1)*
nikonthethird:(1)*
edwin-durai:(1)*
norcalli:(1)*
quodlibetor:(1)*
chescock:(1)*
BenoitZugmeyer:(1)*
F001:(1)*
FuGangqiang:(1)*
Keruspe:(1)*
LegNeato:(1)*
MSleepyPanda:(1)*
SamuelMoriarty:(1)*
Swoorup:(1)*
Uristqwerty:(1)*
alexmaco:(1)*
arabidopsis:(1)*
arielb1:(1)*
axelf4:(1)*
casey:(1)*
lholden:(1)*
cramertj:(1)*
crlf0710:(1)*
davidtwco:(1)*
dyxushuai:(1)*
eaglgenes101:(1)*
AaronFriel:(1)*
gralpli:(1)*
huxi:(1)*
ian-p-cooke:(1)*
jonimake:(1)*
josalhor:(1)*
jsdw:(1)*
kjetilkjeka:(1)*
kvinwang:(1)*
@mehcodeã®ææ°ã®äŸã¯ãäž»ã«_stream_ã³ã³ãããŒã¿ã䜿çšããŠããããšã«æ³šæããŠãã ããïŒãããŠãå°æ¥ã®1ã€ã®ã³ã³ãããŒã¿ã¯ç°¡åã«éåæãããã¯ã«çœ®ãæããããšãã§ããŸãïŒã ããã¯ãåæã³ãŒãã§ã€ãã¬ãŒã¿ã³ã³ãããŒã¿ã䜿çšããã®ãšåãã§ãããããã«ãŒããããé©åãªç¶æ³ã§äœ¿çšã§ããŸãã
@Pauanã©ãããããã¯èšèããããã ãã§ã¯ãããŸããã æ¥å°ŸèŸæ§æãµããŒã¿ãŒã«ãã£ãŠæžãããå®éã®ã³ãŒãã®åé¡ã瀺ããŠããŸãã ãããŠãç§ãèšã£ãããã«ããã¬ãã£ãã¯ã¹ã¹ã¿ã€ã«ã³ãŒãã¯ããªãã®æå³ããããã瀺ããŠããŸããããã¹ããã£ãã¯ã¹ãµããŒã¿ãŒãäžå¹³ãèšãããã«å¿
ãããããããã§ã¯ãããŸããïŒå°ãªããšããã®å ŽåïŒã ãŸããã³ãŒãã«2ã€ã®åŸ
æ©ããã1ã€ã®ã©ã€ããŒãã§ãŒã³ããããšãããšãæåã®ã©ã€ããŒããããã°ããã«ã¯ã©ãããã°ããã§ããïŒ ïŒããã¯æ¬åœã®è³ªåã§ãããç§ã«ã¯ããããŸããïŒã
第äºã«ãéã®ã³ãã¥ããã£ã¯å€§ãããªããå€æ§ãªããã¯ã°ã©ãŠã³ããæã€äººã
ïŒç§ã®ããã«ãç§ã¯python / c / javaãæããã䜿çšããŸãïŒã¯ãã¡ãœãããã§ãŒã³ãç©äºãè¡ãããã®æè¯ã®æ¹æ³ã§ããããšã«å
šå¡ãåæããããã§ã¯ãããŸããã 決å®ãäžããšããããã¯ïŒãããã¹ãã§ã¯ãªãïŒæãæ©ãæ¡çšè
ã®èŠç¹ã«åºã¥ããŠããã ãã§ã¯ãªãããšãé¡ã£ãŠããŸãã
@tajimahaãã¹ããã£ãã¯ã¹ãããã¬ãã£ãã¯ã¹ãžã®æ倧ã®æ確ãªå€æŽã¯ãããã€ãã®ãã¹ããããé¢æ°åŒæ°ãåé€ããããã«ããŒã«ã«ã¯ããŒãžã£ã䜿çšããŠããããã§ãã ããã¯ç§ã«ãšã£ãŠæ¥é èŸã«åºæã®ããã«ã¯èŠããŸããããããã¯ããªãçŽäº€ããŠããŸãã æ¥å°ŸèŸã«ã€ããŠãåãããšãã§ããŸãããããã¯ããã«æ確ã ãšæããŸãã ãããäžéšã®ã³ãŒãããŒã¹ã®ãã§ãŒã³ã®èª€çšã§ããå¯èœæ§ãããããšã«åæããŸããããã®èª€çšãã©ã®ããã«äžæã§ãããããŸãã¯äž»èŠãªæ¹æ³ã§æ¥å°ŸèŸã«é¢é£ããŠãããã¯ããããŸããã
let get_one_id = async move |id| {
self.request(URL, Method::GET, vec![("info".into(), id.into())])
.await?
.json().await
};
let responses: Vec<Response> = futures_unordered(all_ids.into_iter().map(get_one_id))
.collect().await?;
ãã ããæ¥å°ŸèŸã§ã¯ãçµæã®let
ãã€ã³ãã£ã³ã°ãšOk
ãäžç·ã«åé€ããŠãæåŸã®?
ãäžç·ã«åé€ããŠçµæãçŽæ¥æäŸã§ããŸãããã®å Žåãã³ãŒããããã¯ãäžèŠã§ããå人çãªå¥œã¿ã§ã åãã¹ããŒãã¡ã³ãã§2ã€ã®åŸ
æ©ããããããããã¯ãã¬ãã£ãã¯ã¹ã§ã¯ãŸã£ããããŸãæ©èœããŸããã
Rustã³ãŒãã§ãã€ã³ãã£ã³ã°ãäžçŸ©çã§ãããšããå®æçã«è¿°ã¹ãããŠããææ
ãç解ããŠããŸããã ãããã¯ã³ãŒãäŸãç¹ã«çµæåŠçã«é¢ããŠéåžžã«é »ç¹ã§äžè¬çã§ãã ç§ãæ±ã£ãŠããã³ãŒãã«2ã€ä»¥äžã®?
ã衚瀺ãããããšã¯ãã£ãã«ãããŸããã
ãŸãã idiomatic
ãšã¯èšèªã®åç¶æéäžã«å€åãããããåŒæ°ãšããŠäœ¿çšããå Žåã¯çŽ°å¿ã®æ³šæãæããŸãã
ãã®ãããªãã®ã以åã«ææ¡ããããã©ããã¯ããããŸããããæ¥é èŸawait
ããŒã¯ãŒããåŒå
šäœã«é©çšã§ããŸããïŒ ä»¥åã«æèµ·ãããäŸããšããšïŒ
let result = await client.get("url").send()?.json()?
ããã§ã get
ã send
ãããã³json
ã¯éåæã§ãã
ç§ã«ãšã£ãŠïŒä»ã®ããã°ã©ãã³ã°èšèªã§ã®éåæã®çµéšã¯ã»ãšãã©ãããŸããïŒãæ¥å°ŸèŸexpr await
ã¯èªç¶ã«èŠããŸãïŒããããå®è¡ããŠãçµæãåŸ
ã¡ãŸããã
次ã®äŸãå¥åŠã«èŠãããšããæžå¿µãããã€ããããŸããã
client.get("https://my_api").send() await?.json() await? // or
client.get("https://my_api").send()await?.json()await?
ãã ããããã¯ããã€ãã®è¡ã«åå²ããå¿ èŠããããšç§ã¯äž»åŒµããŸãã
client.get("https://my_api").send() await?
.json() await?
ããã¯ã¯ããã«æ確ã§ããã await
ãåžžã«è¡æ«ã«ããå Žåã¯ãç°¡åã«èŠã€ãããããšããè¿œå ã®å©ç¹ããããŸãã
IDEã§ã¯ããã®æ§æã«ã¯ããããã®åãããããŸãããããã¬ãã£ãã¯ã¹ããŒãžã§ã³ãããåªããŠããŸããããããå
¥åããŠããawait
ãå
¥åããå¿
èŠãããããšã«æ°ä»ããå Žåã¯ãããããåé€ããã ãã§ãã ã await
ããšå
¥åããŸãã ã€ãŸããIDEãããŒã¯ãŒãã®ãªãŒãã³ã³ããªãŒããæäŸããŠããªãå Žåã§ãã
ãããæ§æexpr.await
ã¯ãä»ã®å¶åŸ¡ãããŒããŒã¯ãŒãããããã䜿çšããªããããæ··ä¹±ãæããŸãã
åé¡ã¯ããã§ãŒã³ããããŸãããããã¯ããªãã®å ŽåããããŸããããã¹ãŠããã§ãŒã³ã§è¡ãå¿ èŠããããšæ¥µç«¯ã«èšã£ãŠã¯ãããªããšããããšã ãšæããŸãã CãŸãã¯Pythonã¹ã¿ã€ã«ã®ããã°ã©ãã³ã°çšã®ããŒã«ãæäŸããå¿ èŠããããŸãã Pythonã«ã¯ãã§ãŒã³ã³ã³ããŒãã³ããã»ãšãã©ãããŸãããããã®ã³ãŒãã¯èªã¿ããããšç§°è³ãããããšããããããŸãã Pythonããã°ã©ããŒããäžæå€æ°ãå€ããããšæå¥ãèšããŸããã
æ¥å°ŸèŸthen
ã©ãã§ããïŒ
Rustã³ãŒãã§ãã€ã³ãã£ã³ã°ãäžçŸ©çã§ãããšããå®æçã«è¿°ã¹ãããŠããææ ãç解ããŠããŸããã ãããã¯ã³ãŒãäŸãç¹ã«çµæåŠçã«é¢ããŠéåžžã«é »ç¹ã§äžè¬çã§ãã ç§ãæ±ã£ãŠããã³ãŒãã«2ã€ä»¥äžã®
?
ã衚瀺ãããããšã¯ãã£ãã«ãããŸããããŸãã
idiomatic
ãšã¯èšèªã®åç¶æéäžã«å€åãããããåŒæ°ãšããŠäœ¿çšããå Žåã¯çŽ°å¿ã®æ³šæãæããŸãã
ããã«ããã1è¡ã«2ã€ä»¥äžã®?
ãããçŸåšã®Rustã³ãŒãã調æ»ããããã«ãªããŸããïŒèª°ããè€æ°è¡ã®äœ¿çšç¶æ³ã調æ»ã§ããå¯èœæ§ããããŸãïŒã xi-editorãalacrittyãripgrepãbatãxrayãfdãfirecrackerãyewãRocketãexaãironãparity-ethereumãtikvã調æ»ããŸããã ãããã¯ã»ãšãã©ã®æãæã€Rustãããžã§ã¯ãã§ãã
ç§ãèŠã€ããã®ã¯ãåèš585562è¡ã®ãã¡çŽ40è¡?
ããŠããããšã§ãã ããã¯0.006ïŒ
ã§ãã
ãŸããæ¢åã®ã³ãŒã䜿çšãã¿ãŒã³ã調ã¹ãŠããŸãã
æ°ããAPIãæäœãããžã§ããäžããããŠãããããªã¯ãšã¹ãã®äœ¿çšã«æ £ããŠããªããšããŸãã ããªããæžãå¯èœæ§ããããŸãã
client.get("https://my_api").send().await?.json().await?
ãã£ãäžçºã§ïŒ APIãåããŠäœ¿çšããå Žåã¯ããªã¯ãšã¹ããæ£ããäœæããæ»ãã¹ããŒã¿ã¹ã確èªãããã®APIãäœãè¿ããã«ã€ããŠã®ä»®å®ã確èªãããã次ã®ããã«APIãè©ŠããŠã¿ãããšããå§ãããŸãã
let request = client.get("https://my_api").header("k", "v");
dbg!(request);
let response = await(request.send())?;
dbg!(response);
let data = await(response.json())?;
dbg!(data);
ãããã¯ãŒã¯APIã¯ã¡ã¢ãªããŒã¿ã®ãããªãã®ã§ã¯ãªããããã«äœãããã®ãââããããŸããã ããã¯ãããã¿ã€ãã³ã°ã«ãšã£ãŠéåžžã«èªç¶ãªããšã§ãã ãããŠããããã¿ã€ãã³ã°ãããŠãããšãã¯ãäžæå€æ°ãå€ãããããã¹ãŠãæ£ãããªãããšãå¿é ã
let request = client.get("https://my_api").header("k", "v");
dbg!(request);
let response = request.send().await?;
dbg!(response);
let data = response.json().await?;
dbg!(data);
ãããããã§ã«ãããæã£ãŠããå ŽåïŒ
let request = client.get("https://my_api").header("k", "v");
dbg!(request);
let response = await(request.send())?;
dbg!(response);
let data = await(response.json())?;
dbg!(data);
ããªããããªããã°ãªããªãã®ã¯ãããããããé¢æ°ã§ã©ããããããšã§ãããããªãã®ä»äºã¯å®äºããŸããé£éã¯ãã®ããã»ã¹ã§ããçŸããŸããã
ç§ãèŠã€ããã®ã¯ãåèš585562è¡ã®ãã¡2ã€ä»¥äžã䜿çšããŠããã®ã¯çŽ40è¡ã ãã§ããïŒ äžè¡ã§ã
ããã¯æçšãªæž¬å®ã§ã¯ãªãããšããå§ãããŸãã æ¬åœã«éèŠãªã®ã¯ãè€æ°ã®å¶åŸ¡ãããŒæŒç®å_åŒããš_ã§ãã å
žåçãªïŒrustfmtïŒã¹ã¿ã€ã«ã«ãããšããããã¯åãåŒã«å±ããŠããŠããã»ãšãã©ã®å Žåãã¡ã€ã«å
ã®ç°ãªãè¡ã«é
眮ãããããã await
æ¥å°ŸèŸãïŒçè«çã«ïŒéèŠãªéã§é£éããŸãã
ãã¹ãŠãé£éçã«è¡ãã¹ãã ãšèšã£ãŠæ¥µç«¯ã«è¡ãã¹ãã§ã¯ãããŸãã
ãã¹ãŠãé£éã§è¡ãã¹ãã ãšèª°ããèšã£ãããšããããŸããïŒ ãããŸã§èŠãŠããããšã¯ãåæã³ãŒãã§çºçããã®ãšåãããã«ãæå³ãããå Žåã¯ãã§ãŒã³ããããšã_人éå·¥åŠç_ã§ããã¹ãã ãšããããšã ãã§ãã
åèš585562è¡ã®ãã¡2ã€ä»¥äžã䜿çšããŠããã®ã¯çŽ40è¡ã ãã§ããïŒ äžè¡ã§ã
ãããæ¥é èŸãšæ¥å°ŸèŸã«é¢é£ããŠãããã©ããã¯ããããŸããã æ¥å°ŸèŸãå¿
èŠãªCïŒã®äŸã®_none_ã«ã¯ã1è¡ã«è€æ°ã®await
å«ãŸããŠãããã¹ããŒãã¡ã³ãã«è€æ°ã®await
å«ãŸããŠããããšã«ã泚æããŠãã ããã ãŸãã @ Centrilã®æœåšçãªæ¥å°ŸèŸã¬ã€ã¢ãŠãã®äŸã§ã¯ã1è¡ã«è€æ°ã®await
é
眮ãããŸããã§ããã
ããè¯ãæ¯èŒã¯ãã³ã³ãã€ã©ããã®æ¬¡ã®äŸã®ããã«ã ?
ãããã§ãŒã³ããããã®ãšã®æ¯èŒãããããŸããã
Ok(&self.get_bytes(cx, ptr, size_with_null)?[..size])
self.try_to_scalar()?.to_ptr().ok()
let idx = decoder.read_u32()? as usize;
.extend(self.at(cause, param_env).eq(v1, v2)?.into_obligations());
for line in BufReader::new(File::open(path)?).lines() {
ç·šéïŒä»åã¯ç§ãåããããã§ãã @ CAD97 ïŒslightly_smiling_faceïŒ
ããã¯ãå€ãã®then
ãå«ãjavasciptã®promiseã³ãŒããšé©ãã»ã©äŒŒãŠããŸãã ç§ã¯ãããåæãšã¯åŒã³ãŸããã ã»ãŒç¢ºå®ã«ããã§ãŒã³ã«ã¯await
ãããåæããŠãããµããããŸãã
å¿ é ã®åºåãæåä»ãã®ãã¬ãã£ãã¯ã¹
let responses: Vec<Response> = await {
stream::iter(all_ids)
.then(|id| self.request(URL, Method::GET, vec![("info".into(), id.into())]))
.and_then(|mut res| res.json().err_into())
.try_buffer_unordered(10)
.try_collect()
}?;
@ CAD97 @ scottmcmè¯ãç¹ã ç§ã枬å®ããŠãããã®ã«ã¯å¶éãããããšãç§ã¯ç¥ã£ãŠããŸããïŒ
ïŒèª°ããè€æ°è¡ã®äœ¿çšç¶æ³ã調æ»ã§ãããããããŸããïŒ
@skadeãawait
ãš?
é¡äŒŒæ§ã«ã€ããŠèšåããããããããè¡ã£ãŠããã®ã§ãç°¡åãªåæãè¡ããŸããã ç§ã¯çå£ãªç 究ãããŠããªããšããèããæäŸããŠããŸãã ã³ãŒããèŠãŠãããã现ããåæã¯é£ãããšæããŸãããïŒ ç§ãããç¥ããªãåŒã®è§£æãšèå¥ãå¿
èŠã«ãªãå ŽåããããŸãã 誰ãããã®åæãè¡ããããšãé¡ã£ãŠããŸãã
ãã¹ãŠãé£éã§è¡ãã¹ãã ãšèª°ããèšã£ãããšããããŸããïŒ ç§ããããŸã§èŠãŠããããšã¯ãåæã³ãŒãã§çºçããã®ãšåãããã«ããããçã«ããªã£ãŠããå Žåã«ãã§ãŒã³ããããšã¯äººéå·¥åŠçã§ããã¹ãã ãšããããšã ãã§ãã
ç§ãèšã£ãŠããã®ã¯ãæ¥å°ŸèŸã ããè¿œå ãããå ŽåãC / Pythonã¹ã¿ã€ã«ãèŠæ ãããããšãã«äººéå·¥åŠçã§ã¯ãªããšããããšã§ãïŒãã¡ããimoïŒã ãŸãããããã¿ã€ããäœæãããšãã«ãã§ãŒã³ãå¿ èŠãªãå ŽåããããŸãã
ãã®ã¹ã¬ããã®æ¹åæ§ã¯ãé床ã®é£éãšãã³ãŒããã§ããã ãç°¡æœã«ããæ¹æ³ã«çŠç¹ãåœãŠãããŠããããã«æããŸãã
代ããã«ãéåæã³ãŒããåæããªã¢ã³ããšã©ã®ããã«ç°ãªããããããŠããã䜿çšæ³ãšãªãœãŒã¹äœ¿çšçã«ã©ã®ããã«åœ±é¿ãããã確èªããããšããã¹ãŠã®äººã«å§ããããšæããŸãã ãã®ã¹ã¬ããã®400ã®ã³ã¡ã³ãã®ãã¡5ã€æªæºãããããã®éãã«ã€ããŠèšåããŠããŸãã ãããã®éãã«æ°ä»ããŠããªãå Žåã¯ãçŸåšã®ãã€ããªãŒããŒãžã§ã³ãå ¥æããŠãé©åãªéåæã³ãŒãã®ãã£ã³ã¯ãæžããŠã¿ãŠãã ããã éå»20件ã®æçš¿ã§èª¬æãããŠããã³ãŒãã³ã³ãã€ã«ã®æ £çšçãªïŒéã³ã³ãããŒã¿ïŒéåæ/åŸ æ©ããŒãžã§ã³ãååŸããããšãå«ã¿ãŸãã
çŽç²ã«yield / awaitãã€ã³ãã®éã«ç©äºãååšãããã©ãããåç
§ãåŸ
æ©ãã€ã³ãéã§æ°žç¶åããããã©ããããããŠå€ãã®å Žåãå
ç©ã«é¢ããããã€ãã®åºæã®èŠä»¶ã«ããããã®ã¹ã¬ããã§æ³åãããã»ã©ç°¡æœãªã³ãŒããæžãããšãã§ããªããã©ãããç°ãªããŸãã ããšãã°ãä»»æã®éåæé¢æ°ãä»»æã®ã³ã³ãããŒã¿ã«é
眮ããããšã¯ã§ããŸããããããã¯!Unpin
åã§ã¯æ©èœããªãå¯èœæ§ãããããã§ãã éåæãããã¯ããå
ç©ãäœæããå Žåãåºå®åãšèååãå¿
èŠãªããã join!
ãselect!
ãªã©ã®ã³ã³ãããŒã¿ãšçŽæ¥äºææ§ããªãå¯èœæ§ããããŸãããã®ããã pin_mut!
ãš.fuse()
ãžã®è¿œå ã®åŒã³åºããå¿
èŠã§ãã
ããã«ãéåæãããã¯ãæäœããå Žåãæ°ãããã¯ãããŒã¹ã®ãŠãŒãã£ãªãã£ã¯join!
ã select!
ã¯å€ãã³ã³ãããŒã¿ããªã¢ã³ããããã¯ããã«ããŸãåäœããŸãã ãããŠããããã¯ãããã§äŸãšããŠãã°ãã°æäŸãããé床ã®æ¹æ³ã§ã
ãã®æãåçŽãªtokioã®äŸã§postfixawaitã.unwrap()
ã§ã©ã®ããã«æ©èœãããããããŸãã
let response = await!({
client.get(uri)
.timeout(Duration::from_secs(10))
}).unwrap();
ãã¬ãã£ãã¯ã¹ãæ¡çšãããšã
let response = await {
client.get(uri).timeout(Duration::from_secs(10))
}.unwrap();
ããããpostfixãæ¡çšãããŠããå Žåã
client.get(uri).timeout(Duration::from_secs(10)).await.unwrap()
client.get(uri).timeout(Duration::from_secs(10)) await.unwrap()
ãŠãŒã¶ãŒã«ãããããã説æã¯ãããŸããïŒ æ¢åã®ã«ãŒã«ãšç«¶åããŸãã await
ã¯ãã£ãŒã«ãã§ããïŒ ãŸãã¯await
ã¯ã unwrap()
ãšããã¡ãœãããæã€ãã€ã³ãã£ã³ã°ã§ããïŒ æ®å¿µãªïŒ ãããžã§ã¯ããå§ãããšããç§ãã¡ã¯ããããã®å
è£
ã解ããŸãã The Zen ofPythonã®è€æ°ã®ãã¶ã€ã³ã«ãŒã«ã«éåããŸããã
ç¹å¥ãªå Žåã¯ãèŠåãç Žãã»ã©ç¹å¥ãªãã®ã§ã¯ãããŸããã
å®è£ ã説æããã®ãé£ããå Žåãããã¯æªãèãã§ãã
ãããŸããã«çŽé¢ããŠãæšæž¬ããèªæãæåŠããŸãã
ãŠãŒã¶ãŒã«ãããããã説æã¯ãããŸããïŒ æ¢åã®ã«ãŒã«ãšç«¶åããŸãã
await
ã¯ãã£ãŒã«ãã§ããïŒ ãŸãã¯await
ã¯ãunwrap()
ãšããã¡ãœãããæã€ãã€ã³ãã£ã³ã°ã§ããïŒ æ®å¿µãªïŒ ãããžã§ã¯ããå§ãããšããç§ãã¡ã¯ããããã®å è£ ã解ããŸãã The Zen ofPythonã®è€æ°ã®ãã¶ã€ã³ã«ãŒã«ã«éåããŸããã
docs.rs
ã«unwrap
åŒã³åºããŠããããã¥ã¡ã³ããå€ãããŸãããå®éã®å€ãã®å Žåã unwrap
ã?
ã«çœ®ãæããå¿
èŠããããŸãã å°ãªããšããããã¯ç§ã®ç¿æ
£ã§ãã
ç§ãèŠã€ããã®ã¯ãåèš585562è¡ã®ãã¡2ã€ä»¥äžã䜿çšããŠããã®ã¯çŽ40è¡ã ãã§ããïŒ äžè¡ã§ã
ããã¯æçšãªæž¬å®ã§ã¯ãªãããšããå§ãããŸãã æ¬åœã«éèŠãªã®ã¯ãè€æ°ã®å¶åŸ¡ãããŒæŒç®å_åŒããš_ã§ãã å žåçãªïŒrustfmtïŒã¹ã¿ã€ã«ã«ãããšããããã¯åãåŒã«å±ããŠããŠããã»ãšãã©ã®å Žåãã¡ã€ã«å ã®ç°ãªãè¡ã«é 眮ãããããã
await
æ¥å°ŸèŸãïŒçè«çã«ïŒéèŠãªéã§é£éããŸãã
ç§ã¯ããã®ã¢ãããŒãã«å¶éãããå¯èœæ§ãããããšãåŠèªããŸãã
xi-editorãalacrittyãripgrepãbatãxrayãfdãfirecrackerãyewãRocketãexaãironãparity-ethereumãtikvã«ã€ããŠå床調æ»ããŸããã ãããã¯ã»ãšãã©ã®æãæã€Rustãããžã§ã¯ãã§ãã ä»åã¯ãã¿ãŒã³ãæ¢ããŸããïŒ
xxx
.f1()
.f2()
.f3()
...
ãããã®åŒã«è€æ°ã®å¶åŸ¡ãããŒæŒç®åããããã©ããã
7066ãã§ãŒã³ã®ãã¡15ã®ã¿ãè€æ°ã®å¶åŸ¡ãããŒæŒç®åãæã£ãŠããããšã確èªããŸããã ããã¯0.2ïŒ ã§ãã ãããã®è¡ã¯ã 585562è¡ã®ã³ãŒãã®ãã¡167è¡ã«ãŸããã£ãŠããŸãã ããã¯0.03ïŒ ã§ãã
@cenwangumassæéãå²ããŠå®éåããŠããã ãããããšãããããŸãã ïŒããŒãïŒ
1ã€ã®èæ
®äºé
ã¯ãRustã«ã¯letã䜿çšããå€æ°ã®åãã€ã³ããããããããã¬ãã£ãã¯ã¹await
ã«å¯ŸããŠèª¬åŸåã®ããåŒæ°ãäœæããå¯èœæ§ãããããšã§ããäžè²«ããŠäœ¿çšãããšã await
ããšã«åå¥ã®ã³ãŒãè¡ãåŸ
æ©ããŸãã -ãã€ã³ãã å©ç¹ã¯2ã€ãããŸããè¡çªå·ãåé¡ã®çºçå Žæã«é¢ããã³ã³ããã¹ããæäŸããããã®ã¹ã¿ãã¯ãã¬ãŒã¹ãšãå€æ°ãæ€æ»ããããã«åå¥ã®åŸ
æ©ãã€ã³ãããšã«ãã¬ãŒã¯ãã€ã³ããèšå®ããã®ãäžè¬çã§ããããããããã°ãã¬ãŒã¯ãã€ã³ãã®å®¹æãããã®ç°¡æœããäžåãå ŽåããããŸãã 1è¡ã®ã³ãŒãã
å人çã«ã¯ã httpsïŒ //github.com/rust-lang/rust/issues/57640#issuecomment -457457727ãèªãã åŸããã¬ãã£ãã¯ã¹ã¹ã¿ã€ã«ãšãã¹ããã£ãã¯ã¹ã·ãžã«ã®éã§åŒãè£ãããŠããŸããããããããã¹ããã£ãã¯ã¹ã·ãžã«ã«è³æã§ãã
ã¬ã³ããªã³ã°ããããã¬ãã£ãã¯ã¹ã¹ã¿ã€ã«ïŒ
async fn request_user(self, user_id: String) -> Result<User> {
let url = format!("users/{}/profile", user_id);
let user = await? self.request(url, Method::GET, None, true));
let user = await? user.res.json::<UserResponse>();
let user = user.user.into();
Ok(user)
}
ã¬ã³ããªã³ã°ãããæ¥å°ŸèŸã¹ã¿ã€ã«ïŒ
async fn request_user(self, user_id: String) -> Result<User> {
let url = format!("users/{}/profile", user_id);
let user = self.request(url, Method::GET, None, true)) await?;
let user = user.res.json::<UserResponse>() await?;
let user = user.user.into();
Ok(user)
}
ã¬ã³ããªã³ã°ãããæ¥å°ŸèŸã®å°ç« @ïŒ
async fn request_user(self, user_id: String) -> Result<User> {
let url = format!("users/{}/profile", user_id);
let user = self.request(url, Method::GET, None, true))@?;
let user = user.res.json::<UserResponse>()@?;
let user = user.user.into();
Ok(user)
}
ã¬ã³ããªã³ã°ãããæ¥å°ŸèŸã®å°ç« ïŒïŒ
async fn request_user(self, user_id: String) -> Result<User> {
let url = format!("users/{}/profile", user_id);
let user = self.request(url, Method::GET, None, true))#?;
let user = user.res.json::<UserResponse>()#?;
let user = user.user.into();
Ok(user)
}
await
ã«å¯ŸããŠStream
await
ã«ã€ããŠè©±ã人ãååã«ããªãã®ã§ãã ç¯å²å€ã§ããã Stream
ããå°ãå
èŠã®æãæã£ãŠã await
ãäžå¿ã«æ±ºå®ãäžãã®ã¯ãåªåãã䟡å€ããããããããŸããã
次ã®ãããªãã®ãå¿
èŠã«ãªãå¯èœæ§ããããŸãã
ãã¬ãã£ãã¯ã¹æ§æ
for await response in stream {
let response = response?;
...
}
// In which case an `await?` variant might be beneficial
for await? response in stream {
...
}
åŸçœ®æ§æ
for response in stream await {
let response = response?;
...
}
for response in stream.await!() {
let response = response?;
...
}
// Or a specialized variant of `await` and `?`
// Note (Not Obvious): The `?` actually applies to each response of `await`
for response in stream await? {
...
}
for response in stream.await!()? {
...
}
ããããæã人éå·¥åŠçã§äžè²«æ§ã®ããæ§æ
let results: Vec<Result<_, _>> = ...;
for value in? results {
...
}
for response await? stream {
...
}
æ¥å°ŸèŸã¯Future
ããã§ãŒã³ããã®ã«é©ããŠããŸãããäžèŠãããšStream
çŽææ§ãæãäœãããã«èŠããããããããã®äŸã«ã€ããŠå°ãªããšãå°ã説æããããšæããŸãã ããã§ã®æ£ãã解決çãäœã§ãããããããŸããã ãã¶ãã Future
æ¥å°ŸèŸawait
ãšFuture
ã®ç°ãªãã¹ã¿ã€ã«ã®await
Stream
ïŒ ãã ããæ§æãç°ãªãå Žåã¯ãæ§æ解æããããŸãã§ãªãããšã確èªããå¿
èŠããããŸãã
ãããã¯ãã¹ãŠç§ã®æåã®èãã§ããæ¥å°ŸèŸã®èŠ³ç¹ããã Stream
ãŠãŒã¹ã±ãŒã¹ã«ããå°ãèããäžãã䟡å€ããããããããŸããã postfixãStream
ã§ã©ã®ããã«ããŸãæ©èœãããããŸãã¯2ã€ã®æ§æãå¿
èŠãã©ããã«ã€ããŠèª°ããèããŠããŸããïŒ
ã¹ããªãŒã ã®å埩ã®æ§æã¯ãç§ãæ³åããããªãé·ãéèµ·ããããšã§ã¯ãããŸããã while let
ã«ãŒãã䜿çšããŠæåã§è¡ãã®ã¯ãããªãç°¡åã§ãã
while let Some(value) = stream.try_next().await? {
}
while let Some(value) = await? stream.try_next() {
}
while let Some(value) = await { stream.try_next() }? {
}
ç©äºãè¡ãããã®çŸåšã®æ¹æ³ã«ãªããŸãïŒããã«await
ïŒã
ãã®äŸã§ã¯ããåºåãæåä»ãã®ãã¬ãã£ãã¯ã¹ããç¹ã«èŠæ ããæªãããšã«æ³šæããŠãã ããã await(...)?
ãå°ãèŠæ ãããããããããŸãããããåºåãæåä»ãã®ãã¬ãã£ãã¯ã¹ããå®è¡ããå Žåã¯ã_1_çš®é¡ã®åºåãæåïŒ try { ... }
ïŒã®ã¿ãèš±å¯ããããšãæã¿ãŸãã
ã¯ã€ãã¯ã¿ã³ãžã§ã³ãã§ããããåºåãæåã§åŸ
ã€ãã ãã§ã¯ãããŸãã...éåžžã®ãã¬ãã£ãã¯ã¹ãåŸ
ã£ãŠããŸããïŒ await
ã¯åŒãåŸ
ã€ããã await expr
ãšawait { expr }
ã¯åºæ¬çã«åãã§ãã ç¹ã«ãã©ã®åŒã{}ã§å²ã¿ãåãåŒã§ããç¶ããããšãã§ãããããåºåãæåã ãã§åŸ
æ©ããåºåãæåãªãã§åŸ
æ©ããªãããšã¯æå³ããããŸããã
ã¹ããªãŒã ã«é¢ãã質åãããRustã®å ŽåãåŒã®æŒç®åãšããŠã ãã§ãªãããã¿ãŒã³ã®ä¿®é£ŸåãšããŠã䜿çšã§ããããã«ãªãã®ãåŸ ã€ã®ã¯éåžžã«èªç¶ãªããšã ãšæããŸããã
// These two lines mean the same - both await the future
let x = await my_future;
let async x = my_future;
ãã®åŸã for
èªç¶ã«æ©èœããŸã
for async x in my_stream { ... }
@ivandardi
ããã¬ãã£ãã¯ã¹ã¯å¿
é ã®åºåãæåã§åŸ
æ©ãã解決ããåé¡ã¯ã ?
åšèŸºã®åªå
é äœã®è³ªåã§ãã _mandatory_åºåãæåã䜿çšãããšãåªå
é äœã®è³ªåã¯ãããŸããã
_similar_ïŒå®å®ããïŒæ§æã«ã€ããŠã¯ã try { .... }
ãåç
§ããŠãã ããã äžæ¬åŒ§ã®å
åŽã®?
å€åŽã®?
ãšã®çžäºäœçšïŒã§å¿
é ã®åºåãæåããããŸãã
@yazaddaruvala forã«ãŒããããIterator<Item = Result<...>>
ãåŠçããããã€ãã®äžè¬çãªæ©èœã«ç±æ¥ããã¯ãã§ãã
// postfix syntax
for response in stream await {
...
}
ããã¯ã stream: impl Future<Output = Iterator>
ã§ãããåèŠçŽ ã§ã¯ãªããã€ãã¬ãŒã¿ã䜿çšå¯èœã«ãªãã®ãåŸ
ã£ãŠããããšãæå³ããŸãã async for item in stream
ãããåªãããã®ã«ãªãå¯èœæ§ã¯ããŸããããŸããïŒ @tanriolã®èšåã®ãããªããäžè¬çãªæ©èœããªã
@ivandardiéãã¯ãåºåãæåã®æåŸã«ãã§ãŒã³ãéå§ããåŸã®åªå é äœã§ããããã¯ããæçœãªåªå é äœãã¬ãã£ãã¯ã¹ãããæçšãªåªå é äœãã¬ãã£ãã¯ã¹ãïŒå°ãªããšããæçšãªãåªå é äœãäœã§ãããã«ã€ããŠã®ç§ã®ç解ïŒã§ç°ãªã解æãè¡ã2ã€ã®äŸã§ãã ãå¿ é ã®åºåãæåãã¬ãã£ãã¯ã¹ãã
await (foo.bar()).baz()?;
await { let foo = quux(); foo.bar() }.baz()?;
解æãã察象ïŒ3ã€ã®ããªã¢ã³ããã¹ãŠã§æ確ã«ãªãããã«ååãªåºåãæåã䜿çšïŒ
// obvious precedence prefix
await ((foo.bar()).baz()?);
await ({ let foo = quux(); foo.bar() }.baz()?);
// useful precedence prefix
(await ((foo.bar()).baz()))?;
(await ({ let foo = quux(); foo.bar() }.baz())?;
// mandatory delimiters prefix
(await (foo.bar())).baz()?;
(await { let foo = quux(); foo.bar() }).baz()?;
ç§ã®èãã§ã¯ã httpsïŒ //github.com/rust-lang/rust/issues/57640#issuecomment -457457727ã®CïŒããã®@scottmcmã®äŸã¯ãåºåãæåã(await foo).bar
äœçœ®ããawait(foo).bar
äœçœ®ïŒ
await(response.Content.ReadAsStringAsync()).Should().Be(text);
var previous = await(branch.ListHistoryAsync(timestampUtc, null, cancellationToken, 1)).HistoryEntries.SingleOrDefault();
ãªã©ã ãã®ã¬ã€ã¢ãŠãã¯ãéåžžã®é¢æ°åŒã³åºããæ¢åã®ããŒã¯ãŒãããŒã¹ã®å¶åŸ¡ãããŒãããã³ä»ã®èšèªïŒCïŒãå«ãïŒã§ããç¥ãããŠããŸãã ããã«ãããã¹ãã¬ã³ãžãã¹ã®äºç®ãç Žãããšãåé¿ããã await
ãã§ãŒã³ã«åé¡ãçºçããããšã¯ãªãããã§ãã
確ãã«ããã«ãawait
ãã§ãŒã³ã®try!
ãšåãåé¡ããããŸãããããã¯Result
å Žåã»ã©å€§ããªåé¡ã§ã¯ãªãããã§ãã ããã§ã¯ãæ¯èŒççãããããããèªããªããã¿ãŒã³ã«å¯Ÿå¿ããããããæ§æã®å¥åŠããå¶éããããšæããŸãã
ä»ã®èšèªïŒCïŒãå«ãïŒã§ããªãã¿
ããã¯ãCïŒïŒãŸãã¯JavascriptããŸãã¯PythonïŒã§ã®åªå é äœã®ä»çµã¿ã§ã¯ãããŸãã
await(response.Content.ReadAsStringAsync()).Should().Be(text);
ãšåçã§ã
var future = (response.Content.ReadAsStringAsync()).Should().Be(text);
await future;
ïŒãããæŒç®åã¯await
ãããåªå
é äœãé«ãããã await
ãé¢æ°åŒã³åºãã®ããã«èŠããããšããŠããããç·å¯ã«ãã€ã³ããããŸãïŒã
ããã¯ç§ã䞻匵ããŠããããšã§ã¯ãããŸããã é åºã¯åããŸãŸãªã®ã§ãè¿œå ããå¿ èŠãããã®ã¯æ¬åŒ§ã ãã§ãããïŒåå¥ã«ïŒæ¢åã®é¢æ°åŒã³åºãæ§æãæ£ããåªå é äœãæã£ãŠããã ãã§ãã
ãã®ã¬ã€ã¢ãŠãã¯ãæ¢åã®ããŒã¯ãŒãããŒã¹ã®å¶åŸ¡ãããŒã§ããç¥ãããŠããŸã[...]
åæããŸããã å®éãæ¢åã®ããŒã¯ãŒãããŒã¹ã®å¶åŸ¡ãããŒã§ãã®ã¬ã€ã¢ãŠãã䜿çšããããšã«å¯ŸããŠ_èŠå_ããŸãã
warning: unnecessary parentheses around `return` value
--> src/lib.rs:2:9
|
2 | return(4);
| ^^^ help: remove these parentheses
|
= note: #[warn(unused_parens)] on by default
ãããŠã rustfmt
ã¯ãããreturn (4);
ã«å€æŽããã¹ããŒã¹ã_è¿œå _ããŸãã
ããã¯ç§ãäœãããšããŠãããã€ã³ãã«ã¯ããŸã圱é¿ããã髪ãè£ããããªæ°ãããŸãã return (4)
ã return(4)
ãããã¯ã¹ã¿ã€ã«ã®åé¡ã«ãããŸããã
åé¡å
šäœãèªã¿ã {}
äžæ¬åŒ§ãšæ¥é èŸã¯åé¡ãªããšæãå§ããŸãããããã®åŸæ¶ããŸããã
ã©ãã©ãïŒ
let foo = await some_future();
let bar = await {other_future()}?.bar
ããããã§ããã ãããã1ã€ã®ãã§ãŒã³ã§ããå€ãã®await
ããã§ãŒã³ãããå Žåã¯ã©ãã§ããããïŒ
let foo = await some_future();
let bar = await {
await {other_future()}?.bar_async()
}?;
ç§èŠããã¯ãããã¯ããã«æªãããã«èŠããŸã
let foo = some_future() await;
let bar = other_future() await?
.bar_async() await?;
ãã ãã @ cenwangumassã®æçš¿ã«æžãããŠããããã«ãç§ã¯éåæãã§ãŒã³ãä¿¡ããŠããŸããã ããã¯ããã€ããŒãµãŒããŒã§async/await
ã䜿çšããç§ã®äŸã§ãããã®å
·äœçãªäŸã䜿çšããŠããã§ãŒã³ã圹ç«ã€å Žæã瀺ããŠãã ããã ç§ã¯æ¬åœã«èªæãããŸããåè«ã¯ãããŸããã
åã®äŸã«ã€ããŠã¯ããããã®ã»ãšãã©ã¯ãã³ã³ãããŒã¿ã«ãã£ãŠäœããã®æ¹æ³ã§ãç ŽæãããŠããŸãã ããªããåŸ ã£ãŠããã®ã§ãããªãã¯ããããã»ãšãã©å¿ èŠãšããŸããã äŸãã°
let responses: Vec<Response> = await {
stream::iter(all_ids)
.then(|id| self.request(URL, Method::GET, vec![("info".into(), id.into())]))
.and_then(|mut res| res.json().err_into())
.try_buffer_unordered(10)
.try_collect()
}?;
ãã ã§ã
let responses: Vec<Response> = all_ids
.map(async |id| {
let response = self.request(URL, Method::GET, vec![("info".into(), id.into())]) await?;
Ok(res.json() await?)
})
.join_all() await
.collect()?
å ç©ããšã©ãŒãè¿ãå¯èœæ§ãããå Žåã¯ã次ã®ããã«ç°¡åã§ãã
let responses: Vec<Response> = all_ids
.map(async |id| {
let response = self.request(URL, Method::GET, vec![("info".into(), id.into())])? await?;
Ok(res.json()? await?)
})
.join_all()? await
.collect()?
@ lnicola ã @ nicoburns ã
https://internals.rust-lang.org/t/pre-rfc-extended-dot-operator-as-possible-syntax-for-awaitã§val.[await future]
æ§æã®Pre-RFCã¹ã¬ãããäœæããŸãã-ãã§ãŒã³/ 9304
ãã®è°è«ã«ã¯2ã€ã®é£å¶ããããšæããŸããã€ãŒã«ããã€ã³ãã匷調ããã人ãšãããã匷調ããããªã人ã§ãã
2018幎é ã®Rustã®éåæã«ã¯ã次ã®å®£äŒæãå«ãŸããŠããŸãã
éåæ/åŸ æ©è¡šèšã¯ãéåæããã°ã©ãã³ã°ãåæããã°ã©ãã³ã°ã«ããè¿ã¥ããæ¹æ³ã§ãã
äžããç°¡åãªtokioã®äŸãåãäžããŸãïŒ unwrap()
ã?
ïŒïŒ
let response = await!({
client.get(uri).timeout(Duration::from_secs(10))
})?;
æ¥å°ŸèŸã®å°ç« ãé©çšãããšã
let response = client.get(uri).timeout(Duration::from_secs(10))!?
ããã¯åæããã°ã©ãã³ã°ã«éåžžã«äŒŒãŠãããæ¥é èŸãšåŸçœ®èšæ³ã®äž¡æ¹ã®æ°ãæ£ãæ£åšããawait
ããããŸããã
ãã®äŸã§ã¯ã !
ãæ¥å°ŸèŸã®å°ç« ãšããŠäœ¿çšããŸãããããã®ææ¡ã«ãããåã®ã³ã¡ã³ãã§ããã€ãã®å察祚ãåŸãããŸããã æå笊ã¯ããã®ã³ã³ããã¹ãã§ã¯@
ïŒç§ã®è³ã¯ãatããšèªã¿ãŸãïŒãš#
äž¡æ¹ã«æ¬ ããŠããåºæã®æå³ãæã£ãŠãããããããããŸããã ããããããã¯åã«å¥œã¿ã®åé¡ã§ãããç§ã®äž»åŒµã§ã¯ãããŸããã
éåžžã«ç®ç«ããªããããä»ã®ãã¹ãŠã®éžæè¢ããã1æåã®æ¥å°ŸèŸã®å°ç« ãéåžžã«å¥œãã®ã§ãéåæã§ãããã©ãããšæ¯èŒããŠãå®éã«å®è¡ããŠããã³ãŒããææ¡ãããããªããŸããå®è£
ã®è©³çŽ°ãæ€èšããããšæããŸãã ç§ã¯ããããŸã£ããéèŠã§ã¯ãªããšã¯èšããŸãããã ?
å Žåã®æ©æãªã¿ãŒã³ããããã³ãŒãã®ãããŒã«ãšã£ãŠããã»ã©éèŠã§ã¯ãªããšäž»åŒµããŸãã
å¥ã®èšãæ¹ãããã°ãéåæã³ãŒããæžããšãã¯äž»ã«ã€ãŒã«ããã€ã³ãã«é¢å¿ããããèªããšãã¯ããã»ã©æ°ã«ããŸããã ã³ãŒãã¯æžããããããé »ç¹ã«èªã¿åãããããã await
ç®ç«ããªãæ§æã圹ç«ã¡ãŸãã
CïŒããŒã ã®çµéšãæãåºããããïŒåŒ·èª¿ã¯ç§ã®ãã®ã§ãïŒïŒ
ãããããawaitãã«ãæé»ã®ã圢åŒã䜿çšããªãã£ãçç±ã§ããããŸãã å®éã«ã¯ãããã¯äººã ãéåžžã«æ確ã«èããããšæã£ãŠãããã®ã§ããã圌ããããã«æ³šæãæãããšãã§ããããã«ã³ãŒãã®äžå¿ã«çœ®ããããšæã£ãŠããŸããã èå³æ·±ãããšã«ãæ°å¹ŽåŸããã®åŸåã¯ç¶ããŠããŸãã ã€ãŸããäœå¹ŽãåŸã«ãäœããé床ã«åé·ã§ããããšãåŸæããããšããããŸãã ããã€ãã®æ©èœã¯æ©ã段éã§ãã®ããã«åªããŠããŸããã人ã ãããã«æ £ããããäœãããç°¡æœãªãã®ã«é©ããŠããŸãã 'await'ã®å Žåã¯ããã§ã¯ãããŸããã§ããã 人ã ã¯ãŸã ãã®ããŒã¯ãŒãã®éãæ§è³ªãæ¬åœã«å¥œããªããã§ã
Sigilã®ãã£ã©ã¯ã¿ãŒã¯ãé©åãªãã€ã©ã€ãããªããšã»ãšãã©èŠãããåå¿è ã«ã¯ããŸã芪ãã¿ããããŸããïŒããããåã«èšã£ãããã«ïŒã
ããããã·ãžã«ã«ã€ããŠèšãã°ã @
ã¯ãè±èªä»¥å€ã®è©±è
ïŒããšãã°ãç§ïŒãæ··ä¹±ãããããšã¯ãªãã§ãããããªããªãã at
ãšããŠèªã¿åããªãããã§ãã ã³ãŒããèªãã ãšãã«èªåçã«ããªã¬ãŒãããªãå®å
šã«å¥ã®ååãããã®ã§ãããèªäœã®æå³ãæã€å
šäœã®è±¡åœ¢æåãšããŠç解ããã ãã§ãã
@huxiç§ã¯await
ãšããåèªã䜿çšããå¿
èŠãããçç±ã«ã€ããŠã¯ã Centrilã®æçš¿ãããäžåºŠåç
§ããŠãã ããã
ãŸããæ¥å°ŸèŸãããŸã奜ãã§ã¯ãªããã¹ãŠã®äººã«ãšã£ãŠãããŸããé£éã§ããå®éã®ã³ãŒãã¯ããŸããªãã®ã§ãæ¥å°ŸèŸåŸ æ©ãè¿œå ããªãã§ãã ããããšããå®çšçãªè°è«ã䜿çšããŠãã ãããããã«å°ãã®éžè©±ããããŸãïŒç§ã¯ããããæªãèšæ¶ã®ããã«èå±ã«ãªããŸãïŒïŒ
第äºæ¬¡äžç倧æŠã«æ»ã£ãŠãæŠéåœã®1ã€ã¯ããã«å€ãã®é£è¡æ©ã倱ã£ãŠããŸããã 圌ãã¯ã©ãããããã圌ãã®é£è¡æ©ã匷åããªããã°ãªããŸããã§ããã ãããã£ãŠãã©ãã«çŠç¹ãåãããããç¥ãããã®æçœãªæ¹æ³ã¯ãæ»ã£ãŠããé£è¡æ©ãèŠãŠã匟䞞ãæãåœããå Žæã確èªããããšã§ãã é£è¡æ©ã§ã¯ãå¹³åããŠ70ïŒ ã®ç©Žãç¿Œã«ããã10ïŒ ããšã³ãžã³é åã«ããã20ïŒ ãé£è¡æ©ã®ä»ã®é åã«ãããŸããã ããã§ããããã®çµ±èšã§ãç¿Œã匷åããããšã¯çã«ããªã£ãŠããŸããïŒ éãïŒ ãã®çç±ã¯ãæ»ã£ãŠããé£è¡æ©ã ããèŠãŠããããã§ãã ãããŠããããã®é£è¡æ©ã§ã¯ãç¿Œã®åŒŸäžžã®æå·ã¯ããã»ã©æªããªãããã§ãã ããããæ»ã£ãŠãããã¹ãŠã®é£è¡æ©ã¯ãšã³ãžã³é åã«ããããªæå·ããåããªãã£ãããããšã³ãžã³é åãžã®å€§ããªæå·ã¯èŽåœçã§ãããšããçµè«ã«ã€ãªããå¯èœæ§ããããŸãã ãããã£ãŠã代ããã«ãšã³ãžã³é åã匷åããå¿ èŠããããŸãã
ãã®éžè©±ã§ã®ç§ã®ãã€ã³ãã¯ãä»ã®èšèªã§ã¯æ¥å°ŸèŸãåŸ æ©ããŠããªããããæ¥å°ŸèŸåŸ æ©ãå©çšã§ããå®éã®ã³ãŒãäŸãããŸããªããããããªããšããããšã§ãã ãããã£ãŠã誰ãããã¬ãã£ãã¯ã¹åŸ æ©ã³ãŒããæžãããšã«æ £ããŠããŠãããã«éåžžã«æ £ããŠããŸããããã¹ããã£ãã¯ã¹åŸ æ©ããã£ãå Žåã人ã ãããã«åŸ æ©ãé£éãå§ãããã©ããã¯ããããŸããã
ãããã£ãŠãæåã®è¡åã¯ããã€ããªãŒãã«ããæäŸããæè»æ§ã掻çšããèšèªã«è¿œå ãã1ã€ã®ãã¬ãã£ãã¯ã¹æ§æãš1ã€ã®ãã¹ããã£ãã¯ã¹æ§æãéžæããããšã ãšæããŸãã ãObviousPrecedenceããã¬ãã£ãã¯ã¹ãåŸ
ã£ãŠããããšã«æ祚ãã .await
ãã¹ããã£ãã¯ã¹ãåŸ
ã£ãŠããŸãã ãããã¯æçµçãªæ§æã®éžæã§ã¯ãããŸããããæåã«1ã€ãéžæããå¿
èŠããããããã2ã€ã®æ§æã®éžæã¯ãä»ã®æ§æã®éžæãšæ¯èŒããŠæ°ãããšã¯ã¹ããªãšã³ã¹ãæäŸãããšæããŸãã ããããå€éã«å®è£
ããåŸãäž¡æ¹ã®ãªãã·ã§ã³ã䜿çšããŠå®éã®ã³ãŒããæäœããéã®äœ¿çšçµ±èšãšæèŠãååŸããæ§æã®è°è«ãç¶ããããšãã§ããŸããä»åã¯ãããå®çšçãªè°è«ã«è£æã¡ãããŠããŸãã
@ivandardiéžè©±ã¯ããªãæã蟌ãã§ããŠãç§èŠã¯é©åããŸãããããã¯æ ã®å§ãã®ããæ°ãèµ·ããããç©èªã§ããã人ã ã«éèªæãªãã®ãæ¢ããŠãã¹ãŠã®è§åºŠãã«ããŒããããã«æãåºãããããã«ãå察ã«å¯ŸããŠäœ¿çšããããã®ã§ã¯ãããŸãã話ãåãã ããã¯Rust2018ã«ãµãããããããã§æèµ·ãããç¹å®ã®åé¡ã«çžãããããšã¯ãããŸããã§ããã è°è«ã®äžã§ãããå察åŽã«å¯ŸããŠäœ¿çšããããšã¯å€±ç€Œã§ããããªãã¯ãããæ©èœãããããã«ããå€ããèŠãããããå€ãã®ããžã§ã³ãæã£ãŠãã人ã®ç«å Žã䞻匵ããå¿ èŠãããã§ãããã ç§ã¯ãããããªããæããã®ã§ã¯ãªããšæããŸãã ãŸããåçã«ãšã©ãŸããšãæ¥å°ŸèŸã家ã«åž°ãããšããªãã£ãã®ã§ãããããæ¥å°ŸèŸã¯ã©ã®èšèªã«ããããŸãã;ïŒã
人ã
ã¯å®éã«æž¬å®ããŠèª¿ã¹ãŸãããRustïŒ ?
ïŒã«ã¯ãé£éã«äœ¿çšãããããšã¯ãã£ãã«ãªãé£éå¯èœãªæŒç®åããããŸãã https://github.com/rust-lang/rust/issues/57640#issuecomment -458022676
@cenwangumassãhttps://github.com/rust-lang/rust/issues/57640#issuecomment-457962730ã«ããŸãé 眮ããŠããã®ã§ããããçŸåšã®ç¶æ ã®æž¬å®å€ã§ãããšããããšãããŸãã«ããŒãããŠã
postfixãæ¬åœã«é²ãã¹ãéã§ãããªãã°ãé£éãäžéå端ãªæ¯é
çãªã¹ã¿ã€ã«ã«ãªããšãã話ã欲ããã®ã§ããã ããããç§ã¯ããã確信ããŠããŸããã ãŸãããã®èŸºãã§äœ¿çšãããäž»èŠãªäŸïŒ reqwest
ïŒã¯ãAPIãéžæããããã2åŸ
æ©ããå¿
èŠãšããã2åŸ
æ©ãå¿
èŠãšããªã䟿å©ãªãã§ãŒã³APIãä»æ¥ç°¡åã«æ§ç¯ã§ããããšãåè¿°ããŸããã
ç 究段éã®åžæã«ã¯æè¬ããŠããŸãããåŸ æ©ã¯ãã§ã«å€§å¹ ã«é ããŠããããšãææããããšæããŸããã©ã®ç 究段éã§ãããã¯ããã«æªåããŸãã ãŸããå€ãã®ã³ãŒãããŒã¹ã®çµ±èšãåéããæ¹æ³ããããŸãããèªåã§ã¹ããŒãã³ã°ã»ãããçµã¿ç«ãŠãå¿ èŠããããŸãã ããã§ãã£ãšãŠãŒã¶ãŒèª¿æ»ããããã®ã§ãããããã«ã¯æéããããããŸã ååšããªãã»ããã¢ãããšãããå®è¡ãã人ã ãå¿ èŠã§ãã
@Pzixelåãã€ã³ããããã®ã§ãæžãããšãã§ãããšæããŸã
let foo = await some_future();
let bar = await {
await {other_future()}?.bar_async()
}?;
ãªã®ã§
`` `
foo = await some_futureïŒïŒ;
let bar = await {other_futureïŒïŒ}ïŒãbar_asyncïŒïŒ;
let bar = await {bar}ïŒ;
@Pzixelãã®CïŒããŒã ãšã¯ã¹ããªãšã³ã¹ã®èŠç©ããã®ââãœãŒã¹ã¯ãããŸããïŒ ç§ãèŠã€ããã®ã¯ãã®ã³ã¡ã³ãã ãã ã£ãããã§ãã ããã¯åçºãªã©ãæå³ãããã®ã§ã¯ãããŸããã å šæãèªã¿ããã®ã§ããã
ç§ã®è³ã¯ãé»åã¡ãŒã«ã¢ãã¬ã¹ã§äœ¿çšãããŠããããã @
ããatãã«å€æããŸãã ãã®ã·ã³ãã«ã¯ç§ã®æ¯åœèªã§ãKlammeraffeããšåŒã°ãã倧ãŸãã«ãããã¿ã€ãç¿ãã«ç¿»èš³ãããŸãã ç§ã®è³ã代ããã«ãatãã«èœã¡çããããšãå®éã«æè¬ããŠããŸãã
æ¯èŒçæ°ããRustãŠãŒã¶ãŒãšããŠã®ç§ã®2ã»ã³ãïŒC ++ã®ããã¯ã°ã©ãŠã³ããæã£ãŠããŸãããããã¯å®éã«ã¯åœ¹ã«ç«ã¡ãŸããïŒã
ããªãã®äœäººãã¯æ°åè ã«ã€ããŠèšåããŸããããããç§ãæãããšã§ãïŒ
await!( ... )
ãã¯ãã¯ã䜿ãæ¹ãéåžžã«ç°¡åã§ã誀解ãããªããããç§ã«ã¯äžå¯æ¬ ã®ããã«æããŸãã println!()
ã panic!()
ã...ã«äŒŒãŠããŸãããçµå±try!
èµ·ãã£ãããšã§ããawait
ããç·å¯ã«çµåãããšããäºå®ã¯ãäžéšã®å¿ãæã€ã§ããããäžéšã®ãŠãŒã¶ãŒã¯ããããæ確ã«ããããã«ïŒé£éãããã©ããã«ãããããïŒå€ãã®æ¬åŒ§ãä»ããããšã奜ããšæããŸããawait?
ã䟿å©ãªããŒã¯ãŒããšåŒã³ãŸãã é¢åãªæ¬åŒ§ãäžèŠã«ãªãã®ã§äŸ¿å©ã§ããc#
let response = (await http::get("https://www.rust-lang.org/"))?;
// see kids?
åŸ
ã£ãŠããŸã... unwraps the future, so you have to use
ïŒ to unwrap the Result
// but there is some sugar if you want, thanks to the
awaitïŒ `æŒç®å- sigils can be understood quite easily *if the chosen character makes sense* if it is introduced to be "the `?` for futures".
That being said, since no agreement seems to be reached, I think it would be reasonable to ship `await!()` to stable Rust. Then this discussion can be extended without blocking the whole process. Same that what happened for `try!()`/`?`, so again newcomers won't be lost. And if [Simple postfix macros](https://github.com/rust-lang/rfcs/pull/2442) get accepted, the problem will disappear since we'll get postfix macro for "free".
---
Just a thought, what about a postfix keyword, but which can be put as prefix as well, similar in some ways to the `const` keyword of C++? (I don't know if that was already proposed) In prefix position, it behaves like "prefix `await` with obvious precedence and optional sugar":
```c#
// preferred without chaining:
let response = await? http::get("https://www.rust-lang.org/");
// but also possible: (rustfmt warning)
let response = http::get("https://www.rust-lang.org/") await?;
let response = (http::get("https://www.rust-lang.org/") await)?;
let response = (await http::get("https://www.rust-lang.org/"))?;
// chains well
let matches = http::get("https://www.rust-lang.org/") await?
.body?
.async_regex_search("(?=(\d+))\w+\1") await;
// any of these are also allowed, but arguably ugly (rustfmt warning again)
let matches = await ((http::get("https://www.rust-lang.org/") await?)
.body?
.async_regex_search("(?=(\d+))\w+\1"));
let matches = (await? http::get("https://www.rust-lang.org/"))
.body?
.async_regex_search("(?=(\d+))\w+\1") await;
let matches = await http::get("https://www.rust-lang.org/") await?
.body?
.async_regex_search("(?=(\d+))\w+\1");
let matches = await (await http::get("https://www.rust-lang.org/"))?
.body?
.async_regex_search("(?=(\d+))\w+\1");
let matches = await!(
http::get("https://www.rust-lang.org/")) await?
.body?
.async_regex_search("(?=(\d+))\w+\1")
);
let matches = await { // <-- parenthesis or braces optional here, but they clarify
(await? http::get("https://www.rust-lang.org/"))
.body?
.async_regex_search("(?=(\d+))\w+\1")
};
ãããæããæ¹æ³ïŒ
await!()
ãã¯ããå¯èœïŒç§èªèº«ã®å人çãªçµéšã§ã¯ããã¬ãã£ãã¯ã¹awaitã¯ãã§ãŒã³ã®åé¡ã§ã¯ãªããšæããŸãã
ãã§ãŒã³ã¯ãJavascriptã³ãŒãã«æ¥é èŸawaitãšf.then(x => ...)
ãããªã³ã³ãããŒã¿ãè¿œå ããŸãããç§ã®æèŠã§ã¯èªã¿ãããã倱ãããšã¯ãªããã³ã³ãããŒã¿ãæ¥å°ŸèŸawaitãšäº€æããå¿
èŠæ§ãæããŠããªãããã§ãã
è¡ãã«ã¯ïŒ
let ret = response.await!().json().await!().to_string();
ãšåãã§ãïŒ
let ret = await future.then(|x| x.json()).map(|x| x.to_string());
ã³ã³ãããŒã¿ãã§ãŒã³ã®äžã«postfixã®å©ç¹ãåŸ
ã£ãŠãããšã¯æããŸããã
2çªç®ã®äŸã§äœãèµ·ããããç解ããæ¹ãç°¡åã ãšæããŸãã
次ã®ã³ãŒãã§ã¯ãèªã¿ããããé£éããŸãã¯åªå é äœã®åé¡ã¯èŠãããŸããã
async fn fetch_user(name: &str) -> Result<Vec<Permission>, Error> {
let user = await? fetch(format!("/user/{0}", name).as_str())
.map(|x| serde_json::from_str::<User>(x?))
.then(|x| fetch(format!("/permissions/{0}", x?.id).as_str()))
.map(|x| serde_json::from_str::<Vec<Permission>>(x?));
Ok(user)
}
ç§ã¯ãã®ãã¬ãã£ãã¯ã¹ãåŸ ã£ãŠããããšã«è³æã§ãïŒ
Async / awaitã¯èšèªãžã®çŽ æŽãããè¿œå ã§ããããã®è¿œå ãšãã®å®å®åã®åŸãããå€ãã®äººã
ãããå€ãã®å
ç©é¢é£ã®ãã®ã䜿çšããããã«ãªããšæããŸãã
Rustã§åããŠéåæããã°ã©ãã³ã°ãçºèŠãã人ãããããããããŸããã
ãããã£ãŠãéåæã®èåŸã«ããæŠå¿µããã§ã«åŠã¶ã®ã¯é£ãããããããŸããããèšèªã®è€éããæããããšã¯æçãããããŸããã
ãããŠããã¬ãã£ãã¯ã¹ãšãã¹ããã£ãã¯ã¹ã®äž¡æ¹ãåºè·ããã®ã¯è¯ãèãã§ã¯ãªããšæããŸãããããã¯å人çãªæèŠã§ãã
@huxiãããç§ã¯ãã§ã«ãããäžã«ãªã³ã¯ããŸãããããããã¡ããç§ã¯ãããããçŽãããšãã§ããŸãïŒ //github.com/rust-lang/rust/issues/50547#issuecomment -388939886
ç§ã®è³ã¯ãé»åã¡ãŒã«ã¢ãã¬ã¹ã§äœ¿çšãããŠããããã@ããatãã«å€æããŸãã ãã®ã·ã³ãã«ã¯ç§ã®æ¯åœèªã§ãKlammeraffeããšåŒã°ãã倧ãŸãã«ãããã¿ã€ãç¿ãã«ç¿»èš³ãããŸãã ç§ã®è³ã代ããã«ãatãã«èœã¡çããããšãå®éã«æè¬ããŠããŸãã
ç§ã«ã䌌ããããªè©±ããããŸããç§ã®èšèªã§ã¯ãç¬ãã§ãããã¡ãŒã«ã®èªã¿æ¹ã«ã¯åœ±é¿ããŸããã
ã§ãããªãã®çµéšãèŠãŠããããã§ãã
@llambda質åã¯ãã§ãŒã³ã«ã€ããŠawait? foo
ãŸãã¯foo await?
代ããã«ãã®await { foo }?
foo await?
ã¯å¥åŠã«èŠããŸãã
@totorigolo
çŽ æµãªæçš¿ã ããããç§ã¯ããªãã®2çªç®ã®ææ¡ãè¯ãæ¹æ³ã ãšã¯æããŸããã äœããããããã«2ã€ã®æ¹æ³ãå°å
¥ãããšãæ··ä¹±ãšãã©ãã«ãçºçããã ãã§ããããšãã°ãrustfmtãªãã·ã§ã³ãå¿
èŠãªå Žåããã³ãŒããæ··ä¹±ããå Žåãªã©ã§ãã
@Hirevo async/await
ã¯ãã³ã³ãããŒã¿ã®å¿
èŠæ§ãæé€ããããšã«ãªã£ãŠããŸãã ãããããã³ã³ãããŒã¿ã ãã§ãããè¡ãããšãã§ãããã«æ»ããªãããã«ããŸãããã ããªãã®ã³ãŒãã¯ãšåãã§ã
future.then(|x| x.json()).map(|x| x.to_string()).map(|ret| ... );
ã§ã¯ã async/await
ãŸãšããŠåé€ããŸãããã
ãšã¯ãããã³ã³ãããŒã¿ã¯è¡šçŸåãäœãã䟿å©ã§ã¯ãªããåŸ
æ©ãã€ã³ãéã§ã®åçšãªã©ã await
äœãã§ããããè¡šçŸã§ããªãå ŽåããããŸãïŒ Pin
èšèšç®çïŒã
次ã®ã³ãŒãã§ã¯ãèªã¿ããããé£éãåªå é äœã®åé¡ã¯èŠãããŸããã
async fn fetch_user(name: &str) -> Result<Vec<Permission>, Error> {
let user = await? fetch(format!("/user/{0}", name).as_str())
.map(|x| serde_json::from_str::<User>(x?))
.then(|x| fetch(format!("/permissions/{0}", x?.id).as_str()))
.map(|x| serde_json::from_str::<Vec<Permission>>(x?));
Ok(user)
}
ç§ããããŸãïŒ
async fn fetch_user(name: &str) -> Result<Vec<Permission>, Error> {
let user = fetch(format!("/user/{0}", name).as_str()) await?;
let user: User = serde_json::from_str(user);
let permissions = fetch(format!("/permissions/{0}", x.id).as_str()) await?;
let permissions: Vec<Permission> = serde_json::from_str(permissions );
Ok(user)
}
äœãå€ãªããšãèµ·ãã£ãŠããŸããïŒ åé¡ãªãïŒ
async fn fetch_user(name: &str) -> Result<Vec<Permission>, Error> {
let user = dbg!(fetch(format!("/user/{0}", name).as_str()) await?);
let user: User = dbg!(serde_json::from_str(user));
let permissions = dbg!(fetch(format!("/permissions/{0}", x.id).as_str()) await?);
let permissions: Vec<Permission> = dbg!(serde_json::from_str(permissions));
Ok(user)
}
ã³ã³ãããŒã¿ã§åäœãããã®ã¯ãã£ãšé¢åã§ãã èšããŸã§ããªãã then
/ map
é¢æ°ã®?
ã¯æåŸ
ã©ããã«æ©èœãããã³ãŒãã¯into_future()
ãªã©ããªããšæ©èœããŸããã async/await
ãããŒã§ã¯å¿
èŠã®ãªãå¥åŠãªãã®ã
async
ããŒã¯ãŒãã䜿çšããŠå€ãã®æ£åœãªæ§æãå°å
¥ãããšããç¹ã§ãç§ã®ææ¡ã¯æé©ã§ã¯ãªãããšã«åæããŸãã ããããã«ãŒã«ã¯ç解ããããããã¹ãŠã®ãŠãŒã¹ã±ãŒã¹ãæºãããŠãããšæããŸãã
ããããç¹°ãè¿ãã«ãªããŸãããããã¯å€ãã®èš±å¯ãããããªãšãŒã·ã§ã³ãæå³ããŸãïŒ
await!(...)
ã try!()
ããã³println!()
ãããªããç¥ããããã¯ããšã®äžè²«æ§ã®ããawait
ã await(...)
ã await { ... }
ãã€ãŸãç ç³ãªãã®ãã¬ãã£ãã¯ã¹æ§æawait?
ã await?()
ã await? {}
ãã€ãŸãæ§æã®åã«ç ç³ãä»ãã... await
ãã€ãŸãã æ¥å°ŸèŸã®æ§æïŒãã©ã¹... await?
ã§ãããããã¯ç ç³ã§ã¯ãããŸããïŒãããå®éã«ã¯ã次ã®ããšã ããæåŸ ããŠããŸãã
Result
ã®ãªããã¬ãã£ãã¯ã¹ïŒ await
ããŸãã¯é·ãåŒã§æ確ã«ããããã®await { ... }
Result
sïŒ await?
ããŸãã¯await? {}
ãé·ãåŒã§æ確ã«ããŸã... await
ã ... await?
+1ããŠåºè·åŸ ã¡ïŒïŒïŒãã¯ããå®å®ãããŸãã ææ¥ãå¯èœã§ããã°ð
ãã®ãã¿ãŒã³ãã©ã®ããã«äœ¿çšããããã«ã€ããŠã¯å€ãã®æšæž¬ãããããã®ãããªå Žåã®äººéå·¥åŠã«ã€ããŠæžå¿µããããŸãã ç§ã¯ãããã®æžå¿µã«æè¬ããŸããããããå埩çãªå€æŽã«ãªãåŸãªãã£ã説åŸåã®ããçç±ã¯ããããŸããã ããã«ãããåŸã§æé©åã«æ å ±ãæäŸã§ããå®éã®äœ¿çšç¶æ³ã¡ããªãã¯ãçæã§ããŸãïŒå¿ èŠãªå ŽåïŒã
éåæRustãžã®æ¡çšããããç°¡æœã§è¡šçŸåè±ããªæ§æã«ç§»è¡ããããã®åŸã®_optional_ãªãã¡ã¯ã¿ãªã³ã°ã®åãçµã¿ããããäž»èŠãªã¯ã¬ãŒã/ãããžã§ã¯ãã«ãšã£ãŠå€§ããªåãçµã¿ã§ããå Žåã¯ããã®æ¡çšã®åãçµã¿ãä»ããéå§ã§ããããã«ããããšã匷ããå§ãããŸãã ç¶ç¶çãªäžç¢ºå®æ§ãçã¿ãåŒãèµ·ãããŠããŸãã
@Pzixel
ïŒæåã«ãé¢æ°fetch_userã®åŒã³åºãã§ãšã©ãŒãçºçããŸããããã®æçš¿ã§ä¿®æ£ããŸãïŒ
async / awaitã圹ã«ç«ããªããšèšã£ãŠããã®ã§ã¯ãªããã³ã³ãããŒã¿çšã«åé€ããå¿
èŠããããŸãã
Awaitã䜿çšãããšã解決åŸã«å°æ¥ã®å€ãåãã¹ã³ãŒãå
ã®å€æ°ã«ãã€ã³ãã§ããŸããããã¯éåžžã«äŸ¿å©ã§ãã³ã³ãããŒã¿ãŒã ãã§ã¯äžå¯èœã§ãã
åŸ
æ©ãåé€ããããšã¯ç§ã®ãã€ã³ãã§ã¯ãããŸããã§ããã
ã³ã³ãããŒã¿ã¯awaitã§éåžžã«ããŸãæ©èœããé£éã®åé¡ã¯ã³ã³ãããŒã¿ã«ãã£ãŠæ§ç¯ãããåŒå
šäœãåŸ
ã€ã ãã§è§£æ±ºã§ãããšèšããŸããïŒ await (await fetch("test")).json()
ãŸãã¯await { await { fetch("test") }.json() }
ã®å¿
èŠæ§ãæé€ããŸãïŒã
ç§ã®ã³ãŒãäŸã§ã¯ã ?
ã¯ç絡ã«ãã£ãŠæå³ãããšããã«åäœããã¯ããŒãžã£ãé¢æ°å
šäœã§ã¯ãªãErr(...)
è¿ãããã«ããŸãïŒãã®éšåã¯await?
ã«ãã£ãŠåŠçãããŸãïŒãã§ãŒã³å
šäœã§ïŒã
ããªãã¯ç§ã®ã³ãŒãäŸãå¹æçã«æžãçŽããŸããããïŒãã€ã³ãã£ã³ã°ãè¡ãããšã«ãã£ãŠïŒãã®é£ééšåãåé€ããŸããã
ããšãã°ããããã°éšåã®å Žåã以äžã¯å¿
èŠãªdbgã ãã§ãŸã£ããåãåäœãããŸãã ãã以äžã®ãã®ã¯ãããŸããïŒäœåãªæ¬åŒ§ããããŸããïŒïŒ
async fn fetch_permissions(name: &str) -> Result<Vec<Permission>, Error> {
let user = await? fetch(format!("/user/{0}", name).as_str())
.map(|x| dbg!(serde_json::from_str::<User>(dbg!(x)?)))
.then(|x| fetch(format!("/permissions/{0}", x?.id).as_str())))
.map(|x| dbg!(serde_json::from_str::<Vec<Permission>>(dbg!(x)?)));
Ok(user)
}
ã³ã³ãããŒã¿ãšè¿œå ã®ãã€ã³ãã£ã³ã°ãæ¬åŒ§ãªãã§åãããšãè¡ãæ¹æ³ãããããŸããã
ã¹ã³ãŒããäžæå€æ°ã§ãã£ã±ãã«ãªãã®ãé¿ããããã«é£éãè¡ã人ãããŸãã
ãããã£ãŠãã³ã³ãããŒã¿ã¯æçšã§ããããã®é£éèœåã«é¢ããç¹å®ã®æ§æã«ã€ããŠæ±ºå®ãããšãã«ç¡èŠããŠã¯ãªããªãããšãèšãããã£ãã ãã§ãã
ãããŠæåŸã«ã奜å¥å¿ããããªãã³ãŒãã¯.into_future()
ãªãã§ã¯æ©èœããªãã®ã§ããããããããã¯ãã§ã«å
ç©ã§ã¯ãããŸããïŒç§ã¯ããã«é¢ããå°é家ã§ã¯ãããŸãããããã§ã«å
ç©ã§ãããšæåŸ
ããŠããŸãïŒïŒ
fut await
é倧ãªåé¡ã匷調ããããšæããŸããããã¯ã人ã
ãã³ãŒããèªãæ¹æ³ãçå£ã«æ··ä¹±ãããŸãã èªç¶èšèªã§äœ¿çšããããã¬ãŒãºã«äŒŒãããã°ã©ãã³ã°åŒã«ã¯äžå®ã®äŸ¡å€ããããŸãããããã for value in collection {..}
ãããªæ§é ãæã€çç±ã®ã²ãšã€ã§ãããã»ãšãã©ã®èšèªã§a + b
ãšæžãçç±ã®1ã€ã§ãã ïŒ "a plus b"ïŒ a b +
代ããã«ããäœããåŸ
ã€ããããè±èªïŒããã³ä»ã®SVOèšèªïŒã®æ¹ããäœããåŸ
ã€ãã®æžã蟌ã¿/èªã¿åããã¯ããã«èªç¶ã§ãã ?
代ããã«ãæ¥å°ŸèŸtry
ããŒã¯ãŒãlet val = foo() try;
ã䜿çšãããšæ³åããŠã¿ãŠãã ããã
fut.await!()
ãšfut.await()
ã¯ãããªãã¿ã®ããããã³ã°åŒã³åºãã®ããã«èŠããããããã®åé¡ã¯çºçããŸããïŒãã ããããã¯ããã¯é¢é£ãããéæ³ããããã«åŒ·èª¿ããŸãïŒããããã£ãŠãåé¢ãããã¹ããŒã¹ãšã¯ç°ãªã£ãŠèªèãããŸããããŒã¯ãŒãã Sigilã¯ãŸããèªç¶èšèªã®ãã¬ãŒãºãšçŽæ¥é¡äŒŒããããšãªããããæœè±¡çãªæ¹æ³ã§ç°ãªã£ãŠèªèãããŸãããã®ãããææ¡ãããSigilã人ã
ãã©ã®ããã«èªããã¯ç¡é¢ä¿ã ãšæããŸãã
çµè«ãšããŠãããŒã¯ãŒãã«åºå·ããããšã決å®ãããå Žåããã¬ãã£ãã¯ã¹ããªã¢ã³ãã®ã¿ããéžæããå¿ èŠããããšåŒ·ãä¿¡ããŠããŸãã
@rpjohnstã§ã¯ãããªãã®ããããŸããã actual_fun(a + b)?
ãšbreak (a + b)?
ã¯åªå
é äœãç°ãªãããç§ã«ãšã£ãŠéèŠãªã®ã§ã await(a + b)?
ãäœã§ãããããããŸããã
ç§ã¯é ããããã®è°è«ããã©ããŒããŠããŸããããããã€ã質åãšã³ã¡ã³ãããããŸãã
ç§ã®æåã®ã³ã¡ã³ãã¯ã .await!()
æ¥å°ŸèŸãã¯ãã¯ãæåã®ãã€ã³ããé€ããŠãCentrilã®äž»ãªç®çããã¹ãŠæºãããŠãããšä¿¡ããŠãããšããããšã§ãã
ã
await
ã¯ãå°æ¥ã®èšèªèšèšãå¯èœã«ããããã®ããŒã¯ãŒãã®ãŸãŸã«ããå¿ èŠããããŸããã
await
ããŒã¯ãŒãã®ä»ã«ã©ã®ãããªçšéããããŸããïŒ
ç·šéïŒ await
ãã©ã®ããã«æ£ç¢ºã«æ©èœãããã誀解ããŸããã ç§ã¯èªåã®ééã£ãã¹ããŒãã¡ã³ãã«ç®ãéããäŸãæŽæ°ããŸããã
ç§ã®2çªç®ã®ã³ã¡ã³ãã¯ãRustã® await
ããŒã¯ãŒãã¯ãä»ã®èšèªã®await
ãšã¯ãŸã£ããç°ãªãããšãè¡ããããæ··ä¹±ãäºæããªã競åç¶æ
ãåŒãèµ·ããå¯èœæ§ããããšããããšã§ãã
async function waitFor6SecondThenReturn6(){
let result1 = await waitFor1SecondThenReturn1(); // executes first
let result2 = await waitFor2SecondThenReturn2(); // executes second
let result3 = await waitFor3SecondThenReturn3(); // executes third
return result1 + result2 + result3;
}
ãã¬ãã£ãã¯ã¹async
ã¯ãéåæå€ãã³ã³ãã€ã©ã§æ§ç¯ãããã¹ããŒããã·ã³ã®äžéšã§ããããšã瀺ãã¯ããã«æ確ãªä»äºãããŠãããšæããŸãã
async function waitFor6SecondThenReturn6(){
let async result1 = waitFor1SecondThenReturn1(); // executes first
let async result2 = waitFor2SecondThenReturn2(); // executes second
let async result3 = waitFor3SecondThenReturn3(); // executes third
return result1 + result2 + result3;
}
async
é¢æ°ã䜿çšãããšã async
å€ã䜿çšã§ããã®ã¯çŽæçã§ãã ããã¯ãŸããããã¯ã°ã©ãŠã³ãã§åäœããŠããéåææ©æ§ãšãããã©ã®ããã«æ©èœãããã«ã€ããŠã®çŽæãæ§ç¯ããŸãã
ãã®æ§æã«ã¯ãããã€ãã®æªè§£æ±ºã®è³ªåãšæ確ãªæ§æå¯èœæ§ã®åé¡ããããŸãããéåæäœæ¥ãã©ãã§è¡ãããŠããã®ããæ確ã«ãªããããæ§æå¯èœã§é£éå¯èœãª.await!()
åæã¹ã¿ã€ã«ã§è£å®ããŸãã
以åã®æç¶ãåã®äŸã§ã¯ãããã€ãã®åŒã®æåŸã«ããæ¥å°ŸèŸawait
æ°ä»ãã®ã«èŠåŽããã®ã§ããã®ææ¡ãããæ§æã§ã¯æ¬¡ã®ããã«ãªããŸãã
async fn fetch_user(name: &str) -> Result<Vec<Permission>, Error> {
let async user = dbg!(fetch(format!("/user/{0}", name).as_str()));
let user: User = dbg!(serde_json::from_str(user?));
let async permissions = dbg!(fetch(format!("/permissions/{0}", user.id).as_str()));
let permissions: Vec<Permission> = dbg!(serde_json::from_str(permissions?));
Ok(user)
}
ïŒç°¡åã«æ§æå¯èœã§é£éå¯èœãª.dbg!()
ãã¯ãã«ã€ããŠãè°è«ããããŸãããããã¯å¥ã®ãã©ãŒã©ã ã®ããã§ããïŒ
2019幎1æ29æ¥ç«ææ¥11:31:32 PM -0800ã«ãSphericonã¯æ¬¡ã®ããã«æžããŠããŸãã
ç§ã¯é ããããã®è°è«ããã©ããŒããŠããŸããããããã€ã質åãšã³ã¡ã³ãããããŸãã
ç§ã®æåã®ã³ã¡ã³ãã¯ã
.await!()
æ¥å°ŸèŸãã¯ãã¯ãæåã®ãã€ã³ããé€ããŠãCentrilã®äž»ãªç®çããã¹ãŠæºãããŠãããšä¿¡ããŠãããšããããšã§ããã
await
ã¯ãå°æ¥ã®èšèªèšèšãå¯èœã«ããããã®ããŒã¯ãŒãã®ãŸãŸã«ããå¿ èŠããããŸããã
.await!()
æ§æã®äž»èŠãªæ¯æè
ã®1人ãšããŠãç§ã¯
await
ã¯ããŒã¯ãŒãã®ãŸãŸã«ããŠããã¹ãã ãšçµ¶å¯Ÿã«èããŠãã ããã ç§ãã¡ã
ãšã«ããã³ã³ãã€ã©ã«.await!()
ãçµã¿èŸŒãå¿
èŠãããããã§ã
äºçŽ°ãªããšã§ãã
@Hirevo
ããªãã¯ç§ã®ã³ãŒãäŸãå¹æçã«æžãçŽããŸããããïŒãã€ã³ãã£ã³ã°ãè¡ãããšã«ãã£ãŠïŒãã®é£ééšåãåé€ããŸããã
ç§ã¯ãã®ãé£éã®ããã®é£éãã¢ãããŒããç解ããŠããŸããã é£éã¯ããããè¯ãå Žåã«è¯ãã§ããããšãã°ã圹ã«ç«ããªãäžæå€æ°ãäœæããããšã¯ã§ããŸããã ããã§ãŒã³ãåé€ããŸããããšèšããŸãããããã§ã¯äŸ¡å€ããªãããšãããããŸãã
ããšãã°ããããã°éšåã®å Žåã以äžã¯å¿ èŠãªdbgã ãã§ãŸã£ããåãåäœãããŸãã ãããŠãã以äžã¯äœããããŸããïŒäœåãªæ¬åŒ§ãããïŒ
ããããããªãã¯ãããããŸãã
async fn fetch_user(name: &str) -> Result<Vec<Permission>, Error> {
let user = fetch(format!("/user/{0}", name).as_str()) await?;
let user: User = dbg!(serde_json::from_str(dbg!(user)));
let permissions = fetch(format!("/permissions/{0}", x.id).as_str()) await?;
let permissions: Vec<Permission> = dbg!(serde_json::from_str(dbg!(permissions));
Ok(user)
}
ããã¯åãããšã§ã¯ãããŸããã
ã³ã³ãããŒã¿ã¯awaitã§éåžžã«ããŸãæ©èœããé£éã®åé¡ã¯ãã³ã³ãããŒã¿ã«ãã£ãŠæ§ç¯ãããåŒå šäœãåŸ ã€ã ãã§è§£æ±ºã§ãããšèšããŸããïŒawaitïŒawait fetchïŒ "test"ïŒïŒãjsonïŒïŒãŸãã¯awaitã®å¿ èŠæ§ãåãé€ããŸãã {await {fetchïŒ "test"ïŒ} .jsonïŒïŒ}ïŒã
ãã¬ãã£ãã¯ã¹await
åé¡ã®ã¿ã§ãããä»ã®åœ¢åŒã®ãã¬ãã£ãã¯ã¹ã«ã¯ååšããŸããã
ã³ã³ãããŒã¿ãšè¿œå ã®ãã€ã³ãã£ã³ã°ãæ¬åŒ§ãªãã§åãããšãè¡ãæ¹æ³ãããããŸããã
ãããã®ãã€ã³ãã£ã³ã°ãäœæããŠã¿ãŸãããïŒ ããšãã°ããã€ã³ãã£ã³ã°ã¯åžžã«ãªãŒããŒã«é©ããŠããŸãããŸãããã€ã³ãã£ã³ã°å€ãåºåã§ãããåŒãè©äŸ¡ã§ããªããããã¬ãŒãããå Žåã¯ã
æåŸã«ãå®éã«ã¯ãã€ã³ãã£ã³ã°ãåé€ããŠããŸããã ããªãã¯ç§ãlet user = ...
ããããšããã«labmda |user|
æ§æã䜿çšããŸããã äœãä¿åãããŸããã§ãããããã®ã³ãŒãã¯èªã¿ã«ããããããã°ãé£ããã芪ã«ã¢ã¯ã»ã¹ã§ããŸããïŒããšãã°ããšã©ãŒãèªåèªèº«ã§åŒã³åºãã®ã§ã¯ãªããã¡ãœãããã§ãŒã³ã§å€éšããã©ããããå¿
èŠããããŸããå€åïŒã
äžèšã§èšãã°ãé£éã¯ããèªäœã§ã¯äŸ¡å€ãæäŸããŸããã ããã€ãã®ã·ããªãªã§åœ¹ç«ã€ãããããŸããããããã¯ãããã®1ã€ã§ã¯ãããŸããã ãããŠãç§ã®æžã蟌ã¿éåæ/ 6幎以äžã®ããã®awaitã³ãŒã以æ¥ãç§ã¯ããªããæžã蟌ã¿ãä»ãŸã§éåæã³ãŒããé£éããããªããšèããŠããŸãã ã§ããªãã£ãããã§ã¯ãªããäžäŸ¿ã§ææåãããããã§ããã¢ãããŒãã¯åžžã«èªã¿ãããããã°ãã°æžããããããã§ãã èšããŸã§ããªããã³ã³ãããŒã¿ã¯ãŸã£ããå¿
èŠãããŸããã async/await
ãããå Žåã futures
/ streams
ã§ãããã®æ°çŸã®ã¡ãœããã¯å¿
èŠãããŸãããå¿
èŠãªã®join
ãšselect
2ã€ã ãã§ãã
@Sphericon AFAIKã³ãã¥ããã£ã¯ã await
ãããŒã¯ãŒããŸãã¯å°ç« ãšããŠäœ¿çšããããšã«åæããããã async
ã«é¢ããã¢ã€ãã¢ã«ã¯å¥ã®RFCãå¿
èŠã§ãã
ç§ã®2çªç®ã®ã³ã¡ã³ãã¯ãRustã®awaitããŒã¯ãŒãã¯ä»ã®èšèªã®awaitããŒã¯ãŒããšã¯ãŸã£ããç°ãªãããšãè¡ããããæ··ä¹±ãäºæããªã競åç¶æ ãåŒãèµ·ããå¯èœæ§ããããšããããšã§ãã
ãã£ãšè©³ããæããŠããã ããŸããïŒ å
ç©ãããŒãªã³ã°ããŒã¹ã§ããããšãé€ããŠãJS / CïŒawaitã®éã«éãã¯èŠãããŸããã§ãããã async/await
ãåŠçããããšã¯å®éã«ã¯äœããããŸããã
ããã®ããã€ãã®å Žæã§ææ¡ãããŠããawait?
ãã¬ãã£ãã¯ã¹æ§æã«ã€ããŠïŒ
`` `CïŒ
foo = awaitïŒ bar_asyncïŒïŒ;
How would this look with ~~futures of futures~~ result of results *) ? I.e., would it be arbitrarily extensible:
```C#
let foo = await?? double_trouble();
IOWããã¬ãã£ãã¯ã¹await?
ã¯ãç§ã«ã¯ç¹æ®ãããæ§æã®ããã«èŠããŸãã
ïŒ*ç·šéã
ããã¯å ç©ã®å ç©ãšã©ã®ããã«èŠããã§ããããïŒ ã€ãŸããä»»æã«æ¡åŒµå¯èœã§ããããïŒ
let foo = await?? double_trouble();
IOWã
await?
ã¯ãç§ã«ã¯ç¹æ®ãããæ§æã®ããã«èŠããŸãã
@rolandsteinerã®ãå
ç©ã®æªæ¥ããšã¯impl Future<Output = Result<Result<_, _>, _>>
ãæå³ããŸãïŒ1ã€ã®await
+2ã€ã®?
ããã¹ããããå
ç©ãåŸ
ããã«ã1ã€ã®å
ç©ãš2ã€ã®çµæããã¢ã³ã©ãããããããšãæå³ããŸãïŒã
await?
_ã¯ç¹å¥ãªå Žåã§ãããããã¯await
90ïŒ
以äžã®äœ¿çšã«é©çšãããå¯èœæ§ãé«ãç¹å¥ãªå Žåã§ãã å
ç©ã®å
šäœçãªãã€ã³ãã¯ãéåæã®_IO_æäœãåŸ
æ©ããæ¹æ³ã§ããIOã¯ãã©ãŒã«ãã«ã§ããããã async fn
90ïŒ
以äžãio::Result<_>
ïŒãŸãã¯IOããªã¢ã³ããå«ãä»ã®ãšã©ãŒã¿ã€ãïŒãè¿ãå¯èœæ§ããããŸãã ïŒã Result<Result<_, _>, _>
ãè¿ãé¢æ°ã¯çŸåšéåžžã«ãŸããªã®ã§ãç¹å¥ãªå Žåã®æ§æãå¿
èŠã«ãªããšã¯æããŸããã
@ Nemo157ãã¡ããã§ãïŒçµæã®çµæã ã³ã¡ã³ããæŽæ°ããŸããã
ä»æ¥ãç§ãã¡ã¯æžããŸã
await!(future?)
future: Result<Future<Output=T>,E>
await!(future)?
ã®future: Future<Output=Result<T,E>>
ãããŠã await future?
ãšæžããšããããã©ã¡ããæå³ããã®ããç解ããå¿
èŠããããŸãã
ããããã±ãŒã¹1ãåžžã«ã±ãŒã¹2ã«å€ããå¯èœæ§ãããã®ã¯äºå®ã§ããïŒ ã±ãŒã¹1ã®å ŽåãåŒã¯æªæ¥ãŸãã¯ãšã©ãŒãçæããŸãã ãã ãããšã©ãŒã¯é 延ããå°æ¥çã«ç§»åããå¯èœæ§ããããŸãã ãããã£ãŠãã±ãŒã¹2ãåŠçããŠãããã§èªåå€æãè¡ãããšãã§ããŸãã
ããã°ã©ããŒã®èŠ³ç¹ã§ã¯ã Result<Future<Output=T>,E>
ã¯ãšã©ãŒã®å Žåã®æ©æ埩垰ãä¿èšŒããŸããã2ã€ãåãã»ã¡ã³ãã£ãã¯ãæã£ãŠããããšãé€ããŠã ãšã©ãŒã±ãŒã¹ãããã«çºçããå Žåã¯ãã³ã³ãã€ã©ãããŸãæ©èœããè¿œå ã®poll
åŒã³åºããåé¿ã§ããããšãã€ã¡ãŒãžã§ããŸãã
ãããã£ãŠãææ¡ã¯æ¬¡ã®ãšããã§ãã
await exp?
ãããšè§£éããããšãã§ããawait (exp?)
expãããå ŽåResult<Future<Output=T>,E>
ãããã³ãšããŠè§£é(await exp)?
expãããå ŽåFuture<Output=Result<T,E>>
ã ã©ã¡ãã®å Žåãããšã©ãŒãæ©æã«è¿ãããæ£åžžã«å®è¡ãããŠããå Žåã¯çã®çµæã«è§£æ±ºãããŸãã
ããè€éãªã±ãŒã¹ã§ã¯ãèªåã¡ãœããã¬ã·ãŒããŒéåç §ã®ãããªãã®ãé©çšã§ããŸãã
await exp????
ãæã
ã¯æåã®ãã§ãã¯exp
ãšIFã§ããResult
ã try
ãããšçµæããŸã ãããšãã«ç¶ããResult
?
ããªããªããã Result
ã§ã¯ãªããã®ãã§ãããŸã§ã ããããããã¯æªæ¥ã§ãªããã°ãªãããç§ãã¡ã¯ããã«await
ããæ®ãã®?
ãé©çšããŸããç§ã¯æ¥å°ŸèŸã®ããŒã¯ãŒã/å°ç« ã®æ¯æè ã§ããããä»ãããã§ãã ãã ãããã¬ãã£ãã¯ã¹ã®åªå é äœã¯å®éã«ã¯å€§ããªåé¡ã§ã¯ãªããåé¿çãããããšã瀺ããããšæããŸãã
RustããŒã ã®ã¡ã³ããŒã¯æé»ã®ããšã奜ãŸãªãããšã¯ç¥ã£ãŠããŸããããã®ãããªå Žåãæœåšçãªã»ã¡ã³ãã®éãã¯ã»ãšãã©ãªããæ£ããããšã確å®ã«è¡ãããã®è¯ãæ¹æ³ããããŸãã
await?
ã¯ç¹æ®ãªã±ãŒã¹ã§ãããawait
90ïŒ ä»¥äžã®äœ¿çšã«é©çšãããå¯èœæ§ãé«ãç¹æ®ãªã±ãŒã¹ã§ãã å ç©ã®å šäœçãªãã€ã³ãã¯ãéåæIOæäœãåŸ æ©ããæ¹æ³ãšããŠã§ããIOã¯ãã©ãŒã«ãã«ã§ãããããasync fn
90ïŒ ä»¥äžãio::Result<_>
ïŒãŸãã¯IOããªã¢ã³ããå«ããã®ä»ã®ãšã©ãŒã¿ã€ãïŒãè¿ãå¯èœæ§ããããŸãã ïŒãResult<Result<_, _>, _>
ãè¿ãé¢æ°ã¯çŸåšéåžžã«ãŸããªã®ã§ãç¹å¥ãªå Žåã®æ§æãå¿ èŠã«ãªããšã¯æããŸããã
ç¹å¥ãªå Žåã¯ãæ§æãæ¡åŒµããŸãã¯åŠç¿ããã®ãæªããæçµçã«ã¯æè·ç©ã«ãªããŸãã åäžã®çè«çãªãŠãŒã¶ããªãã£ã®ãŠãŒã¹ã±ãŒã¹ã«ã€ããŠãèšèªã®ã«ãŒã«ã«äŸå€ãèšããããšã¯è¯ã劥åã§ã¯ãããŸããã
Result<T, E> where T: Future
Futureãå®è£
ããããšã¯å¯èœã§ããããïŒ ããããã°ã ?
ã¢ã³ã©ããããããšãªãã await result_of_future
ã ãã䜿çšã§ããŸãã ãã¡ãããçµæãè¿ãããã®ã§ã await result_of_future
ãšåŒã³ãŸããããã¯ã (await result_of_future)?
ãæå³ããŸãã ããããã°ã await?
æ§æã¯äžèŠã«ãªãããã¬ãã£ãã¯ã¹æ§æã¯ããå°ãäžè²«æ§ããããŸãã ããã«äœãåé¡ãããã°æããŠãã ããã
å¿
é ã®åºåãæåã䜿çšããawait
è¿œå ã®åŒæ°ã«ã¯ã次ã®ãã®ããããŸãïŒå人çã«ã¯ãå
šäœçã«ã©ã®æ§æãæã奜ããããããŸããïŒã
?
æŒç®åã®ç¹å¥ãªå€§æåå°æåã await?
ãŸãã¯await??
ã¯ãããŸããloop
ã while
ã for
ãªã©ã®æ¢åã®å¶åŸ¡ãããŒæŒç®åãšäžèŽããŸããããããå¿
é ã®åºåãæåãå¿
èŠã§ããäŸïŒ
let p = if y > 0 { op1() } else { op2() };
let p = await { p }?;
ãããããšãã£ã¿ãŒã§ãããããã£ãŠã¿ãŠãããŸã é¢åã§ãã break
ãšreturn
ããã«ãåºåãæåãªãã§await
ãšawait?
ã䜿çšããããšæããŸãã
Future forResultãå®è£ ããããšã¯å¯èœã§ãããã
ããã§TïŒæªæ¥ïŒ
ããªãã¯éã欲ããã§ãããã æãäžè¬çãªåŸ æ©å¯èœãªã®ã¯ãåºåã¿ã€ããçµæã§ããFutureã§ãã
次ã«ã ?
ãé ããããåžåãããããããšãç®çãšããæ瀺çãªè°è«ããããŸãã çµæãªã©ãäžèŽããããå Žåã¯ã©ãããã°ããã§ããã
Result<Future<Result<T, E2>>, E1>
å ŽåããããåŸ
ã€ãšResult<Result<T, E2>, E1>
ãè¿ãããŸãã
Future<Result<T, E1>>
å ŽåããããåŸ
ã€ãšResult<T, E1>
è¿ãããŸãã
?
ãé ãããåžåãããããå¿
èŠã¯ãªããåŸã§çµæã䜿çšããŠå¿
èŠãªããšãè¡ãããšãã§ããŸãã
ããã ãã®æããªãã誀解ããã«éããªãã ?
ã99ïŒ
ã®æéåŸ
æ©ããå¿
èŠãããããããããã©ã®ããã«åœ¹ç«ã€ãã¯ããããŸããã
ããã await?
æ§æã¯ãäžè¬çãªã±ãŒã¹ã§ãã(await future)?
ãæå³ããããšã«ãªã£ãŠããŸãã
äžåºŠã ãããã£ãŠã await
ãawait expr?
ã§ããå³å¯ã«ãã€ã³ããããã®åŒãResult<Future<Result<T, E2>>, E1>
å Žåã Result<T, E2>
ã¿ã€ãã®äœãã«è©äŸ¡ãããŸãã ã ããã¯ãçµæã¿ã€ããåŸ
æ©ããããã®ç¹å¥ãªã±ãŒã·ã³ã°ããªãããšãæå³ããŸãã ããã¯ãéåžžã®ç¹æ§ã®å®è£
ã«åŸãã ãã§ãã
@ivandardi Result<Future<Item=i32, Error=SomeError>, FutCreationError>
ã©ãã§ããïŒ
@Pzixel泚ããã®åœ¢ã®æªæ¥ã¯ãªããªã£ãŠããŸãã çŸåšãé¢é£ããã¿ã€ãã¯1ã€ãåºåïŒããããçµæïŒã§ãã
@ivandardiããããŸããã ç§ã¯ä»ãããèŠãŸãã ããªããããªãã«å¯ŸããŠæã£ãŠããå¯äžã®ããšã¯ããããéžè±ã§ããããã«ããã§åŠã°ãªããã°ãªããªãå¥åŠãªäœãã§ãããšããåªå
é äœã§ãããç§ãæãã«await
ã»ãšãã©ã®ãã®ãããã§ãã
æªæ¥ãè¿ãçµæã¯éåžžã«ãŸãã§ãããåé€ããããããªã³ã¢ã®äœããé€ããŠ1ã€ã®ã±ãŒã¹ãèŠã€ããããªãã£ãã®ã§ããã®å Žåã«åœ¹ç«ã€ç ç³/ç¹æ§ã®å®è£ ã¯å¿ èŠãªããšæããŸãã
@ivandardi
Result<Future<Item=i32, Error=SomeError>, FutCreationError>
ã©ãã§ããïŒ
Future
ãã¬ã€ãã«ã¯Output
é¢é£ä»ããããã¿ã€ããããªãã®ã§ãããã¯äžå¯èœã ãšæããŸãã
@mehcodeãŸããããã¯ä»¥åã«æèµ·ãããæžå¿µã®ããã€ãã«å¯ŸåŠããŠãããšç§ã¯èšããŸãã ãŸãããObviousPrecedenceããšãUsefulPrecedenceãã®éžæè¢ã®ä»£ããã«ããã¬ãã£ãã¯ã¹åŸ æ©æ§æã1ã€ãããªãããããã¬ãã£ãã¯ã¹æ§æã®æ±ºå®ã«ã圹ç«ã¡ãŸãã
ããŠãFutureãã¬ã€ãã«ã¯åºåã«é¢é£ä»ããããã¿ã€ããããªãããšãèãããšãããã¯äžå¯èœã ãšæããŸãã
äœæ ãªã®ïŒ
fn probably_get_future(val: u32) -> Result<impl Future<Item=i32, Error=u32>, &'static str> {
match val {
0 => Ok(ok(15)),
1 => Ok(err(100500)),
_ => Err("Coulnd't create a future"),
}
}
@Pzixelhttps ïŒ //doc.rust-lang.org/std/future/trait.Future.htmlãåç §ããŠãã ãã
ããªãã¯futures
æšæ ã«ãã£ãå€ãç¹æ§ã«ã€ããŠè©±ããŠããã
æ£çŽãªãšãããæ¥é èŸã®äœçœ®ã«ããŒã¯ãŒãããããšã¯æãããŸããã
async fn request_user(self, user_id: String) -> Result<User> {
let url = format!("users/{}/profile", user_id);
let user = (yield self.request(url, Method::GET, None, true)))?;
let user = (yield user.res.json::<UserResponse>())?;
let user = user.user.into();
Ok(user)
}
åãäœçœ®ã«å°ç« ã眮ãããã匷ãå©ç¹ããããŸãïŒ
async fn request_user(self, user_id: String) -> Result<User> {
let url = format!("users/{}/profile", user_id);
let user = (*self.request(url, Method::GET, None, true))?;
let user = (*user.res.json::<UserResponse>())?;
let user = user.user.into();
Ok(user)
}
ä»ã®ãã¬ãã£ãã¯ã¹æŒç®åãšã®äžè²«æ§ããªããåŒã®åã«åé·ãªç©ºçœãè¿œå ããã³ãŒããããªãã®è·é¢ã§å³åŽã«ã·ããããã ãã ãšæããŸãã
æ·±ããã¹ããããã¹ã³ãŒãã®åé¡ã解決ããæ¡åŒµãããæ§æïŒ Pre-RFC ïŒã§sigilã䜿çšããŠã¿ãããšãã§ããŸãã
async fn request_user(self, user_id: String) -> Result<User> {
let url = format!("users/{}/profile", user_id);
let user = self.[*request(url, Method::GET, None, true)]?;
let user = user.res.[*json::<UserResponse>()]?;
let user = user.user.into();
Ok(user)
}
ãŸãããã§ãŒã³ã¡ãœããã«å¯èœæ§ãè¿œå ããŸãã
async fn request_user(self, user_id: String) -> Result<User> {
let url = format!("users/{}/profile", user_id);
let user = self.[*request(url, Method::GET, None, true)]?
.res.[*json::<UserResponse>()]?
.user
.into();
Ok(user)
}
ãããŠæããã«ã *
ã@
眮ãæããŸããããããã¯ããã§ããæå³ããããŸãã
async fn request_user(self, user_id: String) -> Result<User> {
let url = format!("users/{}/profile", user_id);
let user = (@self.request(url, Method::GET, None, true))?;
let user = (@user.res.json::<UserResponse>())?;
let user = user.user.into();
Ok(user)
}
async fn request_user(self, user_id: String) -> Result<User> {
let url = format!("users/{}/profile", user_id);
let user = self.[@request(url, Method::GET, None, true)]?;
let user = user.res.[<strong i="27">@json</strong>::<UserResponse>()]?;
let user = user.user.into();
Ok(user)
}
async fn request_user(self, user_id: String) -> Result<User> {
let url = format!("users/{}/profile", user_id);
let user = self.[@request(url, Method::GET, None, true)]?
.res.[<strong i="30">@json</strong>::<UserResponse>()]?
.user
.into();
Ok(user)
}
ããã§ç§ãæ°ã«å
¥ã£ãŠããã®ã¯ã @
ãé¢æ°å®£èšã®LHSã«é
眮ãããawait
@
åæ ããã ?
ãRHSã«é
眮ãããResult<User>
åæ ãããããšã§ããé¢æ°å®£èšã®ã ããã«ããã @
�
ãšéåžžã«äžè²«æ§ããããŸãã
ããã«ã€ããŠäœãèãã¯ãããŸããïŒ
ããã«ã€ããŠäœãèãã¯ãããŸããïŒ
äœåãªäžæ¬åŒ§ã¯äœ¿çšã§ããŸããã
@mehcodeãããå
ç©ã«Error
ã¿ã€ãããªãããšã«æ°ã¥ããªãã£ãã ããããèŠç¹ã¯ãŸã æå¹ã§ããããããæ©èœãè¿ãæ©èœã䜿çšã§ããŸããæ©èœãå®äºãããšãçµæãŸãã¯ãšã©ãŒãè¿ãããå¯èœæ§ããããŸãã
ããã«ã€ããŠäœãèãã¯ãããŸããïŒ
ã¯ãïŒ ã»ã³ããªã«ã®ã³ã¡ã³ãã«ãããšã
æ¡åŒµãããæ§æã®ææ¡ã«ã€ããŠã¯ããããããæ·±ã説æãããã®ãã¹ãŠã®äœ¿çšæ³ã®ã»ãã³ãã£ã¯ã¹ãšè±ç³ãæäŸããå¿ èŠããããŸãã çŸåšã®ãšããããã®æ§æã§æçš¿ããã³ãŒãã¹ããããã®æå³ãç解ã§ããŸããã
ããããèŠç¹ã¯ãŸã æå¹ã§ããããããæ©èœãè¿ãæ©èœã䜿çšã§ããŸããæ©èœãå®äºãããšãçµæãŸãã¯ãšã©ãŒãè¿ãããå¯èœæ§ããããŸãã
ã ããããªãã¯Future<Item=Result<T, E>>
ãæã£ãŠããã§ãããïŒ ãŸãããã®å Žåãããªãã¯ãã ...æªæ¥ãåŸ
ã£ãŠãçµæã«å¯ŸåŠããŸãð
ã®ããã«ã foo
ã®åãFuture<Item=Result<T, E>>
ãŸãã ãã®å Žåã await foo
ã¯Result<T, E>
ãªãã以äžã䜿çšããŠãšã©ãŒãåŠçã§ããŸãã
await foo?;
await foo.unwrap();
match await foo { ... }
await foo.and_then(|x| x.bar())
@melodicstream
ã ããããªãã¯æªæ¥ãæã£ãŠããã§ããã
- >ãããã§ããïŒ ãŸãããã®å Žåãããªãã¯ãã ...æªæ¥ãåŸ ã£ãŠãçµæã«å¯ŸåŠããŸãð
ãããã Result<Future<Item=Result<T, E>>, OtherE>
ãæå³ããŸã
postfixããªã¢ã³ãã䜿çšãããšã
let bar = foo()? await?.bar();
@melodicstreamæçš¿ãæŽæ°ãããã®æ©èœã®pre-RFCãžã®ãªã³ã¯ãè¿œå ããŸãã
ãã...ç§ã¯3åç®ã®ãã¹ãŠã®ã³ã¡ã³ããèªã¿çŽããŸãã...
å¯äžã®äžè²«ããæèŠã¯ã await
Future
ããã®æ§æã®.await
åŸçœ®è¡šèšãå«ããªããšã§ãã ããããã®åãã¯IDEã§ã¯æ©èœãããããããŸããããç§ã«ã¯ãŸã£ããæ©èœããŸããã ãããå®å®ããæ§æã§ããã°ç¢ºãã«ããã«é©å¿ããããšãã§ããŸããããããç§ã«ãšã£ãŠæ¬åœã«ãæ£ããããšæããããšã¯æ±ºããŠãªãã§ãããã
äž»ã«KISSã®ååã®ããããŸãä»ã®ã»ãšãã©ã®èšèªãšåæ§ã«è¡ã䟡å€ããããããå¿
é ã®æ¬åŒ§ãªãã§è¶
åºæ¬çãªawait
ãã¬ãã£ãã¯ã¹è¡šèšã䜿çšããŸãã
await? future
ã(await future)?
è±ç³ããããšã¯åé¡ãªãããããããããšã§ããããããè¶
ãããã®ã¯ãç§ã«ã¯åé¡ã®ãªã解決çã®ããã«èŠããŸãã åçŽãªlet
åãã€ã³ãã«ãããã»ãšãã©ã®äŸã§ã³ãŒãã®å¯èªæ§ãåäžããŸãããå人çã«ã¯ãç°¡åãªé£éããªãã·ã§ã³ã§ãã£ããšããŠããã³ãŒããèšè¿°ããªãããã®ã«ãŒãããã©ãå¯èœæ§ããããŸãã
ããã¯èšã£ãŠããç§ã¯ããã«ã€ããŠæ±ºå®ããç«å Žã«ãªãããšãéåžžã«å¬ããæããŸãã
ããã«ãã€ãºãè¿œå ããã®ã§ã¯ãªãããã®åé¡ããã®ãŸãŸã«ããŠãæçµçãªè©æ±ºãåŸ ã¡ãŸãïŒããããæå³ããŠããŸãïŒã
...å°ãªããšãç§ã¯æ£çŽã«ãããããããšããŸã...
@Pzixel foo
ã®ã¿ã€ããResult<Future<Item=Result<T, E1>>, E2>
ã§ãããšãããšã await foo
ã®ã¿ã€ãã¯Result<Result<T, E1>, E2>
ãªããããã«å¿ããŠãã®çµæãåŠçã§ããŸãã
await foo?;
await foo.and_then(|x| x.and_then(|y| y.bar()));
await foo.unwrap().unwrap();
@melodicstreamãããããããŸããã Result,
ãåŸ
ã€ããšã¯ã§ããŸããFuture. So you have to do
fooïŒïŒãåŸ
ã€ããšãã§ããŸããïŒ to unwrap
æªæ¥from
çµæ, then do
to get a result, then again
ïŒ `ãæªæ¥ããã®çµæãã¢ã³ã©ããããã®ãåŸ
ã¡ãŸãã
åŸçœ®ã§ã¯foo? await?
ãå眮ã§ã¯
ã§ããããããªãã®äŸãç¹ã«æåŸã®äŸã¯ããŸããããŸããã
(await foo.unwrap()).unwrap()
ãã ãã @ huxiã¯æ£ãããããããŸããããããããååšããªãåé¡ã解決ããŠããŸãã ãããç解ããããã®æè¯ã®æ¹æ³ã¯ãæ¥å°ŸèŸãã¯ããèš±å¯ããåºæ¬çãªasync/await
æ¡çšåŸã«å®éã®ã³ãŒãããŒã¹ã確èªããããšã§ãã
@Pzixelãã®ããããã¹ãŠã®çš®é¡ã®Result<Future<Item=T>, E>
Future
ãå®è£
ããããšãææ¡ããŸããã ããããããšã§ãç§ãèšã£ãŠããããšãå¯èœã«ãªããŸãã
Result<Future<Output=Result<T, E1>>, E2>
await foo??
ã¯åé¡ãããŸãããã await foo.unwrap().unwrap()
ã«ã¯æºè¶³ããŠããŸããã ç§ã®æåã®è³ã¢ãã«ã§ã¯ãããã¯
(await foo.unwrap()).unwrap()
ããã§ãªããã°ãç§ã¯æ¬åœã«æ··ä¹±ããã§ãããã ãã®çç±ã¯ã ?
ãäžè¬æŒç®åã§ããã unwrap
ãã¡ãœããã§ããããã§ãã ã³ã³ãã€ã©ãŒã¯.
ãããªæŒç®åã«å¯ŸããŠç¹å¥ãªããšãè¡ãããšãã§ããŸããããããéåžžã®ã¡ãœããã§ããå Žåã¯ãåžžã«å·ŠåŽã®æãè¿ãåŒã«ã®ã¿é¢é£ããŠãããšæ³å®ããŸãã
await
ã¯åãªãããŒã¯ãŒãã§ããããªããžã§ã¯ãã§ã¯ãªãããšãç¥ã£ãŠããã®ã§ãæ¥å°ŸèŸã®æ§æfoo.unwrap() await.unwrap()
ãåé¡ãããŸããããããã£ãŠã unwrap()
åã«åŒã®äžéšã§ããå¿
èŠããããŸãã
åŸçœ®ã¹ã¿ã€ã«ã®ãã¯ãã¯ãããã®åé¡ã®å€ããããŸã解決ããŸãããæ¢åã®èšèªã«ç²Ÿéããæ¥é èŸãä»ãããŸãŸã«ããŠããããã®ããšããåé¡ã ãã§ãã åŸçœ®ã¹ã¿ã€ã«ã«æ祚ããŸãã
次ã®ã³ãŒããçãããªãã®ã¯æ£ããã§ããïŒ
fn foo(n: u32) -> impl Future<Item = u32> {
if n == 0 {
panic!("Can't be zero");
} else {
do_async_call().map(|_| 10)
}
}
ãããŠ
async fn foo(n: u32) -> u32 {
if n == 0 {
panic!("Can't be zero");
} else {
await!(do_async_call());
10
}
}
æåã®ãã®ã¯æªæ¥ãäœãããšãããšãããã¯ã«ãªãã2çªç®ã®ãã®ã¯æåã®æ祚ã§ãããã¯ã«ãªããŸãã ãããããªããç§ãã¡ã¯ããã§äœãããã¹ãã§ããïŒ æ¬¡ã®ããã«åé¿ã§ããŸã
fn foo(n: u32) -> impl Future<Item = u32> {
if n == 0 {
panic!("Can't be zero");
} else {
async {
await!(do_async_call());
10
}
}
}
ããããããã¯ã¯ããã«äŸ¿å©ã§ã¯ãããŸããã
@Pzixel ïŒããã¯äžããã決å®ã§ãã async fn
ã¯å®å
šã«æ æ°ã§ãããããŒãªã³ã°ããããŸã§ãŸã£ããå®è¡ãããªããããå°æ¥ã®åç¶æéå
šäœã«ããã£ãŠãã¹ãŠã®å
¥ååç¶æéããã£ããã£ããŸãã åé¿çã¯ãæ瀺çãªimpl Future
è¿ããé
延èšç®ã«async
ãããã¯ïŒãŸãã¯fnïŒã䜿çšããã©ããã³ã°é¢æ°ã§ãã ããã¯ã Future
ã³ã³ãããŒã¿ããæåã®ããŒãªã³ã°åŸã«ç§»åã§ããªããããåã³ã³ãããŒã¿ã®éã«å²ãåœãŠãã«ã¹ã¿ãã¯ããããã«_å¿
é _ã§ãã
ããã¯å®äºãã決å®ã§ãããæé»ã®åŸ æ©ã·ã¹ãã ãRustã«å¯ŸããŠïŒããŸãïŒæ©èœããªãçç±ã§ãã
ããã§CïŒéçºè ããããŠç§ã¯ãã¬ãã£ãã¯ã¹ã¹ã¿ã€ã«ãæ¯æããã€ãããªã®ã§ãå察祚ãæããæºåãããŠãã ããã
ãããïŒ read().await
ãŸãã¯read().await()
ïŒã䜿çšããæ¥å°ŸèŸæ§æã¯éåžžã«èª€è§£ãæããããããã£ãŒã«ãã¢ã¯ã»ã¹ãŸãã¯ã¡ãœããåŒã³åºãã瀺åããŸãã await
ã¯ã©ã¡ãã§ããããŸããã ããã¯èšèªæ©èœã§ãã ç§ã¯æ±ºããŠããã©ã³ã®Rustaceanã§ã¯ãããŸããããã³ã³ãã€ã©ã«ãã£ãŠæžãçŽãããããŒã¯ãŒãã§ããä»ã®.something
ã±ãŒã¹ãç¥ããŸããã ç§ãèããããšãã§ããæãè¿ãã®ã¯?
ãµãã£ãã¯ã¹ã§ãã
æ°å¹ŽåããCïŒã§async / awaitã䜿çšããŠããŸããããæšæºã®ã¹ããŒã¹ä»ããã¬ãã£ãã¯ã¹æ§æïŒ await foo()
ïŒã¯ããã®éãã£ãšåé¡ãåŒãèµ·ãããŠããŸããã ãã¹ããããawait
ãå¿
èŠãªå Žåãparensã䜿çšããã®ã¯é¢åã§ã¯ãããŸãããããã¯ããã¹ãŠã®æ瀺çãªæŒç®åã®åªå
é äœã®æšæºæ§æã§ãããããç°¡åã«ååŸã§ããŸãã
`` `cïŒ
var list =ïŒGetListAsyncïŒïŒïŒãToListïŒïŒ;ãåŸ
ã€
`await` is essentially a unary operator, so treating it as such makes sense.
In C# 8.0, currently in preview, we have async enumerables (iterators), which comes with an `IAsyncEnumerable<T>` interface and `await foreach (var x in QueryAsync())` syntax. The lack of async enumerables has been an issue since async was added in C# 5; for example, we have ORMs that return a `Task<IEnumerable>` which is only half asynchronous; we have to block on calls to `MoveNext()`. Having proper async enumerables is a big deal.
If a postfix `await` is used and similar async iterator support is added to Rust, that would look something like
```rust
for val in v_async_iter {
println!("Got: {}", val);
} await // or .await or .await()
ããã¯å¥åŠã«æããŸãã
ä»ã®èšèªãšã®äžè²«æ§ãéèŠèŠãããŠãããšæããŸãã çŸåšãéåæåŒã®åã®await
ããŒã¯ãŒãã¯ãCïŒãVB.NETãJavaScriptãããã³Pythonã®æ§æã§ãããC ++ã®æ§æãšããŠãææ¡ãããŠããŸãã ããã¯ãäžçã®äžäœ7èšèªã®ãã¡5ã€ã§ãã CãšJavaã«ã¯ãŸã async / awaitããããŸããããå¥ã®æ¹åã«é²ãã ãé©ãããããšã§ãããã
å¥ã®èšãæ¹ãããããŸãã¯å¥ã®èšãæ¹ãããæ¬åœã«æ£åœãªçç±ããªãéããæ¥é èŸãšæ¥å°ŸèŸã®äž¡æ¹ãå©ç¹ãšåŠ¥åã®ç¹ã§åãã§ããå Žåãéå ¬åŒã«èšãããããšãããããããããšããå§ãããŸããæšæºãæ§æã
@markrendleç§ãCïŒasync/await
æžããŠããŸãããã¬ãã£ãã¯ã¹ã奜ãã§ãã ããããRustã¯å€§ããç°ãªããŸãã
(await Foo()).ToList()
ããŸããªã±ãŒã¹ã§ããããšã¯ãåç¥ã§ãããã ã»ãšãã©ã®å Žåã await Foo()
ãšæžãã ãã§ãå¥ã®ã¿ã€ããå¿
èŠãªå Žåã¯ãããããFoo
眲åãä¿®æ£ããå¿
èŠããããŸãã
ããããéã¯å¥ã®ãã®ã§ãã ããã«ã¯?
ããããšã©ãŒãäŒæããå¿
èŠããããŸãã CïŒã§ã¯ãasync / awaitã¯èªåçã«äŸå€ãã©ããããåŸ
æ©ãã€ã³ãéã§ã¹ããŒããŸãã ããªãã¯ãããéã³ãŠããŸããã CïŒã§await
ãæžããã³ã«ãæžãå¿
èŠãããããšãèæ
®ããŠãã ãã
var response = (await client.GetAsync("www.google.com")).HandleException();
var json = (await response.ReadAsStreamAsync()).HandleException();
var somethingElse = (await DoMoreAsyncStuff(json)).HandleException();
...
ããããã¹ãŠã®äžæ¬åŒ§ã䜿çšããã®ã¯éåžžã«é¢åã§ãã
ããªããæã£ãŠããpostfixä»ãã®OTOH
var response = client.GetAsync("www.google.com") await.HandleException();
var json = response.ReadAsStreamAsync() await.HandleException();
var somethingElse = DoMoreAsyncStuff(json) await.HandleException();
...
ãŸãã¯ãã³ã§
let response = client.get_async("www.google.com") await?;
let json = response.read_as_Stream_async() await?;
let somethingElse = do_more_async_stuff(json) await?;
...
ãããŠã ?
ãšawait
ã«å ããŠãå¥ã®ãã©ã³ã¹ãã©ãŒããŒããããŸããååã@
ãŸãããã await?
è¿œå ã®æ§æãçºæããå Žåãäžè²«æ§ãä¿ã€ããã«await@
ã @?
ã await@?
ã...ãå¿
èŠã«ãªããŸãã
ãã¬ãã£ãã¯ã¹await
ã倧奜ãã§ãããRustãããã§åé¡ãªããã©ããã¯ããããããŸããã èšèªã«è¿œå ã®ã«ãŒã«ãè¿œå ããããšã¯åé¡ãªããããããŸããããããã¯ããããèªã¿ããããã䟡å€ããªãè² æ
ã§ãã
åé¡ã®ã¹ã¬ããã®è¿œè·¡ãå«ããã¹ãŠã®ã³ã¡ã³ããèªã¿çŽããŠãã ããïŒããã«3æéè¿ãè²»ãããŸããïŒã ãããŠç§ã®èŠçŽã¯æ¬¡ã®ãšããã§ããæ¥å°ŸèŸ@
ã¯æè¯ã®è§£æ±ºçã®ããã«èŠããŸãããæ®å¿µãªããããã¯æãéå°è©äŸ¡ãããŠãããã®ã§ãã
ããã«ã€ããŠã¯å€ãã®ïŒåã£ãïŒæèŠãããã以äžã¯ãããã«å¯Ÿããç§ã®ã³ã¡ã³ãã§ãïŒ
async-await
ã¯postfix @
æ
£ããŠããªãã§ããã
å®éã«ã¯ãåãasync fn
æ§æãæäŸããã await
ãšåãæ©èœãåŒãç¶ã䜿çšã§ãããããæ
£ããŠããªãã®ã¯ååã ãã§ãã
Rustã«ã¯ããããã®å°ç« ããããããã«å¥ã®å°ç« ãå°å ¥ããã¹ãã§ã¯ãããŸãã
ãã ããã·ãžã«ã¯ãèªã¿åãå¯èœã§ä»ã®æ§æãšäžèŽãããŸã§ã¯åé¡ãããŸããã ãããŠãæ°ããå°ç« ãå°å
¥ããããšã¯ããããäœããã®åœ¢ã§äºæ
ãæªåãããããšãå³å¯ã«æå³ããããã§ã¯ãããŸããã äžè²«æ§ã®èŠ³ç¹ãããæ¥å°ŸèŸ@
ã¯ãã©ã®æ¥é èŸ/æ¥å°ŸèŸawait
ãããã¯ããã«åªããæ§æã§ãã
?!@#
ãããªã¹ããããã¯PerlãæãåºãããŸã
å®éã«ã¯ãIMOãéåžžã«åçŽã§äººéå·¥åŠçã«èŠãã@?
以å€ã®çµã¿åããã¯ãã£ãã«èŠãããŸããã impl Try<impl Future<T>>
ã impl Future<impl Try<impl Try<T>>>
ãããã«ã¯impl Future<T>
ãããªæ»ãå€ã®åã¯ãå®éã®ITTã®äŸã§èŠãããããã«ã䜿çšéã®æ倧10ïŒ
ã§çºçããŸãã ããã«ããããã®10ïŒ
ã®90ïŒ
ã«ããå°ç« ã®éåäœã¯ãAPIãä¿®æ£ãããã代ããã«äžæçãªãã€ã³ãã£ã³ã°ãå°å
¥ããŠæ確ã«ããå¿
èŠãããå Žåã«ãã³ãŒãã®èãã瀺ããŸãã
æ¥å°ŸèŸ@
ã¯æ°ã¥ãã«ããã§ãïŒ
ãããŠãããã¯å®éã«ã¯async-await
ã³ã³ããã¹ãã§ã¯å€§ããªå©ç¹ã§ãã ãã®æ§æã¯ãéåæã³ãŒããåæã®ããã«è¡šçŸããæ©èœãå°å
¥ãããããããç
©ãããawait
ã¯ãæ¬æ¥ã®ç®çã«ã®ã¿å¹²æžããŸãã äžèšã®äŸã¯ãéäŒç¹ã®çºçããæ瀺çãããå Žåã«ã³ãŒããèšåŒµãããã»ã©å¯éããŠããå¯èœæ§ãããããšãæ確ã«ç€ºããŠããŸãã ãã¡ããããããã確èªããå¿
èŠããããŸãããã³ãŒããè¥å€§åãããããšãªãã @
å°ç« ãšawait
ã§å®å
šã«åé¡ãããŸããã
å°æ¥ãåŸ ã€ããšã¯ã³ã¹ãã®ãããæäœã§ãããæ瀺çã«èšãå¿ èŠããããŸã
ããã¯æ¬åœã«çã«ããªã£ãŠããŸãããç§ãã¡ã¯ãããããã»ã©é »ç¹ã«ãããŠããã»ã©å€§å£°ã§èšãã¹ãã§ã¯ãªããšæããŸãã ãã¥ãŒããŒã·ã§ã³æ§æãšã®é¡äŒŒæ§ãæäŸã§ãããšæããŸãã mut
ã¯æ瀺çã«1åã ãå¿
èŠã§ãããããã«ãã¥ãŒã¿ãã«ãã€ã³ãã£ã³ã°ãæé»çã«äœ¿çšã§ããŸãã å®å
šã§ãªãæ§æã§å¥ã®ã¢ãããžãŒãæäŸã§ããŸããæ瀺çãªunsafe
ã¯impl Try
returnãŸãã¯ä»åŸã®try
ãããã¯ã¯1åã ãå¿
èŠã§ãããããã«?
æŒç®åãèªä¿¡ãæã£ãŠäœ¿çšã§ããŸãã ãããã£ãŠãåãããã«ãæ瀺çãªasync
ã¯ãæ°žç¶çãªæäœã«1åã ã泚éãä»ããŸããããã«ãå®éã«ãããè¡ã@
æŒç®åãé©çšã§ããŸãã
await
ãšã¯èªã¿æ¹ãéãã®ã§å€ã§ãç°¡åã«å
¥åã§ããŸãã
&
ããrefããšããŠã !
ããnotããšããŠèªãã å ŽåãçŸåš@
ãã©ã®ããã«èªãã§ãããã¯ãããã䜿çšããªããšãã匷ã䞻匵ã§ã¯ãªããšæããŸããã·ã³ãã«ã ãŸããã³ãŒãã®èªã¿åããåžžã«ããéèŠãªåªå
äºé
ã§ãããããå
¥åã®éããéèŠã§ã¯ãããŸããã ã©ã¡ãã®å Žåãã @
ãžã®æ¡çšã¯éåžžã«ç°¡åã§ãã
@
ã¯ãã§ã«ãã¿ãŒã³ãããã³ã°ã§äœ¿çšãããŠããããããããŸãã§ã
!
ãã§ã«ãã¯ãã§äœ¿çšãããŠããã &
ãã§ã«åçšã§äœ¿çšãããŠããã &&
æŒç®åã§ã¯ã |
ã䜿çšãããŠãããããããã¯åé¡ã§ã¯ãªããšæããŸããã¯ããŒãžã£ããã¿ãŒã³ãããã³||
æŒç®åã§ã¯ã +
/ -
ããã¬ãã£ãã¯ã¹äœçœ®ã«ãé©çšã§ãã .
ã¯ãŸã 䜿çšã§ããŸããããå€ãã®ç°ãªãã³ã³ããã¹ãã ç°ãªãæ§ææ§é ã§åãã·ã³ãã«ãåå©çšããããšã«é©ãããšãæªãããšããããŸããã
grepããã®ã¯é£ããã§ããã
äžéšã®ãœãŒã¹ã«éåæãã¿ãŒã³ãå«ãŸããŠãããã©ããã確èªããå Žåã¯ã rg async
æ¹ãã¯ããã«åçŽã§ç°¡åãªãœãªã¥ãŒã·ã§ã³ã«ãªããŸãã ãã®æ¹æ³ã§ãã¹ãŠã®æ©çãŸããã€ã³ããæ¬åœã«èŠã€ãããå Žåã¯ã rg "@\s*[;.?|%^&*-+)}\]]"
ãããªåçŽã§ã¯ãªããã®ãæžãããšãã§ããŸãããããã¯é©ãã¹ãããšã§ããããŸããã å¿
èŠã«ãªãé »åºŠãèãããšãIMOã®ãã®æ£èŠè¡šçŸã¯ãŸã£ããåé¡ãããŸããã
@
ã¯åå¿è
åãã§ã¯ãªããã°ãŒã°ã«ã§æ€çŽ¢ããã®ã¯é£ããã§ã
?
æŒç®åãšäžè²«ããŠåäœããã®ã§ãåå¿è
ã«ãšã£ãŠã¯å®éã«ã¯ç解ãããããšæããŸãã éã«ãæ¥é èŸ/æ¥å°ŸèŸawait
ã¯ãä»ã®Rustæ§æãšäžèŽãããçµåæ§/ãã©ãŒããã/æå³ã«é çãçããŸãã åäžã®ããŒã¯ãŒãã§ã¯åºæ¬çãªæŠå¿µå
šäœã説æã§ãããåå¿è
ã¯ãšã«ãããããæ¬ããåŠã¶ããã await
ãèªå·±ææžåã®äŸ¡å€ãè¿œå ãããšã¯æããŸããã ãããŠãRustã¯ãå¯èœãªæ§ææ§é ã®ããããã«ã€ããŠãã¬ãŒã³ããã¹ãã®ãã³ããæäŸããèšèªã§ã¯ãããŸããã§ããã 誰ãã@
èšå·ã®æå³ãå¿ããå ŽåïŒæ£ããèŠããŠããããã®é¢é£ä»ããããããããã®ã§ãåé¡ã«ãªããšã¯æ¬åœã«æããŸããïŒ-çŸåšrust @ symbol
ãªã®ã§ãã°ãŒã°ã«ã§ãæåããã¯ãã§ãããã¿ãŒã³ãããã³ã°ã§@
ã«é¢ãããã¹ãŠã®é¢é£æ
å ±ãè¿ããŸãã
ãã§ã«await
ããŒã¯ãŒããäºçŽããŠããã®ã§ããšã«ãã䜿çšããå¿
èŠããããŸã
ã©ãããŠïŒ æçµçãªæ©èœã®å®è£
ããããªãã§ããè¯ãããšãå€æããå Žåãæªäœ¿çšã®äºçŽæžã¿ããŒã¯ãŒãããã£ãŠãåé¡ãããŸããã ãŸããæ£ç¢ºã«await
ããŒã¯ãŒããå°å
¥ããããšããçŽæã¯ãããŸãã
?
ã¯ééãã§ã @
ã¯2çªç®ã®ééãã§ã
ããããããªãã¯ãã£ãšèªåœçã«èããŸãããããŠãã®ããããªãã¯èšå·ã®ä»£ããã«åèªãæ±ãããšã奜ã¿ãŸãã ãã®ãããããèãæ§æã§ã¯å€ã衚瀺ãããŸããã ããããããå€ãã®äººã
ãããèŠèŠçã«èããããšããããŠåœŒãã«ãšã£ãŠäŸµå
¥çãªèšèã¯ä»£ããã«åãã®ãé£ããããšãèŠããŠãããŠãã ããã ããããããã§ã®é©åãªåŠ¥åæ¡ã¯ã try!()
ã?
ãšäžç·ã«æäŸãããããã«ã await!()
ãã¯ããäžç·ã«æäŸããããšã§ãããããã£ãŠã @
代ããã«ããã䜿çšã§ããŸãã @
æ¬åœã«äžå¿«ãªå Žåã¯ã
^^^^^^^ç§ã®ã³ã¡ã³ããèªã¿çŽããŸãããïŒ
@ I60Rã®ã³ã¡ã³ããèªãã§å€§ããªå瀺ããããæ¥å°ŸèŸã®
ç§ãã¡ã®åŸ
æ©æäœã¯await
ã¯ãããŸããã å°ãªããšããCïŒãšJavaScriptã§await
ã䜿çšãããæ¹æ³ã§ã¯ãªãã async
/ await
芪ãã¿ãããã®2ã€ã®æ倧ã®ãœãŒã¹ã§ãã
ãããã®èšèªã§ã¯ã Task
ïŒCïŒïŒ/ Promise
ïŒJSïŒãéå§ããã»ãã³ãã£ã¯ã¹ã¯ãã¿ã¹ã¯ãããã«ã¿ã¹ã¯ãã¥ãŒã«å
¥ããããŠå®è¡ãããããšã§ãã CïŒã§ã¯ããã¯ãã«ãã¹ã¬ããã³ã³ããã¹ãã§ãããJSã§ã¯ã·ã³ã°ã«ã¹ã¬ããã§ãã
ãããããããã®èšèªã®ãããã«ãããŠãã await foo
æå³çã«ããã®ã¿ã¹ã¯ãããŒã¯ããã¿ã¹ã¯foo
ã®å®äºãåŸ
ã€ããšãæå³ããŸãããã®éããã®ã¿ã¹ã¯ã§äœ¿çšãããŠããèšç®ãªãœãŒã¹ã¯ä»ã®ãŠãŒã¶ãŒã§ã䜿çšã§ããŸããã¿ã¹ã¯ãã
ããããè€æ°ã®Task
/ Promise
æ§ç¯ããåŸã«å¥ã
ã®await
䞊ååŠçãååŸããçç±ã§ãïŒã·ã³ã°ã«ã¹ã¬ãããšã°ãŒãã¥ãŒã¿ã§ãïŒïŒ await
ã»ãã³ãã£ã¯ã¹ã¯ãããŸããããã®ã¿ã¹ã¯ãå®è¡ãããã®ã§ã¯ãªããåŸ
æ©ãçµäºããŠåéã§ããããã«ãªããŸã§ãããã€ãã®ã¿ã¹ã¯ãå®è¡ãããã
ããã¯ãäœææã«ã¿ã¹ã¯ã®éå§ãæ æ°ãŸãã¯ç±å¿ã«åŸ ã€ããšãšã¯ãŸã£ããå¥ã®ãã®ã§ãããé¢é£æ§ã¯é«ããªããŸãã åæäœæ¥ãå®äºããåŸãæ®ãã®ã¿ã¹ã¯ããã¥ãŒã«å ¥ããããšã«åãçµãã§ããŸãã
æ æ°ãªã€ãã¬ãŒã¿ãšçŸåšã®æªæ¥ã®ãŠãŒã¶ãŒã«ã¯ããã§ã«ãã®ç·ã«æ²¿ã£ãŠæ··ä¹±ããããŸãã await
æ§æã¯ãããã§ã¯äœã®æ©æµãåããŠããªããšæããŸãã
ãããã£ãŠã await!(foo)
await foo
ã¯ããåŸæ¥ã®ãCïŒãŸãã¯JSã®æ¹æ³ã§ã¯@matkladã詳现ãééããå Žåã¯ç§ãèšæ£ããïŒKotlinã®suspend fun
ãšåºãä¿¡ããŠããŸãã ãŸãã¯ãRustã«é£æ¥ãããã£ã¹ã«ãã·ã§ã³ã§èšåãããŠããããã«ããæ瀺çãªéåæãæé»çãªåŸ
æ©ãã
ç°¡åãªã¬ãã¥ãŒïŒKotlinã§ã¯ã suspend
ã³ã³ããã¹ãå
ããã®ã¿suspend fun
ãåŒã³åºãããšãã§ããŸãã ããã«ãããåŒã³åºãããé¢æ°ãããã«å®è¡ãããŠå®äºããåé¢æ°ã®å¿
èŠã«å¿ããŠã¹ã¿ãã¯ã³ã³ããã¹ããäžæåæ¢ãããŸãã åsuspend fun
ã䞊è¡ããŠå®è¡ããå Žåã¯ãéåæã¯ããŒãžã£ãšåçã®ãã®ãäœæããããããsuspend fun
ã³ã³ãããŒã¿ãšçµã¿åãããŠãè€æ°ã®suspend
ã¯ããŒãžã£ã䞊è¡ããŠå®è¡ããŸãã ïŒãããããå°ãè€éã§ããïŒåsuspend fun
ãããã¯ã°ã©ãŠã³ãã§å®è¡ããå Žåã¯ããã®ã¿ã¹ã¯ããšã°ãŒãã¥ãŒã¿ã«é
眮ãã .await()
suspend fun
ãå
¬ââéããã¿ã¹ã¯ã¿ã€ããäœæããŸãã
ãã®ã¢ãŒããã¯ãã£ã¯ãRustã®Future
ãšã¯ç°ãªãåè©ã§èšè¿°ãããŠããŸãããéåžžã«ããç¥ãããŠããããã«èãããŸãã
Rustã§æé»ã®åŸ
æ©ãæ©èœããªãçç±ã以åã«èª¬æãããã®ç«å Žãæ¯æããŸãã async fn() -> T
ãšfn() -> Future<T>
䜿çšæ³ãåçã§ããå¿
èŠããããŸããããã«ãããæ æ°ãªå
ç©ã§ãåæäœæ¥ãè¡ãããã¿ãŒã³ãå¯èœã«ãªããŸãïŒããªãããŒãªå Žåã«ã©ã€ãã¿ã€ã ãæ©èœãããããïŒã å
ç©ãåºå®ããããã«ããããã®éã«éæ¥çãªå±€ãæããã«ç©ã¿éããããšãã§ããããã«ãæ æ°ãªå
ç©ãå¿
èŠã§ãã
ããããç§ã¯ä»ã foo@
ïŒãŸãã¯ä»ã®å°ç« ïŒã®ãæ瀺çã ãéããªãæ§æãçã«ããªã£ãŠãããšç¢ºä¿¡ããŠããŸãã ããã§äžèšèšãã®ã¯å«ã§ããããã®å Žåã®@
ã¯async
ã®ã¢ããæŒç®ã§ããã ?
ã¯try
ã¢ããæŒç®ãšãã䌌ãŠããŸãã
ã³ãŒãã«?
ãæ¯ããããããšã¯ã Result
è¿ããšãã«ã³ã³ãã€ã©ãæå¥ãèšãã®ããããããã ãã®ãã®ã§ãããšããæèŠããããŸãã ãããŠããæå³ã§ãããªãã¯ããããã£ãŠããŸãã ããããããã¯ã³ãŒãã®ããŒã«ã«ãªæå¿«ããšããç§ãã¡ã®çæ³ãç¶æããããšã§ãã ãã®æäœãã¢ãããä»ããŠè§£åãããã®ããæåéãããŒã«ã«ã§å®è¡ãããã®ããç¥ãå¿
èŠããããŸãã
ïŒã¢ããã®è©³çŽ°ãééããå Žåã誰ããç§ãèšæ£ãããšç¢ºä¿¡ããŠããŸãããç§ã®äž»åŒµã¯ãŸã æå¹ã ãšæããŸããïŒ
@
ãåãããã«åäœããå Žåãããã¯è¯ãããšã ãšæããŸãã ããã¯ãããã€ãã®ã¿ã¹ã¯ãã¹ãã³ã¢ããããŠããawait
çµäºããããšã§ã¯ãªããä»ã®èª°ããå®äºããããã«ãã³ãã§éãå¿
èŠã®ããã¹ããŒããã·ã³ãæ§ç¯ããããšã§ãããããå®è¡ã³ã³ããã¹ãã«å
¥ããŸãã
TL; DRïŒãã®ããããã°ã®æçš¿ãã1ã€åãäžãããšããããããã次ã®ããã«ããŸããããRustã®await!()
ã¯ãä»ã®èšèªã®ããã«await
ã¯ãããŸããã çµæã¯_é¡äŒŒ_ã§ãããã¿ã¹ã¯ã®åŠçæ¹æ³ã®ã»ãã³ãã£ã¯ã¹ã¯å€§ããç°ãªããŸãã ãã®ããšãããå
±éã®åäœããªããããå
±éã®æ§æã䜿çšããªãããšã§ã¡ãªãããåŸãããŸãã
ïŒä»¥åã®è°è«ã§ãæ æ°ãªæªæ¥ããç±å¿ãªæªæ¥ã«å€ãã£ãèšèªã«ã€ããŠèšåãããŸãããããã¯ã await foo
ãã foo
ããã§ã«çºçããŠããããšã瀺åããŠããããã§ãããç§ãã¡ã¯ãããçæãããã®ãåŸ
ã£ãŠããã ãã ãšæããŸããçµæãïŒ
ç·šéïŒãããããåæçã«è°è«ãããå Žåã¯ãéã®éçºã®äžåïŒãªã³ã¯ã¯24æéïŒãŸãã¯å éšãŸãã¯ãŠãŒã¶ãŒïŒ@ CAD97ïŒã§@CADã«pingããŠãã ããã ç§ã¯èªåã®ç«å ŽãçŽæ¥ã®ç²Ÿæ»ã«ç«ã¡åããããããšæã£ãŠããŸãã
ç·šé2ïŒå¶çºçãªpingã«ã€ããŠGitHub @cadã«ç³ãèš³ãããŸããã ç§ã¯@ããšã¹ã±ãŒãããããšããŸããããããã«åŒã蟌ãã€ããã¯ãããŸããã§ããã
@ I60R
?!@#
ãããªã¹ããããã¯PerlãæãåºãããŸãå®éã«ã¯ãIMOãéåžžã«åçŽã«èŠãã
@?
以å€ã®çµã¿åããã¯ãã£ãã«èŠãããŸããã
ãããçŸãããŸã§ããªãã¯ãããç¥ãããšãã§ããŸããã ããã«å¥ã®ã³ãŒããã©ã³ã¹ãã©ãŒããŒïŒããšãã°ã yield
sigilïŒãããå Žåãããã¯å®éã®Perlã¹ã¯ãªããã«ãªããŸãã
æ¥å°ŸèŸ
@
ã¯æ°ã¥ãã«ããã§ãïŒ
ãããŠãããã¯å®éã«ã¯
async-await
ã³ã³ããã¹ãã§ã¯å€§ããªå©ç¹ã§ãã
await
ãã€ã³ãã«æ°ä»ãã®ãé£ããããšã¯å©ç¹ã«ã¯ãªãåŸãŸããã
å°æ¥ãåŸ ã€ããšã¯ã³ã¹ãã®ãããæäœã§ãããæ瀺çã«èšãå¿ èŠããããŸã
ããã¯æ¬åœã«çã«ããªã£ãŠããŸãããç§ãã¡ã¯ãããããã»ã©é »ç¹ã«ãããŠããã»ã©å€§å£°ã§èšãã¹ãã§ã¯ãªããšæããŸãã
CïŒãšã¯ã¹ããªãšã³ã¹ã«é¢ããç§ã®ãªã³ã¯ãèªã¿çŽããŠãã ããã ããã»ã©å€§å£°ã§ãããã»ã©é »ç¹ã«èšãããšã¯ãå®éã«ã¯ããã»ã©éèŠã§ãã
ä»ã®ç¹ã¯éåžžã«æå¹ã§ãããç§ãè¿ä¿¡ããç¹ã¯ä¿®æ£äžå¯èœãªã®ã£ããã§ãã
@ CAD97 Rustã§async
ãã©ã®ããã«éãããèšãããšãã§ããCïŒéçºè
ãšããŠ..ãŸããããªãã説æããããã«ããã¯ããã»ã©éãã¯ãããŸããã ç§èŠããªãã®å«æã¯èª€ã£ãåæã«åºã¥ããŠããŸã
ãããã£ãŠã
await!(foo)
await foo
ã¯ããåŸæ¥ã®ãCïŒãŸãã¯JSã®æ¹æ³ã§ã¯
ããã¯ãCïŒã®éçºè
ã®å¿ã§ããŸã£ããåãã§ãã ãã¡ãããå
ç©ã¯ããŒãªã³ã°ããããŸã§å®è¡ãããªãããšãèŠããŠããå¿
èŠããããŸãããã»ãšãã©ã®å Žåãããã¯åé¡ã§ã¯ãããŸããã ã»ãšãã©ã®å Žåã await
ã¯ããå°æ¥ã®F
ããå€æ°x
ã©ãããããŠããªãå€ãååŸãããããšããæå³ã§ãã ããŒãªã³ã°ããããŸã§æªæ¥ãå®è¡ãããªãããšã¯ãå®éã«ã¯CïŒã®äžçã®åŸã®å®å¿ã§ããã人ã
ã¯ãããããããšã«å¹žãã«ãªãã§ãããã ããã«å ããŠãCïŒã¯ã€ãã¬ãŒã¿/ãžã§ãã©ããšåæ§ã®æŠå¿µãæã£ãŠããŸããããããæ æ°ãªã®ã§ãCïŒã®çŸ€è¡ã¯ãã¹ãŠã«ç²ŸéããŠããŸãã
äžèšã§èšãã°ã await
ãå°ãç°ãªãåäœãããã®ãæãŸããã®ã¯ãïŒ
younameitïŒ
èšèªã§await
ããã«åäœããå°ç« ãæã£ãŠãããããç°¡åã§ãããå®å
šã§ã¯ãããŸããã ããã¯ããªããæããããããªãã»ã©ã®ååŒã§ã¯ãªãã®ã§ã人ã
ã¯éãã«æ··ä¹±ããããšã¯ãããŸããã ç±å¿ã§æ æ°ãªå®è¡ãåé¡ã«ãªãç¶æ³ã¯éåžžã«ãŸãã§ãããããèšèšäžã®äž»èŠãªæžå¿µäºé
ã§ã¯ãããŸããã
@Pzixelããã¯CïŒã®
ç±å¿ãª/æ æ°ãªå®è¡ãéèŠã§ããç¶æ³ã¯_æ¬åœã«_ãŸãã§ããããããããäž»èŠãªèšèšäžã®æžå¿µäºé ã§ãã£ãŠã¯ãªããŸããã
æ®å¿µãªãããããã¯çå®ã§ã¯ãããŸããããããã€ãã®PromiseãçæããåŸã§await
çæããããšãããã¿ãŒã³ã¯éåžžã«äžè¬çã§æãŸãããã®ã§ãããRustã§ã¯æ©èœããŸããã
ããã¯éåžžã«å€§ããªéãã§ãããäžéšã®Rustã¡ã³ããŒãé©ãããŸããã
Rustã®async / awaitã¯å®éã«ã¯ã¢ããã·ã¹ãã ã«è¿ããåºæ¬çã«JavaScript / CïŒãšã®å ±éç¹ã¯ãããŸããã
å®è£ ã¯å®å šã«ç°ãªããŸãïŒã¹ããŒããã·ã³ãæ§ç¯ããŠãããã¢ãããšäžèŽããã¿ã¹ã¯ã§å®è¡ããŸãïŒã
APIã¯å®å šã«ç°ãªããŸãïŒãã«ãšããã·ã¥ïŒã
æ æ°ã§ãããšããããã©ã«ãã®åäœã¯å®å šã«ç°ãªããŸãïŒããã¯ã¢ãããšäžèŽããŠããŸãïŒã
ã³ã³ã·ã¥ãŒããŒã¯ãå€æ°ã§ã¯ãªã1ã€ããååšã§ããŸããïŒããã¯ã¢ãããšäžèŽããŠããŸãïŒã
ãšã©ãŒãåé¢ãã ?
ã䜿çšããŠãšã©ãŒãåŠçããããšã¯å®å
šã«ç°ãªããŸãïŒããã¯ã¢ããå€æåãšäžèŽããŠããŸãïŒã
ã¡ã¢ãªã¢ãã«ã¯å®å šã«ç°ãªããRust Futuresã®å®è£ ãšããŠãŒã¶ãŒãå®éã«Futuresã䜿çšããæ¹æ³ã®äž¡æ¹ã«å€§ããªåœ±é¿ãäžããŸãã
å¯äžã®å ±éç¹ã¯ããã¹ãŠã®ã·ã¹ãã ãéåæã³ãŒããç°¡åã«ããããã«èšèšãããŠããããšã§ãã ããã§ãããŸãã ããã¯å®éã«ã¯ããŸãäžè¬çã§ã¯ãããŸããã
å€ãã®äººãCïŒã«ã€ããŠèšåããŠããŸãã ç§ãã¡ã¯ç¥ã£ãŠããŸãã
ç§ãã¡ã¯CïŒãäœãããããJavaScriptãäœãããããç¥ã£ãŠããŸãã ç§ãã¡ã¯ããªããããã®èšèªããããã®æ±ºå®ãããã®ããç¥ã£ãŠããŸãã
CïŒã®å ¬åŒããŒã ã¡ã³ããŒãç§ãã¡ã«è©±ããããasync / awaitã§ãããã®æ±ºå®ãè¡ã£ãçç±ã詳现ã«èª¬æããŸããã
ãããã®èšèªãããŒã¿ãã€ã³ãããŸãã¯ãŠãŒã¹ã±ãŒã¹ãç¡èŠããŠãã人ã¯èª°ãããŸããã ãããã¯èæ ®ãããŠããŸãã
ããããRustã¯å®éã«ã¯CïŒãJavaScriptïŒãŸãã¯ä»ã®èšèªïŒãšã¯ç°ãªããŸãã ãããã£ãŠãä»ã®èšèªãè¡ãããšãç²ç®çã«ã³ããŒããããšã¯ã§ããŸããã
ãããããããã®èšèªã®ãããã«ãããŠããawait fooã¯æå³çã«ããã®ã¿ã¹ã¯ãããŒã¯ããã¿ã¹ã¯fooã®å®äºãåŸ ã€ãããšãæå³ããŸãã
Rustã§ããŸã£ããåãã§ãã éåæé¢æ°ã®ã»ãã³ãã£ã¯ã¹ã¯åãã§ãã async fnïŒFutureãäœæããïŒãåŒã³åºããå ŽåããŸã å®è¡ãéå§ãããŠããŸããã ããã¯ç¢ºãã«JSãCïŒã®äžçãšã¯ç°ãªããŸãã
ãããåŸ ã€ããšã¯ãä»ã®ã©ãã§ãåãã§ãããæªæ¥ãå®æãžãšé§ãç«ãŠãŸãã
æ®å¿µãªãããããã¯çå®ã§ã¯ãããŸããããããã€ãã®PromiseãçæããåŸã§
await
çæããããšãããã¿ãŒã³ã¯éåžžã«äžè¬çã§æãŸãããã®ã§ãããRustã§ã¯æ©èœããŸããã
詳现ãæããŠãã ããã æçš¿ãèªã¿ãŸããããäœãåé¡ãªã®ãããããŸããã§ãã
let foos = (1..10).map(|x| some_future(x)); // create futures, unlike C#/JS don't actually run anything
let results = await foos.join(); // awaits them
ãã¡ããã2è¡ç®ãŸã§ã¯èµ·åããŸããããã»ãšãã©ã®å Žåãããã¯æãŸããåäœã§ãããããã¯await
ããŒã¯ãŒãã®äœ¿çšãèš±å¯ããªã倧ããªéãã§ãããšç§ã¯ç¢ºä¿¡ããŠããŸãã ãããã¯åèªäœã¯ã await
ãšããåèªãããã§æå³ããªãããšã瀺åããŠããŸãã
ãããã®èšèªãããŒã¿ãã€ã³ãããŸãã¯ãŠãŒã¹ã±ãŒã¹ãç¡èŠããŠãã人ã¯èª°ãããŸããã ãããã¯èæ ®ãããŠããŸãã
åãè°è«ãäœåºŠãç¹°ãè¿ãã®ã¯é¢åã§ã¯ãããŸããã æã£ãéãã«å±ãããšæãã®ã§ããããããŸããã
PS
- APIã¯å®å šã«ç°ãªããŸãïŒãã«ãšããã·ã¥ïŒã
ããã¯ããªãèªèº«ã®æªæ¥ã ããå®è¡ãããšãéããçã¿ãŸãã ãããã99ïŒ100ïŒïŒïŒ ã®å Žåããã®éããé ãå ç©ã®ã³ã³ãããŒã¿ã䜿çšããã ãã§ãã
- ã¡ã¢ãªã¢ãã«ã¯å®å šã«ç°ãªããRust Futuresã®å®è£ ãšããŠãŒã¶ãŒãå®éã«Futuresã䜿çšããæ¹æ³ã®äž¡æ¹ã«å€§ããªåœ±é¿ãäžããŸãã
ãã£ãšè©³ããæããŠããã ããŸããïŒ Hyperã§åçŽãªWebãµãŒããŒãäœæãããšãã«ãå®éã«ã¯ãã§ã«éåæã³ãŒããè©ŠããŠã¿ãŸããããéãã¯ããããŸããã§ããã å
¥ããŠasync
ããã§ã await
ããããè¡ã£ãŠã
rustã®async / awaitã®å®è£ ã¯ä»ã®èšèªãšã¯ç°ãªããããå¥ã®ããšãããªããã°ãªããªããšããè°è«ã¯ããªã説åŸåããããŸããã Cã®
for (int i = 0; i < n; i++)
ãšPythonã®
for i in range(n)
確ãã«åãåºæ¬çãªã¡ã«ããºã ãå
±æããŠããŸããããPythonãfor
ã䜿çšããããšãéžæããã®ã¯ãªãã§ããïŒ ãã®éèŠãªéãã瀺ãã«ã¯ã i in range(n) @
ãŸãã¯i in range(n) --->>
ãªã©ã䜿çšããå¿
èŠããããŸãã
ããã§ã®åé¡ã¯ããã®éãããŠãŒã¶ãŒã®æ¥åžžæ¥åã«ãšã£ãŠéèŠãã©ããã§ãã
å žåçãªRustãŠãŒã¶ãŒã®æ¥åžžç掻ã¯æ¬¡ã®ãšããã§ãã
圌ã¯æ¬åœã«æ°ã«ããŠããŸã
NOT rustã«ã¯ãCïŒãJSãšã¯ç°ãªã100äžã®å®è£ ã®è©³çŽ°ããããŸãã ç¡é¢ä¿ãªéããé ããæçšãªéãã ãããŠãŒã¶ãŒã«å ¬éããã®ã¯èšèªèšèšè ã®ä»äºã§ãã
ãã®äžããã¹ããŒããã·ã³ãããããªãããããã«ããŒã¹ãã©ããããããªãããªã©ã®çç±ã§ãçŸåšawait!()
ã«äžæºãèšã£ãŠãã人ã¯èª°ãããŸããã
ãŠãŒã¶ãŒã¯ãããã®éããæ°ã«ããŸããããæ°ã«ããŸããã
ãããåŸ ã€ããšã¯ãä»ã®ã©ãã§ãåãã§ãããæªæ¥ãå®æãžãšé§ãç«ãŠãŸãã
ãããšãããã§ã¯ãããŸãããïŒ ç§ã¯ã¡ããã©æžãå Žåã¯let result = await!(future)
ã§async fn
ãšãã®é¢æ°ãåŒã³åºãããšããšã°ãŒãã¥ãŒã¿äžã«çœ®ããããã«ãã£ãŠããŒãªã³ã°ããããŸã§ãäœãèµ·ãããŸããã
@ ben0x539ã¯ãã
@ CAD97ç§ã®æçš¿ãåºæ¿çã ã£ãã®ãèŠãŠããããã£ãã§ãã Kotlinã«ã€ããŠçããããšãã§ããŸããããã©ã«ãã§ã¯ãä»ã®èšèªãšåãããã«æ©èœããŸãããå¿
èŠã«å¿ããŠRustã®ãããªæ æ°ãªåäœãå®çŸã§ããŸãïŒäŸïŒ val lazy = async(start=LAZY) { deferred_operation() };
ïŒã åæ§ã®ã»ãã³ãã£ã¯ã¹ã«ã€ããŠïŒãªã¢ã¯ãã£ããªãã¶ãŒããã«ã¯ããã©ã«ãã§ã³ãŒã«ãïŒé
延ïŒã§ããããïŒäŸïŒ val lazy = Observable.fromCallable { deferred_operation() };
ïŒãIMOã«æãè¿ãã»ãã³ãã£ã¯ã¹ããªã¢ã¯ãã£ãããã°ã©ãã³ã°ã§æäŸãããŸãã ãããããµãã¹ã¯ã©ã€ããããšãRustã®await!()
ãšåãæ¹æ³ã§å®éã®äœæ¥ãã¹ã±ãžã¥ãŒã«ãããŸããããµãã¹ã¯ã©ã€ãã¯ããã©ã«ãã§éããããã³ã°æäœã§ãããéåæã§èšç®ãããçµæã¯ãã»ãšãã©ã®å ŽåãçŸåšã®å¶åŸ¡ãããŒãšã¯å¥ã«ã¯ããŒãžã£ã§åŠçããããšãã倧ããªéãããããŸãã ãããŠããã£ã³ã»ã«ã®ä»çµã¿ã«ã¯å€§ããªéãããããŸãã ãããã£ãŠãRust async
åäœã¯ç¬ç¹ã§ããã await
ã¯æ··ä¹±ãæããæ§æãç°ãªãããšãããã§ã®å©ç¹ã«ãããªããšããããªãã®äž»åŒµãå®å
šã«æ¯æããŸãã
@Pzixelæ°ããå°ç« ã¯è¡šç€ºãããªããšç¢ºä¿¡ããŠããŸãã yield
ãsigilãšããŠå®è£
ããŠãã if
/ match
/ loop
/ return
ãããªå¶åŸ¡ãããŒæ§é ã§ãããããæå³ããããŸããã æããã«ããã¹ãŠã®å¶åŸ¡ãããŒæ§é ã¯ãããžãã¹ããžãã¯ãèšè¿°ããããžãã¹ããžãã¯ãåžžã«åªå
ããããããããŒã¯ãŒãã䜿çšããå¿
èŠããããŸãã éã«ã @
ãš?
ã¯äŸå€åŠçæ§é ã§ãããäŸå€åŠçããžãã¯ã¯ããã»ã©éèŠã§ã¯ãªãããã埮åŠã§ããå¿
èŠããããŸãã 倧ããªawait
ããŒã¯ãŒããæã€ããšã¯è¯ãããšã§ãããšãã匷ãè°è«ã¯èŠã€ãããŸããã§ããïŒããã¹ãã®éãèãããšãããããèŠéãå¯èœæ§ããããŸãïŒããªããªãããããã¯ãã¹ãŠæš©åšãçµéšã«èšŽããããã§ãïŒããããããã¯ç§ãæå³ããããã§ã¯ãããŸããïŒèª°ãã®æš©åšãçµéšãåŽäžããŸã-ããã¯ããã§å®å
šã«é©çš
@tajimahaããªããæäŸããPythonã®äŸã«ã¯ãå®éã«ã¯ãã£ãšãå®è£
ã®è©³çŽ°ãããããŸãã for
ãasync
ã (int i = 0; i < n; i++)
ãawait
ã i in range(n)
ã@
ãšèŠãªãããšãã§ããŸãããããã§ã¯æããã§ãã Pythonã¯æ°ããããŒã¯ãŒã- in
ïŒJavaã§ã¯å®éã«ã¯sigil- :
ïŒãå°å
¥ããããã«æ°ããç¯å²æ§æãå°å
¥ããŸããã å€ãã®å®è£
ã®è©³çŽ°ãå°å
¥ãã代ããã«ã (i=0, n=0; i<n; i++)
ãããªãã身è¿ãªãã®ãåå©çšã§ããŸãã ããããçŸåšã®ãšããããŠãŒã¶ãŒãšã¯ã¹ããªãšã³ã¹ãžã®åœ±é¿ã¯ãã©ã¹ã«éãããæ§æã¯åçŽã§ããããŠãŒã¶ãŒã¯ãããæ¬åœã«æ°ã«ãããŠããŸãã
@Pzixelæ°ããå°ç« ã¯è¡šç€ºãããªããšç¢ºä¿¡ããŠããŸãã
yield
ãsigilãšããŠå®è£ ããŠããif
/match
/loop
/return
ãããªå¶åŸ¡ãããŒæ§é ã§ãããããæå³ããããŸããã æããã«ããã¹ãŠã®å¶åŸ¡ãããŒæ§é ã¯ãããžãã¹ããžãã¯ãèšè¿°ããããžãã¹ããžãã¯ãåžžã«åªå ããããããããŒã¯ãŒãã䜿çšããå¿ èŠããããŸãã éã«ã@
ãš?
ã¯äŸå€åŠçæ§é ã§ãããäŸå€åŠçããžãã¯ã¯ããã»ã©éèŠã§ã¯ãªãããã埮åŠã§ããå¿ èŠããããŸãã
await
ã¯ãäŸå€åŠçæ§é ãã§ã¯ãããŸããã
ç¡å¹ãªåæã«åºã¥ããŠãããªãã®å«æãééã£ãŠããŸãã
äŸå€åŠçãå¶åŸ¡ãããŒã§ããã ?
ãæªãããšã ãšã¯èª°ãèããŠããŸããã
倧ããª
await
ããŒã¯ãŒããæã€ããšã¯è¯ãããšã§ãããšãã匷ãè°è«ã¯èŠã€ãããŸããã§ããïŒããã¹ãã®éãèãããšãããããèŠéãå¯èœæ§ããããŸãïŒããªããªãããããã¯ãã¹ãŠæš©åšãçµéšã«èšŽããããã§ãïŒããããããã¯ç§ãæå³ããããã§ã¯ãããŸããïŒèª°ãã®æš©åšãçµéšãåŽäžããŸã-ããã¯å®å šãªæ¹æ³ã§_ãã_ã«é©çšããããšã¯ã§ããŸããïŒã
Rustã«ã¯ç¬èªã®çµéšããªããããä»ã®èšèªãRustã«ã€ããŠã©ãèããŠããããä»ã®ããŒã ãçµéšããŠããããšãªã©ã確èªããããšããã§ããŸããã§ããã ããªãã¯å°ç« ã«ãšãŠãèªä¿¡ããããŸãããå®éã«ããã䜿ãããšãããã©ããã¯ããããŸããã
Rustã®æ§æã«ã€ããŠè°è«ãããã¯ãããŸããããå€ãã®æ¥å°ŸèŸãšæ¥é èŸã®è°è«ãèŠãŠããŸããããããããäž¡æ¹ã®é·æãçããããšãã§ããŸãã ãããŠãä»ã®èª°ãããã§ã«C ++ã§ãããææ¡ããããšããŸããã C ++ãšCoroutineTSã®ææ¡ã¯ããã§æ°åèšåãããŸããããç§ã®èŠè§£ã§ã¯ã CoreCoroutinesãšããååã®ä»£æ¿ææ¡ã¯ãã£ãšæ³šç®ã«å€ããŸãã
Core Coroutinesã®äœæè
ã¯ã co_await
ãæ°ããæŒç®åã®ãããªããŒã¯ã³ã«çœ®ãæããããšãææ¡ããŠããŸãã
ã¢ã³ã©ããæŒç®åæ§æãšåŒã°ãããã®ã䜿çšãããšããã¬ãã£ãã¯ã¹è¡šèšãšãã¹ããã£ãã¯ã¹è¡šèšã®äž¡æ¹ã䜿çšã§ã
futureâ<string>â gâ();
stringâ s â=ââ [<-]â fâ();
optional_structâ[->].âoptional_sub_structâ[->].âfield
é¢çœããããããªãããå°ãªããšãè°è«ããã£ãšå®å šã«ãªããšæããŸããã
ããããRustã¯å®éã«ã¯CïŒãJavaScriptïŒãŸãã¯ä»ã®èšèªïŒãšã¯ç°ãªããŸãã ãããã£ãŠãä»ã®èšèªãè¡ãããšãç²ç®çã«ã³ããŒããããšã¯ã§ããŸããã
éæ£çµ±çãªæ§æã«å¯Ÿããå人çãªåŸåã®èšãèš³ãšããŠãéããã䜿çšããªãã§ãã ããã
éãã¯ããã€ãããŸããïŒ JavaãCãPythonãJavaScriptãCïŒãPHPãRubyãGoãSwiftãªã©ãéçãåçãã³ã³ãã€ã«æžã¿ãã€ã³ã¿ãŒããªã¿ãŒåã®äžè¬çãªèšèªã䜿çšããŸãã ãããã¯æ©èœã»ããã倧ããç°ãªããŸãããæ§æã«ã¯ãŸã å€ãã®å ±éç¹ããããŸãã ãããã®èšèªã®ããããããbrainf * ckãã®ãããªãã®ã ãšæããç¬éã¯ãããŸããïŒ
å¥åŠãªæ§æã§ã¯ãªããç°ãªãã䟿å©ãªæ©èœãæäŸããããšã«çŠç¹ãåœãŠãã¹ãã ãšæããŸãã
ã¹ã¬ãããèªãã åŸã誰ããé£éã®ç·æ¥ã®å¿ èŠæ§ãç¡å¹ã«ãã誰ããäžæå€æ°ãå€ãããããšã«æ©ãŸãããŠãããšãã䞻匵ãç¡å¹ã«ãããšãè°è«ã¯ã»ãŒçµãã£ããšæããŸãã
IMOãããªãã¯åŸçœ®æ§æã®å¿ èŠæ§ã«ã€ããŠã®è°è«ã倱ããŸããã ããªãã¯ãéããã«é Œãããšããã§ããŸããã ããã¯ãŸãå¥ã®å¿ æ»ã®è©Šã¿ã§ãã
@tensordurukããªãã®èšèã¯ä»ã®ãŠãŒã¶ãŒã«å¯ŸããŠå°ãæµå¯Ÿçãããããã«æããŸãã ãããããã§ãã¯ããŠã¿ãŠãã ããã
ãããŠæ£çŽãªãšãããæ¥å°ŸèŸã®æ§æã«å察ãã人ãããããããå Žåã¯ãä»ã®ãšãããã¬ãã£ãã¯ã¹æ§æã決å®ãããã¬ãã£ãã¯ã¹æ§æã®ã³ãŒããã©ã®ããã«èšè¿°ãããããåŸ ã£ãŠãããåæãè¡ã£ãŠãèšè¿°ãããã³ãŒãã®éã確èªããå¿ èŠããããŸãæ¥å°ŸèŸãåŸ ã€ããšã§æ©æµãåããããšãã§ããŸãã ããããããšã§ãæ¥å°ŸèŸãåŸ ã€ãªã©ã®é©æ°çãªå€æŽã«æ £ããŠããªããã¹ãŠã®äººããªã ãããšåæã«ãæ¥å°ŸèŸãåŸ ã€ãã©ããã«ã€ããŠã®å®çšçãªè°è«ãåŸãããšãã§ããŸãã
ããã«é¢ããææªã®ã·ããªãªã¯ãããããã¹ãŠå®è¡ããŠãæ¥é èŸawaitãããå®å šã«åªããæ¥å°ŸèŸawaitæ§æãæãã€ããå Žåã§ãã 人ã ãããè¯ã圢åŒã®åŸ æ©ã«åãæ¿ããããšããããããããªãã°ãããã¯å€ãã®ã³ãŒããã£ãŒã³ã«ã€ãªããã§ãããã
ãããŠããã®æ§æã®è°è«ã¯ãã¹ãŠãå®éã«ã¯é£éã«åž°çãããšæããŸãã é£éãåé¡ã§ã¯ãªãã£ãå Žåãæ¥å°ŸèŸã®åŸ æ©ã¯å®å šã«ãŠã£ã³ããŠã®å€ã«ãããæ¥é èŸã®åŸ æ©ã ãã§è§£æ±ºããæ¹ãã¯ããã«ç°¡åã§ãã ãã ããRustã§ã¯é£éãéåžžã«éèŠã§ããããã次ã®ãããã¯ã«ã€ããŠã®è°è«ãå§ãŸããŸãã
if we should have only postfix await:
what's the best syntax for it that:
benefits chaining?
is also ok in non-chaining scenarios
is readable in both chainable and non-chainable contexts?
else if we should have only prefix await:
what's the best syntax for it that:
isn't ambiguous in the sense of order of operation (useful vs obvious)
else if we should have both prefix and postfix await:
what's the best syntax for it that:
benefits chaining?
is also ok in non-chaining scenarios
is readable in both chainable and non-chainable contexts?
isn't ambiguous in the sense of order of operation (useful vs obvious)
should it be a single unified syntax that somehow works for both prefix and postfix?
would there be clear situations where prefix syntax is favored over postfix?
would there be a situation where postfix syntax isn't allowed, but prefix is, and vice-versa?
ãŸãã¯ãã®ãããªãã®ã 誰ããç§ãããè¯ããã€ã³ãã§ããè¯ã決å®ãã¿ãŒã³ãæãä»ãããšãã§ãããªããããããŠãã ããïŒ XD
ãããã£ãŠããŸããæ§æã«ã€ããŠèª¬æããã®ã§ã¯ãªããæ¥å°ŸèŸãæ¥é èŸããŸãã¯æ¥å°ŸèŸãšæ¥é èŸã®äž¡æ¹ãå¿ èŠãã©ãããããã³æãã€ããéžæãå¿ èŠãªçç±ã決å®ããå¿ èŠããããŸãã ããã解決ããããæ§æã®éžæã«é¢ããå°ããªåé¡ã«é²ãããšãã§ããŸãã
@tensorduruk
IMOãããªãã¯åŸçœ®æ§æã®å¿ èŠæ§ã«ã€ããŠã®è°è«ã倱ããŸããã ããªãã¯ãéããã«é Œãããšããã§ããŸããã ããã¯ãŸãå¥ã®å¿ æ»ã®è©Šã¿ã§ãã
çå£ã«ããªãããã§åŒã°ããŠããªãæµæã®ä»£ããã«ããªãã®èšã£ãèšèªã䜿çšããªãã®ã§ããïŒ
ä»ã®åŸæ¥ã®èšèªã«ã¯ã¯ã©ã¹ãããã®ã§ãããžãã¯ã䜿çšãããšãrustã«ã¯ã¯ã©ã¹ãå¿
èŠã§ãã ä»ã®èšèªã«ã¯åçšããªãã®ã§ãéã«ã¯åçšããã£ãŠã¯ãªããŸããã
é£éãåŠçããªããšãæ©äŒãéããŠããŸããŸãã ã€ãŸããé£éã«ãã£ãŠäžæå€æ°ãå¿ååã§ããå Žåã¯ãäžæå€æ°ã®ãã€ã³ãã£ã³ã°ãäœæããããããŸããã
ãã ããæ¯æ©ã®ããã«ãçŸåšã®ãã¯ãããŒã¯ãŒãã«åºå·ããå¿ èŠããããšæããŸãã æ¯æ©ã®æ©èœãšããŠæ¥å°ŸèŸãã¯ããçšæãã人ã ã«ãããããã¡ãã«ãããŸãããã ã¯ããèœã¡çããšè§£çŽãçºçããŸãããããã¯rustfixã§åŠçã§ããŸãã
@tensorduruk
IMOãããªãã¯åŸçœ®æ§æã®å¿ èŠæ§ã«ã€ããŠã®è°è«ã倱ããŸããã ããªãã¯ãéããã«é Œãããšããã§ããŸããã ããã¯ãŸãå¥ã®å¿ æ»ã®è©Šã¿ã§ãã
çå£ã«ããªãããã§åŒã°ããŠããªãæµæã®ä»£ããã«ããªãã®èšã£ãèšèªã䜿çšããªãã®ã§ããïŒ
ä»ã®åŸæ¥ã®èšèªã«ã¯ã¯ã©ã¹ãããã®ã§ãããžãã¯ã䜿çšãããšãrustã«ã¯ã¯ã©ã¹ãå¿ èŠã§ãã ä»ã®èšèªã«ã¯åçšããªãã®ã§ãéã«ã¯åçšããã£ãŠã¯ãªããŸãããé£éãåŠçããªããšãæ©äŒãéããŠããŸããŸãã ã€ãŸããé£éã«ãã£ãŠäžæå€æ°ãå¿ååã§ããå Žåã¯ãäžæå€æ°ã®ãã€ã³ãã£ã³ã°ãäœæããããããŸããã
ãã ããæ¯æ©ã®ããã«ãçŸåšã®ãã¯ãããŒã¯ãŒãã«åºå·ããå¿ èŠããããšæããŸãã æ¯æ©ã®æ©èœãšããŠæ¥å°ŸèŸãã¯ããçšæãã人ã ã«ãããããã¡ãã«ãããŸãããã ã¯ããèœã¡çããšè§£çŽãçºçããŸãããããã¯rustfixã§åŠçã§ããŸãã
泚ææ·±ãèªãã§ãã ããã å¥åŠãªæ§æã§ã¯ãªãã䟿å©ãªæ©èœãæäŸããå¿ èŠããããšèšããŸããã æ§é äœïŒ åããïŒ ç¹åŸŽïŒ
æ¬åœã«ååšããåé¡ã解決ããŠãã ããã 人ã
ã¯ãäŸãçµ±èšã䜿ã£ãŠãäžæçãªãã€ã³ãã£ã³ã°ã¯åé¡ã«ãªããªããããããªãããšã瀺ããŸããã f await
f.await
æ¯æããŠããçããã¯ã蚌æ ã䜿ã£ãŠå察åŽã説åŸããããšããããšããããŸããïŒ
ãŸããç§ã«å察祚ãæããŠãæå³ããããŸããã postfixãåãå ¥ããã«ã¯ãpostfixãã©ãã§åœ¹ç«ã€ããè°è«ããå¿ èŠããããŸãïŒãããããé£éçãªè°è«ãç¹°ãè¿ããªãã§ãã ãããããã¯è¡ãæ¢ãŸãã§ã;ãããããããã¡ãã®åé¡ã§ã¯ãªããããã€ãã®èšŒæ ã§äººã ãæ©ãŸããé »ç¹ãªåé¡ã§ãïŒã
CïŒãJSã®ãããªæ§æãååŸã§ããŸããïŒ ã»ãšãã©ã®éçºè ã¯äžçäžã§ããã䜿çšããŠããŸããç§ã¯rustãæ°ããæ§æã䜿çšããããäžè²«æ§ããªãã®ã¯å¥œãã§ã¯ãããŸãããRustã¯æ°ãã人ã ãåŠã¶ã®ãé£ããã§ãã
以äžã¯ã await
å
åŽã«ããpostfix @
䜿çšã«é¢ããç§ã®æçš¿ã®ä»é²ã§ãã
代ããã«ä»ã®å€ãã®èšèªã®çµéšã䜿çšããå¿ èŠããããŸã
ãããŠå®éã«äœ¿ã£ãŠããŸãã ããããããã¯ç§ãã¡ãåãçµéšãå®å
šã«ç¹°ãè¿ããªããã°ãªããªããšããæå³ã§ã¯ãããŸããã ãŸãããã®ããã«@
ã«å¯ŸããŠè°è«ããå Žåã以åã®çµéšã«èšŽããããšãçŽåŸã§ããªããããæçšãªçµæãåŸãããªãå¯èœæ§ããããŸãã
åé¡ã®éºäŒç説æã¯çå®ã§ããå¯èœæ§ããããåé¡ãçŸåšã®åœ¢ããšã£ãçç±ãæããã«ããã®ã«åœ¹ç«ã€å¯èœæ§ããããŸããããã®ã¡ãªããã決å®ããäžã§æ±ºå®çãªãã®ã§ã¯ãããŸããã
å€ãã®äººããããæããŠããã®ã§ã await
ã䜿çšããå¿
èŠããããŸã
ãããã®äººã
ã¯ããããawait
ãšããçç±ã ãã§ãªããä»ã®å€ãã®çç±ã§await
ãæãããããããŸããã ãããã®çç±ã¯ãRustã«ãååšããªãå¯èœæ§ããããŸãã ãããŠã @
ã«å¯ŸããŠãã®ããã«è°è«ããŠããäžè¬ã®äººã
ã«ã¢ããŒã«ããããšã¯ã»ãšãã©ãããŸããã
åšåã«èšŽãããã®ã¯ãåž°çŽè«çã«ãããŠæå¹ãªè°è«ã«ãªãå¯èœæ§ããããŸãã ããšãã°ãããªãã®äººå£ã®äžè«èª¿æ»ã§ã¯ã100ïŒ ãç¹å®ã®ãã©ã³ãã®è£œåãå¥ã®ãã©ã³ãããã奜ãããšãããããŸãã 次ã«ãèæ ®ããã次ã®äººããã®ãã©ã³ãã奜ãå¯èœæ§ãéåžžã«é«ããšãã説åŸåã®ããïŒåŒ·åãªïŒè°è«ãè¡ãããšãã§ãïŒãã ããäŸå€ãããå¯èœæ§ããããããåžžã«100ïŒ ãšã¯éããŸããïŒãäžè«èª¿æ»ã¯ãã®äž»åŒµã®æå¹ãªèšŒæ ã§ãã ããããæŒç¹¹çæšè«ã®èšŒæ ãšããŠã®è°è«ãšããŠã¯äžé©åã§ããããšãã°ãäžè«èª¿æ»ã§ã¯ãåªå ãã©ã³ãã競åä»ç€ŸãããåªããŠããããšããŸãã¯èª°ãããã®ãã©ã³ããä»ã®ãã©ã³ãããã奜ãããšã蚌æãããŠãããšèšããŸãã
@Pzixel
ããããéã¯å¥ã®ãã®ã§ãã ããã«ã¯
?
ããããšã©ãŒãäŒæããå¿ èŠããããŸãã CïŒã§ã¯ãasync / awaitã¯èªåçã«äŸå€ãã©ããããåŸ æ©ãã€ã³ãéã§ã¹ããŒããŸãã ããªãã¯ãããéã³ãŠããŸããã CïŒã§await
ãæžããã³ã«ãæžãå¿ èŠãããããšãèæ ®ããŠãã ããvar response = (await client.GetAsync("www.google.com")).HandleException(); var json = (await response.ReadAsStreamAsync()).HandleException(); var somethingElse = (await DoMoreAsyncStuff(json)).HandleException(); ...
ããããã¹ãŠã®äžæ¬åŒ§ã䜿çšããã®ã¯éåžžã«é¢åã§ãã
CïŒã§ã¯ã次ã®ããã«èšè¿°ããŸãã
try
{
var response = await client.GetAsync("www.google.com");
var json = await response.ReadAsStreamAsync();
var somethingElse = await DoMoreAsyncStuff(json);
}
catch (Exception ex)
{
// handle exception
}
foo().await?
ãªã©ã®propagate-error-chainingåŒæ°ã«é¢ããŠããã¬ãã£ãã¯ã¹ã®await
æŒç®åã«?
è¿œå ã§ããªãã£ãçç±ã¯ãããŸããïŒ
let response = await? getProfile();
ç§ã«ã¡ããã©èµ·ãã£ãããäžã€ã®ããšïŒããªããFuture<Result<...>>
match
ãããå Žåã¯ã©ããªããŸããïŒ ãããã®ã©ããèªã¿ãããã§ããïŒ
// Prefix
let userId = match await response {
Ok(u) => u.id,
_ => -1
};
// Postfix
let userId = match response {
Ok(u) => u.id,
_ => -1
} await;
ããã«ã async match
åŒã¯åé¡ã«ãªãã§ããããïŒ ã®ããã«ãäžèŽåŒã®æ¬äœãéåæã«ããŸããïŒ ãããããªãã match await response
ãšawait match response
éã«éãããããŸãã match
ãšawait
ã¯ã©ã¡ããå®è³ªçã«åé
æŒç®åã§ããã match
ã¯ãã§ã«æ¥é èŸã§ããããã await
ãæ¥é èŸã§ãããã©ãããåºå¥ãããããªããŸãã 1ã€ã®ãã¬ãã£ãã¯ã¹ãš1ã€ã®ãã¹ããã£ãã¯ã¹ããããšãäžèŽãåŸ
ã£ãŠããã®ãå¿çãåŸ
ã£ãŠããã®ããæå®ããã®ãé£ãããªããŸãã
let userId = match response {
Ok(u) => somethingAsync(u),
_ => -1
} await; // Are we awaiting match or response here?
ããªããäž¡æ¹ã®ããšãåŸ ããªããã°ãªããªããªããããªãã¯æ¬¡ã®ãããªãã®ãèŠãŠããã§ããã
// Prefix - yes, double await is weird and ugly but...
let userId = await match await response {
Ok(u) => somethingAsync(u),
_ => -1
} await;
// Postfix - ... this is weirder and uglier
let userId = match response {
Ok(u) => somethingAsync(u),
_ => -1
} await await;
ç§ã¯ããããããããªããšæããŸãã
// Postfix - ... this is weirder and uglier
let userId = match response await {
Ok(u) => somethingAsync(u),
_ => -1
} await;
ïŒããã°ã©ãã³ã°èšèªã®èšèšã¯é£ããã§ããïŒ
ãšã«ãããRustã¯åé
æŒç®åã®æ¥é èŸãmatch
ã§ããããšãåªå
ããã await
ã¯åé
æŒç®åã§ããããšãç¹°ãè¿ããŸãã
C# // Postfix - ... this is weirder and uglier let userId = match response await { ... } await;
çŸããã¯èŠã人ã®ç®ã«ããã
ãšã«ãããRustã¯åé æŒç®åã®æ¥é èŸã
match
ã§ããããšãåªå ãããawait
ã¯åé æŒç®åã§ããããšãç¹°ãè¿ããŸãã
?
ã¯åé
ã§ãããæ¥å°ŸèŸã§ãã
ãšã«ãããè°è«ã¯ä»ãææ°ŽæºãäžåšããŠããããã«æããŸãã æ°ããè°è«ã®ãã€ã³ããæã¡åºããªããã°ãåãç«å ŽãäœåºŠãç¹°ãè¿ãããšã¯ç¡é§ã§ãã
FWIWãæ§æãäœã§ããawait
ãµããŒãã§ããããšãããããæããŸããç§ã«ã¯ç¬èªã®å¥œã¿ããããŸãããçŸå®çãªææ¡ã¯ã©ããã²ã©ããŠäœ¿çšã§ããªããšã¯æããŸããã
@markrendleããªããäœã«çããŠããã®ã
CïŒã§ã¯ã次ã®ããã«èšè¿°ããŸãã
ç§ã¯CïŒã§æžãæ¹æ³ãç¥ã£ãŠããŸãã ãäŸå€ããªãã£ããšãããã©ããªããæ³åããŠã¿ãŠãã ããããšèšããŸããã Rustã¯ããã§ã¯ãªãããã§ãã
foo().await?
ãªã©ã®propagate-error-chainingåŒæ°ã«é¢ããŠããã¬ãã£ãã¯ã¹ã®await
æŒç®åã«?
è¿œå ã§ããªãã£ãçç±ã¯ãããŸããïŒ
ãã§ã«2åãŸãã¯3åè°è«ãããŠããŸãããããã¯ãèªãã§ãã ããã äžèšã§èšãã°ãããã¯äººå·¥çãªæ§æã§ããã ?
äœããè¿œå ãããšããŸãæ©èœããŸããã ãã¬ãã£ãã¯ã¹ãšããŠã®await?
ãã³ã³ãã€ã©ã§ã®è¿œå ãµããŒããå¿
èŠãšããå Žåããµãã£ãã¯ã¹ãšããŠã®await?
ã¯æ£ããæ©èœããŸãã ãããŠãæ¥å°ŸèŸãåŸ
ããªãå Žåã§ãããã§ãŒã³ã«ã¯äžæ¬åŒ§ãå¿
èŠã§ãïŒç§ã¯ããã§ã¯å人çã«å«ãã§ããã人ã
ã¯åžžã«ãããéèŠãªããšãšããŠèšåããŠããŸãïŒã
ç§ã«ã¡ããã©èµ·ãã£ãããäžã€ã®ããšïŒããªãã
Future<Result<...>>
match
ãããå Žåã¯ã©ããªããŸããïŒ ãããã®ã©ããèªã¿ãããã§ããïŒ
// Real postfix
let userId = match response await {
Ok(u) => u.id,
_ => -1
};
// Real Postfix 2 - looks fine, except it's better to be
let userId = match response await {
Ok(u) => somethingAsync(u),
_ => ok(-1)
} await;
// Real Postfix 2
let userId = match response await {
Ok(u) => somethingAsync(u) await,
_ => -1
};
CïŒã®å¥ã®ãŠãŒã¶ãŒãšããŠããã®ãã¬ãã£ãã¯ã¹æ§æïŒ new
ã await
ãããã³Cã¹ã¿ã€ã«ã®ãã£ã¹ããç§ã®çŽæãæãããªããããããšèšããŸãã æ¥å°ŸèŸæŒç®åãªãã·ã§ã³ã匷ããµããŒãããŸãã
ãããããããã®æ§æã¯ãããè¯ãæ瀺çã«å ç©ããã§ãŒã³ããããæ¬äŒŒãã¯ãã«ãªããŸãã ã©ããªæ±ºè°ãæè¿ããŸãã
@orthoxeroxããªãã¯éåžžã«è¯ãç¹ãæããŠããŸãã ç§ã®ãã€ãžã§ãã§ã¯ãäž»ã«Javaãèšè¿°ããæ瀺çãªã€ã³ã¹ã¿ã³ã¹åãå¿ èŠãšãããã¹ãŠã®ã¯ã©ã¹ïŒãã«ããŒãã¿ãŒã³ãšäŸåæ§æ³šå ¥ã䜿çšããå Žåã«é©ãã»ã©ãŸãã«çºçããŸãïŒã«ãæŒç®åãé衚瀺ã«ã§ããéçãã¡ã¯ããªã¡ãœãããããã¬ãã«ãŸã§æ°ããæŒç®åã軜èããŸãã
@Pzixel
@markrendleããªããäœã«çããŠããã®ã
CïŒã§ã¯ã次ã®ããã«èšè¿°ããŸãã
ç§ã¯CïŒã§æžãæ¹æ³ãç¥ã£ãŠããŸãã ãäŸå€ããªãã£ããšãããã©ããªããæ³åããŠã¿ãŠãã ããããšèšããŸããã Rustã¯ããã§ã¯ãªãããã§ãã
ããããããªããèšã£ãããšã§ã¯ãªãã®ã§ãããã¯ããããèšèªã®å£ã ãšæããŸãããããªããæå³ããããšã ã£ãã®ãããããŸããã
ãšã«ããã @ rolandsteinerãèšã£ãããã«ãéèŠãªããšã¯ãäœããã®åœ¢ã®async / awaitãååŸããããšã§ãããã®ãããã³ã¢ããŒã ã®æ±ºå®ãåŸ ã€ããšãã§ãããã¹ãŠã®æ¥å°ŸèŸãã¡ã³ã¯ã³ã¢ããŒã ã®æ±ºå®ãåŸ ã€ããšãã§ããŸãã ðâ€ïžâ®ïž
@yasammez CïŒã«æ¥ãŠãã ããã v8.0ã§ã¯ãååãªãã§newïŒïŒã䜿çšããã ãã§ã:)
æ¥å°ŸèŸæŒç®åã®ã¢ã€ãã¢ãããã€ãæšãŠãã€ããã§ãã
foo()~; // the pause operator
foo()^^; // the road bumps operator
foo()>>>; // the fast forward operator
postfixæŒç®åãè¡ãæ¹æ³ã§ãããã©ããã¯èšããŸããããå人çã«ã¯@
ããã¹ãŠã®å¯èœãªéžæè¢ããæãéšã
ãããŠå¥åŠã«èŠãããã®ã®1ã€ã ãšæããŸãã @phauxã³ã¡ã³ãã®~
ã¯ãã¯ããã«ãšã¬ã¬ã³ãã§ãå¿ãããªããããã§ãã ãŸããç§ãäœããèŠéããŠããªããã°ãRustã§ã¯ãŸã äœã«ã䜿çšããŠããŸããã
ç¹èš±ã䞻匵ããããªãã®ã§ããã @ phauxã®åã«~
ãææ¡ãããŸãã; P
ããã¯ãšã³ãŒããŒã¯ã®ãããªãã®ãªã®ã§ãç§ã¯ãããææ¡ããŸããã
Hi~~~~~
Where r u~~~~~
Hay~~~~~
I am in another mountain top~~~~~
~
ã¯ãæã®åŸã«ãæ«å°Ÿã瀺ãããã«äœ¿çšãããããšããããŸããããã¯ãåŸ
ã€ã®ã«é©ããŠããŸãã
ãã®ã¹ã¬ãããã°ãããããšã®ããŒã¯ã«éããã®ãããããšãããã§äœãã«åãçµãã§ããã®ãã¯ããããŸããã
~
ããã€ãã®ããŒããŒããç¹ã«å°ãããŠç¹çŽ°ãªã¡ã«ãã«ã«ããŒããŒãã§ã¯çããã®ã¯ç°¡åã§ã¯ãªããšæããŸãã
ã«ãªãåŸãïŒ
let await userId = match response {
Ok(u) => u.id,
_ => -1
};
let await userId = match response {
await Ok(u) => somethingAsync(u),
_ => ok(-1)
};
~
ãäžäŸ¿ãªããŒããŒãã¬ã€ã¢ãŠãã®ãŠãŒã¶ãŒåãã«ã ...
ãããª
æåã¯ãåºåãæåãå¿
èŠãªãã¬ãã£ãã¯ã¹æ§æãawait(future)
ãŸãã¯await{future}
ãšããŠäœ¿çšããããšã匷ãæãã§ããŸãããããã¯ãéåžžã«æ確ã§èŠèŠçã«è§£æããããããã§ãã ãã ããRust Futureã¯ä»ã®èšèªã®ä»ã®ã»ãšãã©ã®Futureãšã¯ç°ãªããã¿ã¹ã¯ããšã°ãŒãã¥ãŒã¿ã«ããã«é
眮ããã®ã§ã¯ãªããã³ã³ããã¹ããæ¬è³ªçã«ã¢ããã³ãŒã«ãã§ãŒã³ãšæºååã
ãã®ç¹ã§ä»ã®èšèªãšæ¯èŒããããšãããšæ··ä¹±ãçããã®ã¯å°ãæ®å¿µã ãšæããŸãã æãè¿ãã¢ããã°ã¯ãå®éã«ã¯Haskellã®ã¢ããdo
è¡šèšãŸãã¯Scalaã®for
ç解ã§ãïŒããã¯ç§ãé ã®äžã§ããç¥ã£ãŠããå¯äžã®ãã®ã§ãïŒã çªç¶ãç¬èªã®æ§æãææ¡ããããšãæ€èšããããšã«æè¬ããŸããã ?
æŒç®åã®ååšããä»ã®ã·ãžã«ã®äœ¿çšã奚å±ããã³é»æ¢ããŠããã®ã§ã¯ãªãããšå¿é
ããŠããŸãã 次ã®ããããã®ä»ã®å°ç« ããŒã¹ã®æŒç®å?
ãããã¯ã®ãããªãéšã
ãããšæ··ä¹±ã«èŠããããã«future@?
ããå¥ã®1ãããã»ã©ã°ãããŠããªãããšãåŸçœ®ã·ã®ã«æŒç®åæ段ãæããããšã«ããå
è¡ã»ããã
ãããã£ãŠãç§ã¯æ¥å°ŸèŸã®å°ç« æŒç®åã®ã¡ãªããã確信ããŠããŸãã ããã®æ¬ ç¹ã¯ãç§ãæã奜ãã§ãããå°ç« ã決ããŠã¿ã€ãã«ãã£ãŠåãããªããšããããšã§ãã future!?
ã¯ç§ããããæžããã³ã«ç§ãç¬ãããã ãããšæãã®ã§ãç§ã¯!
ã奜ãã ã§ãããããããŠããã¯ç§ãèŠãã®ã«æãèŠèŠçã«çã«ããªã£ãŠããŸãã 次ã¯$
ã ãšæããŸãããèŠèŠçã«èå¥ã§ããã®ã§future$?
ã§ãã ~
èŠããšã ~
ãããŒãå²ãåœãŠã®ãã¬ãã£ãã¯ã¹æŒç®åã§ãã£ãRustã®åæã®é ãæãåºããŸãã ããããããã¯ãã¹ãŠéåžžã«å人çãªãã®ãªã®ã§ãæçµçãªææ決å®è
ãããããŸããã¯ãããŸããã ç§ã圌ãã ã£ããšãããããããããå¿
èŠãªåºåãæåã䜿çšãããã¬ãã£ãã¯ã¹æŒç®åã®äžå¿«ãªéžæãããã ãã§ãããã
ãã ããRust Futureã¯ä»ã®èšèªã®ä»ã®ã»ãšãã©ã®Futureãšã¯ç°ãªããã¿ã¹ã¯ããšã°ãŒãã¥ãŒã¿ã«ããã«é 眮ããã®ã§ã¯ãªããã³ã³ããã¹ããæ¬è³ªçã«ã¢ããã³ãŒã«ãã§ãŒã³ãšæºååã
ç§ã¯å察ããåŸåããããŸãã ããªããèšåããæ¯ãèãã¯await
ããããã£ã§ã¯ãªããåšå²ã®async
é¢æ°ãŸãã¯ã¹ã³ãŒãã®ããããã£ã§ãã ãã®åã®ã³ãŒãã®å®è¡ãé
ãããã®ã¯await
ã§ã¯ãªãããã®ã³ãŒããå«ãã¹ã³ãŒãã§ãã
ãããããå¥åŠã«èŠãã@
ã·ã³ãã«ã®åé¡ã¯ããã®ã³ã³ããã¹ãã§ã®äœ¿çšããããŸã§äºæãããŠããªãã£ãããšã§ãããããã£ãŠãã»ãšãã©ã®ãã©ã³ãã§ã¯ãéåžžã«äžå¿«ãªåœ¢ã§æäŸãããŠããŸãã
次ã«ã人æ°ã®ããããã°ã©ãã³ã°ãã©ã³ãïŒãŸãã¯å°ãªããšãMozillaã®Fira Code
ïŒã«ãããè¯ãã°ãªããšããã€ãã®ååãæäŸãããšãç¶æ³ãå°ãæ¹åãããå¯èœæ§ããããŸãã
ä»ã®ãã¹ãŠã®å Žåã§ã¯ãç§ã«ãšã£ãŠã @
ãããã»ã©å¥åŠã§ãã³ãŒããèšè¿°ãŸãã¯ä¿å®ãããšãã«å®éã®åé¡ãåŒãèµ·ãããšã¯æããŸããã
ããšãã°ã次ã®ã³ãŒãã¯@
èšå·ãšã¯ç°ãªããã®ã䜿çšããŠããŸã- ïŒ
ïŒ
// A
if db.is_trusted_identity(recipient.clone(), message.key.clone())ïŒ ? {
info!("recipient: {}", recipient);
}
// B
match db.load(message.key)ïŒ ? {
Some(key) => key,
None => {
return Err(/* [...] */);
}
};
// C
let mut res = client.get(&script_src)
.header("cookie", self.cookies.read().as_header_value())
.header("user-agent", USER_AGENT)
.send()ïŒ ?
.error_for_status()?;
// D
let mut res: InboxResponse = client.get(inbox_url)
.headers(inbox_headers)
.send()ïŒ ?
.error_for_status()?
.json()ïŒ ?;
// E
let mut res: Response = client.post(url)
.multipart(form)
.headers(headers.clone())
.send()ïŒ ?
.error_for_status()?
.json()ïŒ ?;
// F
async fn request_user(self, user_id: String) -> Result<User> {
let url = format!("users/{}/profile", user_id);
let user = self.request(url, Method::GET, None, true)ïŒ ?
.res.json::<UserResponse>()ïŒ ?
.user
.into();
Ok(user)
}
éåžžã®ANSI
@
ãšã®æ¯èŒã®ããã«å±éããŸã
// A
if db.is_trusted_identity(recipient.clone(), message.key.clone())@? {
info!("recipient: {}", recipient);
}
// B
match db.load(message.key)@? {
Some(key) => key,
None => {
return Err(/* [...] */);
}
};
// C
let mut res = client.get(&script_src)
.header("cookie", self.cookies.read().as_header_value())
.header("user-agent", USER_AGENT)
.send()@?
.error_for_status()?;
// D
let mut res: InboxResponse = client.get(inbox_url)
.headers(inbox_headers)
.send()@?
.error_for_status()?
.json()@?;
// E
let mut res: Response = client.post(url)
.multipart(form)
.headers(headers.clone())
.send()@?
.error_for_status()?
.json()@?;
// F
async fn request_user(self, user_id: String) -> Result<User> {
let url = format!("users/{}/profile", user_id);
let user = self.request(url, Method::GET, None, true)@?
.res.json::<UserResponse>()@?
.user
.into();
Ok(user)
}
@norcalli
æåã¯ãåºåãæåãå¿ èŠãªãã¬ãã£ãã¯ã¹æ§æã
await(future)
ãŸãã¯await{future}
ãšããŠäœ¿çšããããšã匷ãæãã§ããŸãããããã¯ãéåžžã«æ確ã§èŠèŠçã«è§£æããããããã§ãã
次ã«ãæ確ãªif { cond }
ã while { cond }
ãããã³match { expr }
ãŸã...
ããããRust Futureã¯ä»ã®èšèªã®ä»ã®ã»ãšãã©ã®Futureãšã¯éããšãããä»ã®äººã®ææ¡ãç解ããŠããŸã
ããã¯çå®ã§ã¯ãªãã ããã¯å®éã«
ãããã¯å éšçã«ç°ãªãå¯èœæ§ããããŸããããŠãŒã¶ãŒã®èŠ³ç¹ããã¯ãŸã£ããåãã§ãããããããã§åºå¥ããããšã¯æå³ããããŸããã
@Pzixel
ãã¹ããŒã³æã«æåã«åŸ æ©ãããŸã§å®è¡ããããšãããŒãªã³ã°æã«æåã«åŸ æ©ãããŸã§å®è¡ãããã®éãã¯ããã»ã©å€§ãããããŸããã
ããããããã¯ç§ãã¡ã話ããŠããéãã§ã¯ãããŸããã ç§ãã¡ã¯æ æ°ãªvsç±å¿ãªæåã®åŸ æ©ã«ã€ããŠè©±ããŠããã®ã§ã¯ãããŸããã
ç§ãã¡ã話ããŠããã®ã¯ã await
ãããã§ã«ãšã°ãŒãã¥ãŒã¿ã«é
眮ãããŠããä»ã®èšèªã®ãšã°ãŒãã¥ãŒã¿ã§åŸ
æã®Promise
ïŒJSïŒ/ Task
ïŒCïŒïŒã«åå ããããšã§ããæ§ç¯æïŒã€ãŸãããã§ã«ãããã¯ã°ã©ãŠã³ããã§å®è¡ãããŠããŸããïŒãRustã§ã¯ã Future
ã¯ã await!
é§åã«ãªããŸã§äžæŽ»æ§ç¶æ
ã®ãã·ã³ã§ãã
Promise
/ Task
ã¯ãå®è¡äžã®éåææäœãžã®ãã³ãã«ã§ãã Future
ã¯ãé
延éåæèšç®ã§ãã Rustã®èå人ãå«ã人ã
ã¯ä»¥åã«ãã®ééããç¯ããããšãããããããã®500以äžã®ã³ã¡ã³ãã®éäžã§äŸã以åã«ãªã³ã¯ãããŠããŸãã
å人çã«ã¯ããã®ã»ãã³ãã£ã¯ã¹ã®äžäžèŽã¯ã await
芪ãã¿ããããæã¡æ¶ãã®ã«ååãªå€§ããã ãšæããŸãã ç§ãã¡ã®Future
ã Promise
/ Task
ãšåãç®æšãéæããŸãããã¡ã«ããºã ã¯ç°ãªããŸãã
ã¡ãªã¿ã«ãJavaScriptã§async
/ await
ãæåã«åŠãã ãšãã async
ã¯ã await
è¶
倧åœãåŸãããã«æžããããã ã®ããã®a = fa(); b = fb(); /* later */ await [a, b];
ïŒãŸãã¯ãããäœã§ãããJSãæžããªããã°ãªããªãã£ãã®ã§ããã¯æ代ã§ãïŒã ç§ã®èãã§ã¯ãRustã®ã»ãã³ãã£ã¯ã¹ã¯async
ïŒ await
è¶
倧åœãäžããïŒã§ã¯ãªãã Future
äžèŽãããšããç¹ã§ãä»ã®äººã®async
ã®èŠæ¹ã¯ç§ãšäžèŽããŠããŸãã Future
æ§ç¯ãšawait!
ã
ãã®æç¹ã§ãRustã®async
/ Future
/ await
ã»ãã³ãã£ã¯ã¹ã®éãã«é¢ããè°è«ã¯é 調ã«é²ãã§ãããæ°ããæ
å ±ã¯æ瀺ãããŠããªããšæããŸãã ããããæ°ããç«å ŽãæŽå¯ããªãéãããã®è°è«ãããã«æ®ããŠãããšãã¹ã¬ããã«ãšã£ãŠããããæåã§ãããã ïŒç§ã¯ãããInternalsããã³/ãŸãã¯Discordã«æã£ãŠããããã§ããïŒ
@ CAD97ã¯ããããªãã®ç«å Žã¯ããããŸããããã®åºå¥ã¯ããã»ã©å€§ãããªããšæããŸãã
ããªãã¯ç§ãæã«å ¥ããŸãããç§ã¯ããªããæã«å ¥ããŸããã ããã§ãè°è«ã«ãã®æµããæãããŸãããã
@ CAD97
Rustã®èå人ãå«ã人ã ã¯ä»¥åã«ãã®ééããç¯ããããšãããããããã®500以äžã®ã³ã¡ã³ãã®éäžã§äŸã以åã«ãªã³ã¯ãããŠããŸãã
Rustã«ç²ŸéããŠãã人ã§ããã®ééããç¯ãããšããããããã¯æ¬åœã«ééãã§ããïŒ
ãã®ãããRust AllHandsã§async-awaitã«ã€ããŠå€ãã®è°è«ããããŸããã ãããã®è°è«ã®éçšã§ãããã€ãã®ããšãæããã«ãªããŸããã
ãŸããåŸ æ©æ§æã«ã€ããŠlangããŒã ã«ã¯ïŒãŸã ïŒã³ã³ã»ã³ãµã¹ããããŸããã æããã«å€ãã®å¯èœæ§ãšããããã¹ãŠãæ¯æãã匷åãªè°è«ããããŸãã ç§ãã¡ã¯é·ãæéããããŠä»£æ¿æ¡ã暡玢ããéåžžã«å€ãã®èå³æ·±ãåŸåŸ©ãçã¿åºããŸããã ãã®è°è«ã®æ¬¡ã®ã¹ãããã¯ããããã®ã¡ã¢ãïŒãã®ã¹ã¬ããããã®ä»ã®ã³ã¡ã³ããšãšãã«ïŒåããªã¢ã³ãã®ã±ãŒã¹ãã¬ã€ã¢ãŠãããäžçš®ã®èŠçŽã³ã¡ã³ãã«å€æããããããç¶è¡ããããšã ãšæããŸãã ç§ã¯@withoutboatsãš@cramertjãš
æ§æã®è³ªåããé¢ããŠãç§ãã¡ãè¡ãããšãèšç»ããŠãããã1ã€ã®ããšã¯ãå®è£ ã®ã¹ããŒã¿ã¹ã®å šäœçãªããªã¢ãŒãžã§ãã çŸåšãããã€ãã®å¶éããããŸãïŒããšãã°ãå®è£ ã§ã¯ãçŸåšããŠã§ã€ã«ãŒã«é¢ããæ å ±ãã¹ã¬ããåããããã«ãå éšã§TLSãå¿ èŠã§ãïŒã ãããã¯å®å®åã®åŠšãã«ãªãå Žåãšããã§ãªãå ŽåããããŸãããæçµçã«å¯ŸåŠããå¿ èŠã®ããåé¡ã§ãããã©ããã«ããããããïŒäžéšã¯ã³ã³ãã€ã©ããŒã ããã®ïŒå調çãªåªåãå¿ èŠã«ãªããŸãã 次ã®ãã1ã€ã®ã¹ãããã¯ããã®ããªã¢ãŒãžãå®è¡ããŠã¬ããŒããçæããããšã§ãã æ¥é±ãã®ããªã¢ãŒãžãå®æœããäºå®ã§ãããã®æç¹ã§æŽæ°ããããŸãã
ãããŸã§ã®éãäžèšã®ã¬ããŒããäœæããæ©äŒãåŸããããŸã§ããã®ã¹ã¬ããã
ïŒæåŸã®æ®µèœãå°ãæ¡åŒµããããã«ãé·ããã£ã¹ã«ãã·ã§ã³ã¹ã¬ãããè¶ ããŠãã¶ã€ã³ã¹ããŒã¹ãæ¢çŽ¢ããå¥ã®æ¹æ³ãæ¢çŽ¢ããããšã«ããªãèå³ããããŸããããã¯ãã®ã³ã¡ã³ãã§åãäžããããšãã§ãããããã¯ããã«å€§ããªãããã¯ãªã®ã§ã詳现ã«ã¯è§ŠããŸããã ããããä»ã®ãšãããç§ã¯ããã解決ããããã®ããè¯ãæ¹æ³ãèŠã€ããããšã«éåžžã«èå³ããããšèšãã ãã§ååã§ã-ãããŠå°æ¥ïŒ-æ§æã®è°è«ãïŒ
éåæåŸ æ©ã¹ããŒã¿ã¹ã¬ããŒãïŒ
http://smallcultfollowing.com/babysteps/blog/2019/03/01/async-await-status-report/
ç§ã®ä»¥åã®ã³ã¡ã³ããšæ¯èŒããŠãããã«ã¯ããªã¢ãŒãžã®çµæãšæ§æã«é¢ããããã€ãã®èããå«ãŸããŠããŸãïŒãã ããå®å šãªæ§æã®èšè¿°ã¯ãŸã ãããŸããïŒã
å°ãªããšãåœé¢ã¯ããã®åé¡ãasync-awaitå®å®åã®ãããã¯ãšããŠããŒã¯ããŸãã
ããªãåã«ãNiââkoã¯ãawaitæŒç®åã®æçµçãªæ§æã«ã€ããŠãèšèªããŒã ãšã³ãã¥ããã£ã§ã®è°è«ã®èŠçŽãæžãããšãçŽæããŸããã é·ãéãè©«ã³ç³ãäžããŸãã è°è«ã®ç¶æ³ã®èšè¿°ã¯ä»¥äžã«ãªã³ã¯ãããŠããŸãã ãã ãããã®åã«ãçŸåšã®è°è«ã®çŸç¶ãšä»åŸã®æ¹åæ§ã«ã€ããŠãææ°æ å ±ããäŒãããŸãã
ãŸãã2019幎7æ4æ¥ã«åå²ãã1.37ãªãªãŒã¹ã§async-awaitãå®å®ãããããšèããŠããŸãã await!
ãã¯ããå®å®ãããããªãã®ã§ããã®åã«æ§æã®è³ªåã解決ããå¿
èŠããããŸãã ãã®å®å®åã¯éã®çµãããè¡šãã®ã§ã¯ãªãããããå§ãŸããè¡šãããšã«æ³šæããŠãã ããã å®è¡ããå¿
èŠã®ããæ©èœäœæ¥ïŒããšãã°ããã¬ã€ãã®éåæfnïŒãšå®è£
äœæ¥ïŒç¶ç¶çãªæé©åããã°ä¿®æ£ãªã©ïŒãæ®ã£ãŠããŸãã ããã§ããéåæ/åŸ
æ©ã®å®å®åã¯äž»èŠãªãã€ã«ã¹ããŒã³ã«ãªããŸãïŒ
æ§æã«é¢ããéãã解決ã®èšç»ã¯æ¬¡ã®ãšããã§ãã
for
ã«ãŒãïŒJavaScriptã®for await
ã«ãŒããªã©ïŒã䜿çšããŠã¹ããªãŒã ãåŠçããŸãã ãã®ãããç§ã¯ãã®åé¡ã«é¢ããäžé£ã®æçš¿ã«åãçµãã§ããŸãïŒèšäºã¯DropboxPaperããã¥ã¡ã³ãã§ããã¡ãããå ¥æã§ããŸãã ã芧ã®ãšãããããã¯ããªãé·ããå€ãã®è°è«ãååŸã«äžŠã¹ãŠããŸãã ãã£ãŒãããã¯ãããã ããã°å¹žãã§ãã ãã®åé¡ïŒãã§ã«500ãè¶ ããã³ã¡ã³ãããããŸãïŒãå床éãã®ã§ã¯ãªãããã®ç®çã®ããã«å éšã¹ã¬ãããäœæããŸããã
å ã»ã©ç³ãäžããŸããããã«ãè¿ããã¡ã«æçµæ±ºå®ãäžãäºå®ã§ãã ãŸããè°è«ã¯ã»ãŒå®å®ããç¶æ ã«éããŠãããšæããŠããŸãã次ã®æ°é±éã¯ããã®æ§æã®è°è«ã®ãæçµã³ã¡ã³ãæéãã«ãªããšäºæ³ããŠããŸãã äŒè°ã®åŸããã®æ±ºå®ãã©ã®ããã«è¡ããããã«ã€ããŠå ±æããããã®ãã詳现ãªã¿ã€ã ã©ã€ã³ãããããšãé¡ã£ãŠããŸãã
Async / awaitæ§æã¯ãããããRustã1.0以éã«ç²åŸããæãæåŸ ãããŠããæ©èœã§ãããç¹ã«awaitã®æ§æã¯ãç§ãã¡ãæãå€ãã®ãã£ãŒãããã¯ãåãåã£ã決å®ã®1ã€ã§ãã éå»æ°ã¶æã«ããã£ãŠãããã®è°è«ã«åå ããŠããããã¹ãŠã®äººã«æè¬ããŸãïŒ ããã¯ãå€ãã®äººã匷ãç°ãªãææ ãæã£ãŠããéžæã§ãã ç§ãã¡ã¯ããªãã®ãã£ãŒãããã¯ãèãããŠããããšãçã«ä¿èšŒããããšæããŸãããããŠæçµçãªæ±ºå®ã¯å€ãã®ææ ®æ·±ããããŠæ³šææ·±ã審è°ã®åŸã«å°éãããã§ãããã
æãåèã«ãªãã³ã¡ã³ã
ä»ã®èšèªãawaitæ§é ãã©ã®ããã«åŠçããããæžãããšã¯åœ¹ã«ç«ã€ãããããªããšæããŸããã
Kotlin
C
F
Scala
Python
JavaScript
C ++ïŒã³ã«ãŒãã³TRïŒ
ããã¯
ããŒã
ããã§ããRuståŒã¯ããã€ãã®é£éã¡ãœããã«ãªãå¯èœæ§ãããããšãå¿ããªãã§ãã ããã ã»ãšãã©ã®èšèªã¯ããããªãåŸåããããŸãã