ããã¯RFC2394ïŒrust-lang / rfcsïŒ2394ïŒã®è¿œè·¡ã®åé¡ã§ãããèšèªã«éåæããã³åŸ æ©æ§æãè¿œå ããŸãã
ç§ã¯ãã®RFCã®å®è£ äœæ¥ãäž»å°ããŸãããrustcã§ã®äœæ¥çµéšãæ¯èŒçå°ãªããããã¡ã³ã¿ãŒã·ãããããã ããã°å¹žãã§ãã
TODOïŒ
æªè§£æ±ºã®è³ªåïŒ
await
æçµçãªæ§æãTry
å®è£
ãå確èªããŸãããã§ã®è°è«ã¯çµãã£ãããã§ãã®ã§ã await
æ§æã®è³ªåã®äžéšãšããŠããã«ãªã³ã¯ããŸãïŒ https ïŒ
ïŒ50307ã§å®è£ ããããã¯ãããŠããŸãã
æ§æã«ã€ããŠïŒåçŽãªããŒã¯ãŒããšããŠawait
ãæ¬åœã«æ¬²ããã§ãã ããšãã°ãããã°ã®æžå¿µäºé
ãèŠãŠã¿ãŸãããã
awaitããŒã¯ãŒãã«ã©ã®æ§æãå¿ èŠãã¯æ£ç¢ºã«ã¯ããããŸããã äœããçµæã®æªæ¥ã§ããå ŽåïŒIOã®æªæ¥ã®ããã«ïŒããããåŸ ã£ãŠãã
?
æŒç®åãé©çšã§ããããã«ããå¿ èŠããããŸãã ãããããããæå¹ã«ããã«ã¯ãåªå é äœã¯æå€ã«æãããããããªã-await io_future?
ã§ãããawait
第äžããã³?
ã«ããããããäºã?
èŸæžçã«ãããç·å¯ã®awaitãããææããããã®ã
ç§ã¯ããã§åæããŸãããäžãã£ãã¯æªã§ãã ?
åªå
é äœã¯await
ãããäœããããã§çµããããšãèŠããŠããæ¹ãç°¡åã ãšæããŸãã
let foo = await future?
èªã¿ãããããªãã¡ã¯ã¿ãªã³ã°ãç°¡åã§ãã ç§ã¯ãããããè¯ãã¢ãããŒãã ãšä¿¡ããŠããŸãã
let foo = await!(future)?
æäœãå®è¡ãããé åºãããããç解ã§ããŸãããèªã¿ã«ãããªããŸãã
await foo?
ãæåã«await
å®è¡ãããšãåé¡ã¯ãªããšæããŸãã ããããåå¥çã«ã¯ãã£ãšçµã³ã€ããŠããŸããã await
ã¯å·ŠåŽã«ããã ?
ã¯å³åŽã«ãããŸãã ãããã£ãŠãæåã«await
ããã®åŸã«Result
ãåŠçããã®ã«ååè«ççã§ãã
æèŠã®çžéãããå Žåã¯ã話ãåãããã«ãã®æšãè¡šæããŠãã ããã ãµã€ã¬ã³ãããŠã³æ祚ãäœãæå³ããã®ãããããŸããã ç§ãã¡ã¯çãRustã«è¯ãããšãé¡ã£ãŠããŸãã
await
ãããŒã¯ãŒã@Pzixelã§ãããšããèŠæ¹ã¯ãŸã¡ãŸã¡ã§ãã async
ãããŒã¯ãŒãã§ããããšãèãããšãããã¯ç¢ºãã«çŸçé
åããããããããããäžè²«æ§ããããŸãããã©ã®èšèªã§ããããŒã¯ãŒãã®è¥å€§åãã¯æ¬åœã®é¢å¿äºã§ãã ããã¯èšã£ãŠãã async
ãªãã§await
ã䜿çšããããšã¯ãæ©èœçã«ãæå³ããããŸããïŒ ãããããªããããããç§ãã¡ã¯ããããã®ãŸãŸã«ããŠããããšãã§ããŸãã ããã§ãªããã°ãç§ã¯await
ãããŒã¯ãŒãã«ããããšã«åŸåããã§ãããã
?
åªå é äœã¯await
ãããäœããããã§çµããããšãèŠããŠããæ¹ãç°¡åã ãšæããŸã
ãããåŠã³ãå é¢åããããšã¯å¯èœãããããŸãããã觊ããŠãããã®ã¯ç©ºçœã§åºåãããŠãããã®ãããç·å¯ã«çµã³ã€ããŠãããšãã匷ãçŽæãããã®ã§ãå®éã«ã¯åžžã«ééã£ãŠèªãŸããã ãããšæããŸãã
ãŸãããã¹ãŠã®å Žåã«åœ¹ç«ã€ããã§ã¯ãããŸãããããšãã°ã Result<impl Future, _>
ãè¿ãé¢æ°ïŒ
let foo = await (foo()?)?;
ããã§ã®æžå¿µã¯ãåã«ãåäžã®åŸ
æ©+ ?
ã®åªå
é äœãç解ã§ããããã ãã§ãªãããè€æ°ã®åŸ
æ©ãé£éããããšã©ã®ããã«èŠããããã§ããããŸãã ãããã£ãŠãåªå
é äœãéžæããã ãã§ãã await (await (await first()?).second()?).third()?
åé¡ãçºçããŸãã
await
æ§æã®ãªãã·ã§ã³ã®èŠçŽãäžéšã¯RFCããã®ãã®ã§ãæ®ãã¯RFCã¹ã¬ããããã®ãã®ã§ãã
await { future }?
ãŸãã¯await(future)?
ãããªåºåãæåãå¿
èŠã§ãïŒããã¯ãã€ãºãå€ãã§ãïŒãawait future?
ãŸãã¯(await future)?
ãæåŸ
ã©ããã«æ©èœããããã«ãåªå
é äœãéžæããã ãã§ãïŒã©ã¡ããæå€ãªæãã§ãïŒãawait? future
ãããªãã®ã«çµåããŸãïŒããã¯çããããšã§ãïŒãfuture await?
ãfuture.await?
ããã«ããªããšãããŠawait
æ¥å°ŸèŸãäœæããŸãïŒããã¯åäŸã®ãªãããšã§ãïŒãfuture@?
ããã«ã ?
ããã«æ°ããå°ç« ã䜿çšããŸãïŒããã¯ãã©ã€ã³ãã€ãºãã§ãïŒãããã¯èšã£ãŠãã
await
ãªãã§async
ã䜿çšããããšã¯ãæ©èœçã«ãæå³ããããŸããïŒ
@alexregããã§ãã ããšãã°ãKotlinã¯ãã®ããã«æ©èœããŸãã ããã¯ãæé»ã®åŸ æ©ããªãã·ã§ã³ã§ãã
@rpjohnstèå³æ·±ãã ãããšãç§ã¯äžè¬çã«async
ãšawait
ãèšèªã®æ瀺çãªæ©èœãšããŠæ®ããŠããã®ã§ãããªããªããããã¯Rustã®ç²Ÿç¥ã«åºã¥ããŠãããšæãããã§ãããéåæããã°ã©ãã³ã°ã®å°é家ã§ã¯ãããŸããã ..
@alexreg async / awaitã¯ãCïŒïŒç§ã®ç¬¬äžèšèªïŒã§æ¥åžžçã«äœ¿çšããŠããã®ã§ãæ¬åœã«çŽ æŽãããæ©èœã§ãã @rpjohnstã¯ããã¹ãŠã®å¯èœæ§ãéåžžã«ããŸãåé¡ããŸããã ç§ã¯2çªç®ã®ãªãã·ã§ã³ã奜ã¿ãŸããç§ã¯ä»ã®èæ ®äºé ã«åæããŸãïŒéšã ãã/ç°åžžãª/ ...ïŒã ç§ã¯éå»5幎éãäœãã§éåæ/åŸ æ©ã³ãŒããæ±ã£ãŠããŸããããã®ãããªãã©ã°ããŒã¯ãŒããæã€ããšã¯æ¬åœã«éèŠã§ãã
@rpjohnst
ãããã£ãŠãåªå é äœãéžæããã ãã§ããawaitïŒawaitïŒawait firstïŒïŒïŒïŒãsecondïŒïŒïŒïŒãthirdïŒïŒ?.ã®åé¡ãçºçããŸãã
ç§ã®ç·Žç¿ã§ã¯ã1è¡ã«2ã€ã®await
æžãããšã¯ãããŸããã ãããŸãã«ãå¿
èŠãªãšãã«then
ãšæžãçŽããawaitããŸã£ãã䜿çšããªãã§ãã ããã ããªãã¯ãããèªããããã¯ããã«é£ããããšãèªåèªèº«ã§èŠãããšãã§ããŸã
let first = await first()?;
let second = await first.second()?;
let third = await second.third()?;
ã§ããããäž»èŠãªã±ãŒã¹ãããåçŽã§ããè¯ããã®ã«ããããã«ãèšèªããã®ãããªæ¹æ³ã§ã³ãŒããæžãããšãæããšã©ãŸãããŠã倧äžå€«ã ãšæããŸãã
ããŒããŒã¢ãŠã§ã€future await?
ã¯èŠæ
£ããªããã®ã®é¢çœããã«èŠããŸãããããã«å¯Ÿããè«ççãªåè«ã¯èŠåœãããŸããã
ç§ã®ç·Žç¿ã§ã¯ã1è¡ã«2ã€ã®
await
æžãããšã¯ãããŸããã
ããããããã¯æ§æã«é¢ä¿ãªãæªãèãã§ããããã§ããããããšãCïŒã®æ¢åã®await
æ§æãéãããã§ãã 人ã
ã¯try!()
ïŒ ?
ã®å身ïŒã«ã€ããŠåæ§ã®è°è«ãããŸããã
æ¥å°ŸèŸãšæé»ã®ããŒãžã§ã³ã¯ã¯ããã«éãã§ãïŒ
first().await?.second().await?.third().await?
first()?.second()?.third()?
ããããããã¯æ§æã«é¢ä¿ãªãæªãèãã§ããããã§ããããããšãCïŒã®æ¢åã®awaitæ§æãéãããã§ãã
async
æäœããšã«1è¡ã«ããããšã¯ãç解ããã®ã«ååè€éã§ãããã°ãé£ãããããæ§æã«é¢ä¿ãªããããã¯æªãèãã ãšæããŸãã ããããåäžã®ã¹ããŒãã¡ã³ãã«é£éãããããšã¯ããã«æªãããã§ãã
ããšãã°ãå®éã®ã³ãŒããèŠãŠã¿ãŸãããïŒãããžã§ã¯ããã1ã€åã£ãŠããŸãïŒã
[Fact]
public async Task Should_UpdateTrackableStatus()
{
var web3 = TestHelper.GetWeb3();
var factory = await SeasonFactory.DeployAsync(web3);
var season = await factory.CreateSeasonAsync(DateTimeOffset.UtcNow, DateTimeOffset.UtcNow.AddDays(1));
var request = await season.GetOrCreateRequestAsync("123");
var trackableStatus = new StatusUpdate(DateTimeOffset.UtcNow, Request.TrackableStatuses.First(), "Trackable status");
var nonTrackableStatus = new StatusUpdate(DateTimeOffset.UtcNow, 0, "Nontrackable status");
await request.UpdateStatusAsync(trackableStatus);
await request.UpdateStatusAsync(nonTrackableStatus);
var statuses = await request.GetStatusesAsync();
Assert.Single(statuses);
Assert.Equal(trackableStatus, statuses.Single());
}
å®éã«ã¯ãæ§æã§èš±å¯ãããŠããŠãawait
ããã§ãŒã³ãã䟡å€ã¯ãªãããšã瀺ããŠããŸããããã¯ã await
ãå®å
šã«èªã¿åãäžèœã«ãªããããã¯ã³ã©ã€ããŒã®æžã蟌ã¿ãšèªã¿åããããã«å°é£ã«ãªãããã§ãããç§ã¯ããããŸãããããæªãçç±ã¯ããã ãã§ã¯ãªããšä¿¡ããŠããŸãã
æ¥å°ŸèŸãšæé»ã®ããŒãžã§ã³ã¯ã¯ããã«éãã§ã
ã¿ã¹ã¯ã®éå§ãšã¿ã¹ã¯ã®åŸ æ©ãåºå¥ããå¯èœæ§ã¯éåžžã«éèŠã§ãã ããšãã°ãç§ã¯ãããã®ãããªã³ãŒããèšè¿°ããŸãïŒããããããžã§ã¯ãã®ã¹ããããã§ãïŒã
public async Task<StatusUpdate[]> GetStatusesAsync()
{
int statusUpdatesCount = await Contract.GetFunction("getStatusUpdatesCount").CallAsync<int>();
var getStatusUpdate = Contract.GetFunction("getStatusUpdate");
var tasks = Enumerable.Range(0, statusUpdatesCount).Select(async i =>
{
var statusUpdate = await getStatusUpdate.CallDeserializingToObjectAsync<StatusUpdateStruct>(i);
return new StatusUpdate(XDateTime.UtcOffsetFromTicks(statusUpdate.UpdateDate), statusUpdate.StatusCode, statusUpdate.Note);
});
return await Task.WhenAll(tasks);
}
ããã§ã¯ãNåã®éåæãªã¯ãšã¹ããäœæããããããåŸ æ©ããŠããŸãã åã«ãŒãã®å埩ãåŸ ã€ããšã¯ãããŸããããæåã«éåæãªã¯ãšã¹ãã®é åãäœæãã次ã«ããããã¹ãŠãäžåºŠã«åŸ ã¡ãŸãã
Kotlinãç¥ããªãã®ã§ãã©ãããããã解決ãããããããŸããã ããããã¿ã¹ã¯ã®ãå®è¡äžããšãåŸ æ©äžããåãã§ããå Žåãã©ã®ããã«è¡šçŸã§ãããããããŸããã
ãããã£ãŠãæé»ã®ããŒãžã§ã³ã¯ãCïŒã®ãããªããã«å€ãã®æé»ã®èšèªã§ã¯äœ¿çšã§ããªããšæããŸãã
u8
ãi32
ã«æé»çã«å€æããããšããã§ããªãã«ãŒã«ãæã€Rustã§ã¯ãã¯ããã«æ··ä¹±ããŸãã
@Pzixelããã2çªç®ã®ãªãã·ã§ã³ã¯ãã奜ãŸãããªãã·ã§ã³ã®1ã€ã®ããã«èãããŸãã ç§ã¯CïŒã§ãasync/await
ã䜿çšããŸããããããæ°å¹Žã¯äž»ã«CïŒã§ããã°ã©ãã³ã°ããŠããªããããããŸã䜿çšããŠããŸããã åªå
é äœã«é¢ããŠã¯ã await (future?)
æ¹ãèªç¶ã§ãã
@rpjohnstç§ã¯æ¥å°ŸèŸæŒç®åã®ã¢ã€ãã¢ã奜ãã§ãããèªã¿ããããšäººã
ãè¡ãä»®å®ã«ã€ããŠãå¿é
ããŠããŸãã struct
ãšããååã®await
ã¡ã³ããŒã«ãšã£ãŠã¯ç°¡åã«æ··ä¹±ããå¯èœæ§ããããŸãã ã
ã¿ã¹ã¯ã®éå§ãšã¿ã¹ã¯ã®åŸ æ©ãåºå¥ããå¯èœæ§ã¯éåžžã«éèŠã§ãã
䟡å€ãããã®ã¯ãæé»ã®ããŒãžã§ã³ããããè¡ãããšã§ãã RFCã¹ã¬ãããšå éšã¹ã¬ããã®äž¡æ¹ã§æ»ã¬ãŸã§è°è«ãããã®ã§ãããã§ã¯ããŸã詳ãã説æããŸããããåºæ¬çãªèãæ¹ã¯ãã¿ã¹ã¯åŸ æ©ããã¿ã¹ã¯æ§ç¯ã«æ瀺æ§ã移åããããšã ãã§ããæ°ããæé»æ§ãå°å ¥ããªãã§ãã ããã
ããªãã®äŸã¯æ¬¡ã®ããã«ãªããŸãã
pub async fn get_statuses() -> Vec<StatusUpdate> {
// get_status_updates is also an `async fn`, but calling it works just like any other call:
let count = get_status_updates();
let mut tasks = vec![];
for i in 0..count {
// Here is where task *construction* becomes explicit, as an async block:
task.push(async {
// Again, simply *calling* get_status_update looks just like a sync call:
let status_update: StatusUpdateStruct = get_status_update(i).deserialize();
StatusUpdate::new(utc_from_ticks(status_update.update_date), status_update.status_code, status_update.note))
});
}
// And finally, launching the explicitly-constructed futures is also explicit, while awaiting the result is implicit:
join_all(&tasks[..])
}
ãããç§ãæå³ããããšã§ããããããæ©èœããããã«ã¯ãæªæ¥ãæ§ç¯ããè¡çºãæ確ã«ãããªããã°ãªããŸãããã ããã¯ãåæã³ãŒãã§ã¹ã¬ãããæäœããã®ãšéåžžã«ãã䌌ãŠããŸããé¢æ°ã®åŒã³åºãã¯ãåŒã³åºãå
ãåéããåã«åžžã«é¢æ°ã®å®äºãåŸ
æ©ãã䞊è¡æ§ãå°å
¥ããããã®åå¥ã®ããŒã«ããããŸãã ããšãã°ãã¯ããŒãžã£ãšthread::spawn
/ join
ã¯ãéåæãããã¯ãšjoin_all
/ select
/ etcã«å¯Ÿå¿ããŸãã
䟡å€ãããã®ã¯ãæé»ã®ããŒãžã§ã³ããããè¡ãããšã§ãã RFCã¹ã¬ãããšå éšã¹ã¬ããã®äž¡æ¹ã§æ»ã¬ãŸã§è°è«ãããã®ã§ãããã§ã¯ããŸã詳ãã説æããŸããããåºæ¬çãªèãæ¹ã¯ãã¿ã¹ã¯åŸ æ©ããã¿ã¹ã¯æ§ç¯ã«æ瀺æ§ã移åããããšã ãã§ããæ°ããæé»æ§ãå°å ¥ããªãã§ãã ããã
ããã ãšæããŸãã ãã®é¢æ°ã§ã©ã®ãããªãããŒãçºçãããã¯ããããŸãããããã§ãåŸ
æ©ãå®äºãããŸã§å®è¡ãäžæãããŸãã ãããã«ã¡ã¯ãããã®ã©ããã«éåæé¢æ°ããããŸããã©ããèŠã€ããŠã¿ãŠãã ãããé©ãããããšã§ãããïŒããšããasync
ãããã¯ãã衚瀺ãããŸããã
ãã1ã€ã®ãã€ã³ãïŒéã¯ããã¢ã¡ã¿ã«ã«è¿ããªã©ããã¹ãŠãè¡šçŸã§ããèšèªã«ãªãåŸåããããŸãã ããªã人工çãªã³ãŒããæäŸãããã®ã§ãããããã¯ãã®èãã瀺ããŠãããšæããŸãã
var a = await fooAsync(); // awaiting first task
var b = barAsync(); //running second task
var c = await bazAsync(); // awaiting third task
if (c.IsSomeCondition && !b.Status = TaskStatus.RanToCompletion) // if some condition is true and b is still running
{
var firstFinishedTask = await Task.Any(b, Task.Delay(5000)); // waiting for 5 more seconds;
if (firstFinishedTask != b) // our task is timeouted
throw new Exception(); // doing something
// more logic here
}
else
{
// more logic here
}
ãã³ã¯åžžã«äœãèµ·ãã£ãŠããããå®å
šã«å¶åŸ¡ããåŸåããããŸãã await
䜿çšãããšãç¶ç¶ããã»ã¹ãå®è¡ãããã€ã³ããæå®ã§ããŸãã ãŸããfutureå
ã®å€ãunwrap
ããããšãã§ããŸãã 䜿çšåŽã§æé»çãªå€æãèš±å¯ããå Žåãããã€ãã®åœ±é¿ããããŸãã
Future<T>
ãã T
èªäœãåŸ
æ©ããŠããããšãæåŸ
ããå¿
èŠããããŸãã ããŒã¯ãŒãã®åé¡ã§ã¯ãããŸãããååšããå Žåãçµæã¯T
ã«ãªããŸãããã以å€ã®å ŽåFuture<T>
get_status_updates
è¡ã§å®è¡ãäžæããã®ãããããŸãããã get_status_update
ã§ã¯å®è¡ãããŸããã ãããã¯äºãã«éåžžã«äŒŒãŠããŸãã ãã®ãããå
ã®ã³ãŒãã®ããã«æ©èœããªãããéåžžã«è€éã§ãããããäž»é¡ã«ç²ŸéããŠããŠã衚瀺ãããŸããã ã©ã¡ãã®æ¹æ³ã§ãããã®ãªãã·ã§ã³ã¯æå©ã«ã¯ãªããŸããããã®é¢æ°ã§ã©ã®ãããªãããŒãçºçãããã¯ããããŸãããããã§ãåŸ æ©ãå®äºãããŸã§å®è¡ãäžæãããŸãã
ã¯ããããã¯ç§ãããµã¹ãã³ã·ã§ã³ãã€ã³ããèŠã¥ãããªãããšããæå³ã§ãã ãªã³ã¯ãããå
éšã¹ã¬ãããèªãã ãããªããããããã»ã©å€§ããªåé¡ã§ã¯ãªãã®ãã«ã€ããŠè°è«ããŸããã æ°ããã³ãŒããèšè¿°ããå¿
èŠã¯ãããŸããã泚éãå¥ã®å Žæã«é
眮ããã ãã§ãïŒ await
edåŒã®ä»£ããã«async
ãããã¯ïŒã IDEã¯ãã¿ã€ããäœã§ããããåé¡ãªãèªèããŸãïŒé¢æ°åŒã³åºãã®å Žåã¯åžžã«T
ã§ããã async
ãããã¯ã®å Žåã¯Future<Output=T>
ã§ãïŒã
ãŸããæ§æã«é¢ä¿ãªããããªãã®ç解ã¯ããããééã£ãŠããããšã«æ³šæããŸãã Rustã®async
é¢æ°ã¯ãäœããã®æ¹æ³ã§åŸ
æ©ãããŸã§ã³ãŒãããŸã£ããå®è¡b.Status != TaskStatus.RanToCompletion
ãã§ãã¯ã¯åžžã«åæ ŒããŸãã ããããã®ããã«æ©èœããçç±ã«èå³ãããå Žåã¯ãRFCã¹ã¬ããã§ããã«ã€ããŠãè°è«ãããŸããã
ããªãã®äŸã§ã¯ããªãããã
get_status_updates
è¡ã§å®è¡ãäžæããã®ãããããŸããããget_status_update
ã§ã¯å®è¡ãããŸããã ãããã¯äºãã«éåžžã«äŒŒãŠããŸãã
ããã¯ãäž¡æ¹ã®å Žæã§ã®å²ã蟌ã¿å®è¡ãè¡ããŸãã éèŠãªã®ã¯ã async
ãããã¯ã¯ãåŸ
æ©ãããŸã§å®è¡ãããªããšããããšã§ããããã¯ãåè¿°ããããã«ãRustã®ãã¹ãŠã®å
ç©ã«åœãŠã¯ãŸãããã§ãã ç§ã®äŸã§ã¯ã get_statuses
ã¯get_status_updates
get_statuses
åŒã³åºãïŒãããã£ãŠåŸ
æ©ãïŒãã«ãŒãå
ã§count
å
ç©ãæ§ç¯ããŸãïŒãã ãåŸ
æ©ããŸããïŒã次ã«åŒã³åºããŸãïŒãããã£ãŠåŸ
æ©ããŸãïŒã ïŒ join_all
ããã®æç¹ã§ãããã®å
ç©ã¯åæã«get_status_update
åŒã³åºããŸãïŒãããã£ãŠåŸ
æ©ããŸãïŒã
ããªãã®äŸãšã®å¯äžã®éãã¯ãå
ç©ãå®è¡ãéå§ãããšãã§ã-ããªãã®äžã§ãããã¯ã«ãŒãã®éã«ãããŸãã ç§ã®å Žåãããã¯join_all
ãŸãã ããããããã¯Rustå
ç©ãæ©èœããåºæ¬çãªéšåã§ãããæé»ã®æ§æãasync
/ await
ã¯ãŸã£ããé¢ä¿ãããŸããã
ãŸããæ§æã«é¢ä¿ãªããããªãã®ç解ã¯ããããééã£ãŠããããšã«æ³šæããŸãã Rustã®éåæé¢æ°ã¯ãäœããã®æ¹æ³ã§åŸ æ©ããããŸã§ã³ãŒãããŸã£ããå®è¡ããªããããb.StatusïŒ= TaskStatus.RanToCompletionãã§ãã¯ã¯åžžã«åæ ŒããŸãã
ã¯ããCïŒã¿ã¹ã¯ã¯æåã®äžæåæ¢ãã€ã³ããŸã§åæçã«å®è¡ãããŸãã ãææããã ãããããšãããããŸãã
ãã ããã¡ãœããã®æ®ãã®éšåãå®è¡ããŠããéãããã¯ã°ã©ãŠã³ãã§ããã€ãã®ã¿ã¹ã¯ãå®è¡ããããã¯ã°ã©ãŠã³ãã¿ã¹ã¯ãçµäºãããã©ããã確èªã§ããã¯ããªã®ã§ãå®éã«ã¯åé¡ã§ã¯ãããŸããã ããšãã°ã
var a = await fooAsync(); // awaiting first task
var b = Task.Run(() => barAsync()); //running background task somehow
// the rest of the method is the same
ç§ã¯async
ãããã¯ã«ã€ããŠããªãã®èããæã£ãŠããŸãããããŠç§ãèŠãããã«ãããã¯åãç£ã§ãããããå€ãã®äžå©ãªç¹ããããŸãã å
ã®ææ¡ã§ã¯ãåéåæã¿ã¹ã¯ã¯await
ãšãã¢ã«ãªã£ãŠããŸãã async
ãããã¯ã䜿çšãããšãåã¿ã¹ã¯ã¯æ§ç¯ãã€ã³ãã§async
ãããã¯ãšãã¢ã«ãªãããã以åãšã»ãŒåãç¶æ³ïŒ1ïŒ1ã®é¢ä¿ïŒã«ãªããŸãããã³ãŒã«ãµã€ãã®åäœã¯ã³ã³ããã¹ãã«äŸåãããããããäžèªç¶ã§ç解ãã«ãããªããŸãã åŸ
ã£ãŠãããšã let a = foo()
ãŸãã¯let b = await foo()
ããã®ã¿ã¹ã¯ãäœæãããããäœæãããŠåŸ
æ©ããŠããããšãããããŸãã let a = foo()
ãšasync
ãããã¯ã衚瀺ãããå Žåãäžã«async
ããããã©ããã確èªããå¿
èŠããããŸãããã®å Žåã¯ãæ£ãããšæããŸãã
pub async fn get_statuses() -> Vec<StatusUpdate> {
// get_status_updates is also an `async fn`, but calling it works just like any other call:
let count = get_status_updates();
let mut tasks = vec![];
for i in 0..count {
// Here is where task *construction* becomes explicit, as an async block:
task.push(async {
// Again, simply *calling* get_status_update looks just like a sync call:
let status_update: StatusUpdateStruct = get_status_update(i).deserialize();
StatusUpdate::new(utc_from_ticks(status_update.update_date), status_update.status_code, status_update.note))
});
}
// And finally, launching the explicitly-constructed futures is also explicit, while awaiting the result is implicit:
join_all(&tasks[..])
}
ããã§ãã¹ãŠã®ã¿ã¹ã¯ãäžåºŠã«åŸ ã£ãŠããŸã
pub async fn get_statuses() -> Vec<StatusUpdate> {
// get_status_updates is also an `async fn`, but calling it works just like any other call:
let count = get_status_updates();
let mut tasks = vec![];
for i in 0..count {
// Isn't "just a construction" anymore
task.push({
let status_update: StatusUpdateStruct = get_status_update(i).deserialize();
StatusUpdate::new(utc_from_ticks(status_update.update_date), status_update.status_code, status_update.note))
});
}
tasks
}
ç§ãã¡ã¯ãããã1ã€ãã€å®è¡ããŠããŸãã
ãããã£ãŠããã®éšåã®æ£ç¢ºãªåäœã¯äœã§ããããèšãããšã¯ã§ããŸããã
let status_update: StatusUpdateStruct = get_status_update(i).deserialize();
StatusUpdate::new(utc_from_ticks(status_update.update_date), status_update.status_code, status_update.note))
ããå€ãã®ã³ã³ããã¹ããæããã«ã
ãããŠããã¹ãããããããã¯ã§ç©äºã¯ããå¥åŠã«ãªããŸãã å·¥å ·ãªã©ã«é¢ãã質åã¯èšããŸã§ããããŸããã
ã³ãŒã«ãµã€ãã®åäœã¯ã³ã³ããã¹ãã«äŸåããããã«ãªããŸã
ããã¯ãéåžžã®åæã³ãŒããšã¯ããŒãžã£ã§ã¯ãã§ã«åœãŠã¯ãŸããŸãã äŸãã°ïŒ
// Construct a closure, delaying `do_something_synchronous()`:
task.push(|| {
let data = do_something_synchronous();
StatusUpdate { data }
});
vs
// Execute a block, immediately running `do_something_synchronous()`:
task.push({
let data = do_something_synchronous();
StatusUpdate { data }
});
å®å
šãªæé»ã®åŸ
æ©ææ¡ãã泚æããå¿
èŠããããã1ã€ã®ããšã¯ã async
ã³ã³ããã¹ãããasync fn
åŒã³åºãããšãã§ããªãããšã§ãã ã€ãŸããé¢æ°åŒã³åºãæ§æsome_function(arg1, arg2, etc)
ã¯ã some_function
ãasync
ã§ãããã©ããã«é¢ä¿ãªããåŒã³åºãå
ãç¶è¡ããåã«åžžã«some_function
ã®æ¬äœãå®è¡ããŠå®äºããŸãã ãããã£ãŠã async
ã³ã³ããã¹ããžã®ãšã³ããªã¯åžžã«æ瀺çã«ããŒã¯ãããé¢æ°åŒã³åºãã®æ§æã¯å®éã«ã¯ããäžè²«æ§ããããŸãã
awaitæ§æã«ã€ããŠïŒã¡ãœããæ§æãæã€ãã¯ãã¯ã©ãã§ããïŒ ç§ã¯ãããå¯èœã«ãããããå®éã®RFCãèŠã€ããããšãã§ããŸããããç§ã¯ããã€ãã®è°è«ïŒèŠã€ãã1 ã 2ã¢ã€ãã¢ã¯åäŸã®ãªãã§ã¯ãããŸããã®ã§ãredditã®äžãïŒã ããã«ããã await
ãããŒã¯ãŒãã«ããããšãªãããŸãã¯ãã®æ©èœã®ã¿ã«æ°ããæ§æãå°å
¥ããããšãªããæ¥å°ŸèŸã®äœçœ®ã§æ©èœããããšãã§ããŸãã
// Postfix await-as-a-keyword. Looks as if we were accessing a Result<_, _> field,
// unless await is syntax-highlighted
first().await?.second().await?.third().await?
// Macro with method syntax. A few more symbols, but clearly a macro invocation that
// can affect control flow
first().await!()?.second().await!()?.third().await!()?
ã¢ããã®æ§æãåçŽåããScala-worldã®ã©ã€ãã©ãªããããŸãïŒ http ïŒ
ãã¶ããããã€ãã®ã¢ã€ãã¢ã¯Rustã«ãšã£ãŠèå³æ·±ããã®ã§ãã
ããã¥ã¡ã³ãããã®åŒçšïŒ
ã»ãšãã©ã®äž»æµèšèªã¯ãasync / awaitã€ãã£ãªã ã䜿çšããéåæããã°ã©ãã³ã°ããµããŒãããŠãããããããå®è£ ããŠããŸãïŒFïŒãCïŒ/ VBãJavascriptãPythonãSwiftãªã©ïŒã 䟿å©ã§ãããasync / awaitã¯éåžžãéåæèšç®ïŒTaskãFutureãªã©ïŒãè¡šãç¹å®ã®ã¢ããã«é¢é£ä»ããããŠããŸãã
ãã®ã©ã€ãã©ãªã¯ãasync / awaitã«äŒŒããœãªã¥ãŒã·ã§ã³ãå®è£ ããŸãããä»»æã®ã¢ããã¿ã€ãã«äžè¬åãããŠããŸãã ãã®äžè¬åã¯ãäžéšã®ã³ãŒãããŒã¹ãéåæèšç®ã«Futureã«å ããŠTaskãªã©ã®ä»ã®ã¢ããã䜿çšããããšãèæ ®ãããšäž»èŠãªèŠå ã§ãã
ã¢ãã
M
äžããããå Žåãäžè¬åã§ã¯ãéåžžã®å€ãã¢ããã«æã¡äžãïŒT => M[T]
ïŒãã¢ããã€ã³ã¹ã¿ã³ã¹ããå€ãæã¡äžããªãïŒM[T] => T
ïŒãšããæŠå¿µã䜿çšããŸãã >䜿çšäŸïŒlift { val a = unlift(callServiceA()) val b = unlift(callServiceB(a)) val c = unlift(callServiceC(b)) (a, c) }
ãªããã¯éåæã«å¯Ÿå¿ãããªããã解é€ããŠåŸ æ©ããããšã«æ³šæããŠãã ããã
ããã¯ãéåžžã®åæã³ãŒããšã¯ããŒãžã£ã§ã¯ãã§ã«åœãŠã¯ãŸããŸãã äŸãã°ïŒ
ããã«ããã€ãã®éãããããŸãã
await
ã¯ãããŸããã await
ã®å Žåãã³ã³ããã¹ãã¯ãããŸããã async
å Žåãã³ã³ããã¹ããå¿
èŠã§ãã åè
ã¯åãæ©èœãæäŸããŸãããã³ãŒãã«ã€ããŠããŸãç¥ãå¿
èŠããªããããåã¡ãŸããasync
é¢æ°ã¯éåžžã«å€§ããïŒéåžžã®é¢æ°ãšåãããã倧ããïŒãè€éãªå ŽåããããŸããthen
åŒã³åºããé€ããŸããã await
ãææ¡ãããŠããŸãïŒã async
ãããã¯ã¯é »ç¹ã«ãã¹ããããŸããå®å šãªæé»ã®awaitææ¡ãã泚æããªããã°ãªããªããã1ã€ã®ããšã¯ãéåæã³ã³ããã¹ãããéåæfnsãåŒã³åºãããšãã§ããªããšããããšã§ãã
ããŒããæ°ã¥ããªãã£ãã ç§ã®ç·Žç¿ã§ã¯ãéåæã³ã³ããã¹ãããéåæãå®è¡ãããããšãå€ãã®ã§ãããã¯è¯ãèãããŸããã CïŒã§ã¯ã async
ã¯ãã³ã³ãã€ã©ãé¢æ°æ¬äœãæžãæããããšãå¯èœã«ããåãªãããŒã¯ãŒãã§ãããé¢æ°ã€ã³ã¿ãŒãã§ã€ã¹ã«ã¯ãŸã£ãã圱é¿ããªãããã async Task<Foo>
ãšTask<Foo>
ã¯å®å
šã«äº€æå¯èœã§ãããå®è£
ãšAPIãåãé¢ããŸãã
async
ã¿ã¹ã¯ããããã¯ãããå ŽåããããŸããããšãã°ã main
ãããããã¯ãŒã¯APIãåŒã³åºãããå Žåãªã©ã§ãã ãããã¯ããå¿
èŠããããŸãïŒããã§ãªãå Žåã¯ãOSã«æ»ããããã°ã©ã ãçµäºããŸãïŒããéåæHTTPãªã¯ãšã¹ããå®è¡ããå¿
èŠããããŸãã main
ããããã³ã°ããŠéåæã«ãã以å€ã«ãã©ã®ãããªè§£æ±ºçãããã®ãââããããŸããããŸããéåæã®ã¡ã€ã³ããåŒã³åºããªãå Žåã¯ã Result
ã¡ã€ã³ãªã¿ãŒã³ã¿ã€ãã䜿çšããŸãã ã
çŸåšã®await
ãæ¯æããå¥ã®èæ
®äºé
ã¯ãä»ã®äžè¬çãªèšèªã§ã©ã®ããã«æ©èœãããã§ãïŒ @fdietzeã§ç€ºãããŠã
ããã«ããã€ãã®éãããããŸã
ãŸããã¡ã€ã³RFCã«ã¯ãã§ã«async
ãããã¯ããããæé»çãªããŒãžã§ã³ãšåãã»ãã³ãã£ã¯ã¹ãæã£ãŠããããšãç解ããŠããå¿
èŠããããŸãã
ç§ã®ç·Žç¿ã§ã¯ãéåæã³ã³ããã¹ãããéåæãå®è¡ãããããšãå€ãã®ã§ãããã¯è¯ãèãããŸããã
ããã¯åé¡ã§ã¯ãããŸããã async
ã³ã³ããã¹ãã§ãasync
ãããã¯ã䜿çšã§ãïŒéåžžã©ããF: Future
ãšè©äŸ¡ããããããããã§åé¡ãããŸããïŒãå
ç©ã§ã¹ããŒã³ãŸãã¯ãããã¯ã§ããŸãã以åãšãŸã£ããåãAPIã䜿çšããŸãã
async fn
åŒã³åºãããšã¯ã§ããŸãããã代ããã«async
ãããã¯ã§ããããžã®åŒã³åºããã©ããããŸã- F: Future
ãå¿
èŠãªå Žåã¯ãçŸåšã®ã³ã³ããã¹ãã«é¢ä¿ãªãè¡ããŸãã
asyncã¯ãã³ã³ãã€ã©ãé¢æ°æ¬äœãæžãæããããšãå¯èœã«ããåãªãããŒã¯ãŒãã§ãããé¢æ°ã€ã³ã¿ãŒãã§ã€ã¹ã«ã¯ãŸã£ãã圱é¿ããŸããã
ã¯ããããã¯ææ¡éã®æ£åœãªéãã§ãã å
éšã¹ã¬ããã§ãã«ããŒãããŠããŸããã ããããã2ã€ã®ã€ã³ã¿ãŒãã§ãŒã¹ãç°ãªããšäŸ¿å©ã§ããããã¯ã async fn
ããŒãžã§ã³ã§ã¯æ§ç¯ã®äžéšãšããŠã³ãŒããå®è¡ãããªãã®ã«å¯Ÿãã -> impl Future
ããŒãžã§ã³ã§ã¯ãªã¯ãšã¹ããéå§ããŠãããªã¯ãšã¹ããéä¿¡ã§ããããšã瀺ããŠããããã§ãã F: Future
ã ãŸãã async fn
ã¯ãéåžžã®fn
ã®æŽåæ§ãé«ããªããŸããã€ãŸãã -> T
ãšããŠå®£èšããããã®ãåŒã³åºããšããããããã§ãããã©ããã«é¢ä¿ãªããåžžã«T
ãåŸãããŸãã async
ã
ïŒãŸããã«ãŒã¹ãã«éã«ããªãã®é£èºãŸã ããããšã«æ³šæããŠãã ããasync fn
ãšFuture
RFCã§èª¬æããããã«-returningããŒãžã§ã³ã¯ãã async fn
ããŒãžã§ã³ã¯èšåããŸããFuture
ã¯çœ²åã®ã©ãã«ã§ããããæåããŒãžã§ã³ã«ã¯impl Trait
ãå¿
èŠã§ãããããã«ã¯ç涯ã«é¢ããããã€ãã®åé¡ããããŸããããã¯ãå®éã async fn
åæ©ã®äžéšã§ãããããã
CïŒ/ TypeScript / JS / Pythonãªã©ã®ä»ã®èšèªããã®ç§»è¡ã容æã«ãªããŸã
ããã¯ãRustã§ã¯ããèªäœã§ããªãåé¡ãšãªããªãã©ã«await future
æ§æã®å Žåã«ã®ã¿å©ç¹ã§ãã ãã以å€ã®å Žåãããããã®èšèªãšã®äžäžèŽããããŸãããæé»ã®åŸ
æ©ã«ã¯ãå°ãªããšãaïŒKotlinãšã®é¡äŒŒç¹ãããã³bïŒåæã¹ã¬ããããŒã¹ã®ã³ãŒããšã®é¡äŒŒç¹ããããŸãã
ã¯ããããã¯ææ¡éã®æ£åœãªéãã§ãã å éšã¹ã¬ããã§ãã«ããŒãããŠããŸããã ééããªãã2ã€ã®ã€ã³ã¿ãŒãã§ã€ã¹ãç°ãªããšäŸ¿å©ã§ã
APIãå®è£ ã®è©³çŽ°ã«äŸåãããããšã¯ç§ã«ã¯è¯ããªãããã«æãããã®ã§ã_ 2ã€ã®ã€ã³ã¿ãŒãã§ãŒã¹ãç°ãªãããšã«ã¯ããã€ãã®å©ç¹ããã_ãšæããŸãã ããšãã°ãå éšã®æªæ¥ãžã®åŒã³åºããåã«å§ä»»ããå¥çŽãæžããŠãã
fn foo(&self) -> Future<T> {
self.myService.foo()
}
ãããŠããã°ãè¿œå ãããã ãã§ã
async fn foo(&self) -> T {
let result = await self.myService.foo();
self.logger.log("foo executed with result {}.", result);
result
}
ãããŠããã¯å£æ» çãªå€åã«ãªããŸãã ãããïŒ
ããã¯ãRustã§ã¯ããèªäœã§ããªãåé¡ãšãªããªãã©ã«awaitfutureæ§æã®å Žåã«ã®ã¿å©ç¹ã§ãã ãã以å€ã®å Žåãããããã®èšèªãšã®äžäžèŽããããŸãããæé»ã®åŸ æ©ã«ã¯ãå°ãªããšãaïŒKotlinãšã®é¡äŒŒç¹ãããã³bïŒåæã¹ã¬ããããŒã¹ã®ã³ãŒããšã®é¡äŒŒç¹ããããŸãã
ããã¯ã await
æ§æã await foo
/ foo await
/ foo@
/ foo.await
/ ...ã®å©ç¹ã§ããåãããšã§ãããå¯äžã®éãã¯ãããŒã¯ãŒãã®ä»£ããã«ååŸã«é
眮ããããå°ç« ãä»ããããšã§ãã
ãŸããRFCã§èª¬æãããŠããããã«ãRustã§ã¯ãéåæfnãšFuture-returningããŒãžã§ã³ã®éã«ãŸã ããªãã®é£èºãããããšã«æ³šæããå¿ èŠããããŸãã
ç§ã¯ãããç¥ã£ãŠããŸãããããŠããã¯ç§ããšãŠãäžå®ã«ãããŸãã
ãããŠããã¯å£æ» çãªå€åã«ãªããŸãã
async
ãããã¯ãè¿ãããšã§ããããåé¿ã§ããŸãã æé»ã®åŸ
æ©ææ¡ã§ã¯ãäŸã¯æ¬¡ã®ããã«ãªããŸãã
fn foo(&self) -> impl Future<Output = T> { // Note: you never could return `Future<T>`...
async { self.my_service.foo() } // ...and under the proposal you couldn't call `foo` outside of `async` either.
}
ãããŠãã®ã³ã°ä»ãïŒ
fn foo(&self) -> impl Future<Output = T> {
async {
let result = self.my_service.foo();
self.logger.log("foo executed with result {}.", result);
result
}
}
ãã®åºå¥ãæã€ããšã«é¢ãããã倧ããªåé¡ã¯ããšã³ã·ã¹ãã ãæåã®å°æ¥ã®å®è£ ãšã³ã³ãããŒã¿ãŒïŒä»æ¥ã®å¯äžã®æ¹æ³ïŒããéåæ/åŸ æ©ã«ç§»è¡ãããšãã«çºçããŸãã ããããããã§ãããã®ææ¡ã«ãããå€ãã€ã³ã¿ãŒãã§ãŒã¹ãç¶æããæ°ããéåæã€ã³ã¿ãŒãã§ãŒã¹ãæäŸããããšãã§ããŸãã ããšãã°ãCïŒã¯ãã®ãã¿ãŒã³ã§ãã£ã±ãã§ãã
ãŸããããã¯åççã«èãããŸãã
ãã ãããã®ãããªæé»æ§ïŒããã§foo()
ãéåæãŸãã¯åææ©èœã§ãããã©ããã¯ããããŸããïŒã¯ãCOM +ãªã©ã®ãããã³ã«ã§çºçããã®ãšåãåé¡ãåŒãèµ·ãããWCFãå®è£
ãããçç±ã§ãããšç§ã¯ä¿¡ããŠããŸãã éåæãªã¢ãŒããªã¯ãšã¹ããåçŽãªã¡ãœããåŒã³åºãã®ããã«èŠãããšã人ã
ã¯åé¡ãæ±ããŠããŸããã
ãã®ã³ãŒãã¯ãéåæãŸãã¯åæã®ãªã¯ãšã¹ãããããã©ãããããããªãããšãé€ããŠãå®å šã«æ£åžžã«èŠããŸãã éèŠãªæ å ±ã ãšæããŸãã äŸãã°ïŒ
fn foo(&self) -> impl Future<Output = T> {
async {
let result = self.my_service.foo();
self.logger.log("foo executed with result {}.", result);
let bars: Vec<Bar> = Vec::new();
for i in 0..100 {
bars.push(self.my_other_service.bar(i, result));
}
result
}
}
bar
ãåæé¢æ°ãªã®ãéåæé¢æ°ãªã®ããç¥ãããšã¯éèŠã§ãã ã«ãŒãå
ã®await
ã¯ãè² è·ãšããã©ãŒãã³ã¹å
šäœãæ¹åããããã«ãã®ã³ãŒããå€æŽããå¿
èŠãããããšã瀺ãããŒã«ãŒãšããŠããèŠãããŸãã ããã¯ç§ãæšæ¥ã¬ãã¥ãŒããã³ãŒãã§ãïŒã³ãŒãã¯æé©ã§ã¯ãããŸããããã¬ãã¥ãŒã®å埩ã®1ã€ã§ãïŒïŒ
ã芧ã®ãšãããããã§ã«ãŒããåŸ
æ©ããŠããããšã«ç°¡åã«æ°ã¥ããå€æŽããããã«äŸé ŒããŸããã å€æŽãã³ãããããããšãããŒãžã®èªã¿èŸŒã¿ã3åé«éåãããŸããã await
ãªããã°ãç§ã¯ãã®äžæ£è¡çºãç°¡åã«èŠèœãšãããšãã§ããŸããã
Kotlinã䜿çšããããšããªãããšã¯èªããŸãããååãã®èšèªã調ã¹ããšãã¯ãæ©æ¢°çã«çžäºã«ç°¡åã«ç¿»èš³ã§ããããã«ãªããŸã§ãã»ãšãã©ã®å Žåãæ§æãå°ãªãJavaã®ããªã¢ã³ãã®ããã§ããã ãŸããJavaã®äžçïŒæ§æãå°ãå€ãåŸåãããïŒã§ãªãããã奜ãŸããã®ãæ³åã§ããŸããæè¿ãç¹ã«Javaã§ã¯ãªãããã«äººæ°ãé«ãŸã£ãŠããããšãèªèããŠããŸãïŒOracle察Googleã®ç¶æ³ïŒã ïŒã
ãã ãã人æ°ãšèŠªãã¿ããããèæ
®ã«å
¥ããããšã«ããå Žåã¯ãJavaScriptã®æ©èœã確èªããããšããå§ãããŸããããã¯ãæ瀺çãªawait
ãŸãã
ãšã¯èšããã®ã®ã await
ã¯CïŒã«ãã£ãŠäž»æµã®èšèªã«å°å
¥ãããŸãããããã¯ã䜿ãããããæãéèŠã§ãããšèããããŠããèšèªã®1ã€ã§ããå¯èœawait
ããŒã¯ãŒãã ãã§ãªããã¡ãœããåŒã³åºãã®Async
ãµãã£ãã¯ã¹ã«ãã£ãŠã瀺ãããŸãã await
ã yield return
ãšæãå
±æããä»ã®èšèªæ©èœããã³ãŒãã§ç®ç«ã€ããã«è¡šç€ºãããŸãã
äœæ ã§ããïŒ ç§ã®èãã§ã¯ããžã§ãã¬ãŒã¿ãŒãšéåæåŒã³åºãã¯åŒ·åãªæ§é ã§ãããããã³ãŒãã§æ°ä»ãããã«æž¡ãããšã¯ã§ããŸããã å¶åŸ¡ãããŒæŒç®åã®éå±€ããããŸãã
Pascal
ãšæ¯èŒããŠãã ããïŒgoto
ïŒå€§äžå€«ãå³å¯ãªéå±€ã§ã¯ãããŸããïŒyield return
ã¯ç®ç«ã€åŸåããããŸãïŒawait
+ Async
ãµãã£ãã¯ã¹ãŸããè¡šçŸåããã¯ãŒã«å¿ããŠãåé·æ§ãäœããã®ããåé·ãªãã®ãžãšå€åããŠããããšã«æ³šç®ããŠãã ããã
ãã¡ãããä»ã®èšèªã¯ç°ãªãã¢ãããŒããåããŸããã ïŒã®ããã«Schemeã®ç¶ç¶call/cc
ããããŸãéãã¯ãããŸããã await
ãŸãã¯ãã¯ãïŒã䜿çšãããšãåŒã³åºããŠãããã瀺ãããã«äœã®æ§æãæã£ãŠããŸããã ãã¯ãã®å ŽåãRustã¯ãã¯ããèŠããããããšããã¢ãããŒããåããŸããã
ãããã£ãŠãæ§æãå°ãªãããããšèªäœã¯æãŸãããªãïŒAPLãPerlã®ãããªèšèªããããŸãïŒãæ§æã¯åãªãå®åæã§ããå¿ èŠã¯ãªããèªã¿ãããã«ãããŠéèŠãªåœ¹å²ãæãããŸãã
å¹³è¡ããè°è«ããããŸãïŒç³ãèš³ãããŸãããããœãŒã¹ãæãåºããŸããããèšèªããŒã ã®èª°ãããæ¥ãå¯èœæ§ããããŸãïŒäººã ã¯æ°ããæ©èœã®ãã€ãºã®å€ãæ§æã«æ £ããŠããŸãããããããäžè¬çã«äœ¿çšãããããã«ãªããšãåé·æ§ãäœããªããŸãã
await!(foo)?
察await foo?
ã®è³ªåã«ã€ããŠã¯ãç§ã¯åã®ãã£ã³ãã«ããŸãã ã»ãšãã©ãã¹ãŠã®æ§æãå
éšåã§ããŸãããééãšè¿æ¥æ§ããæããããåŸãã®ã«æ
£ããããŠããŸãã await foo?
ãããšã2ã€ã®æŒç®åã®åªå
é äœãäºçªç®ã«æšæž¬ããå¯èœæ§ãé«ããªããŸãããäžæ¬åŒ§ã¯äœãèµ·ãã£ãŠããããæ確ã«ããŸãã 3æåç¯çŽãã䟡å€ã¯ãããŸããã await!
ãé£éãããæ¹æ³ã«ã€ããŠã¯ãäžéšã®èšèªã§ã¯äžè¬çãªã€ãã£ãªã ãããããŸããããèªã¿ãããã®æªãããããã¬ãŒãšã®çžäºäœçšãªã©ãæé©åãã䟡å€ã®ãªãæ¬ ç¹ãå€ããããšæããŠããŸãã
3æåç¯çŽãã䟡å€ã¯ãããŸããã
ç§ã®éžè©±çãªçµéšã§ã¯ãäœåãªæåïŒé·ãååãªã©ïŒã¯ããã»ã©åé¡ã«ã¯ãªããŸããããäœåãªããŒã¯ã³ã¯æ¬åœã«è¿·æã«ãªãå¯èœæ§ããããŸãã CPUã®äŸãã§ã¯ãé·ãååã¯å±ææ§ã®è¯ãçŽç·çãªã³ãŒãã§ãããçèã®èšæ¶ããå ¥åããã ãã§ãããè€æ°ã®ããŒã¯ã³ïŒå¥èªç¹ãªã©ïŒãå«ãŸããå Žåã®åãæåæ°ã¯åå²ããŠããããã£ãã·ã¥ãã¹ã§ãã£ã±ãã§ãã
ïŒ await foo?
ã¯éåžžã«éèªæã§ãããåé¿ããå¿
èŠããããããã«ããŒã¯ã³ãå
¥åããå¿
èŠãããããšã«å®å
šã«åæããŸããç§ã®èŠ³å¯ã§ã¯ããã¹ãŠã®æåãåãããã«äœæãããããã§ã¯ãããŸãããïŒ
@rpjohnst代æ¿æ¡ããæé»ã®
bar
ãåæé¢æ°ãªã®ãéåæé¢æ°ãªã®ããç¥ãããšã¯éèŠã§ãã
ããããããé¢æ°ãå®äŸ¡ãé«äŸ¡ããIOãå®è¡ãããã©ããããŸãã¯ã°ããŒãã«ãªç¶æ ã«è§Šãããã©ãããç¥ãããšãšå®éã«ç°ãªããã©ããã¯ããããŸããã ïŒããã¯@lnicolaã®éå±€ã«ãåœãŠã¯ãŸããŸã-éåæåŒã³åºããåæåŒã³åºããšåãããã«å®äºãããŸã§å®è¡ãããå Žåããããã¯ãã¯ãŒã®ç¹ã§å®éã«ã¯éãã¯ãããŸããïŒïŒ
ããšãã°ãåŒã³åºããã«ãŒãå ã«ãã£ããšããäºå®ã¯ããããéåæã§ãã£ããšããäºå®ãšåããããéèŠã§ãã ãããŠã䞊ååãæ£ããè¡ãã®ãéåžžã«ç°¡åãªRustã§ã¯ãé«äŸ¡ãªåæã«ãŒããRayonã€ãã¬ãŒã¿ãŒã«åãæ¿ããããšãææ¡ããããšãã§ããŸãã
ãããã£ãŠã await
èŠæ±ããããšã¯ããããã®æé©åããã£ããããããã«å®éã«ã¯ããã»ã©éèŠã§ã¯ãªããšæããŸãã ã«ãŒãã¯ãã§ã«æé©åãæ¢ãã®ã«é©ããå Žæã§ããã async fn
ã¯ãå®äŸ¡ãªIOåæå®è¡æ§ãååŸã§ããããšã瀺ãåªããææšã§ãã ãããã®æ©äŒãéããŠããããšã«æ°ä»ããå Žåã¯ãããŸã«å®è¡ãããã«ãŒãå
ã®éåæåŒã³åºããçšã®Clippylintãäœæããããšãã§ããŸãã åæã³ãŒãã«ãåæ§ã®lintããããšäŸ¿å©ã§ãã
ãæ瀺çãªéåæãã®åæ©ã¯ã @ lnicolaã瀺åããããã«ãåã«ãæ§æãå°ãªããããšã§ã¯ãããŸããã ããã¯ãé¢æ°åŒã³åºãæ§æã®åäœãããäžè²«æ§ã®ãããã®ã«ããŠã foo()
åžžã«foo
ã®æ¬äœãæåŸãŸã§å®è¡ããããã«ããããã§ãã ãã®ææ¡ã§ã¯ãã¢ãããŒã·ã§ã³ãçç¥ãããšã䞊è¡æ§ã®äœãã³ãŒããåŸãããŸããããã¯ãäºå®äžãã¹ãŠã®ã³ãŒãããã§ã«åäœããŠããæ¹æ³ã§ãã ãexplicitawaitãã§ã¯ã泚éãçç¥ãããšãå¶çºçãªåæå®è¡ããŸãã¯å°ãªããšãå¶çºçãªã€ã³ã¿ãŒãªãŒããçºçããŸããã
ããªãã®ä»£æ¿æ¡ã¯ããæé»ã®åŸ æ©ãã§ã¯ãªããæ瀺çãªéåæããšããŠæ瀺ãããå Žåããããã«è¯ãåä¿¡ã«ãªãå¯èœæ§ããããšæããŸã:-)
ã¹ã¬ããã®ååã¯ãæ瀺çãªå°æ¥ã®æ§ç¯ãæé»çãªåŸ æ©ãã§ãããåŸè ã®ååã¯åºå·ããŠããããã§ãã ïŒP
ããããããé¢æ°ãå®äŸ¡ãé«äŸ¡ããIOãå®è¡ãããã©ããããŸãã¯ã°ããŒãã«ãªç¶æ ã«è§Šãããã©ãããç¥ãããšãšå®éã«ç°ãªããã©ããã¯ããããŸããã ïŒããã¯@lnicolaã®éå±€ã«ãåœãŠã¯ãŸããŸã-éåæåŒã³åºããåæåŒã³åºããšåãããã«å®äºãããŸã§å®è¡ãããå Žåããããã¯ãã¯ãŒã®ç¹ã§å®éã«ã¯éãã¯ãããŸããïŒïŒ
ããã¯ãé¢æ°ãããã€ãã®ç¶æ
ãå€æŽããããšãç¥ã£ãŠããã®ãšåããããéèŠã ãšæããŸãããŸããåŒã³åºãåŽãšåŒã³åºãåŽã®äž¡æ¹ã«mut
ããŒã¯ãŒãããããŸãã
ãæ瀺çãªéåæãã®åæ©ã¯ã @ lnicolaã瀺åããããã«ãåã«ãæ§æãå°ãªããããšã§ã¯ãããŸããã ããã¯ãé¢æ°åŒã³åºãæ§æã®åäœãããäžè²«æ§ã®ãããã®ã«ããŠãfooïŒïŒãåžžã«fooã®æ¬äœãæåŸãŸã§å®è¡ããããã«ããããã§ãã
äžæ¹ã§ã¯ãããã¯è¯ãèæ
®äºé
ã§ãã ãã1ã€ã¯ãå°æ¥ã®äœæãšå°æ¥ã®å®è¡ãç°¡åã«åé¢ã§ããŸãã ã€ãŸãã foo
ãæœè±¡åãè¿ãã run
ãåŒã³åºããŠçµæãåŸãå Žåã foo
ã¯äœãããªãç¡é§ãªãŽãã«ã¯ãªããŸããããéåžžã«å¹æçã§ãã䟿å©ãªããšïŒåŸã§ã¡ãœãããåŒã³åºãããšãã§ãããªããžã§ã¯ããæ§ç¯ããŸãã éãã¯ãããŸããã ç§ãã¡ãåŒã³åºãfoo
ã¡ãœããã¯åãªããã©ãã¯ããã¯ã¹ã§ããããã®ã·ã°ããã£Future<Output=T>
ãå®éã«ã¯æªæ¥ãè¿ãããŸãã ãããã£ãŠãå¿
èŠã«å¿ããŠæ瀺çã«await
ããŸãã
ã¹ã¬ããã®ååã¯ãæ瀺çãªå°æ¥ã®æ§ç¯ãæé»çãªåŸ æ©ãã§ãããåŸè ã®ååã¯åºå·ããŠããããã§ãã ïŒP
ç§ã¯å人çã«ãããè¯ã代æ¿æ¡ã¯ãæ瀺çãªéåæã®æ瀺çãªåŸ æ©ãã§ãããšèããŠããŸã:)
PS
ç§ãä»å€ã®èãã«èŠèãããŸããïŒCïŒLDMãšéä¿¡ããããšããŸãããïŒ ããšãã°ã @ HaloFour ã @ gafter ã @ CyrusNajmabadiãªã©ã§ãã ãªã圌ããåã£ãæ§æãåã£ããã圌ãã«å°ããããšã¯æ¬åœã«è¯ãèããããããŸããã ä»ã®èšèªã®äººã«ãèããŠã¿ãããšãææ¡ãããã®ã§ãããç§ã¯åœŒããç¥ããªãã ãã§ã:)圌ãã¯æ¢åã®æ§æã«ã€ããŠè€æ°ã®è°è«ãããŠããŠããã§ã«å€ãã®è°è«ãããããšãã§ããããã€ãã®æçšãªã¢ã€ãã¢ãæã£ãŠãããããããŸããã
CïŒãæã£ãŠããã®ã§ãRustããã®æ§æãæã£ãŠããå¿ èŠããããšããæå³ã§ã¯ãããŸããããããã¯ããéã¿ã®ãã決å®ãããããšãå¯èœã«ããã ãã§ãã
ç§ã¯å人çã«ãããè¯ã代æ¿æ¡ã¯ãæ瀺çãªéåæã®æ瀺çãªåŸ æ©ãã§ãããšèããŠããŸã:)
äž»ãªææ¡ã¯ãæ瀺çãªéåæãã§æé»ã®éåæãã§ãã Future
ã眲åã®ã©ãã«ã衚瀺ãããŠããªããŠãã泚éã®ãªãé¢æ°åŒã³åºãã¯ããããåŸ
ããã«æªæ¥ãæ§ç¯ããŠããå¯èœæ§ããããŸãã
䟡å€ãããã®ã¯ãå éšã¹ã¬ããã«ãæ瀺çãªéåææ瀺çãªåŸ æ©ãã®ä»£æ¿æ段ãå«ãŸããŠããããšã§ããããã¯ãã©ã¡ãã®äž»èŠãªä»£æ¿æ段ãšãå°æ¥äºææ§ãããããã§ãã ïŒæåã®æçš¿ã®æåŸã®ã»ã¯ã·ã§ã³ãåç §ããŠãã ãããïŒ
CïŒLDMãšéä¿¡ããããšããŸãããïŒ
ã¡ã€ã³RFCã®äœè
ã¯ããããŸããã ç§ãèŠããŠããéããããããçãŸããäž»ãªãã€ã³ãã¯ã async fn
ã®çœ²åã«Future
ãå«ããªããšãã決å®ã§ããã CïŒã§ã¯ã Task
ãä»ã®ã¿ã€ãã«çœ®ãæããŠãé¢æ°ã®é§åæ¹æ³ãããçšåºŠå¶åŸ¡ã§ããŸãã ããããRustã§ã¯ããã®ãããªã¡ã«ããºã ã¯ãããŸããïŒãããŠãããŸããïŒããã¹ãŠã®å
ç©ã¯åäžã®ç¹æ§ãééãããããæ¯åãã®ç¹æ§ãæžãåºãå¿
èŠã¯ãããŸããã
ãŸããDartèšèªã®èšèšè ãšãé£çµ¡ãåããããããæ瀺çãªéåæãã®ææ¡ãäœæããåæ©ã®å€§éšåã§ããã Dart 1ã«ã¯åé¡ããããŸãããããã¯ãåŒã³åºããããšãã«é¢æ°ãªãã£ãããïŒRustã®åäœãšã¯ãŸã£ããåãã§ã¯ãããŸããããé¡äŒŒããŠããŸãïŒãDart 2ã§å€æŽããããããé¢æ°ãæåã®åŸ æ©ç¶æ ãŸã§å®è¡ããããšãã倧ããªæ··ä¹±ãåŒãèµ·ãããŸãããåŒã³åºããããåŸ ã¡ãŸãã Rustã¯ä»ã®çç±ã§ãããè¡ãããšã¯ã§ããŸããããåŒã³åºããããšãã«é¢æ°å šäœãå®è¡ã§ãããããæ··ä¹±ãé¿ããããšãã§ããŸãã
ãŸããDartèšèªã®èšèšè ãšãé£çµ¡ãåããããããæ瀺çãªéåæãã®ææ¡ãäœæããåæ©ã®å€§éšåã§ããã Dart 1ã«ã¯åé¡ããããŸãããããã¯ãåŒã³åºããããšãã«é¢æ°ãæåã®åŸ æ©ç¶æ ãŸã§å®è¡ãããªãã£ãããïŒRustã®åäœãšã¯ãŸã£ããåãã§ã¯ãããŸããããé¡äŒŒããŠããŸãïŒãDart 2ã§å€æŽããããããé¢æ°ãæåã®åŸ æ©ç¶æ ãŸã§å®è¡ããããšãã倧ããªæ··ä¹±ãåŒãèµ·ãããŸãããåŒã³åºããããåŸ ã¡ãŸãã Rustã¯ä»ã®çç±ã§ãããè¡ãããšã¯ã§ããŸããããåŒã³åºããããšãã«é¢æ°å šäœãå®è¡ã§ãããããæ··ä¹±ãé¿ããããšãã§ããŸãã
çŽ æŽãããçµéšãç§ã¯ãããç¥ããŸããã§ããã ããªãããã®ãããªå€§èŠæš¡ãªä»äºããããšèããŠããããã§ãã ãããã£ãð
ç§ãä»å€ã®èãã«èŠèãããŸããïŒCïŒLDMãšéä¿¡ããããšããŸãããïŒ ããšãã°ã @ HaloFour ã @ gafter ã @ CyrusNajmabadiãªã©ã§ãã ãªã圌ããåã£ãæ§æãåã£ããã圌ãã«å°ããããšã¯æ¬åœã«è¯ãèããããããŸããã
èå³ã®ããæ å ±ãæäŸãããŠããã ããŸãããã ããç§ã¯ããããã£ãšèŠãã ãã§ãã ããªããçŸåšæã£ãŠããç¹å®ã®è³ªåãèŠçŽããããšã¯å¯èœã§ããããïŒ
await
æ§æã«ã€ããŠïŒããã¯å®å
šã«ã°ãããŠãããããããŸãããé æ
®ãªãç§ã«åãã£ãŠå«ãã§ãã ãããç§ã¯éåæããã°ã©ãã³ã°ã®åå¿è
ã§ãäœã«ã€ããŠè©±ããŠããã®ãããããŸããïŒïŒ
ãawaitããšããåèªã䜿çšãã代ããã«ã ?
ãããªèšå·/æŒç®åãå°å
¥ããããšã¯ã§ããŸããã ããšãã°ã #
ã@
ãªã©ãçŸåšäœ¿çšãããŠããªããã®ã§ããå¯èœæ§ããããŸãã
ããšãã°ãæ¥å°ŸèŸæŒç®åã®å ŽåïŒ
let stuff = func()#?;
let chain = blah1()?.blah2()#.blah3()#?;
ããã¯éåžžã«ç°¡æœã§ãå·Šããå³ã«èªç¶ã«èªã¿åãããŸããæåã«åŸ
æ©ãïŒ #
ïŒã次ã«ãšã©ãŒãåŠçããŸãïŒ ?
ïŒã .await
ãæ§é äœã¡ã³ããŒã®ããã«èŠããpostfixawaitããŒã¯ãŒãã®ãããªåé¡ã¯ãããŸããã #
ã¯æããã«æŒç®åã§ãã
postfixãé©åãªå Žæã§ãããã©ããã¯ããããŸããããåªå é äœã®ããã«ãã®ããã«æããŸããã ãã¬ãã£ãã¯ã¹ãšããŠïŒ
let stuff = #func()?;
ãŸãã¯äžäœã§ãïŒ
let stuff = func#()?; // :-D :-D
ããã¯ä»ãŸã§ã«è°è«ãããããšããããŸããïŒ
ïŒç§ã¯ããã®ãããªãã®ããPerlãæªåé«ããã·ã³ãã«ã®ã©ã³ãã ããŒããŒãããã·ã¥ãæ§æã«è¿ã¥ãå§ããŠããããšãèªèããŠããŸã... :-DïŒ
@rayvector https://github.com/rust-lang/rust/issues/50547#issuecomment -388108875ã5çªç®ã®éžæè¢ã
@CyrusNajmabadiæ¥ãŠãããŠããããšãã äž»ãªè³ªåã¯ããªã¹ããããŠãããã®ãããçŸåšã®Rustèšèªã«ãã®ãŸãŸé©ããŠãããšæããªãã·ã§ã³ã¯ã©ããããŸãã¯ä»ã®éžæè¢ããããã©ããã§ãã ãã®ãããã¯ã¯ããã»ã©é·ããªãã®ã§ãç°¡åã«äžããäžã«ãã°ããã¹ã¯ããŒã«ã§ããŸãã äž»ãªè³ªåïŒRustã¯çŸåšã®CïŒ/ TS / ... await
æ¹æ³ã«åŸãã¹ããããããšãç¬èªã«å®è£
ããå¿
èŠãããã®ãââã çŸåšã®æ§æã¯ãäœããã®æ¹æ³ã§å€æŽãããããçš®ã®ãã¬ã¬ã·ãŒãã§ããããããšãCïŒã«æé©ã§ãããæ°ããèšèªã«ãæé©ãªãªãã·ã§ã³ã§ããïŒ
CïŒæ§æã«å¯Ÿããäž»ãªèæ
®äºé
ã¯ãæŒç®åã®åªå
é äœawait foo?
ãæåã«åŸ
æ©ããŠããã ?
æŒç®åãè©äŸ¡ããå¿
èŠãããããšãšãCïŒãšã¯ç°ãªããæåã®await
ãŸã§åŒã³åºãå
ã®ã¹ã¬ããã§å®è¡ãããªããšããéãã§ãã GetEnumerator
ãæåã«åŒã³åºããããŸã§ãåŠå®æ§ãã§ãã¯ãå®è¡ããŸããã
IEnumerable<int> GetInts(int n)
{
if (n < 0)
throw new InvalidArgumentException(nameof(n));
for (int i = 0; i <= n; i++)
yield return i;
}
ç§ã®æåã®ã³ã¡ã³ããšãã®åŸã®è°è«ã§ãã詳现ã«ã
@Pzixelãããç§ã以åã«ãã®ã¹ã¬ããã
ãããã«ãããç§ã¯ãã®ç°¡åãªèšåãé€ããŠãããã«ã€ããŠå€ãã®è°è«ãèŠãããšããããŸããã
è³æ/å察ã®è¯ãè°è«ã¯ãããŸããïŒ
@rayvectorããã§ã¯ãããåé·ãªæ§æãæ¯æããããã«å°ãè°è«ããŸããã ãã®çç±ã®1ã€ã¯ãããªããèšåããçç±ã§ãã
Perlãæªåé«ããèšå·ã®ã©ã³ãã ããŒããŒãããã·ã¥ãæ§æ
æ確ã«ããããã«ãç§ã¯await!(f)?
ãå®éã«æçµçãªæ§æã®ããã«å®è¡ãããŠãããšã¯æããŸãããããã¯ãç¹å®ã®éžæã«ã³ãããããªã確ããªæ¹æ³ã§ãããšããçç±ã§ç¹ã«éžæãããŸããã ãŸã ãå®è¡äžãã ãšæãæ§æïŒ ?
æŒç®åãå«ãïŒã¯æ¬¡ã®ãšããã§ãã
await f?
await? f
await { f }?
await(f)?
(await f)?
f.await?
ãŸãã¯ããããããããã®çµã¿åããã éèŠãªã®ã¯ããããã®ããã€ãã«ã¯åªå
é äœãæ確ã«ããããã«äžæ¬åŒ§ãå«ãŸããŠãããããã«ã¯å€ãã®ãªãã·ã§ã³ããããŸã-ããããæçµããŒãžã§ã³ã§ã¯await
ããã¯ãã§ã¯ãªãããŒã¯ãŒãæŒç®åã«ãªãããšãæå³ããŠããŸãïŒ rpjohnstãææ¡ãããããªããã€ãã®å€§ããªå€æŽãé€ããŠïŒã
åçŽãªpostfixawaitæŒç®åïŒäŸïŒ ~
ïŒããæ¬åŒ§ããªããåªå
é äœãæãé«ãããŒã¯ãŒãã®ããããã«æ祚ããŸãã
ç§ã¯ãã®ã¹ã¬ãããèªãã§ããŸããã次ã®ããšãææ¡ããããšæããŸãã
await f?
ã¯ãæåã«?
æŒç®åãè©äŸ¡ãã次ã«çµæã®æªæ¥ãåŸ
ã¡ãŸãã(await f)?
ã¯æåã«æªæ¥ãåŸ
ã¡ã次ã«?
æŒç®åãçµæãšæ¯èŒããŠè©äŸ¡ããŸãïŒéåžžã®RustæŒç®åã®åªå
é äœã«ããïŒawait? f
ã¯ã `ïŒawait fïŒïŒã®ã·ã³ã¿ãã¯ã¹ã·ã¥ã¬ãŒãšããŠäœ¿çšã§ããŸãã ãå°æ¥çµæãè¿ãããšããã®ã¯éåžžã«äžè¬çãªã±ãŒã¹ã ãšæãã®ã§ãå°çšã®æ§æã¯éåžžã«çã«ããªã£ãŠããŸããawait
ã¯æ瀺çã§ãªããã°ãªããªããšããä»ã®ã³ã¡ã³ãæäŸè
ã«åæããŸãã JavaScriptã§ãããè¡ãã®ã¯éåžžã«ç°¡åã§ãããŸããRustã³ãŒãã®æ瀺æ§ãšå¯èªæ§ã«æ¬åœã«æè¬ããŠããŸããéåæãæé»çã«ãããšãéåæã³ãŒãã§ã¯ãããå°ç¡ãã«ãªããšæããŸãã
ãæé»ã®éåæãããã¯ãã¯ãå°æ¥ã®åã«await
ããŒã¯ãŒããæ¿å
¥ããã ãã®proc_macroãšããŠå®è£
å¯èœã§ããå¿
èŠãããããšã«æ°ã¥ããŸããã
äž»ãªè³ªåã¯ããªã¹ããããŠãããã®ã®äžãããçŸåšã®Rustèšèªã«é©ããŠãããšæããªãã·ã§ã³ã¯ã©ãããšããããšã§ãã
CïŒãã¶ã€ããŒã«ãRustèšèªã«æé©ãªãã®ãå°ããã®ã¯...èå³æ·±ãã§ã:)
ç§ã¯ãã®ãããªæ±ºå®ãããè³æ ŒããªããšæããŠããŸãã ç§ã¯ãã³ãšããã«æãåºãã®ã奜ãã§ãã ããããããã¯ç§ãæ¯æ¥äœ¿ã£ãŠããèšèªã§ã¯ãããŸããã ãŸããç§ã¯ãããç§ã®ç²Ÿç¥ã«æ·±ãæ ¹ä»ããŠããŸããã ãã®ãããããã§ãã®èšèªã®é©åãªéžæã«ã€ããŠäž»åŒµããè³æ Œã¯ãªããšæããŸãã Go / TypeScript / CïŒ/ VB / C ++ã«ã€ããŠè³ªåãããã 確ãã«ãç§ã¯ã¯ããã«å¿«é©ã«æããã§ãããã ãããããã³ã¯ç§ã®å°éåéããå€ããããŠããã®ãããªèãã«æºè¶³ããããšã¯ã§ããŸããã
CïŒæ§æã«å¯Ÿããäž»ãªèæ ®äºé ã¯ãæŒç®åã®åªå é äœ
await foo?
ããã¯ç§ãã³ã¡ã³ãã§ãããããªæ°ãããŸãã 'await'ã§åªå é äœãããèããå¿ èŠãªãã©ãŒã ãèšå®ããåã«å€ãã®ãã©ãŒã ãè©ŠããŸããã ç§ãã¡ãèŠã€ããäžå¿çãªããšã®1ã€ã¯ããã®æ©èœã䜿çšããããšæã£ãŠããç§ãã¡ãšé¡§å®¢ïŒå éšããã³å€éšïŒã«ãšã£ãŠãéåæåŒã³åºããè¶ ããŠäœããããã§ãŒã³ãããããšæãããšã¯ãã£ãã«ãããŸããã§ããã èšãæããã°ã人ã ã¯ãåŸ ã€ããããããè¡šçŸã®æãéèŠãªéšåã§ããããããã£ãŠããããããã«è¿ã¥ããããšã«åŒ·ãåŒãå¯ããããŠããããã«èŠããŸããã 泚ïŒãå®å šãªåŒããšã¯ãåŒã¹ããŒãã¡ã³ãã®äžéšã«ããåŒãæäžäœã®å²ãåœãŠã®å³åŽã«ããåŒããŸãã¯ãåŒæ°ããšããŠäœãã«æž¡ãåŒãªã©ãæå³ããŸãã
exprå
ã§ãawaitãããç¶è¡ãããããšããåŸåã¯ãŸãã§ããã (await expr).M()
ãããªãã®ãæã
èŠãããŸããããããã¯await expr.M()
å®è¡ããŠãã人ã®æ°ãããäžè¬çã§ã¯ãªããæãŸãããªãããã§ãã
ãããããawaitãã«ãæé»ã®ã圢åŒã䜿çšããªãã£ãçç±ã§ããããŸãã å®éã«ã¯ãããã¯äººã ãéåžžã«æ確ã«èããããšæã£ãŠãããã®ã§ããã圌ããããã«æ³šæãæãããšãã§ããããã«ã³ãŒãã®äžå¿ãŸããã§ããã 人ã ã¯ãŸã ãã®ããŒã¯ãŒãã®éãæ§è³ªãšç§ãã¡ãéžãã åªå é äœãæ¬åœã«æ°ã«å ¥ã£ãŠããããã§ãã
ãããŸã§ã®ãšãããèŠèŽè ã®åªå é äœã®éžæã«éåžžã«æºè¶³ããŠããŸãã å°æ¥çã«ã¯ãããã§ããã€ãã®å€æŽãå ããå¯èœæ§ããããŸãã ããããå šäœãšããŠãããããããšãžã®åŒ·ãå§åã¯ãããŸããã
-
ãŸããCïŒã®å®è¡ãšã¯ç°ãªããæåã«åŸ æ©ãããŸã§åŒã³åºãå ã®ã¹ã¬ããã§å®è¡ãããªããããŸã£ããéå§ãããªããšããéãã«å ããŠãçŸåšã®ã³ãŒãã¹ããããã¯ãGetEnumeratorãæåã«åŒã³åºããããŸã§ãã¬ãã£ããã§ãã¯ãå®è¡ããŸããã
IMOãç§ãã¡ãåæåãäœæããæ¹æ³ã¯ãããã¶ãééãã§ãããäœå¹Žã«ãããã£ãŠå€ãã®æ··ä¹±ãæããŸããã å€ãã®ã³ãŒãã次ã®ããã«èšè¿°ããªããã°ãªããªãåŸåããããããããã¯ç¹ã«æªãããšã§ãã
`` `cïŒ
void SomeEnumeratorïŒX argsïŒ
{{
// Argsãæ€èšŒããåæäœæ¥ãè¡ããŸãã
SomeEnumeratorImplïŒargsïŒ;ãè¿ããŸãã
}
void SomeEnumeratorImplïŒX argsïŒ
{{
//..ã
åç
//..ã
}
People have to write this *all the time* because of the unexpected behavior that the iterator pattern has. I think we were worried about expensive work happening initially. However, in practice, that doesn't seem to happen, and people def think about the work as happening when the call happens, and the yields themselves happening when you actually finally start streaming the elements.
Linq (which is the poster child for this feature) needs to do this *everywhere*, this highly diminishing this choice.
For ```await``` i think things are *much* better. We use 'async/await' a ton ourselves, and i don't think i've ever once said "man... i wish that it wasn't running the code synchronously up to the first 'await'". It simply makes sense given what the feature is. The feature is literally "run the code up to await points, then 'yield', then resume once the work you're yielding on completes". it would be super weird to not have these semantics to me since it is precisely the 'awaits' that are dictating flow, so why would anything be different prior to hitting the first await.
Also... how do things then work if you have something like this:
```c#
async Task FooAsync()
{
if (cond)
{
// only await in method
await ...
}
}
ãã®ã¡ãœãããå®å šã«åŒã³åºãããšãã§ããåŸ æ©ããããšã¯ãããŸããã ãæåã«åŸ æ©ãããŸã§å®è¡ãåŒã³åºãå ã®ã¹ã¬ããã§å®è¡ãããªããå Žåãå®éã«ããã§äœãèµ·ãããŸããïŒ
åŸ ã€ïŒ f㯠`ïŒawait fïŒïŒã®æ§æç³è¡£ãšããŠå©çšã§ããŸãã ãå°æ¥çµæãè¿ãããšããã®ã¯éåžžã«äžè¬çãªã±ãŒã¹ã ãšæãã®ã§ãå°çšã®æ§æã¯éåžžã«çã«ããªã£ãŠããŸãã
ããã¯ç§ã«æãå ±é³ŽããŸãã ããã«ããããawaitããæäžäœã®æŠå¿µã«ããããšãã§ããŸãããçµæã¿ã€ãã®ç°¡åãªåŠçãå¯èœã«ãªããŸãã
CïŒããããã£ãŠããããšã®1ã€ã¯ãåªå
é äœã«é¢ãã人ã
ã®çŽæã¯ç©ºçœã«çµã³ã€ããŠãããšããããšã§ãã ããã§ãããªãããxãåŸ
ã€ããæã£ãŠãããªãïŒ ?
ãåŒã«é£æ¥ããŠããããã await
åªå
é äœã¯?
ãããäœãããã«ããã«æããããŸãã äžèšãå®éã«(await x)?
ãšããŠè§£æãããå Žåãããã¯ç§ãã¡ã®èŽè¡ã«ãšã£ãŠé©ãã¹ãããšã§ãã
await (x?)
ãšããŠè§£æãããšãæ§æããæãèªç¶ã«æããããfuture / taskã®ãçµæããååŸããå¿
èŠæ§ã«é©åããå®éã«å€ãåãåã£ãå Žåã¯ããããåŸ
æ©ãããå¿
èŠããããŸãã ã ãã®åŸãçµæãè¿ãããå Žåã¯ãããããawaitããšçµã¿åãããŠãåŸã§çºçããããšãéç¥ããã®ãé©åã ãšæããŸãã ããawait? x?
å?
ãã£ãããšãããæãèªç¶ã«é¢é£ããã³ãŒãã®éšåã«çµåãããã æåã®?
ã¯await
ïŒç¹ã«ãã®çµæïŒã«é¢é£ãã2çªç®ã¯x
ãŸãã
ãæåã«åŸ æ©ãããŸã§å®è¡ãåŒã³åºãå ã®ã¹ã¬ããã§å®è¡ãããªããå Žåãå®éã«ããã§äœãèµ·ãããŸããïŒ
åŒã³åºãåŽãæ»ãå€åŸ
ã£ãŠãŸã§ãäœãèµ·ãããŸããFooAsync
ãã€ã³ãã§ã FooAsync
ãŸã§ã®ããããã®äœã®å®è¡await
ãŸãã¯ãããè¿ãããŸãã
Rust Future
ã¯ããŒãªã³ã°é§ååã§ãã¹ã¿ãã¯ã«å²ãåœãŠããã poll
æåã«åŒã³åºããåŸã¯ç§»åã§ããªãããããã®ããã«æ©èœããŸãã åŒã³åºãå
ã¯ãããããæå®ã®äœçœ®ã«ç§»åããæ©äŒãå¿
èŠã§ãããããã¬ãã«ã®Future
ã®ããŒãäžããŸãã¯èŠªFuture
å
ã®å€ã«ãããå€ãã®å Žåãã¹ã¿ãã¯ãã¬ãŒã ãäžã«ãããŸããåŒã³åºãå
ã®async fn
--beforeä»»æã®ã³ãŒããå®è¡ãããŸãã
ããã¯ãaïŒåŒã³åºãæã«ã³ãŒããå®è¡ãããªãCïŒãžã§ãã¬ãŒã¿ãŒã®ãããªã»ãã³ãã£ã¯ã¹ããŸãã¯bïŒé¢æ°ã®åŒã³åºããããã«æé»çã«åŸ
æ©ããKotlinã³ã«ãŒãã³ã®ãããªã»ãã³ãã£ã¯ã¹ïŒã¯ããŒãžã£ãŒã®ãããªasync { .. }
ïŒã®ããããã«åºå·ããŠããããšãæå³ããŸãåæå®è¡ãå¿
èŠãªå Žåã®
åŸè ã®æ¹ã奜ãã§ããCïŒãžã§ãã¬ãŒã¿ãŒã§èšåããåé¡ãåé¿ããæŒç®åã®åªå é äœã®è³ªåãå®å šã«åé¿ã§ããããã§ãã
@CyrusNajmabadi Rustã§ã¯ã Future
ã¯éåžžã Task
ãšããŠçæããããŸã§æ©èœããŸããïŒFïŒ Async
éåžžã«äŒŒãŠããŸãïŒïŒ
let bar = foo();
ãã®å Žåã foo()
ã¯Future
è¿ããŸãããå®éã«ã¯äœãããŸããã æåã§ã¹ããŒã³ããå¿
èŠããããŸãïŒãããFïŒ Async
䌌ãŠããŸãïŒïŒ
tokio::run(bar);
ã¹ããŒã³ããããšã Future
ãŸãã ããã¯Future
ã®ããã©ã«ãã®åäœã§ãããããRustã®async / awaitã¯ãçæããããŸã§ã³ãŒããå®è¡ããªãæ¹ãäžè²«æ§ããããŸãã
æããã«ãCïŒã§ã¯ç¶æ³ãç°ãªããŸããCïŒã§ã¯foo()
ãåŒã³åºããšãããã«Task
å®è¡ãéå§ããããããCïŒã§ã¯æåã®await
ãŸã§ã³ãŒããå®è¡ããã®ãçã«ããªã£ãŠããŸãã ã
ãŸã...ãã®ãããªãã®ãããå Žåãã©ã®ããã«æ©èœããã®ã§ãããã[...]ãã®ã¡ãœãããå®å šã«åŒã³åºãããšãã§ããåŸ æ©ããããšã¯ãããŸããã ãæåã«åŸ æ©ãããŸã§å®è¡ãåŒã³åºãå ã®ã¹ã¬ããã§å®è¡ãããªããå Žåãå®éã«ããã§äœãèµ·ãããŸããïŒ
FooAsync()
ãåŒã³åºããšãäœãå®è¡ããããã³ãŒãã¯å®è¡ãããŸããã 次ã«ããããçæãããšãã³ãŒããåæçã«å®è¡ããã await
ã¯å®è¡ãããªããããããã«()
ïŒRustã®void
ã®ããŒãžã§ã³ïŒãè¿ãããŸãã
ã€ãŸãããå®è¡ã¯æåã«åŸ
æ©ãããŸã§åŒã³åºãå
ã®ã¹ã¬ããã§å®è¡ãããªããã§ã¯ãªãããæ瀺çã«çæããããŸã§å®è¡ã¯å®è¡ãããŸããïŒ tokio::run
ïŒãã§ãã
åŒã³åºãå ãFooAsyncã®æ»ãå€ãåŸ ã€ãŸã§ã¯äœãèµ·ãããŸããããã®æç¹ã§ãFooAsyncã®æ¬äœã¯ãåŸ ã€ãæ»ããŸã§å®è¡ãããŸãã
ããã ããã¯æ®å¿µãªããšã®ããã§ãã å€ãã®å Žåãç§ã¯äœããåŸ ã€ããšã«æ £ããŠããªãå¯èœæ§ããããŸãïŒå€ãã®å Žåããã£ã³ã»ã«ãã¿ã¹ã¯ã®æ§æãåå ã§ãïŒã éçºè ãšããŠãç§ã¯ãŸã åæã®ãšã©ãŒãåãåã£ãŠããã ããã°å¹žãã§ãïŒããã¯ã人ã ãå®è¡ãåŸ ã¡æãã§ããæãäžè¬çãªçç±ã®1ã€ã§ãïŒã
ããã¯ãaïŒåŒã³åºãæã«ã³ãŒããå®è¡ãããªãCïŒãžã§ãã¬ãŒã¿ãŒã®ãããªã»ãã³ãã£ã¯ã¹ããŸãã¯bïŒé¢æ°ã®åŒã³åºããããã«æé»çã«åŸ æ©ããKotlinã³ã«ãŒãã³ã®ãããªã»ãã³ãã£ã¯ã¹ïŒã¯ããŒãžã£ãŒã®ãããªéåæ{ïŒã®ããããã«åºå·ããŠããããšãæå³ããŸãã ã}åæå®è¡ãå¿ èŠãªå Žåã®ãããã¯ïŒã
ããããèãããšãç§ã¯åŸè ãããåè ã®æ¹ãã¯ããã«å¥œãã§ãã ãã ç§ã®å人çãªå¥œã¿ã§ãã kotlinã®ã¢ãããŒãããã¡ã€ã³ã«ãšã£ãŠããèªç¶ã§ãããšæããå Žåã¯ããããéžæããŠãã ããã
@CyrusNajmabadiIck ã ããã¯æ®å¿µãªããšã®ããã§ãã å€ãã®å Žåãç§ã¯äœããåŸ ã€ããšã«æ £ããŠããªãå¯èœæ§ããããŸãïŒå€ãã®å Žåããã£ã³ã»ã«ãã¿ã¹ã¯ã®æ§æãåå ã§ãïŒã éçºè ãšããŠãç§ã¯ãŸã åæã®ãšã©ãŒãåãåã£ãŠããã ããã°å¹žãã§ãïŒããã¯ã人ã ãå®è¡ãåŸ ã¡æãã§ããæãäžè¬çãªçç±ã®1ã€ã§ãïŒã
æ£å察ã ãšæããŸãã ç§ã®JavaScriptã®çµéšã§ã¯ã await
䜿çšãå¿ããããšã¯éåžžã«äžè¬çã§ãã ãã®å Žåã Promise
ã¯åŒãç¶ãå®è¡ãããŸããããšã©ãŒã¯é£²ã¿èŸŒãŸããŸãïŒãŸãã¯ä»ã®å¥åŠãªããšãèµ·ãããŸãïŒã
Rust / Haskell / FïŒã¹ã¿ã€ã«ã§ã¯ã Future
ãïŒæ£ãããšã©ãŒåŠçã§ïŒå®è¡ããããããŸã£ããå®è¡ãããŸããã 次ã«ãå®è¡ãããŠããªãããšã«æ°ä»ããã®ã§ã調æ»ããŠä¿®æ£ããŸãã ããã«ãããã³ãŒããããå
ç¢ã«ãªããšæããŸãã
@ Pauan @ rpjohnst説æããããšãããããŸãã ããããç§ãã¡ãæ€èšããã¢ãããŒãã§ããã ããããå®éã«ã¯ããã»ã©æãŸãããã®ã§ã¯ãªãããšãå€æããŸããã
ãå®éã«ã¯äœãããªããæåã§ã¹ããŒã³ããå¿
èŠããããå Žåã¯ããªã³ããã³ãã§ã¿ã¹ã¯ãçæãããã®ãè¿ããã®ãšããŠã¢ãã«åããæ¹ãã¯ãªãŒã³ã§ããããšãããããŸããã ã€ãŸãã Func<Task>
ãããªåçŽãªãã®ã§ãã
æ£å察ã ãšæããŸãã JavaScriptã®ç§ã®çµéšã§ã¯ãawaitã®äœ¿çšãå¿ããããšã¯éåžžã«äžè¬çã§ãã
CïŒã¯ãã¿ã¹ã¯ãåŸ æ©ããŠããããããã§ãªããã°ã¿ã¹ã¯ãé©åã«äœ¿çšããŠããããšã確èªããããã«æ©èœããŸãã
ãããããšã©ãŒã¯é£²ã¿èŸŒãŸããŸã
ããã¯ç§ãèšã£ãŠããããšã®å察ã§ãã ç§ã¯ãã³ãŒããç±å¿ã«å®è¡ããŠãã¿ã¹ã¯ã§ã³ãŒããå®è¡ããããšã«ãªããªãå Žåã§ãããšã©ãŒãããã«çºçããããã«ããããšèšã£ãŠããŸãã ããã¯ã€ãã¬ãŒã¿ã§ãåãã§ãã ã€ãã¬ãŒã¿ãã¹ããªãŒãã³ã°ãããŠããå Žå/å Žåã¯ãé¢æ°ãåŒã³åºããæç¹ã§ãæœåšçã«ã¯ããã«å ã®æç¹ã§ãæ£ããäœæãããŠããªãã£ãããšãããªãç¥ã£ãŠããŸãã
次ã«ãå®è¡ãããŠããªãããšã«æ°ä»ããã®ã§ã調æ»ããŠä¿®æ£ããŸãã
ç§ã話ããŠããã·ããªãªã§ã¯ããå®è¡ãããŠããªããããšã¯å®å šã«åççã§ãã çµå±ã®ãšãããç§ã®ã¢ããªã±ãŒã·ã§ã³ã¯ãå®éã«ã¿ã¹ã¯ãå®è¡ããå¿ èŠããªããšãã€ã§ãå€æããå¯èœæ§ããããŸãã ããã¯ç§ã説æããŠãããã°ã§ã¯ãããŸããã ç§ã説æããŠãããã°ã¯ãæ€èšŒã«åæ Œããªãã£ãããšã§ããå®éã«äœæ¥ãå®è¡ããå¿ èŠãããæç¹ã§ã¯ãªããè«ççã«äœæ¥ãäœæããæç¹ã«è¿ãããšãç¥ããããšæããŸãã ããããéåæåŠçã説æããããã®ã¢ãã«ã§ããããšãèãããšãããããäºãã«é ãé¢ããŠããå ŽåããããããŸãã ãããã£ãŠãåé¡ã«é¢ããæ å ±ãã§ããã ãæ©ãçºçãããããšã¯äŸ¡å€ããããŸãã
åè¿°ã®ããã«ãããã仮説ã§ã¯ãããŸããã åæ§ã®ããšãã¹ããªãŒã /ã€ãã¬ãŒã¿ã§ãçºçããŸãã 人ã ã¯ãã°ãã°ããããäœæããŸããããã®åŸãŸã§ããããå®çŸããŸããã ãããã®ããšããœãŒã¹ãŸã§è¿œè·¡ããªããã°ãªããªãããšã¯ã人ã ã«ãšã£ãŠäœåãªè² æ ã§ããã ããããéåžžã«å€ãã®APIïŒhte BCLãå«ãïŒãåæ/åæäœæ¥ãšå®éã®é 延/é 延äœæ¥ã®éã§åå²ãè¡ããªããã°ãªããªãçç±ã§ãã
ããã¯ç§ãèšã£ãŠããããšã®å察ã§ãã ç§ã¯ãã³ãŒããç±å¿ã«å®è¡ããŠãã¿ã¹ã¯ã§ã³ãŒããå®è¡ããããšã«ãªããªãå Žåã§ãããšã©ãŒãããã«çºçããããã«ããããšèšã£ãŠããŸãã
åæã®ãšã©ãŒãžã®æ¬²æ±ã¯ç解ã§ããŸãããæ··ä¹±ããŠããŸããã©ã®ãããªç¶æ³ã§ãã Future
ãã¹ããŒã³ããããšãã§ããªããªã£ãŠããŸããã®ã§ããããã
Rustã§Future
ãæ©èœããæ¹æ³ã¯ãããŸããŸãªæ¹æ³ïŒéåæ/åŸ
æ©ã䞊åã³ã³ãããŒã¿ãªã©ãå«ãïŒã§Future
äžç·ã«äœæããããšã§ãããããè¡ãããšã§ããã¹ãŠã®ãµãFuture
ãå«ãåäžèåFuture
ã 次ã«ãããã°ã©ã ã®ãããã¬ãã«ïŒ main
ïŒã§ã tokio::run
ïŒãŸãã¯åæ§ã®ãã®ïŒã䜿çšããŠããã°ã©ã ãçæããŸãã
main
ã§ã®ãã®åäžã®tokio::run
åŒã³åºããé€ããŠãéåžžã¯æåã§Future
ã®ã§ã¯ãªããããããäœæããã ãã§ãã ãããŠãã³ã³ããžã·ã§ã³ã¯ãã¹ããŒã³/ãšã©ãŒåŠç/ãã£ã³ã»ã«ãªã©ãèªç¶ã«åŠçããŸãã æ£ããã
ç§ãäœããæ確ã«ããããšæããŸãã ç§ã次ã®ãããªããšãèšããšãïŒ
ããããå®éã«ã¯ããã»ã©æãŸãããã®ã§ã¯ãªãããšãå€æããŸããã
ç§ã¯ç§ãã¡ã®èšèª/ãã©ãããã©ãŒã ã§ç©äºã«ã€ããŠéåžžã«å ·äœçã«è©±ããŠããã CïŒ/ãNet / CoreFxãªã©ã«æå³ã®ãã決å®ã«ã€ããŠã®ã¿æŽå¯ãäžããããšãã§ããŸããç¶æ³ãç°ãªããæé©åãã察象ãšåãã¹ãã¢ãããŒãã®çš®é¡ãå®å šã«ç°ãªãå ŽåããããŸããå¥ã®æ¹åã
åæã®ãšã©ãŒãžã®æ¬²æ±ã¯ç解ã§ããŸãããç§ã¯æ··ä¹±ããŠããŸããã©ã®ãããªç¶æ³ã§ããæªæ¥ãçã¿åºãããšã«åãæããããšãã§ããªããªããã®ã§ããããã
ãã€ã:)
RoslynïŒCïŒ/ VBã³ã³ãã€ã©/ IDEã³ãŒãããŒã¹ïŒèªäœãã©ã®ããã«èšè¿°ãããŠããããèããŠã¿ãŠãã ããã ããã¯éåžžã«éåæã§ã€ã³ã¿ã©ã¯ãã£ãã§ãã ã€ãŸãããã®äž»ãªäœ¿çšäŸã¯ãã¢ã¯ã»ã¹ããå€ãã®ã¯ã©ã€ã¢ã³ããšå ±æããŠäœ¿çšããããšã§ãã æãç°¡åãªãµãŒãã¹ã¯ãè±å¯ãªæ©èœãä»ããŠãŠãŒã¶ãŒãšããåãããã®ãäžè¬çã§ãããã®å€ãã¯ããŠãŒã¶ãŒãä»»æã®æ°ã®ã¢ã¯ã·ã§ã³ãå®è¡ãããããåœåã¯éèŠã ãšèããŠããäœæ¥ãè¡ãå¿ èŠããªããªã£ããšå€æããŸãã ããšãã°ããŠãŒã¶ãŒãå ¥åããŠãããšãã«ã倧éã®ã¿ã¹ã¯ã®æ§æãšæäœãè¡ã£ãŠããŸãããæ°ããªç§åŸã«å¥ã®ã€ãã³ããçºçãããããããããå®è¡ããããšããã§ããªããšå€æããå¯èœæ§ããããŸãã
ããšãã°ããŠãŒã¶ãŒãå ¥åããŠãããšãã«ã倧éã®ã¿ã¹ã¯ã®æ§æãšæäœãè¡ã£ãŠããŸãããæ°ããªç§åŸã«å¥ã®ã€ãã³ããçºçãããããããããå®è¡ããããšããã§ããªããšå€æããå¯èœæ§ããããŸãã
ã§ããããã¯ãã£ã³ã»ã«ã ãã§åŠçãããŠããã®ã§ã¯ãªãã§ããïŒ
ãããŠãã³ã³ããžã·ã§ã³ã¯ãã¹ããŒã³/ãšã©ãŒåŠç/ãã£ã³ã»ã«ãªã©ãèªç¶ã«åŠçããŸãã æ£ããã
ç©äºãè¡šçŸããããã®2ã€ã®éåžžã«ç°ãªãã¢ãã«ãããããã«æããŸãã ããã¯åé¡ãããŸãã:)ç§ã®èª¬æã¯ãç§ãã¡ãéžæããã¢ãã«ã®ã³ã³ããã¹ãã§è¡ãããããšãæå³ããŠããŸãã éžæããŠããã¢ãã«ã«ã¯æå³ããªãå ŽåããããŸãã
ç©äºãè¡šçŸããããã®2ã€ã®éåžžã«ç°ãªãã¢ãã«ãããããã«æããŸãã ããã¯åé¡ãããŸãã:)ç§ã®èª¬æã¯ãç§ãã¡ãéžæããã¢ãã«ã®ã³ã³ããã¹ãã§è¡ãããããšãæå³ããŠããŸãã éžæããŠããã¢ãã«ã«ã¯æå³ããªãå ŽåããããŸãã
絶察ã«ãç§ã¯ããªãã®èŠç¹ãç解ããããšããŠããã ãã§ãªããç§ãã¡ã®èŠç¹ã説æããŠããŸãã 説æã«æéãå²ããŠããã ãããããšãããããŸãã
ã§ããããã¯ãã£ã³ã»ã«ã ãã§åŠçãããŠããã®ã§ã¯ãªãã§ããïŒ
ãã£ã³ã»ã«ã¯ãéåæãšçŽäº€ããæŠå¿µã§ãïŒç§ãã¡ã«ãšã£ãŠïŒã ãããã¯äžè¬çã«äžç·ã«äœ¿çšãããŸãã ããããã©ã¡ããããäžæ¹ãå¿ èŠãšããŸããã
å®å šã«ãã£ã³ã»ã«ããã«ã·ã¹ãã ã䜿çšããããšãã§ããŸãããäœæããã¿ã¹ã¯ããåŸ æ©ãããã³ãŒãã®å®è¡ã«åãæããããšãã§ããªãå ŽåããããŸãã ã€ãŸããè«ççãªçç±ã§ãã³ãŒãã¯ããtããåŸ ã€å¿ èŠã¯ãããŸãããäœãä»ã®ããšãããã ãã§ãããšè¡šç€ºãããå ŽåããããŸãã ïŒç§ãã¡ã®äžçã§ã¯ïŒã¿ã¹ã¯ã«ã€ããŠã¯ããã®ã¿ã¹ã¯ãåŸ ãããããšãæåŸ ãããã¹ãã§ãããšæ瀺ããããå¿ èŠãšããããããã®ã¯äœããããŸããã ãã®ãããªã·ã¹ãã ã§ã¯ãç§ã¯æ©æã®æ€èšŒãåŸãããšæããŸãã
泚ïŒããã¯ã€ãã¬ãŒã¿ã®åé¡ã«äŒŒãŠããŸãã 誰ãã«é»è©±ããŠãåŸã§ã³ãŒãã§äœ¿çšããäºå®ã®çµæãååŸããããšãã§ããŸãã ãã ããããŸããŸãªçç±ã«ãããå®éã«çµæã䜿çšããå¿ èŠããªããªãå ŽåããããŸãã ç§ã®å人çãªæã¿ã¯ãããšãæè¡çã«æ€èšŒçµæãååŸã§ãããããã°ã©ã ãæåããããšããŠããæ€èšŒçµæãæ©æã«ååŸããããšã§ãã
ã©ã¡ãã®æ¹åã«ãåççãªè°è«ããããšæããŸãã ããããç§ã®èãã§ã¯ãåæã¢ãããŒãã«ã¯çæãããé·æããããŸãã ãã¡ãããå®éã®implãã©ã®ããã«æ©èœããããã«ãã£ãŠåæã¢ãããŒããæåéãé©åããªãå Žåãããã¯ããªããäœãããå¿ èŠããããã«ã€ããŠã®è³ªåã«çããããã§ãïŒD
èšãæããã°ãç§ã¯ããªãã®ã¢ãããŒããããã§æªããšã¯æããªãã ãããŠããããRustã«é©ããŠãããšæããã®ã¢ãã«ã®åšãã«åŒ·åãªå©ç¹ãããå Žåã¯ãdefããããå®è¡ããŸã:)
å®å šã«ãã£ã³ã»ã«ããã«ã·ã¹ãã ã䜿çšããããšãã§ããŸãããäœæããã¿ã¹ã¯ããåŸ æ©ãããã³ãŒãã®å®è¡ã«åãæããããšãã§ããªãå ŽåããããŸãã ã€ãŸããè«ççãªçç±ã§ãã³ãŒãã¯ããtããåŸ ã€å¿ èŠã¯ãããŸãããäœãä»ã®ããšãããã ãã§ãããšè¡šç€ºãããå ŽåããããŸãã
å人çã«ã¯ãããã¯éåžžã®if/then/else
ããžãã¯ã§åŠçããã®ãæé©ã ãšæããŸãã
async fn foo() {
if some_condition {
await!(bar());
}
}
ããããããªããèšãããã«ãããã¯CïŒãšã¯éåžžã«ç°ãªãèŠç¹ã§ãã
å人çã«ã¯ãããã¯éåžžã®if / then / elseããžãã¯ã§åŠçããã®ãæé©ã ãšæããŸãã
ã¯ãã ã¿ã¹ã¯ãäœæãããã®ãšåãæç¹ã§æ¡ä»¶ã®ãã§ãã¯ãå®è¡ã§ããã°ãããã¯åé¡ãããŸããïŒãããŠãå€ãã®å Žåã¯ãã®ãããªãã®ã§ãïŒã ããããç§ãã¡ã®äžçã§ã¯ãç©äºããã®ããã«ããŸãã€ãªãã£ãŠãããšããããšã¯äžè¬çã«ã¯ãããŸããã çµå±ã®ãšããããŠãŒã¶ãŒã«å¿ããŠïŒå¿ èŠãªãšãã«çµæãæºåã§ããããã«ïŒç±å¿ã«éåæäœæ¥ãå®è¡ãããã®ã§ãããåŸã§æ°ã«ããªããšå€æããå¯èœæ§ããããŸãã
ç§ãã¡ã®ãã¡ã€ã³ã§ã¯ããåŸ æ©ãã¯ã人ããå€ãå¿ èŠãšãããæç¹ã§çºçããŸããããã¯ãå¥ã®æ±ºå®/ã³ã³ããŒãã³ããªã©ã§ãã ã䟡å€ã«åãçµã¿å§ããã¹ããããšãã決å®ããã
ããæå³ã§ããããã¯éåžžã«åãé¢ãããŠãããããã¯çŸåŸ³ãšèŠãªãããŠããŸãã ãããã¥ãŒãµãŒãšã³ã³ã·ã¥ãŒããŒã¯å®å šã«ç°ãªãããªã·ãŒãæã€ããšãã§ããŸããããã¿ã¹ã¯ãã®åªããæœè±¡åãéããŠå®è¡ãããŠããéåæäœæ¥ã«ã€ããŠå¹æçã«éä¿¡ã§ããŸãã
ãšã«ãããç§ã¯åæ/éåæã®æèŠããæ€éããŸãã æããã«ãããã§ã¯éåžžã«ç°ãªãã¢ãã«ã䜿çšãããŠããŸãã :)
åªå é äœã«é¢ããŠã¯ãCïŒãç©äºãã©ã®ããã«èãããã«ã€ããŠããã€ãã®æ å ±ãæäŸããŸããã ã圹ã«ç«ãŠã°å¹žãã§ãã ããã«è©³ããæ å ±ãå¿ èŠãªå Žåã¯ãç¥ãããã ããã
@CyrusNajmabadiã¯ããããªãã®æŽå¯ã¯éåžžã«åœ¹ã«ç«ã¡ãŸããã å人çã«ã¯ã await? foo
ãé²ãã¹ãéã§ããããšã«åæããŸãïŒãã ãããæ瀺çãªasync
ãã®ææ¡ãæ°ã«å
¥ã£ãŠããŸãïŒã
ãšããã§ãéåæ/åæäœæ¥ã®ã¢ããªã³ã°ã«é¢ãã.netã¢ãã«ã®ãã¹ãŠã®è€éããããã³ãã®ã·ã¹ãã ã®ãã¹ãŠã®é·æ/çæã«é¢ããæé«ã®å°é家ã®æèŠã®1ã€ãå¿ èŠãªå Žåã¯ã @ stephentoubã
ç§ã®èšæ¶ããããããã®åå²ã«ã€ããŠã®åæ§ã®èããåæã®.netã®ã¢ãããŒãã«åãå ¥ãããã圌ã¯è¡ãããæçµçãªæ±ºå®ãšããããã©ãã»ã©é©åã§ãã£ããã«ã€ããŠéåžžã«ãã話ãããšãã§ãããšæããŸãã
å°ãèŠæ
£ããªãããã«èŠããŠããç§ã¯ãŸã await? future
ã«è³æ祚ãæããŸãã ããããæ§æããããšã®æ¬åœã®æ¬ ç¹ã¯ãããŸããïŒ
ã³ãŒã«ãïŒFïŒïŒãšãããïŒCïŒãJSïŒã®éåæã®é·æãšçæã®å¥ã®åŸ¹åºçãªåæã¯æ¬¡ã®ãšããã§ãïŒ http ïŒ//tomasp.net/blog/async-csharp-differences.aspx
å°çšã®æ§æå€æŽãªãã§postfix await
ãè©Šãããšãã§ããpostfixãã¯ãã®æ°ããRFCããããŸãïŒ https ïŒ
await {}
ã¯ããã§ç§ã®ãæ°ã«å
¥ãã§ã unsafe {}
圷圿ãšãããããã«åªå
é äœã瀺ããŸãã
let value = await { future }?;
@seunlanlege
ã¯ããããã¯èšæ¶ã«æ®ãã®ã§ã人ã
ã¯ãã®ãããªã³ãŒããæžãããšãã§ãããšãã誀ã£ãä»®å®ãæã£ãŠããŸã
let value = await {
let val1 = future1;
future2(val1)
}
ãããã圌ãã¯ã§ããŸããã
@Pzixel
ç§ãããªããæ£ããç解ããŠãããªããããªãã¯äººã
ãå
ç©ãawait {}
ãããã¯å
ã§æé»ã®ãã¡ã«åŸ
ã£ãŠãããšæ³å®ããã ãããšä»®å®ããŠããŸããïŒ ç§ã¯ããã«åæããŸããã await {}
ã¯ããããã¯ãè©äŸ¡ããåŒã§ã®ã¿åŸ
æ©ããŸãã
let value = await {
let future = create_future();
future
};
ãããŠããã¯èœèãããã¿ãŒã³ã§ãªããã°ãªããŸãã
ç°¡ç¥å
let value = await { create_future() };
ããªãã¯ãè€æ°ã®è¡šçŸããæšå¥šãããã¹ãã§ã¯ãªãããšããã¹ããŒãã¡ã³ããææ¡ããŸãã äœããããããšæããŸãããïŒ
await
ããã¿ãŒã³ã«ããã®ã¯å¥œãŸããã§ããïŒ ref
ãªã©ã¯å¥ãšããŠïŒïŒ
äœãã®ãããªãã®ïŒ
let await n = bar();
ç§ã¯ãããåŒã³åºãããšã奜ãasync
ãããããã¿ãŒã³ãawait
ç§ã¯ãããã¿ãŒã³æ§æäœãã®å€ãã®å©ç¹ã衚瀺ãããŸããããã ãã¿ãŒã³æ§æã¯ãéåžžã察å¿ããåŒã«é¢ããŠäºéã«æ©èœããŸãã
https://doc.rust-lang.org/nightly/std/task/index.htmlã®çŸåšã®ããŒãžã«ãããšãã¿ã¹ã¯modã¯libcoreããã®åãšã¯ã¹ããŒããšliballocã®åãšã¯ã¹ããŒãã®äž¡æ¹ã§æ§æãããŠãããããçµæã¯å°ã...æé©ã§ã¯ãããŸããã ãããå®å®ããåã«ããããäœããã®åœ¢ã§å¯ŸåŠãããããšãé¡ã£ãŠããŸãã
ã³ãŒããèŠãŠã¿ãŸããã ãããŠãç§ã¯ããã€ãã®ææ¡ããããŸãïŒ
UnsafePoll
ãã¬ã€ããšPoll
åæåã®ååã¯éåžžã«äŒŒãŠããŸãããé¢é£æ§ã¯ãããŸããã ç§ã¯ååãå€æŽããããšããå§ãUnsafePoll
ã«ãäŸãã°UnsafeTask
ãtask.rs
ãŸãšããããŠãããããããã²ãŒããé£ãããªã£ãŠããŸãã ããäžåºŠåå²ããããšããå§ãããŸããTaskObj#from_poll_task()
ååãå€ãã£ãŠããŸãã 代ããã«new()
ãšããååãä»ããããšããå§ãããŸãTaskObj#poll_task
ã¯poll()
å¯èœæ§ããããŸãã ãã£ãŒã«ãpoll
åŒã³åºãããå¯èœæ§poll_fn
ããããã¯é¢æ°ãã€ã³ã¿ã ããšã瀺åããŠããŸãWaker
ã¯ã TaskObj
ãšåãæŠç¥ã䜿çšããŠãvtableãã¹ã¿ãã¯ã«çœ®ãããšãã§ããå ŽåããããŸãã ãã ã®ã¢ã€ãã¢ã§ããããããå¿
èŠãã©ããã¯ããããŸããã éæ¥åç
§ãå°ãå°ãªãã®ã§ããã£ãšéããªããŸããïŒdyn
ã¯ããŒã¿çã§å®å®ããŠããŸãã ã³ãŒãã¯ããããé©çšãããå Žæã§dyn
䜿çšããå¿
èŠããããŸãç§ããã®ãããªãã®ã®PRãæäŸããããšãã§ããŸãã @cramertj @aturon詳现ã«ã€ããŠã¯ãDiscordçµç±ã§
ãã¹ãŠã®Future
ã¡ãœããawait()
ãè¿œå ããã®ã¯ã©ãã§ããïŒ
/// just like and_then method
let x = f.and_then(....);
let x = f.await();
await f? => f()?.await()
await? f => f().await()?
/// with chain invoke.
let x = first().await().second().await()?.third().await()?
let x = first().await()?.second().await()?.third().await()?
let x = first()?.await()?.second().await()?.third().await()?
@zengsaiåé¡ã¯ã await
ãéåžžã®æ¹æ³ã®ããã«æ©èœããªãããšã§ãã å®éã async
ãããã¯/é¢æ°ã«ãªãå Žåã await
ã¡ãœãããäœãããããèæ
®ããŠãã ããã ã¡ãœããã¯ã©ã®ã³ã³ããã¹ãã§å®è¡ããããããããªããããã³ã³ãã€ã«ãšã©ãŒãåŒãèµ·ããããšã¯ãããŸããã
@xfixããã¯äžè¬çã«ã¯åœãŠã¯ãŸããŸããã ã³ã³ãã€ã©ãŒã¯å¿ èŠãªããšãäœã§ãå®è¡ã§ãããã®å Žåã¯ç¹å¥ã«ã¡ãœããåŒã³åºããåŠçã§ããŸãã ã¡ãœããã¹ã¿ã€ã«ã®åŒã³åºãã¯èšå®ã®åé¡ã解決ããŸãããäºæããªããã®ã§ããïŒawaitã¯ä»ã®èšèªã§ã¯ãã®ããã«æ©èœããŸããïŒãã³ã³ãã€ã©ãŒã®éãããã¯ã«ãªãå¯èœæ§ããããŸãã
@elszbenã³ã³ãã€ã©ãããããããšãäœã§ãããšã¯ãã³ã³ãã€ã©ã¯ãããŸããã
future.await()
ã¯éåžžã®é¢æ°åŒã³åºãã®ããã«èãããŸãããããã§ã¯ãããŸããã ãã®ããã«ãããå Žåã¯ãäžèšã®ã©ããã§ææ¡ãããfuture.await!()
æ§æã§åãã»ãã³ãã£ã¯ã¹ãå¯èœã«ãªãããããã§äœãå¥åŠãªããšãèµ·ãã£ãŠããããšãããã¯ãã§æ確ã«ããŒã¯ãããŸãã
ç·šéïŒæçš¿ãåé€ãããŸãã
ãã®æçš¿ãå ç©RFCã«ç§»åããŸããã ãªã³ã¯
async fn
ãš#[must_use]
éã®çžäºäœçšãèŠã人ã¯ããŸããïŒ
async fn
å ŽåããããçŽæ¥åŒã³åºããšã³ãŒãã¯å®è¡ãããã Future
ãè¿ãããŸãã ãã¹ãŠã®async fn
ã¯ãå€åŽãã®impl Future
ã¿ã€ãã«åºæã®#[must_use]
ãæã£ãŠããã¯ããªã®ã§ã Future
äœããããªããã°ããããåŒã³åºãããšã¯ã§ããŸããã
ãã®äžã #[must_use]
ãèªåã§async fn
ã¢ã¿ãããããšããããå
éšé¢æ°ã®æ»ãå€ã«é©çšãããããã«èŠããŸãã ãããã£ãŠã #[must_use] async fn foo() -> T { ... }
ãšæžããšãawaitã®çµæã䜿ã£ãŠäœããããªããã°await!(foo())
ãæžãããšã¯ã§ããŸããã
誰ããéåæfnãšïŒ[must_use]ã®éã®çžäºäœçšãèŠãããšããããŸããïŒ
ãã®ãã£ã¹ã«ãã·ã§ã³ã«é¢å¿ã®ããä»ã®äººã«ã€ããŠã¯ã httpsïŒ//github.com/rust-lang/rust/issues/51560ãåç §ããŠ
éåæé¢æ°ãã©ã®ããã«å®è£ ããããèããŠãããšããããããã®é¢æ°ã¯ååž°ãçžäºååž°ããµããŒãããŠããªãããšã«æ°ã¥ããŸããã
awaitæ§æã«ã€ããŠã¯ãå人çã«ã¯ä¿®æ£åŸã®ãã¯ãã«åãã£ãŠããŸããæé»ã®awaitã¢ãããŒãã¯ãªãããã§ãŒã³ãç°¡åã§ãã¡ãœããåŒã³åºãã®ããã«äœ¿çšããããšãã§ããŸãã
@ warlord500ããªãã¯ãäžèšã®äœçŸäžãã®éçºè
ã®çµéšå
šäœãå®å
šã«ç¡èŠããŠããŸãã await
ããã§ãŒã³ããããªãã
@Pzixelã¯ãç§ãã¹ã¬ããã欲ãããã®ãèªãã§ããªããš
äžéšã®å¯çš¿è
ã¯é£éãèš±å¯ããããªããããããªãããšãç¥ã£ãŠããŸãããç§ãã¡ã®äœäººãã¯
ããããéçºè
ã ç§ãç¡èŠããŠãããšããèããã©ãã§åŸãã®ãããããŸãã
éçºè
ã®æèŠãç§ã®ã³ã¡ã³ãã¯ãã³ãã¥ããã£ã®ã¡ã³ããŒã®æèŠãšãã®æèŠãä¿æããçç±ãæå®ããããšã ãã§ããã
ç·šéïŒããªããæèŠã®éããæã£ââãŠãããªããå
±æããŠãã ããïŒ ãªãããªããèšãã®ãèå³ããããŸã
æ§æã®ãããªã¡ãœãããä»ããŠé£éåŸ
æ©ãèš±å¯ããã¹ãã§ã¯ãããŸãããïŒ
@ warlord500ã¯ãMSããŒã ãæ°åã®é¡§å®¢ãšæ°çŸäžã®éçºè ã®éã§ãã®çµéšãå ±æããããã§ãã ç§ã¯æ¯æ¥éåæ/åŸ æ©ã³ãŒããæžããŠããã®ã§ããããèªåã§ç¥ã£ãŠããŸããããªãã¯ããããé£éãããããªãã®ã§ãã å¿ èŠã«å¿ããŠãæ£ç¢ºãªèŠç©ããã以äžã«ç€ºããŸãã
'await'ã§åªå é äœãããèããå¿ èŠãªãã©ãŒã ãèšå®ããåã«å€ãã®ãã©ãŒã ãè©ŠããŸããã ç§ãã¡ãèŠã€ããäžå¿çãªããšã®1ã€ã¯ããã®æ©èœã䜿çšããããšæã£ãŠããç§ãã¡ãšé¡§å®¢ïŒå éšããã³å€éšïŒã«ãšã£ãŠãéåæåŒã³åºããè¶ ããŠäœããããã§ãŒã³ãããããšæãããšã¯ãã£ãã«ãããŸããã§ããã èšãæããã°ã人ã ã¯ãåŸ ã€ããããããè¡šçŸã®æãéèŠãªéšåã§ããããããã£ãŠããããããã«è¿ã¥ããããšã«åŒ·ãåŒãå¯ããããŠããããã«èŠããŸããã 泚ïŒãå®å šãªåŒããšã¯ãåŒã¹ããŒãã¡ã³ãã®äžéšã«ããåŒãæäžäœã®å²ãåœãŠã®å³åŽã«ããåŒããŸãã¯ãåŒæ°ããšããŠäœãã«æž¡ãåŒãªã©ãæå³ããŸãã
exprå ã§ãawaitãããç¶è¡ãããããšããåŸåã¯ãŸãã§ããã
(await expr).M()
ãããªãã®ãæã ç®ã«ããŸããããããã¯await expr.M()
å®è¡ããŠãã人ã®æ°ãããäžè¬çã§ã¯ãªããæãŸãããªãããã§ãã
ç§ã¯ä»ããªãæ··ä¹±ããŠããŸããç§ãããªããæ£ããç解ããŠãããªããç§ãã¡ã¯ãµããŒãããã¹ãã§ã¯ãããŸãã
äžè¬çã«äœ¿çšãããŠããªãã®ã§ãä¿®æ£åŸã®ç°¡åãªãã§ãŒã³ã¹ã¿ã€ã«ãåŸ
ã¡ãŸããïŒ åŸ
æ©ã¯è¡šçŸã®æãéèŠãªéšåã§ãããšã¿ãªãããŸãã
ãã®å Žåãç§ã¯ããªããæ£ããç解ããŠããããšã確èªããããã ãã«æšæž¬ããŸãã
ç§ãééã£ãŠããå Žåã¯ãç§ãä¿®æ£ããããšãèºèºããªãã§ãã ããã
ãŸããèŠç©ãããå
¥æããå Žæãžã®ãªã³ã¯ãæçš¿ããŠãã ããã
ããããšãããããŸãã
äžèšã®2ã€ã®ç¹ã«å¯Ÿããç§ã®åè«ã¯ãããªããäœããäžè¬çã«äœ¿çšããªããšããçç±ã ãã§ããããããã³ãŒããããã¯ãªãŒã³ã«ããå Žåã«ããããµããŒãããããšãæ害ã§ãããšã¯éããªãã
å°æ¥çæãããåŒã
æãéèŠãªéšåã§ããããããäžã«é
眮ãããå Žåã§ããéåžžã®ãã¯ãã¹ã¿ã€ã«ã«å ããŠåŸçœ®ãã¯ãã¹ã¿ã€ã«ãèš±å¯ããã°ããããè¡ãããšãã§ããŸãã
ãŸããèŠç©ãããå ¥æããå Žæãžã®ãªã³ã¯ãæçš¿ããŠãã ããã
ããããšãããããŸãã
ããã...ããããããªãã¯ã¹ã¬ããå šäœãèªãã ãšèšããŸãã...ð
ããããç§ã¯ãããå ±æããããšã«åé¡ã¯ãããŸããïŒ https ïŒ//github.com/rust-lang/rust/issues/50547#issuecomment-388939886ã Cyrusã®ãã¹ãŠã®æçš¿ãèªãããšããå§ãããŸããããã¯ãCïŒ/ãNetãšã³ã·ã¹ãã å šäœã®å®éã®çµéšã§ãããRustã§åå©çšã§ãã貎éãªçµéšã§ãã
åŒã®æãéèŠãªéšåãåŸ ã€ããšããããŸã
åŒçšã¯æããã«å察ãèšã£ãŠããŸãðãããŠããªããç¥ã£ãŠãããç§ã¯æ¯æ¥åãããã«éåæ/åŸ æ©ãæžããŠããŸãã
async / awaitã®çµéšã¯ãããŸããïŒ ããã§ã¯å ±æããŠããããŸããïŒ
ãããŒãç§ã¯ãããéãããšã¯ä¿¡ããããªãã ããããªã³ã¯ããããã«ããªãã®äžæ¥ã®æéãå²ããŠããã ãããããšãããããŸãã
ç§ã¯çµéšããªãã®ã§ã壮倧ãªèšç»ã§ã¯ç§ã®æèŠã¯ããã»ã©éèŠã§ã¯ãªããšæããŸã
@Pzixel async
/ await
ã䜿çšããŠãããªããä»ã®äººã®çµéšã«é¢ããæ
å ±ãå
±æããŠããã ãããããšãããããŸãããä»ã®è²¢ç®è
ã«æ¬æãè¡šããŠãã ããã èªåã®æè¡çãªãã€ã³ããèãããã«ãä»ã®äººã®çµéšã¬ãã«ãæ¹å€ããå¿
èŠã¯ãããŸããã
ã¢ãã¬ãŒã¿ãŒæ³šïŒ @Pzixelã³ãã¥ããã£ã¡ã³ããŒãžã®å人çãªæ»æã¯èš±å¯ãããŠããŸããã ç§ã¯ããªãã®ã³ã¡ã³ããããããç·šéããŸããã åã³ãããããŸããã ã¢ãã¬ãŒãããªã·ãŒã«ã€ããŠè³ªåãããå Žåã¯ã rust-mods @ rust-lang.orgãŸã§ãã©ããŒã¢ããããŠãã ãã
@crabtwç§ã¯èª°ãæ¹å€ããŸããã§ããã ãäžäŸ¿ããããããŠç³ãèš³ããããŸããã
ç§ã¯ã人ããåŸ ã£ãŠããããé£éãããã®ã«å®éã«å¿ èŠãããã®ãââããããšãä»æ¥ã®æ©èœã®åœŒã®å€æ¿ã§ããã®ããç解ããããšãã«ãçµéšã«ã€ããŠäžåºŠå°ããŸããã ç§ã¯æš©åšã«èšŽããããããŸããã§ãããããã¯ãèªåã§è©ŠããŠããã®çå®ãèªåã§ç解ããå¿ èŠãããããšèšããæçšãªæ å ±ã®éãŸãã«ãããŸããã ããã§ã¯äžå¿«ãªããšã¯äœããããŸããã
ã³ãã¥ããã£ã¡ã³ããŒãžã®å人çãªæ»æã¯èš±å¯ãããŠããŸããã ç§ã¯ããªãã®ã³ã¡ã³ããããããç·šéããŸããã
å人çãªæ»æã¯ãããŸããã ç§ãèŠãããšãã§ããããã«ãããªãã¯å察祚ã«ã€ããŠã®ç§ã®åç §ãã³ã¡ã³ãã¢ãŠãããŸããã ãŸããããã¯ç§ã®ãã¹ãã®å察祚ã®ç§ã®ãªã¢ã¯ã¿ãŒã§ãããç¹å¥ãªããšã¯äœããããŸããã§ããã åé€ãããã®ã§ããã®åç §ãåé€ããããšãåççã§ãïŒãã以äžã®èªè ã«ãšã£ãŠã¯æ··ä¹±ãæãå¯èœæ§ããããŸãïŒãåé€ããŠããã ãããããšãããããŸãã
åç §ããŠããã ãããããšãããããŸãã ç§ãèšã£ãŠããããšããçŠé³ããšã¯èŠãªããªãã§ãã ããïŒïŒRustãšCïŒã¯ç°ãªãèšèªã§ãããã³ãã¥ããã£ããã©ãã€ã ãã€ãã£ãªã ãç°ãªããŸãã ããªãã¯defãããªãã®èšèªã®ããã«æè¯ã®éžæãããã¹ãã§ãã ç§ã®èšèãã圹ã«ç«ãŠã°å¹žãã§ãã ããããåžžã«ããŸããŸãªæ¹æ³ã§ç©äºãè¡ãããšãã§ããŸãã
ç§ã®æã¿ã¯ãããªããRustã«ãšã£ãŠçŽ æŽãããäœããæãã€ãããšã§ãã ãã®åŸãæã
ã¯ããªããäœããããèŠãããšãã§ãããšåªé
ã«CïŒã®ããã«ãããæ¡çšã¹ããŒã«:)
ç§ã®ç¥ãéãããªã³ã¯ãããåŒæ°ã¯ãäž»ã®åªå
é äœã«ã€ããŠèªã£await
ãç¹ã«ãããã¯ããŒã¹ã«çã«ããªã£ãŠãããšäž»åŒµããŠããawait x.y()
ã®ããã«await (x.y())
ã§ã¯ãªã(await x).y()
ã¯ããŠãŒã¶ãŒãåè
ã®è§£éãããé »ç¹ã«æãã§æåŸ
ããããã§ãïŒãŸããééã¯ãã®è§£éã瀺åããŠããŸãïŒã ãããŠãç§ã¯åæããåŸåããããŸããã await!(x.y())
ãããªæ§æããããŸãããåãé€ãããšã芳å¯ããŸãã
ãã ãããããx.y().await!().z()
ãããªé£éã®äŸ¡å€ã«é¢ããç¹å®ã®çãã瀺åããŠãããšã¯æããŸããã
åŒçšãããã³ã¡ã³ãã¯ãRustã«å€§ããªéãããããããéšåçã«èå³æ·±ããã®ã§ããããã¯ãæçµçãªawaitæ§æã®ç解ãé
ããã倧ããªèŠå ã®1ã€ã§ããCïŒã«ã¯?
æŒç®åããªããããã³ãŒãããããŸããã (await expr)?
ãšæžãå¿
èŠããããŸãã 圌ãã¯(await expr).M()
ãæ¬åœã«çãããšèª¬æããŠãããããã¯Rustã§ãåœãŠã¯ãŸããšæãåŸåããããŸãããç§ã®èŠ³ç¹ãããããšãããã«å¯Ÿããå¯äžã®äŸå€ã¯?
ã§ãããããã¯éåžžã«äžè¬çã§ããå€ãã®å
ç©ãçµæã«è©äŸ¡ãããããã§ãïŒããšãã°ãçŸåšååšãããã¹ãŠã®å
ç©ãè©äŸ¡ãããŸãïŒã
@withoutboatsã¯ããããã§ãã ãã®éšåãããäžåºŠåŒçšããããšæããŸãã
ç§ã®èŠ³ç¹ãããããšãããã«å¯Ÿããå¯äžã®äŸå€ã¯ïŒ
äŸå€ãããªãå Žåã¯ã (await foo)?
ã·ã§ãŒãã«ãããšããŠawait? foo
ãäœæããäž¡æ¹ã®é·æã掻çšããã®ã劥åœãšæãããŸãã
ä»ã®ãšãããå°ãªããšããã®ææ¡æ§æawait!()
ã®æ確ãªäœ¿çšã§ããããã«ãªããŸã?
ã await
ã®åºæ¬æ§æãå€æŽããå Žåã¯ã await
ãš?
ã®çµã¿åããã®æ§æãçããªãããšããããŸãã ïŒãããŠãæã
ã¯ãããå€æŽãããã®ã«å¿ããŠãæã
ã¯ãã¹ãŠã®åé¡ãæã£ãŠããªãå¯èœæ§ããããŸããïŒ
@joshtriplettãããã®äœåãªäžæ¬åŒ§ã¯ãããŸãããåãé€ããŸãããå®éã«ã¯éåžžã«éããã®ã§ãã ããšãã°ãçŸåšã®ãããžã§ã¯ãå šäœãæ€çŽ¢ããŸãã
Matching lines: 139 Matching files: 10 Total files searched: 77
ç§ã¯2743slocã§139ãåŸ
ã£ãŠããŸãã 倧ããããšã§ã¯ãªããããããŸãããããã¬ãŒã¹ã¬ã¹ã®ä»£æ¿åãããã¯ãªãŒã³ã§åªãããã®ãšããŠæ€èšããå¿
èŠããããšæããŸãã ãšã¯ããã ?
ãå¯äžã®äŸå€ã§ãããããäžãã£ããªãã§await foo
ãç°¡åã«äœ¿çšã§ãããã®ç¹æ®ãªã±ãŒã¹ã®ããã ãã«ç¹å¥ãªæ§æãå°å
¥ã§ããŸãã ããã¯å€§ããããšã§ã¯ãããŸããããLISPãããžã§ã¯ãã®ããã«ããã€ãã®äžæ¬åŒ§ãç¯çŽããããšãã§ããŸãã
éåæé¢æ°ã眲åã«å€éšæ»ãåã¢ãããŒãã䜿çšããå¿ èŠããããšæãçç±ã«ã€ããŠã®ããã°æçš¿ãäœæããŸããã èªæžã楜ããïŒ
ç§ã¯ãã¹ãŠã®è°è«ã«åŸããªãã£ãã®ã§ãç§ããããéãããªãã°ãããããã§ã«è°è«ãããŠããã§ãããå Žæãç§ã«ææããŠãã ããã
å
éšãªã¿ãŒã³ã¿ã€ãã®ã¢ãããŒãã«é¢ããè¿œå ã®æžå¿µäºé
ã¯æ¬¡ã®ãšããã§ãã Stream
ã®æ§æã¯ãæå®ããããšã©ã®ããã«ãªããŸããïŒ async fn foo() -> impl Stream<Item = T>
ã¯èŠæ ããããã async fn foo() -> impl Future<Output = T>
ãšäžèŽãããšæããŸãããå
éšãªã¿ãŒã³ã¿ã€ãã®ã¢ãããŒãã§ã¯æ©èœããŸããã ãããŠã async_stream
ããŒã¯ãŒããå°å
¥ããããšã¯æããªãã
@Ekleog Streamã¯ãå¥ã®ããŒã¯ãŒãã䜿çšããå¿
èŠããããŸãã impl Trait
ã¯éã«æ©èœããããã async
䜿çšããããšã¯ã§ããŸããã ç¹å®ã®ç¹æ§ã確å®ã«å®è£
ãããããã«ããããšããã§ããŸããããç¹æ§èªäœã¯ãåºç€ãšãªãå
·è±¡åã«ãã§ã«å®è£
ãããŠããå¿
èŠããããŸãã
ãã ãããã€ãéåæãžã§ãã¬ãŒã¿ãŒé¢æ°ãè¿œå ãããå Žåã¯ãå€éšæ»ãåã®ã¢ãããŒãã圹ç«ã¡ãŸãã
async_gen fn foo() -> impl AsyncGenerator<Yield = i32, Return = ()> { yield 1; ... }
Stream
ã¯ã Return = ()
ã䜿çšããŠãã¹ãŠã®éåæãžã§ãã¬ãŒã¿ãŒã«å®è£
ã§ããŸãã ããã«ããããããå¯èœã«ãªããŸãã
async_gen fn foo() -> impl Stream<Item = i32> { yield 1; ... }
泚ïŒãžã§ãã¬ãŒã¿ãŒã¯ãã§ã«å€éã«äœ¿çšãããŠããŸããããã®æ§æã¯äœ¿çšãããŠããŸããã ãŸããå
ç©0.3ã®Stream
ãšã¯ç°ãªããçŸåšã¯ãã³çãã«å¯Ÿå¿ããŠããŸããã
ç·šéïŒãã®ã³ãŒãã¯ä»¥åã¯Generator
ã Stream
ãšGenerator
éããèŠéããŸããã ã¹ããªãŒã ã¯éåæã§ãã ããã¯ãå€ãçæããå¿
èŠã¯ãªããããããªãããçæããå¿
èŠããªãããšãæå³ããŸãã Poll::Ready
ãŸãã¯Poll::Pending
ããããã§å¿çã§ããŸãã äžæ¹ã Generator
ã¯ãåžžã«åæããŠè²æ©ãŸãã¯å®äºããå¿
èŠããããŸãã ãããåæ ããããã«ã AsyncGenerator
ã«å€æŽããŸããã
Edit2ïŒ @Ekleogãžã§ãã¬ãŒã¿ãŒã®çŸåšã®å®è£
ã§ã¯ãããŒã«ãŒã®ãªãæ§æã䜿çšããŠãããæ¬äœå
ã®yield
æ¢ãããšã§ããžã§ãã¬ãŒã¿ãŒã§ããå¿
èŠãããããšãæ€åºããŠããããã§ãã ããã¯ã async
ãåå©çš
å®éãç§ã¯async
ãåå©çšã§ãããšèããŠããŸãããããã¯ããã®RFCã«åŸã£ãŠã async
ãFuture
ã§ã®ã¿èš±å¯ããããããæ€åºã§ããããã§ãããªã¿ãŒã³ã¿ã€ãïŒ Future
ãŸãã¯Stream
ããããã§ããå¿
èŠããããŸãïŒã確èªããããšã«ããã Stream
ããŠããŸãã
ç§ãã¡ã¯åãã«ãããå Žåã®ã§ãç§ã¯ä»ããããåŒãäžããŠãçç±ã¯ã async
çæããããã®ããŒã¯ãŒããäž¡æ¹ãšãFuture
sããã³Stream
sãããã®åŸãç§ã¯å€åŽã®ãªã¿ãŒã³ãèããŸãã¿ã€ãã¢ãããŒãã¯æ瀺çã§ãããããã¯ããã«ã¯ãªãŒã³ã§ããã async fn foo() -> i32
ãi32
ã¹ããªãŒã ãçæããããšã誰ãæåŸ
ããªããšæããŸãïŒããã¯ãæ¬æã«å«ãŸããŠããå Žåã«å¯èœã§ãïŒ yield
ã§ãå
éšãªã¿ãŒã³ã¿ã€ãã®ã¢ãããŒããéžæãããŸããïŒã
ãžã§ãã¬ãŒã¿ãŒã®2çªç®ã®ããŒã¯ãŒãïŒäŸïŒ gen fn
ïŒãäœæããäž¡æ¹ãé©çšããã ãã§ã¹ããªãŒã ãäœæã§ããŸãïŒäŸïŒ async gen fn
ïŒã ã¢ãŠã¿ãŒãªã¿ãŒã³ã¿ã€ãã¯ãããã«å
¥ãå¿
èŠã¯ãŸã£ãããããŸããã
@rpjohnstå€éšãªã¿ãŒã³åã¢ãããŒãã«ããã2ã€ã®é¢é£ããåãç°¡åã«èšå®ã§ãããããç§ã¯ãããåãäžããŸããã
2ã€ã®é¢é£ããã¿ã€ããèšå®ããããããŸããã ã¹ããªãŒã ã¯ãŸã åäžã®ã¿ã€ãã§ããã impl Iterator<Item=impl Future>>
ãªã©ã§ã¯ãããŸããã
@rpjohnstç§ã¯ïŒéåæïŒãžã§ãã¬ãŒã¿ãŒã®é¢é£ããã¿ã€ãYield
ãšReturn
ãæå³ããŸãã
gen fn foo() -> impl Generator<Yield = i32, Return = ()> { ... }
ããã¯ç§ã®å ã®ã¹ã±ããã§ãããããžã§ãã¬ãŒã¿ãŒã«ã€ããŠè©±ãããšã¯ãå°ãªããšã远跡ã®åé¡ã«é¢ããŠã¯ãç§ãã¡ãããã¯ããã«é²ãã§ãããšæããŸãã
// generator
fn foo() -> T yields Y
// generator that implements Iterator
fn foo() yields Y
// async generator
async fn foo() -> T yields Y
// async generator that implements Stream
async fn foo() yields Y
ããäžè¬çã«ã¯ãRFCã§è¡ããã決å®ãåæ€èšããåã«ãå®è£ ã«ã€ããŠããå€ãã®çµéšãç©ãå¿ èŠããããšæããŸãã ãã§ã«è¡ã£ãã®ãšåãè°è«ãåã£ãŠããŸããåéã¿ä»ããå¿ èŠãã©ããã確èªããã«ã¯ãRFCã«ãã£ãŠææ¡ãããæ©èœã®çµéšãå¿ èŠã§ãã
ç§ã¯ããªãã«å®å šã«åæãããã®ã§ãããç§ãããªãã®ã³ã¡ã³ããæ£ããèªãã å Žåãéåæ/åŸ æ©æ§æã®å®å®åã¯ãéåæã¹ããªãŒã ã®é©åãªæ§æãšå®è£ ãåŸ ã¡ããããã®2ã€ã§çµéšãç©ãã®ã§ããããïŒ ïŒå®å®ãããšãå€éšãªã¿ãŒã³ã¿ã€ããšå éšãªã¿ãŒã³ã¿ã€ããåãæ¿ããããšãã§ããªãããïŒ
Rust 2018ã«ã¯éåæ/åŸ æ©ãæåŸ ãããŠããŠããããŸã§ã«éåæãžã§ãã¬ãŒã¿ãŒã®æºåãæŽãããšãæãã§ããªããšæããŸãããâŠïŒ
ïŒãŸããç§ã®ã³ã¡ã³ãã¯@MajorBreakfastã®ããã°æçš¿ãžã®è¿œå ã®è°è«ãšããŠã®ã¿æå³ãããŠããŸãããããã®ãããã¯ã«é¢ããè°è«ã¯å®å šã«æ¶å»ãããããã§ãâŠããã¯ç§ã®ç®çã§ã¯ãããŸããã§ãããè°è«ã¯åã³éäžããå¿ èŠããããšæããŸãããã®ããã°æçš¿ïŒïŒ
awaitããŒã¯ãŒãã®çããŠãŒã¹ã±ãŒã¹ã¯ããŸã ç§ãæ··ä¹±ãããŸãã ïŒç¹ã«Future vs Stream vs GeneratorïŒ
ãã¹ãŠã®ãŠãŒã¹ã±ãŒã¹ã§yieldããŒã¯ãŒãã§ååã§ã¯ãªãã§ããããã ã®ããã«
{ let a = yield future; println(a) } -> Future
ããã«ãããæ»ãã¿ã€ããæ瀺çã«ä¿ããããããããŒã¯ãŒããšã©ã€ãã©ãªãç·å¯ã«èåããããšãªãããã¹ãŠã®ãç¶ç¶ãããŒã¹ã®ã»ãã³ãã£ã¯ã¹ã«å¿ èŠãªããŒã¯ãŒãã¯1ã€ã ãã§ãã
ïŒç§ãã¡ã¯ç²åèšèªã§ãããè¡ããŸããïŒ
@aep await
ã¯ããžã§ãã¬ãŒã¿ãŒããæªæ¥ãçæããŸããã Future
ã®å®è¡ãäžæåæ¢ããåŒã³åºãå
ã«å¶åŸ¡ãæ»ããŸãã
@cramertjã¯ããŸãã«ãã®thoïŒyieldããŒã¯ãŒãã®åŸã«ââç¶ç¶ãå«ãfutureãè¿ãïŒãæ£ç¢ºã«å®è¡ã§ããå¯èœæ§ããããŸããããã¯ãã¯ããã«åºç¯ãªãŠãŒã¹ã±ãŒã¹ã§ãã
ããããç§ã¯ãã®è°è«ã®ããã«ããŒãã£ãŒã«å°ãé
ããŠãããšæããŸããïŒ :)
@aep await
åºæã®ããŒã¯ãŒãã®çç±ã¯ãå°æ¥ã®ãžã§ãã¬ãŒã¿ãŒåºæã®yield
ããŒã¯ãŒããšã®æ§æå¯èœæ§ã®ããã§ãã éåæãžã§ãã¬ãŒã¿ãŒããµããŒããããã®ã§ã2ã€ã®ç¬ç«ããç¶ç¶ãã¹ã³ãŒãããæå³ããŸãã
ãŸããRustå
ç©ã¯ãå°ãªããšãéšåçã«ã¡ã¢ãªç®¡çäžã®çç±ãããã³ãŒã«ããã¯ããŒã¹ã§ã¯ãªãããŒãªã³ã°ããŒã¹ã§ãããããç¶ç¶ãå«ãå
ç©ãè¿ãããšã¯ã§ããŸããã yield
ãåäžã®ãªããžã§ã¯ããžã®åç
§ãã¹ããŒãããããã poll
ãåäžã®ãªããžã§ã¯ããå€æŽããæ¹ãã¯ããã«ç°¡åã§ãã
async / awaitã¯ãèšèªèªäœãæ±æããããŒã¯ãŒãã®åå ã§ãã£ãŠã¯ãªããªããšæããŸãããªããªããasyncã¯èšèªã®å éšã§ã¯ãªããåãªãæ©èœã ããã§ãã
@sackeryããã¯èšèªã®å éšã®äžéšã§ãããçŽç²ã«ã©ã€ãã©ãªãšããŠå®è£ ããããšã¯ã§ããŸããã
ãããã£ãŠãnimãšåãããã«ãããŒã¯ãŒããšããŠäœæããŸããcïŒã®å Žåãšåãã§ãã
質åïŒå¯å€åç
§ã«ãã£ãŠå€ããã£ããã£ããasync
é移åã¯ããŒãžã£ã®ã·ã°ããã£ã¯ã©ãããã¹ãã§ããïŒ çŸåšã圌ãã¯å®å
šã«çŠæ¢ãããŠããŸãã ééã®åçšãå°æ¥ãæ»ã¬ãŸã§ç¶ãããšãå¯èœã«ããããçš®ã®GATã¢ãããŒããå¿
èŠãªããã§ããäŸïŒ
trait AsyncFnMut {
type Output<'a>: Future;
fn call(&'a mut self, args: ...) -> Self::Output<'a>;
}
@cramertjããã«ã¯ãã¯ããŒãžã£ã®ãã£ããã£ãããç°å¢ãžã®å¯å€åç §ãè¿ããšããäžè¬çãªåé¡ããããŸãã ããããããœãªã¥ãŒã·ã§ã³ãéåæfnã«é¢é£ä»ããå¿ èŠã¯ãããŸãããïŒ
@withoutboatsã®æš©å©ãããã¯ããããä»ã®å Žæãããasync
ç¶æ³ã§ã¯ããã«äžè¬çã«ãªãã§ãããã
fn async
代ããã«async fn
ã©ãã§ããïŒ
ç§ã®ããã«let mut
ããè¯ãmut let
ã
fn foo1() {
}
fn async foo2() {
}
pub fn foo3() {
}
pub fn async foo4() {
}
pub fn
ãæ€çŽ¢ããŠãããœãŒã¹ã³ãŒãå
ã®ãã¹ãŠã®ãããªãã¯é¢æ°ãèŠã€ããããšãã§ããŸããããããçŸåšã®æ§æã¯ããã§ã¯ãããŸããã
fn foo1() {
}
async fn foo2() {
}
pub fn foo3() {
}
pub async fn foo4() {
}
ãã®ææ¡ã¯ããã»ã©éèŠã§ã¯ãããŸãããããã¯å人çãªå¥œã¿ã®åé¡ã§ãã
ã ããç§ã¯ããªãæ¹å
šå¡ãžã®æèŠãå°éããŸã:)
ç§ã¯ãã¹ãŠã®ä¿®é£Ÿåãfnã®åã«è¡ãã¹ãã ãšä¿¡ããŠããŸãã ããã¯æããã§ããããããä»ã®èšèªã§ã©ã®ããã«è¡ããããã§ãã ããã¯åžžèã§ãã
@Pzixelã¢ã¯ã»ã¹ä¿®é£Ÿåã¯éèŠãªã®ã§ã fn
åã«é
眮ããå¿
èŠãããããšãç§ã¯ç¥ã£ãŠããŸãã
ãããã async
ã¯ããããããã§ã¯ãªããšæããŸãã
@xmetaç§ã¯ãããŸã§ãã®ã¢ã€ãã¢ãææ¡ãããã®ãèŠãããšããããŸããã äžè²«æ§ãfn
ããã«ã async
ã眮ããããšæããããããŸãããããã¹ãŠã®ãªãã·ã§ã³ãæ€èšããããšãéèŠã ãšæããŸãã æçš¿ããŠãããŠããããšãïŒ
// Status quo:
pub unsafe async fn foo() {} // #![feature(async_await, futures_api)]
pub const unsafe fn foo2() {} // #![feature(const_fn)]
@MajorBreakfastè¿ä¿¡ããããšãããããŸãããããªæãã§ããã
{ Public, Private } â Function â put `pub` in front of `fn`
{ Public, Private } â Struct â put `pub` in front of `struct`
{ Public, Private } â Trait â put `pub` in front of `trait`
{ Public, Private } â Enum â put `pub` in front of `enum`
Function â {Async, Sync} â put `async` in back of `fn`
Variable â {Mutable, Imutable} â put `mut` in back of `let`
@xmeta @MajorBreakfast
async fn
ã¯äžå¯åã§ãããéåæé¢æ°ãè¡šããŸãã
async fn
ã¯å
šäœã§ãã
pub fn
æ€çŽ¢ããŸããããã¯ããããªãã¯åææ©èœãæ€çŽ¢ããŠããããšãæå³ããŸãã
åæ§ã«ã pub async fn
æ€çŽ¢ããŸããã€ãŸãããããªãã¯éåæé¢æ°ãæ€çŽ¢ããŸãã
@ZhangHanDong
async fn
ã¯ãfutureãè¿ãéåžžã®é¢æ°ãå®çŸ©ããŸãã æªæ¥ãè¿ããã¹ãŠã®é¢æ°ã¯ãéåæããšèŠãªãããŸãã async fn
ã®é¢æ°ãã€ã³ã¿ãšãæªæ¥ãè¿ãä»ã®é¢æ°ã¯åãã§ã°ã ãããéã³å Žã®äŸã§ãã ãasyncfnããæ€çŽ¢ãããšãè¡šèšã䜿çšããé¢æ°ã®ã¿ãæ€çŽ¢ããããã¹ãŠã®éåæé¢æ°ãæ€çŽ¢ãããããã§ã¯ãããŸãããpub fn
ãæ€çŽ¢ããŠãã unsafe
ãŸãã¯const
é¢æ°ã¯èŠã€ãããŸããã° async fn
ã«ãã£ãŠè¿ãããå
·è±¡åã¯ããã¡ããå¿åã§ãã ã€ãŸããã©ã¡ããFuture
ãå®è£
ããåãè¿ããŸã
@xmetaã¯ã mut
ã¯ãletã®åŸã«ç§»åãããªãããšã«æ³šæããŠãã ãããã€ãŸãã mut
ã¯let
å€æŽããªãããšã«æ³šæããŠãã ããã let
ã¯ãã¿ãŒã³ãåããŸããã€ãŸã
let PATTERN = EXPRESSION;
mut
ã¯PATTERN
äžéšã§ããã let
èªäœã®äžéšã§ã¯ãããŸããã äŸãã°ïŒ
// one is mutable one is not
let (mut a, b) = (1, 2);
@steveklabnikããããŸããã éå±€æ§é ãšèªé ã®é¢ä¿ã瀺ãããã£ãã ãã§ãã ããããšã
async
ãããã¯å
ã®return
ãšbreak
ã®æãŸããåäœã«ã€ããŠã人ã
ã¯ã©ã®ããã«èããŠããŸããïŒ çŸåšã return
ã¯éåæãããã¯ããè¿ãããŸãreturn
ãèš±å¯ããå Žåããããå®éã«å¯èœãªå¯äžã®ãªãã·ã§ã³ã§ãã return
ãå®å
šã«çŠæ¢ãã 'label: async { .... break 'label x; }
ãããªãã®ã䜿çšããŠéåæãããã¯ããæ»ãããšãã§ããŸãã ããã¯ããããã¯è§£é€æ©èœïŒhttps://github.com/rust-lang/rust/issues/ïŒã«ããŒã¯ãŒãbreak
ãšreturn
ã©ã¡ãã䜿çšãããã«ã€ããŠã®äŒè©±ã«ãã€ãªãããŸãã 48594ïŒã
ç§ã¯return
ãèš±å¯ããããã®ãã®ã§ãã ãããçŠæ¢ããäž»ãªæžå¿µã¯ããããçŸåšã®é¢æ°ããã§ã¯ãªããéåæãããã¯ããæ»ããããæ··ä¹±ããå¯èœæ§ãããããšã§ãã ããããç§ã¯ãããæ··ä¹±ããããšã«ãªããšã¯æããŸããã ééreturn
ãã§ã«return
ãéåæãããã¯ã«ãé©çšãããããšãåŠã¶ã®ã¯IMOãç°¡åã§ããããããèš±å¯ããããšã¯IMOã«ãšã£ãŠéåžžã«äŸ¡å€ããããŸãã
@cramertj return
ã¯ãå
éšãããã¯ã§ã¯ãªããåžžã«å
å«é¢æ°ãçµäºããå¿
èŠããããŸãã ãããæ©èœããã®ã«æå³ããªãå Žåãããã¯æ©èœããªãããã«èãããŸããã return
ã¯ãŸã£ããæ©èœããªãã¯ãã§ãã
ããã«break
ã䜿çšããã®ã¯æ®å¿µãªããšã®ããã§ãããæ®å¿µãªããlabel-break-valueãããããšãèãããšãå°ãªããšããããšäžèŽããŠããŸãã
éåæã®ç§»åãšééã¯ãŸã èšç»ãããŠããŸããïŒ ä»¥äžã¯RFCããã®ãã®ã§ãïŒ
// closure which is evaluated immediately
async move {
// asynchronous portion of the function
}
ãããŠããã«ããŒãžãäžã«
async { /* body */ }
// is equivalent to
(async || { /* body */ })()
ããã«ããã return
ãã¯ããŒãžã£ãŒãšäžèŽããç°¡åã«ç解ããŠèª¬æã§ããããã«ãªããŸãã
ãã¬ãŒã¯ããŒãããã¯RFCã¯ãã©ãã«ä»ãã®å
éšã¯ããŒãžã£ãŒãããžã£ã³ãã§ããããã«ããããšãèšç»ããŠããŸããïŒ ããã§ãªãå ŽåïŒãããŠç§ã¯ããããããèš±å¯ããã¹ãã ãšã¯ç€ºåããŠããŸããïŒã returns
ã®äžè²«ããæ¯ãèããçŠæ¢ãããããããŸãbreak-to-blocksã®rfcãšççŸãã代æ¿æ段ã䜿çšããããšã¯éåžžã«æ®å¿µã§ãã
@memoryruins async || { ... return x; ... }
ã¯çµ¶å¯Ÿã«æ©èœããã¯ãã§ãã async
ãã¯ããŒãžã£ã§ã¯ãªããšããçç±ã ãã§ã async { ... return x; ... }
ã¯ãã¹ãã§ã¯ãªããšèšã£ãŠããŸãã return
ã¯ããå«ãŸããŠããé¢æ°ããæ»ãããšããéåžžã«å
·äœçãªæå³ããããŸãã ã¯ããŒãžã£ã¯æ©èœã§ãã éåæãããã¯ã¯ããã§ã¯ãããŸããã
@memoryruinsãããã¯äž¡æ¹ãšããã§ã«å®è£ ãããŠããŸãã
@joshtriplett
éåæãããã¯ã¯ããã§ã¯ãããŸããã
ããã¯ç§ã«ã¯çã«ããªã£ãŠããããã«ãç§ãããããšããç§ã¯ãŸã ããããå«ããããã¯ãšã¯å¥ã«å®çŸ©ãããå®è¡ã³ã³ããã¹ããšäœã ãšããæå³ã§ã®é¢æ°ãšããŠããããèãããšæããŸãreturn
å
éšã§async
ãããã¯ã ããã§ã®æ··ä¹±ã¯ã»ãšãã©æ§æçã«èŠããŸãããããã¯ã¯éåžžãã³ãŒãã||
ãasync
ããã«æ°ããå®è¡ã³ã³ããã¹ãã«åã蟌ããã®ã§ã¯ãªããåŒã®åãªãã©ãããŒã§ãã
ãã ãã@ cramertjã®ãæ§æãã¯éèŠã§ãã
ãã®ããã«èããŠãã ããã é¢æ°ã®ããã«èŠããªããã®ïŒãŸãã¯ã¯ããŒãžã£ã®ããã«èŠããã¯ããŒãžã£ãé¢æ°ãšããŠèªèããããšã«æ
£ããŠãããã®ïŒãããã return
ã衚瀺ãããå Žåãã¡ã³ã¿ã«ããŒãµãŒã¯ãããã©ãã«è¡ããšæããŸããïŒ
return
ãä¹ã£åããã®ã¯ãã¹ãŠãä»äººã®ã³ãŒããèªãã®ãããæ··ä¹±ãããŸãã 人ã
ã¯ãå°ãªããšããšããèãã«äœ¿çšãããŠããbreak
äžéšã®èŠªãããã¯ã«æ»ãã圌ããæã£ãŠããã§ãããããã©ã®ãããã¯ãç¥ãããã«ã³ã³ããã¹ããèªã¿åãããšã return
ã¯åžžã«ãé¢æ°å
šäœããè¿ããã倧ããªãã³ããŒã§ããã
ããããããã«è©äŸ¡ãããã¯ããŒãžã£ãšåæ§ã«æ±ãããŠããªãå Žåãç¹ã«æ§æçã«ã¯ããªã¿ãŒã³ã«äžè²«æ§ããªãããšã«åæããŸãã éåæãããã¯ã®?
ããã§ã«æ±ºå®ãããŠããå ŽåïŒRFCã¯ãŸã 決å®ãããŠããªããšèšã£ãŠããŸãïŒããããšäžèŽãããšæããŸãã
@joshtripletté¢æ°ãšã¯ããŒãžã£ïŒæ§æçã«ã¯éåžžã«ç°ãªãïŒãããªã¿ãŒã³ã¹ã³ãŒãããšããŠèªèã§ãããšèšãã®ã¯æ£æçã§ãããéåæãããã¯ã¯åãè¡ã«æ²¿ã£ãŠèªèã§ããŸããã ãªã2ã€ã®ç°ãªãæ§æ圢åŒãåãå ¥ããããã®ã«ã3ã€ã¯åãå ¥ããããªãã®ã§ããïŒ
RFCã§ãã®ãããã¯ã«é¢ããããã€ãã®ãŸããã ç§ãããã§èšã£ãããã«ãç§ã¯ã©ãã«ãæäŸããå¿
èŠãªãã«break
ã䜿çšããéåæãããã¯ãæ¯æããŠããŸãïŒéåæãããã¯ããå€åŽã®ã«ãŒãã«æãåºãæ¹æ³ããªãã®ã§ãè¡šçŸåºŠã倱ãããšã¯ãããŸããïŒã
@withoutboatsã¯ããŒãžã£ã¯åãªãå¥ã®çš®é¡ã®é¢æ°ã§ãã ãã¯ããŒãžã£ã¯é¢æ°ã§ããããåŠãã ããã return
åžžã«å«ãŸããŠããé¢æ°ããæ»ãããªã©ãé¢æ°ã«ã€ããŠç¥ã£ãŠãããã¹ãŠã®ãã®ãã¯ããŒãžã£ã«é©çšã§ããŸãã
@ Nemo157ã©ãã«ã®ãªãbreak
ãasync
ãããã¯ãã¿ãŒã²ããã«ããŠããå Žåã§ããéåæãããã¯å
ã®ã«ãŒãããæ©æã«æ»ãããã®ã¡ã«ããºã ïŒ 'label: async
ïŒãæäŸããå¿
èŠããããŸãã ã
@joshtriplett
ã¯ããŒãžã£ã¯å¥ã®çš®é¡ã®é¢æ°ã§ãã ãã¯ããŒãžã£ã¯é¢æ°ã§ããããåŠãã ããããªã¿ãŒã³ã¯åžžã«å«ãŸããŠããé¢æ°ããæ»ãããªã©ãé¢æ°ã«ã€ããŠç¥ã£ãŠãããã¹ãŠã®ãã®ãã¯ããŒãžã£ã«é©çšã§ããŸãã
async
ãããã¯ãäžçš®ã®ãé¢æ°ãã ãšæããŸããåŒæ°ããªããéåæã§å®è¡ããŠå®äºããããšãã§ããŸãã ãããã¯ãåŒæ°ããªããäºåã«é©çšãããŠããasync
ã¯ããŒãžã£ã®ç¹æ®ãªã±ãŒã¹ã§ãã
@cramertjãããå¿ èŠã«å¿ããŠæé»ã®ãã¬ãŒã¯ãã€ã³ãã«ãã©ãã«ãä»ããããšãã§ãããšæã£ãŠããŸããïŒçŸåšã¯ãã¹ãŠã©ãã«ãä»ããããšãã§ãããšæããŸãïŒã
å¶åŸ¡ãããŒã远跡ãã«ãããããã®ãç¹ã«return
æå³ãåå®çŸ©ãããã®ã¯ãã¹ãŠãã³ãŒããã¹ã ãŒãºã«èªã¿åãæ©èœã«å€§ããªè² æ
ããããŸãã
åãããã«ãCã®æšæºçãªã¬ã€ãã³ã¹ã¯ãããã¯ãã®éäžããæ»ããã¯ããèšè¿°ããªããã§ãã ãŸãã¯ãããŸãäžè¬çã§ã¯ãããŸãããããŸã åé¡ã®ããã±ãŒã¹ãšããŠãã«ãŒãã®ããã«èŠãããã¯ããäœæããå Žåã break
ãšcontinue
ã¯ãã®å
éšããæ©èœããã¯ãã§ãã å®éã«2ã€ã®ã«ãŒããåã蟌ãã ã«ãŒãã£ãœããã¯ããäœæãã人ãèŠãããšããããŸãããã®ããã break
ã¯æåŸ
ã©ããã«æ©èœãããéåžžã«æ··ä¹±ããŸãã
éåæãããã¯ãäžçš®ã®ãæ©èœãã ãšæããŸã
ããã¯ãå®è£ ã®å éšãç¥ãããšã«åºã¥ãèŠç¹ã ãšæããŸãã
ç§ã¯ããããé¢æ°ãšããŠã¯ãŸã£ããèŠãŠããŸããã
ç§ã¯ããããé¢æ°ãšããŠã¯ãŸã£ããèŠãŠããŸããã
@joshtriplett
ç§ã®çæã¯ãã¯ããŒãžã£ãŒã®ããèšèªã«åããŠåãè°è«ãããã ãããšããããšã§ãreturn
ã¯ã¯ããŒãžã£ãŒå
ã§ã¯ãªããå®çŸ©é¢æ°å
ã§æ©èœããã¯ãã§ãã ãããŠç¢ºãã«ãScalaã®ããã«ããã®è§£éãæ¡çšããèšèªããããŸãã
@cramertjç§ã¯ããŸããããããã é¢æ°å
ã§å®çŸ©ãããã©ã ããé¢æ°ã®å Žåãããããé¢æ°ã§ããããšã¯å®å
šã«èªç¶ãªããšã§ãã ïŒãããã«æåã«è§Šããã®ã¯PythonãFWIWã§ãã©ã ãã¯return
ã䜿çšã§ããããã¹ããããé¢æ°ã§ã¯return
ãå«ãé¢æ°ããreturn
ãè¿ãããŸããïŒ
éåæãããã¯ãäœãããã®ãããããã°ã return
ãã©ã®ããã«åäœããªããã°ãªããªãããçŽæçã«ããããšæããŸãã å®è¡ã®é
延ãè¡šããŠããããšãããã£ããã return
ãé¢æ°ã«é©çšã§ããªãããšã¯æããã§ãã ãããã¯ãå®è¡ããããŸã§ã«ãé¢æ°ããã§ã«æ»ã£ãŠããããšã¯æããã§ãã ãããåŠã¶IMOã¯ãããã»ã©é£ããããšã§ã¯ãããŸããã å°ãªããšãè©ŠããŠã¿ãå¿
èŠããããŸãã
ãã®RFCã¯ã
?
æŒç®åãšreturn
ãbreak
ãcontinue
ãªã©ã®å¶åŸ¡ãããŒæ§é ãéåæãããã¯å ã§ã©ã®ããã«æ©èœããããææ¡ããŠããŸããã
å°çšã®RFCãäœæããããŸã§ãå¶åŸ¡ãããŒæŒç®åãçŠæ¢ãããããããã¯ã延æãããããã®ãæåã§ããããïŒ åŸã§èª¬æããããã«èšåãããä»ã®æãŸããæ©èœããããŸããã ãããŸã§ã®éãéåæé¢æ°ãã¯ããŒãžã£ã await!
:)
ããã§@memoryruinsã«åæããŸãããããã®è©³çŽ°ã«ã€ããŠè©³ãã説æããããã«ãå¥ã®RFCãäœæãã䟡å€ããããšæããŸãã
core::task::context()
ãšåŒã°ããå¯èœæ§ã®ããéåæfnå
ããã³ã³ããã¹ãã«ã¢ã¯ã»ã¹ã§ããããã«ããé¢æ°ã«ã€ããŠã©ãæããŸããïŒ éåæfnã®å€éšããåŒã³åºãããå Žåãããã¯åã«ãããã¯ã«ãªããŸãã ããšãã°ããšã°ãŒãã¥ãŒã¿ã«ã¢ã¯ã»ã¹ããŠäœããçæããå Žåãªã©ãããã¯éåžžã«äŸ¿å©ã ãšæããŸãã
@MajorBreakfastãã®é¢æ°ã¯lazy
ãšåŒã°ããŸã
async fn foo() -> i32 {
await!(lazy(|ctx| {
// do something with ctx
42
}))
}
ã¹ããŒã³ã®ãããªããå ·äœçãªãã®ã«ã€ããŠã¯ã人éå·¥åŠçã«ãããã«ããŒé¢æ°ãããå¯èœæ§ããããŸã
async fn foo() -> i32 {
let some_task = lazy(|_| 5);
let spawned_task = await!(spawn_with_handle(some_task));
await!(spawned_task)
}
@ Nemo157å®ã¯spawn_with_handle
ãããã䜿ããããšããã§ãã ã³ãŒãã0.3ã«å€æãããšãã³ã³ããã¹ãã«ã¢ã¯ã»ã¹ããå¿
èŠãããããã spawn_with_handle
ã¯å®éã«ã¯æªæ¥ã«ãããªãããšã«æ°ä»ããŸããïŒã³ãŒããåç
§ïŒã ç§ãããããã®ã¯ã spawn_with_handle
ã¡ãœãããContextExt
ã«è¿œå ãã spawn_with_handle
ãéåæé¢æ°å
ã§ã®ã¿æ©èœããç¡æã®é¢æ°ã«ããããšã§ãã
fn poll(self: PinMut<Self>, cx: &mut Context) -> Poll<Self::Output> {
let join_handle = ctx.spawn_with_handle(future);
...
}
async fn foo() {
let join_handle = spawn_with_handle(future); // This would use this function internally
await!(join_handle);
}
ããã«ãããçŸåšç§ãã¡ãæã£ãŠãããã¹ãŠã®äºéåŸ æ©ãã³ã»ã³ã¹ãåé€ãããŸãã
èããŠã¿ããšãã¡ãœããã¯core::task::with_current_context()
ãšåŒã°ããå¿
èŠããããåç
§ãæ ŒçŽããããšã¯äžå¯èœã§ãªããã°ãªããªããããå°ãç°ãªãåäœãããŸãã
ç·šéïŒãã®é¢æ°ã¯get_task_cx
ãšããååã§æ¢ã«ååšããŸãã çŸåšãæè¡çãªçç±ã§libstdã«ãããŸãã libcoreã«å
¥ããããšãã§ãããããããªãã¯APIã«ããããšãææ¡ããŸãã
async
é¢æ°ããåŒã³åºãããšãã§ããé¢æ°ã䜿çšããŠãTLSãã移åãããšã芪ã®async
é¢æ°ããã³ã³ããã¹ããååŸã§ãããšã¯æããŸããã ãã®æç¹ã§ãã³ã³ããã¹ãã¯async
é¢æ°å
ã®é衚瀺ã®ããŒã«ã«å€æ°ã®ããã«æ±ãããå¯èœæ§ãé«ãããããã®é¢æ°ã§ã³ã³ããã¹ãã«çŽæ¥ã¢ã¯ã»ã¹ãããã¯ããäœæã§ããŸããã spawn_with_handle
æ¹æ³ã¯ãããŸããã
ã ãããæœåšçã«æ¬¡ã®ãããªãã®
fn spawn_with_handle(executor: &mut Executor, future: impl Future) { ... }
async fn foo() {
let join_handle = spawn_with_handle(async_context!().executor(), future);
await!(join_handle);
}
@ Nemo157ããªããæ£ãããšæããŸãïŒç§ãææ¡ããŠãããããªé¢æ°ã¯ãéåæfnå
ããçŽæ¥åŒã³åºãããªããšæ©èœããªãå¯èœæ§ããããŸãã ããããæè¯ã®æ¹æ³ã¯ã spawn_with_handle
await
å
éšã§select!
ãjoin!
ïŒã
async fn foo() {
let join_handle = spawn_with_handle!(future);
await!(join_handle);
}
ããã¯èŠæ ããããããã¯ãå
ã®await!(lazy(|ctx| { ... }))
ä»ããŠç°¡åã«å®è£
ã§ããŸãã
async_context!()
ã¯ãåŸ
æ©ãã€ã³ãéã§ã³ã³ããã¹ãåç
§ãä¿åããããšã劚ããããšãã§ããªããããåé¡ããããŸãã
async_context!()
ã¯ãåŸ æ©ãã€ã³ãéã§ã³ã³ããã¹ãåç §ãæ ŒçŽããããšã劚ããããšãã§ããªããããåé¡ããããŸãã
å®è£ ã«ãã£ãŠã¯ãå¯èœã§ãã å®å šãªãžã§ãã¬ãŒã¿ãŒåŒæ°ã埩掻ããå Žåããããã«ããéäŒç¹å šäœã§åç §ãä¿æã§ããªãããã«å¶éããå¿ èŠããããŸããåŒæ°ã®èåŸã«ããå€ã®æå¹æéã¯ãéäŒç¹ãŸã§ããå®è¡ãããŸããã Async / awaitã¯ããã®å¶éãç¶æ¿ããã ãã§ãã
@ Nemo157ãã®ãããªæå³ã§ããïŒ
let my_arg = yield; // my_arg lives until next yield
@Pzixel _ãããã_å€ãè°è«ãç®èŠã
ã¯ããç§ã¯await!()
æ§æã?
ãããªãã®ãšçµã¿åããããšãã«ææ§ããåãé€ãã®ã奜ãã§ããããã®æ§æãåäžã®ãããžã§ã¯ãã§1000åå
¥åããã®ãé¢åã§ããããšã«ãåæããŸãã ãŸãããã€ãºãå€ããã¯ãªãŒã³ãªã³ãŒããéèŠã ãšæããŸãã
ãã®ããã something_async()@
ãawait
ãã®ãšæ¯èŒãããªã©ãæ¥å°ŸèŸã®ä»ããèšå·ïŒä»¥åã«æ°åèšåãããŠããŸãïŒã«å¯Ÿããå®éã®åŒæ°ã¯äœã§ãããçåã«æã£ãŠããŸããããããawait
åå ã§ãã @
ã¯ãawaitã®a
ã«äŒŒãŠããã®ã§é¢çœããããããŸããããããŸããã£ããããã·ã³ãã«ã§ããã°ã©ãã§ãããŸããŸããã
åºæ¬çã«æ¥å°ŸèŸ?
ã«ãªã£ãtry!()
ã§åæ§ã®ããšãèµ·ãã£ãã®ã§ããã®ãããªæ§æã®éžæã¯è«ççã§ãããšç§ã¯äž»åŒµããŸãïŒããã¯å®å
šã«åãã§ã¯ãªãããšãç§ã¯ç¥ã£ãŠããŸãïŒã ç°¡æœã§ãèŠãããããå
¥åãç°¡åã§ãã
ãã®ãããªæ§æã®ãã1ã€ã®ãã°ãããç¹ã¯ã ?
èšå·ãšçµã¿åããããšãåäœãããã«æ確ã«ãªãããšã§ãïŒå°ãªããšããããªããšæããŸãïŒã 以äžãèŠãŠãã ããã
// Await, then unwrap a Result from the future
awaiting_a_result()@?;
// Unwrap a future from a result, then await
result_with_future()?@;
// The real crazy can make it as funky as they want
magic()?@@?@??@;
// - I'm joking, of course
await future?
ããã«ããã®ãããªç¶æ³ãç¥ããªãéãäœãèµ·ããããäžç®ã§ããããªãå Žåã®ããã«ãããã«ã¯åé¡ã¯ãããŸããã ããã§ãããã®å®è£
�
ãšäžèŽããŠããŸãã
ããŠãç§ãèããããšãã§ããããã€ãã®_ãã€ããŒ_ãªããšããã®ã¢ã€ãã¢ã«å¯Ÿæããã§ãããïŒ
await
ãã®ãšã¯ç°ãªããç°¡æœãããŠç®ç«ããªã/åé·ã§ããå¯èœæ§ããããŸããããã«ãããé¢æ°å
ã®äžæåæ¢ãã€ã³ããèŠã€ããã®ãå°é£ã«ãªããŸããasync
ããŒã¯ãŒããšã¯é察称ã§ããå¯èœæ§ããããŸããäžæ¹ã¯ããŒã¯ãŒãã§ãããäžæ¹ã¯ã·ã³ãã«ã§ãã ãã ãã await!()
ã«ã¯ãããŒãŠã§ã¢ãšãã¯ãã®åãåé¡ããããŸãã@phauxã¯ã ~
èšå·ã®äœ¿çšã«ã€ããŠãèšåããŸããã ãã ãããã®æåã¯ããªãã®æ°ã®ããŒããŒãã¬ã€ã¢ãŠãã§å
¥åããã®ããã¡ã³ããŒã ãšæãã®ã§ããã®ã¢ã€ãã¢ãåé€ããããšããå§ãããŸãã
ã¿ããªã©ãæããŸããïŒ try!()
?
ã«ãªã£ãæ¹æ³ãšã©ãããããã䌌ãŠããããšã«åæããŸããïŒ await
ãšã·ã³ãã«ã®ã©ã¡ãã奜ãã§ããããããŠãã®çç±ã¯äœã§ããïŒ ç§ã¯ããã«ã€ããŠè©±ãåãããšã«å€¢äžã§ããããããšãäœãã足ããªãã®ã§ããããïŒ
ç§ã䜿çšããå¯èœæ§ã®ãã誀ã£ãçšèªã§ç³ãèš³ãããŸããã
ç§ãå°ç« ããŒã¹ã®æ§æã§æ±ããŠããæ倧ã®æžå¿µã¯ãããªãã芪åã«ç€ºããããã«ããããç°¡åã«ã°ãªãã¹ãŒãã«å€ããå¯èœæ§ãããããšã§ãã PerlïŒpre-6ïŒã«ç²ŸéããŠãã人ãªã誰ã§ããç§ããããã©ãã«äœ¿ãã®ãç解ããã§ãããã ã©ã€ã³ãã€ãºãåé¿ãã
ããã¯èšã£ãŠããããããæåã®æ¹æ³ã¯ãå®éã«ã¯try!
ãšãŸã£ããåãã§ããïŒ ã€ãŸããæ瀺çãªasync!(foo)
ãã¯ãããéå§ããå¿
èŠã«å¿ããŠããã®ããã®ç ç³ãšãªãå°ç« ãè¿œå ããŸãã 確ãã«ãããã¯åé¡ãåŸã§å»¶æããŸããã async!(foo)
ã¯async / awaitã®æåã®å埩ã«ã¯ååã§ãããæ¯èŒçè°è«ã®äœå°ããªããšããå©ç¹ããããŸãã ïŒãããŠã try!
/ ?
ã®åäŸãããããšã¯ãå°ç« ãçºçããå¿
èŠããããŸãïŒ
@withoutboatsãã®ã¹ã¬ããå šäœãèªãã ããšã¯ãããŸããããå®è£ ãæäŒã£ãŠããã人ã¯ããŸããïŒ éçºãã©ã³ãã¯ã©ãã«ãããŸããïŒ
ãããŠãæ®ãã®æªè§£æ±ºã®èæ ®äºé ã«é¢ããŠãRustã³ãã¥ããã£å€ã®å°é家ã«å©ããæ±ãã人ã¯ããŸããïŒ Joe Duffyã¯ã䞊è¡æ§ã«ã€ããŠå€ãã®ããšãç¥ã£ãŠããŠæ°ã«ãããŠããŠãåä»ãªè©³çŽ°ãéåžžã«ããç解ããŠããŸãã圌ã¯RustConfã§
@BatmanAoDæåã®å®è£ ã¯https://github.com/rust-lang/rust/pull/51580ã«äžéžããŸãã
å ã®RFCã¹ã¬ããã«ã¯ãRust以å€ã§ããPLTåéã®å€ãã®å°é家ããã®ã³ã¡ã³ãããããŸãã:)
æã¯éãªããªã®ã§ãå ç©ãåŸ ã€ããã®ã$ãèšå·ãææ¡ããããšæããŸãããããã³ã³ãã€ã©ãŒã«æãåºãããããšæããŸãã
ãã ã®åè«ã åŸ
ã€ããã®ã·ã³ãã«ãæã€ã®ã¯è¯ãèãã§ã¯ãªããšæããŸãã Rustãšã¯ãæ瀺çã§ããã人ã
ãäœã¬ãã«ã®ã³ãŒãã匷åãªèšèªã§èšè¿°ã§ããããã«ããããšã§ãã èšå·ã¯await!
ãã¯ããããã¯ããã«ææ§ã§ãããèªã¿ã«ããã³ãŒããæžãããšã§ã人ã
ãå¥ã®æ¹æ³ã§èªåã®è¶³ãæã€ããšãã§ããŸãã ?
ã¯äžæ©é ããããšç§ã¯ãã§ã«äž»åŒµããŸãã
ãŸãã async fn
圢åŒã§äœ¿çšãããasync
ããŒã¯ãŒããããããšã«åæããŸããã ããã¯ãéåæã«å¯Ÿããããçš®ã®ããã€ã¢ã¹ããæå³ããŸãã ãªãéåæã¯ããŒã¯ãŒãã«å€ããã®ã§ããïŒ éåæã³ãŒãã¯ãå¿
ãããå¿
èŠã§ã¯ãªããç§ãã¡ã«ãšã£ãŠåãªãå¥ã®æœè±¡åã§ãã éåæå±æ§ã¯ããã匷åãªã³ãŒããèšè¿°ã§ããããã«ãããåºæ¬ã®Rustæ¹èšã®ãæ¡åŒµãã®ããã«æ©èœãããšæããŸãã
ç§ã¯èšèªã¢ãŒããã¯ãã§ã¯ãããŸããããJavaScriptã§Promisesã䜿çšããŠéåæã³ãŒããäœæããçµéšãå°ããããŸããããã§è¡ãããæ¹æ³ã«ãããéåæã³ãŒããäœæããã®ã楜ãããªããšæããŸãã
@steveklabnikãããmove
ãµããŒããªãã®å®è£
ããšãå®å
šå®è£
ãã«åå²ããå¿
èŠããããŸããïŒ
次ã®å®è£ ã®å埩ã¯ãããã€ãã®ãããªãã¯ãã©ãŒã¯/ãã©ã³ãã§äœæ¥ãããŠããŸããïŒ ãŸãã¯ãRFC 2418ãåãå ¥ãããããŸã§ããããé²ããããšããã§ããŸãããïŒ
ãªãéåæ/åŸ æ©æ§æã®åé¡ãRFCã§ã¯ãªãããã§è°è«ãããŠããã®ã§ããïŒ
@ c-edw async
ããŒã¯ãŒãã«é¢ãã質åã¯ããé¢æ°ã¯äœè²ã§ããïŒãã«ãã£ãŠåçããã
@parasyteãã®æçš¿ã¯ãå®éã«ã¯ãèªåçã«ç®¡çãããã°ãªãŒã³ã¹ã¬ããã¹ã¿ã€ã«ã®åæå®è¡æ§ã®ãªãéåæé¢æ°ã®ã¢ã€ãã¢å šäœã«å察ããè°è«ã§ããããšãç§ã«ç€ºåãããŠããŸãã
ã°ãªãŒã³ã¹ã¬ããã¯ïŒç®¡çãããïŒã©ã³ã¿ã€ã ãªãã§ã¯ééçã«å®è£ ã§ããªããããç§ã¯ãã®ç«å Žã«åæããŸãããRustããããå¿ èŠãšããã«éåæã³ãŒãããµããŒãããã®ã«ã¯ååãªçç±ããããŸãã
ããããããªãã®æçš¿ãèªãã§ãããšã async
/ await
ã»ãã³ãã£ã¯ã¹ã¯åé¡ãªãããã§ãããããŒã¯ãŒãã«ã€ããŠå°ãåºãããçµè«ã¯ãããŸããïŒ ãããæ¡åŒµããŠããã ããŸãããïŒ
ããã§ã®ããªãã®èŠæ¹ã«ãåæããŸãã ç§ã¯async
ããŒã¯ãŒããå¿
èŠã§ãããšã³ã¡ã³ãããŠããŸããããããŠèšäºã¯ãã®èåŸã«ããçç±ã説æããŸãã èè
ãå°ãåºããçµè«ã¯å¥ã®åé¡ã§ãã
@parasyteããã
ç§ã¯ãããæ£çŸ©ãšã¯èšããªãã£ããšæããŠããã®ã§ãããã«æ確ã«ããããšæããŸãã
äºåæ³ã¯é¿ããããŸããã äžéšã®ãããžã§ã¯ãã§ã¯ããã¹ãŠã®é¢æ°åŒã³åºããéåæã«ããŠãåæé¢æ°åŒã³åºããååšããªãããã«ããããšã§ããããæ¶å»ããããšããŸããã ã¿ã©ãã¯ãã®äžäŸã§ãã ãããŠä»ã®ãããžã§ã¯ãã¯ãåæé¢æ°ã®ãã¡ãµãŒãã®åŸãã«éåæé¢æ°ãé ãããšã«ãã£ãŠäºåæ³ãæ¶ãããšããŸããã geventã¯ãã®çš®ã®äŸã§ãã
ã©ã¡ããåãåé¡ãæ±ããŠããŸãã éåæã¿ã¹ã¯ãå®äºããã®ããã¿ã¹ã¯ãéåæçã«éå§ããããšãåºå¥ããããã®äºåæ³ãå¿ èŠã§ãã
await
ããŒã¯ãŒããããŸãã async
ããŒã¯ãŒãé¢æ°åŒã³åºãã®ãµã€ãããgevent.spawn
ãæäŸããŸããããããããªãasyncã¯ããŒã¯ãŒãã«å€ããã®ãããšãã質åã«çãããããcolor-a-functionã®èšäºãåãäžããçç±ã§ãã
ãŸããã¹ã¬ããããŒã¹ã®åæã³ãŒãã§ããããã¿ã¹ã¯ãå®äºããã®ãåŸ
ã€ãïŒçµåïŒãšãã¿ã¹ã¯ãéå§ãããïŒã¹ããŒã³ïŒãåºå¥ããããšãã§ããŸãã ãã¹ãŠãéåæïŒå®è£
ã«é¢ããŠïŒã§ããèšèªãæ³åã§ããŸããã await
ã¯ã¢ãããŒã·ã§ã³ããªãïŒããã©ã«ãã®åäœã§ããããïŒãMidoriã®async
ã¯ä»£ããã«spawn
æž¡ãããã¯ããŒãžã£ã§ã
ãããã£ãŠãéåæã¯ããŒã¯ãŒãã«å€ããããšã«åæããŸãããRustã¯ãã®ã¬ãã«ã§ã®å®è£ ã®ã¡ã«ããºã ã«é¢å¿ãããããã®ããã«äž¡æ¹ã®è²ãæäŸããå¿ èŠãããããããã以äžã®ããã«æããŸãã
@rpjohnstã¯ããããªãã®ææ¡ãèªã¿ãŸããã ããã¯ãæŠå¿µçã«ã¯ãè²ãé衚瀺ã«ããããšãšåãã§ãã ãŸã£ããåãã¹ã¬ããã®éã®ãã©ãŒã©ã ã§ç§ã¯ãããæ¹å€ããŸããã ãã¹ãŠã®é¢æ°åŒã³åºãã¯åæããŠããããã«èŠããŸããããã¯ãé¢æ°ãéåæãã€ãã©ã€ã³ã§åæãšããããã³ã°ã®äž¡æ¹ãè¡ã£ãŠããå Žåã«ç¹ã«å±éºã§ãã ãã®çš®ã®ãã°ã¯äºæž¬äžå¯èœã§ããããã©ãã«ã·ã¥ãŒãã£ã³ã°ããã®ã«å®éã®çœå®³ã§ãã
ç§ã¯ç¹ã«ç§ã®ææ¡ã«ã€ããŠè©±ããŠããã®ã§ã¯ãªãããã¹ãŠãéåæã§ããèšèªã«ã€ããŠè©±ããŠããã®ã§ãã ããªãã¯ãã®ããã«äºåæ³ããéããããš
IIUCã¯ãŸãã«ãããªãè©Šã¿ããã®ã§ãã ãã®æç¹ã§ãããŒã¯ãŒããšã¯ããŒãžã£ã¯ã»ãã³ãã£ã¯ã¹ã䞻匵ããŠããã ãã§ãã
2018幎7æ12æ¥æšææ¥ååŸ3æ1åãã©ãã»ã«ãžã§ã³ã¹ãã³[email protected]
æžããŸããïŒ
äºåæ³ã®çç±ã®è°è«ãšããŠããŒã¯ãŒãã®ååšã䜿çšããŸãã
ã¿ã©ãã«ã¯ãŸã ååšããŸãã ããããåé€ããå Žåãäºåæ³ã¯ã©ãã«ãããŸããïŒ The
æ§æã¯all-syncã³ãŒããšåãã§ãããéåæã®æ©èœãåããŠããŸã
ã³ãŒãã
çµæãåŸ
ããã«éåæé¢æ°ãåŒã³åºããšã
åæçã«promiseãè¿ããŸãã ããã¯åŸã§åŸ
ã€ããšãã§ããŸãã ð
_ãããŒã誰ããã¿ã©ãã«ã€ããŠäœãç¥ã£ãŠããŸããïŒ çãç©ãã»ãšãã©ããªãã¯ããŒãºããããžã§ã¯ãã ãšãã€ãæã£ãŠããŸããã 誰ããããã«ã€ããŠãã£ãšè©³ããæžããŠãããé¢çœãã§ãããã_
/ãªããããã¯
@Pzixelãããžã§ã¯ããã·ã£ããããŠã³ããããããçãç©ã¯ãŸã äœæ¥ããŠããŸããã ããããJoeDuffyã®ããã°ã«ã¯èå³æ·±ã詳现ããããããããŸãã äžèšã®ç§ã®ãªã³ã¯ãåç §ããŠãã ããã
ããã§è»éã«ä¹ã£ãŠããŸã£ãã®ã§ãç¹°ãè¿ããŠãããããªæ°ãããŸãããããã¯ãããŒã¯ãŒãã®ååšããã€ãŸãawait
ããŒã¯ãŒãã®äžéšã§ãã ããŒã¯ãŒããspawn
ãjoin
ãªã©ã®APIã«çœ®ãæãããšãå®å
šã«éåæã«ãªããŸããïŒMidoriã®ããã«ïŒãäºåæ³ã¯ãããŸããïŒMidoriã®ããã«ïŒã
èšãæããã°ãç§ãåã«èšã£ãããã«ãããã¯åºæ¬çã§ã¯ãããŸãã-ç§ãã¡ãéžæã
@CyrusNajmabadiããäžåºŠpingããŸãã
äºåºŠãšèšåãããããªãå Žåã¯ãæããŠãã ããã ç§ã¯ããªããèå³ãæã£ãŠãããããããªããšæã£ãã ãã§ãã
ïŒwg-netã®äžåãã£ã³ãã«ããïŒ
@cramertj
æèã®ç³§ïŒasync { ... }
ãããã¯ã®æåŸã«Ok::<(), MyErrorType>(())
ãæžãããšããããããŸãã ãšã©ãŒã¿ã€ãã®å¶çŽãç°¡åã«ããããã«èããããããšãããã§ããããã
@withoutboats
[...]ãããã[try
]ãšäžè²«æ§ãæããããã§ããïŒ
ïŒ try
ãããã¯ãã©ã®ããã«ãªã¿ãŒã³ã¿ã€ãã宣èšã§ãããã«ã€ããŠã®æ¯èŒçæè¿ã®è°è«ãèŠããŠããŸãããä»ã¯ãããèŠã€ããããšãã§ããŸãã...ïŒ
èšåãããè²åãïŒ
async -> io::Result<()> {
...
}
async: io::Result<()> {
...
}
async as io::Result<()> {
...
}
try
ã§ããããšã®1ã€ã¯ã async
ã人éå·¥åŠçã§ã¯ãããŸããããå€æ°ãã€ã³ãã£ã³ã°ãŸãã¯åã®å²ãåœãŠã䜿çšããããšã§ãã
let _: io::Result<()> = try { ... };
let _: impl Future<Output = io::Result<()>> = async { ... };
ç§ã¯ä»¥åã Future
ãã¬ã€ãã«fnã®ãããªæ§æãèš±å¯ãããšããã¢ã€ãã¢ãæããããŠããŸããïŒäŸïŒ Future -> io::Result<()>
ã ããã¯ãŸã å€ãã®æåã§ãããããã¯æåã¿ã€ãæäŸãªãã·ã§ã³ãå°ãèŠæ ãããããŸãïŒ
let _: impl Future -> io::Result<()> = async {
}
async -> impl Future<Output = io::Result<()>> {
...
}
ç§ã®éžæã«ãªããŸãã
ããã¯ãæ¢åã®ã¯ããŒãžã£æ§æã«äŒŒãŠã
|x: i32| -> i32 { x + 1 };
ç·šéïŒãããŠæçµçã«TryFuture
ãFuture
ãå®è£
ããããšãå¯èœã«ãªã£ããšãïŒ
async -> impl TryFuture<Ok = i32, Error = ()> {
...
}
Edit2ïŒæ£ç¢ºã«ã¯ãäžèšã¯ä»æ¥ã®ç¹æ§å®çŸ©ã§æ©èœããŸãã TryFuture
ã¿ã€ãã¯ãçŸåšFuture
å®è£
ããŠããªããããä»æ¥ã»ã©æçšã§ã¯ãããŸããã
@MajorBreakfastãªã-> impl Future<Output = io::Result<()>>
ã§ã¯ãªã-> io::Result<()>
ã§ããïŒ ãã§ã«async fn foo() -> io::Result<()>
ã«å¯ŸããŠreturn-type-desugaringãå®è¡ããŠããã®ã§ãIMOã->
ããŒã¹ã®æ§æã䜿çšããå Žåãããã§åãç ç³ãå¿
èŠã«ãªãããšã¯æããã§ãã
@cramertjã¯ããäžè²«ããŠããå¿ èŠããããŸãã äžèšã®ç§ã®æçš¿ã¯ãã¢ãŠã¿ãŒãªã¿ãŒã³ã¿ã€ãã®ã¢ãããŒããåªããŠããããšãçããã«çŽåŸãããããšãã§ãããšä»®å®ããŠããŸãð
async -> R { .. }
å Žåã¯ãããããtry -> R { .. }
ã䜿çšããå¿
èŠããããŸãããŸããã¿ã€ãã®å²ãåœãŠã«ã¯äžè¬ã«expr -> TheType
ã䜿çšããå¿
èŠããããŸãã èšãæããã°ãç§ãã¡ã䜿çšããåã®åž°å±æ§æã¯ãã©ãã«ã§ãåäžã«é©çšãããã¹ãã§ãã
@CentrilåæããŸãã ã©ãã§ã䜿ããã¯ãã§ãã ->
ãæ¬åœã«æ£ããéžæã§ãããã©ãã->
ãåŒã³åºãå¯èœã«é¢é£ä»ããŸãã ãããŠãéåæãããã¯ã¯ããã§ã¯ãããŸããã
@MajorBreakfastç§ã¯åºæ¬çã«åæããŸãã ã¿ã€ãã®å²ãåœãŠã«ã¯:
ã䜿çšããå¿
èŠããããšæããŸãããããã£ãŠã async : Type { .. }
ã try : Type { .. }
ãããã³expr : Type
ã§ãã Discordã®æœåšçãªãããŸããã«ã€ããŠèª¬æããŸãããã :
ã§åé²ããæ¹æ³ãèŠã€ãããšæããŸã...
ãã1ã€ã®è³ªåã¯ã Either
åæåã«ã€ããŠã§ãã futures
ã¯ã¬ãŒãã«ã¯ãã§ã«Either
ããããŸãã ãŸããããã§ãªãå Žåã¯either
ã¯ã¬ãŒãã®Either
ããã«èŠãããããæ··ä¹±ãæããŸãã
Futures
ã¯stdïŒå°ãªããšããã®éåžžã«åºæ¬çãªéšåïŒã«ããŒãžãããŠããããã«èŠããã®ã§ãããã«Either
å«ããããšãã§ããŸããïŒ é¢æ°ããimpl Future
ãè¿ãããšãã§ããããã«ããã«ã¯ãããããçšæããããšãéèŠã§ãã
ããšãã°ãç§ã¯ãã次ã®ãããªã³ãŒããèšè¿°ããŸãã
fn handler() -> impl Future<Item = (), Error = Bar> + Send {
someFuture()
.and_then(|x| {
if condition(&x) {
Either::A(anotherFuture(x))
} else {
Either::B(future::ok(()))
}
})
}
ç§ã¯ããã次ã®ããã«æžãããšãã§ããããã«ããããšæããŸãïŒ
async fn handler() -> Result<(), Bar> {
let x = await someFuture();
if condition(&x) {
await anotherFuture(x);
}
}
ããããç§ãç解ããŠããããã«ã async
ãå±éããããšãããã«Either
ãæ¿å
¥ããå¿
èŠããããŸãã
_å¿ èŠã«å¿ããŠãããã§å®éã®ã³ãŒããèŠã€ããããšãã§ããŸãã
@Pzixel async
é¢æ°å
ã«Either
ã¯å¿
èŠãããŸããããã ããå
ç©ãawait
ããéãã async
ãè¡ãã³ãŒãå€æã«ãã£ãŠããã2ã€ãé衚瀺ã«ãªããŸããå
éšã§åãæå®ããã³ã³ãã€ã©ã«åäžã®æ»ãåãæ瀺ããŸãã
@PzixelãŸããç§ã¯ïŒå人çã«ïŒ Either
ããã®RFCã§å°å
¥ãããªãããšãæãã§ããŸããããã¯ã httpsïŒ//github.com/rust-lang/rfcs/issuesã®å¶éä»ãããŒãžã§ã³ãå°å
¥ããããã§ãFuture
ã®ã¿æ©èœããŸãïŒããããã£ãŠãäžè¬çãªãœãªã¥ãŒã·ã§ã³ãããŒãžãããå Žåã¯ãAPI cruftãè¿œå ãããå¯èœæ§ããããŸãã @ Nemo157ãè¿°ã¹ãããã«ãä»Either
æã£ãŠãã:)
@Ekleog確ãã«ãç§ã¯æ¢åã®éåæã³ãŒãã«å®éã«å€§éã®either
ããããšãããã®èãã«èŠèãããããããæ¬åœã«åãé€ããããšæã£ãŠããŸãã 次ã«ãäŸåé¢ä¿ã«either
ã¯ã¬ãŒããããããã«ã³ã³ãã€ã«ãããªãããšã«æ°ä»ããŸã§ã30åã»ã©è²»ããããšãã®æ··ä¹±ãæãåºããŸããïŒå°æ¥ã®ãšã©ãŒã¯éåžžã«ç解ãã«ãããããããªãæéãããããŸããïŒã ã ããããã®åé¡ãäœããã®åœ¢ã§è§£æ±ºãããŠããããšã確èªããããã«ãç§ãã³ã¡ã³ããæžããã®ã¯ãã®ããã§ãã
ãã¡ãããããã¯async/await
ã ãã«é¢é£ããŠããã®ã§ã¯ãªããããäžè¬çãªãã®ãªã®ã§ãç¬èªã®RFCã«å€ããŸãã futures
ãeither
ã«ã€ããŠç¥ã£ãŠãããããŸãã¯ãã®éïŒ IntoFuture
æ£ããå®è£
ããããïŒã§ããããšã匷調ãããã£ãã ãã§ãã
@Pzixelå
ç©ã¯ã¬ãŒãã«ãã£ãŠãšã¯ã¹ããŒããããEither
ã¯ã either
ã¯ã¬ãŒãããã®åãšã¯ã¹ããŒãã§ãã futures
ã¯ã¬ãŒã0.3ã¯ãå€ç«ããã«ãŒã«ã®ããã Either
ã«å¯ŸããŠFuture
ãå®è£
ã§ããŸããã äžè²«æ§ãä¿ã€ããã«Either
Stream
ãšSink
implsãEither
ããåé€ãã代ããã«ä»£æ¿æ段ãæäŸããå¯èœæ§ãé«ãã§ãïŒããã§èª¬æããŸãïŒã ããã«ã either
ã¯ã¬ãŒãã¯ãããããæ©èœãã©ã°ã®äžã§ã Future
ã Stream
ãããã³Sink
èªäœãå®è£
ã§ããŸãã
ãšã¯èšããã®ã®ã Either
代ããã«éåæé¢æ°ã䜿çšããæ¹ãè¯ãã§ãããã
async : Type { .. }
ãã®ãhttps://github.com/rust-lang/rfcs/pull/2522ã§ææ¡ãããŠã
Send
èªåçã«å®è£
ããasync / awaité¢æ°
次ã®éåæé¢æ°ã¯ïŒãŸã ïŒïŒ Send
ã¯ãªãããã§ãïŒ
pub async fn __receive() -> ()
{
let mut chan: futures::channel::mpsc::Receiver<Box<Send + 'static>> = None.unwrap();
await!(chan.next());
}
å®å
šãªãªãããã¥ãŒãµãŒãžã®ãªã³ã¯ïŒ futures-0.3
ããªãããã«ãã¬ã€ã°ã©ãŠã³ãã§ã³ã³ãã€ã«ãããªãïŒã¯ããã«ãã
ãŸãããã®åé¡ã調æ»ããŠãããšãã«ãhttpsïŒ//github.com/rust-lang/rust/issues/53249ã«åºããããŸãããããã¯ãäžçªäžã®æçš¿ã®è¿œè·¡ãªã¹ãã«è¿œå ããå¿ èŠããããšæããŸã:)
ããã¯ã Send
_ should_ãå®è£
ããasync / awaité¢æ°ãæ©èœããããšã瀺ãéã³å Žã§ãã Rc
ããŒãžã§ã³ã®ã³ã¡ã³ãã解é€ãããšããã®é¢æ°ãéSend
ãšããŠæ£ããæ€åºãããŸãã ç§ã¯ããªãã®ç¹å®ã®äŸãå°ãèŠãŠïŒãã®ãã·ã³ã«ã¯Rustã³ã³ãã€ã©ã¯ãããŸããïŒslightly_frowning_face :)ããããæ©èœããªãçç±ã解æããããšãã§ããŸãã
@Ekleog std::mpsc::Receiver
ã¯Sync
ã§ã¯ãªããããªããæžããasync fn
ã¯ãããžã®åç
§ãä¿æããŠããŸãã !Sync
ã¢ã€ãã ãžã®!Send
ã¯
@cramertjããŒãâŠããããç§ã¯ææããŠããmpsc::Receiver
ãæã£ãŠããŸãããïŒãžã§ããªãã¯åãSend
å Žåã Send
ã«ãªãã¯ãã§ãã ïŒãŸãã std::mpsc::Receiver
ãªãfutures::channel::mpsc::Receiver
ãããã¯ãã¿ã€ããSend
å ŽåãSync
ã§ãã mpsc::Receiver
æ°ä»ããã«ç³ãèš³ãããŸããã mpsc::Receiver
ïŒïŒ
@ Nemo157ããããšãïŒ ãã®åé¡ã«é¢ãããã€ãºãå€ãããã®ãé¿ããããã«ãhttpsïŒ//github.com/rust-lang/rust/issues/53259ãéããŸãã:)
async
ãããã¯ã?
ããã³ãã®ä»ã®å¶åŸ¡ãããŒãèš±å¯ãããã©ãããããã³ã©ã®ããã«èš±å¯ããããšããåé¡ã¯ã try
ãããã¯ãšã®çžäºäœçšãä¿èšŒããå¯èœæ§ããããŸãïŒããšãã°ã try async { .. }
?
ãèš±å¯ããreturn
ïŒïŒã
ããã¯ã async
ãããã¯ã®ã¿ã€ããæå®ããããã®ã¡ã«ããºã ãã try
ãããã¯ã®ã¿ã€ããæå®ããããã®ã¡ã«ããºã ãšçžäºäœçšããå¿
èŠãããå¯èœæ§ãããããšãæå³ããŸãã åž°å±æ§æRFCã«ã³ã¡ã³ããæ®ããŸããïŒ https ïŒ
æåã¯futures-rs
åé¡ã ãšæã£ãŠãããã®ããããããŸããããå®éã«ã¯éåæ/åŸ
æ©ã®åé¡ã§ããå¯èœæ§ãããããã https ïŒ
1ã€ã®æ°ããåé¡ïŒ https ïŒ
æ°æ¥åã«äžåã§è°è«ãããããã«ã await
ã¯ãŸã ããŒã¯ãŒããšããŠäºçŽãããŠããŸããã 2018ãªãªãŒã¹ã®åã«ãã®äºçŽãååŸããïŒãããŠ2018幎çã®ããŒã¯ãŒãlintã«è¿œå ããïŒããšã¯éåžžã«éèŠã§ãã ä»ã®ãšãããã¯ãæ§æã䜿ãç¶ãããã®ã§ãå°ãè€éãªäºçŽã§ãã
Future / Task APIã«ã¯ãããŒã«ã«ã®æªæ¥ãçã¿åºãæ¹æ³ããããŸããïŒ
SpawnLocalObjError
ãããããã§ãããæªäœ¿çšã®ããã§ãã
@panicbitã¯ãŒãã³ã°ã°ã«ãŒãã§ã¯ãçŸåšãã³ã³ããã¹ãã«ã¹ããŒã³æ©èœãå«ããããšãçã«ããªã£ãŠãããã©ããã«ã€ããŠè©±ãåã£ãŠããŸãã https://github.com/rust-lang-nursery/wg-net/issues/56
ïŒ SpawnLocalObjError
ã¯å®å
šã«æªäœ¿çšã§ã¯ãããŸããïŒå
ç©ã¯ã¬ãŒãã®LocalPool
ãããã䜿çšããŸãããã ããlibcoreã®äœãããã䜿çšããªããšããã®ã¯æ£ããã§ãïŒ
@withoutboatsåé¡ã®èª¬æã«ãããªã³ã¯ã®ããã€ããhttpsïŒ //github.com/rust-lang/rfcs/pull/2418ãéãããã httpsïŒ //github.com/rust-lang-nursery/futures-rs/issues/1199ãhttpsïŒ/ã«ç§»åãããŸãã
NBã ãã®è¿œè·¡åé¡ã®ååã¯async / awaitã§ãããã¿ã¹ã¯APIã«ãå²ãåœãŠãããŠããŸãã ã¿ã¹ã¯APIã«ã¯çŸåšä¿çäžã®å®å®åRFCããããŸãïŒ https ïŒ
ããŒã¯ãŒãã代æ¿ã®éåæå®è£ ã§åå©çšã§ããããã«ãããã£ã³ã¹ã¯ãããŸããïŒ çŸåšã¯FutureãäœæããŠããŸãããããã·ã¥ããŒã¹ã®éåæããã䜿ããããããæ©äŒãéãããããªãã®ã§ãã
@aep oneshot::channel
ã䜿çšãããšãããã·ã¥ããŒã¹ã®ã·ã¹ãã ãããã«ããŒã¹ã®Futureã·ã¹ãã ã«ç°¡åã«å€æã§ããŸãã
äŸãšããŠãJavaScript Promisesã¯ããã·ã¥ããŒã¹ã§ãããããstdwebã¯oneshot::channel
ã䜿çšããŠJavaScriptPromisesãRustFuturessetTimeout
ãªã©ã®ä»ã®ããã·ã¥ããŒã¹ã®ã³ãŒã«ããã¯APIã«ãoneshot::channel
ã䜿çšããŸãã
Rustã®ã¡ã¢ãªã¢ãã«ã®ãããããã·ã¥ããŒã¹ã®Futureã¯ããã«ãšæ¯èŒããŠè¿œå ã®ããã©ãŒãã³ã¹ã³ã¹ããããããŸãã ãããã£ãŠãFutureã·ã¹ãã å
šäœãããã·ã¥ããŒã¹ã«ããã®ã§ã¯ãªããå¿
èŠãªå Žåã«ã®ã¿ïŒããšãã°ã oneshot::channel
ïŒãã®ããã©ãŒãã³ã¹ã³ã¹ããæ¯æãæ¹ãé©åã§ãã
ããã¯èšã£ãŠããç§ã¯ã³ã¢ããŒã ãã©ã³ã°ããŒã ã®äžå¡ã§ã¯ãªãã®ã§ãç§ãèšãããšã«ã¯äœã®æš©éããããŸããã ããã¯ç§ã®å人çãªæèŠã§ãã
å®éã«ã¯ããªãœãŒã¹ã«å¶çŽã®ããã³ãŒãã§ã¯ãã®éã§ãã ãã«ã¢ãã«ã«ã¯ããã«ãã£ããããŸããããã¯ãåŸ æ©äžã®é¢æ°ã®ã¹ã¿ãã¯ãä»ããŠæ¬¡ã®æºåå®äºå€ãäŸçµŠããã®ã§ã¯ãªãããã«ãããŠãããã®ã®å éšã«ãªãœãŒã¹ãå¿ èŠã«ãªãããã§ãã futures.rsã®èšèšã¯ããããã¯ãŒã¯ã¹ã€ããïŒç§ã®ãŠãŒã¹ã±ãŒã¹ïŒãã²ãŒã ã¬ã³ãã©ãŒãªã©ãããŒããŠã§ã¢ã«è¿ããã®ã«ã¯é«ãããã ãã§ãã
ãã ãããã®å Žåãããã§å¿ èŠãªã®ã¯ããžã§ãã¬ãŒã¿ãŒã®ããã«éåæã§åºåãããããšã ãã§ãã åã«èšã£ãããã«ã2ã€ã®ããŒã¯ãŒããåäžã®ã©ã€ãã©ãªã«ãã€ã³ãããã®ã§ã¯ãªããååã«æœè±¡åããã°ãéåæãšãžã§ãã¬ãŒã¿ã¯å®éã«ã¯åããã®ã ãšæããŸãã
ãã ãããã®å Žåãããã§å¿ èŠãªã®ã¯ããžã§ãã¬ãŒã¿ãŒã®ããã«éåæã§åºåãããããšã ãã§ãã
ãã®æç¹ã§ã®async
ã¯ãæåéããžã§ãã¬ãŒã¿ãªãã©ã«ã®æå°éã®ã©ãããŒã§ãã ãžã§ãã¬ãŒã¿ãŒãããã·ã¥ããŒã¹ã®éåæIOã«ã©ã®ããã«åœ¹ç«ã€ããç解ããã®ã«èŠåŽããŠããŸããããããã®CPSå€æãå¿
èŠã§ã¯ãããŸãããïŒ
ãåŒã£åŒµãããŠãããã®ã®äžã«ãªãœãŒã¹ãå¿
èŠã ããšã¯ã©ãããæå³ããå
·äœçã«æããŠãã ããã ãªããããå¿
èŠã«ãªãã®ãããŸãã¯ãåŸ
æ©äžã®é¢æ°ã®ã¹ã¿ãã¯ãä»ããŠæ¬¡ã®æºåå®äºå€ããã£ãŒãããããpoll()
ãšã©ã®ããã«ç°ãªãã®ãããããŸããã
ç§ã¯ãããã·ã¥ããŒã¹ã®å ç©ã¯ããé«äŸ¡ã§ããïŒãããã£ãŠãå¶çŽã®ããç°å¢ã§äœ¿çšããã®ã¯é£ããïŒãšããå°è±¡ãåããŸããã ä»»æã®ã³ãŒã«ããã¯ãfutureã«ã¢ã¿ããã§ããããã«ããã«ã¯ãäœããã®åœ¢åŒã®éæ¥åç §ïŒéåžžã¯ããŒãå²ãåœãŠïŒãå¿ èŠã§ãããã®ãããã«ãŒãfutureã«äžåºŠå²ãåœãŠãã®ã§ã¯ãªãããã¹ãŠã®ã³ã³ãããŒã¿ãŒã«å²ãåœãŠãŸãã ãŸããã¹ã¬ããã®å®å šæ§ã®åé¡ã«ãããã£ã³ã»ã«ãããè€éã«ãªãããããã£ã³ã»ã«ããµããŒãããªãããã¬ãŒã¹ãåé¿ããããã«ãã¹ãŠã®ã³ãŒã«ããã¯å®äºã§ã¢ãããã¯æäœã䜿çšããå¿ èŠããããŸãã ç§ãç¥ãéããããããã¹ãŠãåèšãããšããã¬ãŒã ã¯ãŒã¯ãæé©åããã®ãã¯ããã«å°é£ã«ãªããŸãã
ãããã®ããã«CPSå€æãå¿ èŠã§ã¯ãããŸãããïŒ
ãããçŸåšã®ãžã§ãã¬ãŒã¿ãŒæ§æã¯ç¶ç¶ã®åŒæ°ããªãããããã®ããã«ã¯æ©èœããŸããããã®ãããéåæããããè¡ãæ¹æ³ãããããããšãæãã§ããŸããã
åŒã£åŒµãããŠãããã®ã®äžã«ãªãœãŒã¹ãå¿ èŠã§ããïŒ
ããã¯ãéåæã®é åºã2åéã«ãããšã³ã¹ããããããšããç§ã®ã²ã©ãèšãæ¹ã§ãã ã€ãŸããããŒããŠã§ã¢ããå ç©ãžããããŠãã£ãã«ã䜿çšããŠåã³æ»ã£ãŠããŸãã ããŒããŠã§ã¢ã«è¿ãã³ãŒãã§ã¯ã¡ãªããããªããã®ãããããéã¶å¿ èŠããããŸãã
äžè¬çãªäŸã¯ããœã±ããã®ãã¡ã€ã«èšè¿°åã®æºåãã§ããŠããããšãããã£ãŠããå Žåã¯ãfutureã¹ã¿ãã¯ãåŒã³åºãããšã¯ã§ããŸãããã代ããã«ããã¹ãŠã®å®è¡ããžãã¯ãå®è£ ããŠãå®éã®ã€ãã³ããfutureã«ãããããå¿ èŠããããŸããããã«ã¯ãããã¯ãªã©ã®å€éšã³ã¹ããããããŸããã³ãŒããµã€ãºããããŠæãéèŠãªã®ã¯ã³ãŒãã®è€éãã
ä»»æã®ã³ãŒã«ããã¯ãfutureã«ã¢ã¿ããã§ããããã«ããã«ã¯ãäœããã®åœ¢ã®éæ¥åç §ãå¿ èŠã§ã
ã¯ããäžéšã®ç°å¢ã§ã¯ã³ãŒã«ããã¯ãé«äŸ¡ã§ããããšãç解ããŠããŸãïŒå®è¡é床ãé¢ä¿ãªãç§ã®ãã®ã§ã¯ãããŸããããåèšã¡ã¢ãªã1MBãªã®ã§ãfutures.rsã¯ãã©ãã·ã¥ã«ãé©åããŸããïŒãç¶ç¶ã®ãããªãã®ïŒçŸåšã®ãžã§ãã¬ãŒã¿ãŒã®æŠå¿µã¯ååå®è£ ãããŠããŸãïŒã
ãŸããã¹ã¬ããã»ãŒãã®ããããã£ã³ã»ã«ãããè€éã«ãªããŸã
ããã§ã¯æ··ä¹±ããŠãããšæããŸãã ç§ã¯ã³ãŒã«ããã¯ãæ¯æããŠããŸããã ç¶ç¶ã¯éçã¹ã¿ãã¯ã§ãåé¡ãããŸããã ããšãã°ãclayèšèªã§å®è£ ããã®ã¯ãããã·ã¥ãŸãã¯ãã«ã«äœ¿çšã§ããåãªããžã§ãã¬ãŒã¿ãŒãã¿ãŒã³ã§ãã ããªãã¡ïŒ
async fn add (a: u32) -> u32 {
let b = await
a + b
}
add(3).continue(2) == 5
ãã¯ãã§ãããç¶ããããšãã§ãããšæããŸãããããã§1ã€ã®ç¹å®ã®æŠå¿µã«èšèªããŒã¯ãŒãã浪費ããæ©äŒãéããããã«æããŸãã
å®è¡é床ãé¢ä¿ãªãç§ã®ãã®ã§ã¯ãããŸããããç§ã¯åèš1MBã®ã¡ã¢ãªãæã£ãŠããã®ã§ãfutures.rsã¯ãã©ãã·ã¥ã«ãé©åããŸãã
çŸåšã®å ç©ã¯ãã¡ã¢ãªã«å¶çŽã®ããç°å¢ã§å®è¡ããããšãç®çãšããŠãããšç¢ºä¿¡ããŠããŸãã äœããããªã«å€ãã®ã¹ããŒã¹ãå ããŠããã®ã§ããïŒ
ç·šéïŒãã®ããã°ã©ã ã¯ãã³ã³ãã€ã«æã«295KBã®ãã£ã¹ã¯ã¹ããŒã¹ãå¿ èŠãšããŸã-ç§ã®MacBookã§ãªãªãŒã¹ããŸãïŒåºæ¬çãªhello worldã¯273KBãå¿ èŠãšããŸãïŒïŒ
use futures::{executor::LocalPool, future};
fn main() {
let mut pool = LocalPool::new();
let hello = pool.run_until(future::ready("Hello, world!"));
println!("{}", hello);
}
å®è¡é床ãé¢ä¿ãªãç§ã®ãã®ã§ã¯ãããŸããããç§ã¯åèš1MBã®ã¡ã¢ãªãæã£ãŠããã®ã§ãfutures.rsã¯ãã©ãã·ã¥ã«ãé©åããŸãã
çŸåšã®å ç©ã¯ãã¡ã¢ãªã«å¶çŽã®ããç°å¢ã§å®è¡ããããšãç®çãšããŠãããšç¢ºä¿¡ããŠããŸãã äœããããªã«å€ãã®ã¹ããŒã¹ãå ããŠããã®ã§ããïŒ
ãŸããèšæ¶ãšã¯ã©ãããæå³ã§ããïŒ 128kBãã©ãã·ã¥/ 16kBRAMãæèŒããããã€ã¹ã§çŸåšã®éåæ/åŸ æ©ããŒã¹ã®ã³ãŒããå®è¡ããŸããã çŸåšãasync / awaitã«ã¯ç¢ºãã«ã¡ã¢ãªäœ¿çšã®åé¡ããããŸããããããã¯äž»ã«å®è£ ã®åé¡ã§ãããããã€ãã®æé©åãè¿œå ããããšã§æ¹åã§ããŸãïŒhttps://github.com/rust-lang/rust/issues/52924ãªã©ïŒã
äžè¬çãªäŸã¯ããœã±ããã®ãã¡ã€ã«èšè¿°åã®æºåãã§ããŠããããšãããã£ãŠããå Žåã¯ãfutureã¹ã¿ãã¯ãåŒã³åºãããšã¯ã§ããŸãããã代ããã«ããã¹ãŠã®å®è¡ããžãã¯ãå®è£ ããŠãå®éã®ã€ãã³ããfutureã«ãããããå¿ èŠããããŸããããã«ã¯ãããã¯ãªã©ã®å€éšã³ã¹ããããããŸããã³ãŒããµã€ãºããããŠæãéèŠãªã®ã¯ã³ãŒãã®è€éãã
ã©ãããŠïŒ ããã¯ãŸã å
ç©ãããªãã匷å¶ãããã®ã®ããã«ã¯èŠããŸããã ããã·ã¥ããŒã¹ã®ã¡ã«ããºã ãšåããããç°¡åã«poll
ãåŒã³åºãããšãã§ããŸãã
ãŸããèšæ¶ãšã¯ã©ãããæå³ã§ããïŒ
ããã¯é¢ä¿ãªããšæããŸãã ãã®è°è«å šäœã§ã¯ãç§ãæå³ããŠããªãã£ãç¹ãç¡å¹ã«ããããšã«ã€ããŠè©³ãã説æããŸããã ç§ã¯ããã®èšèšãã³ã¢èšèªã«çµã¿èŸŒãã®ã¯ééãã§ãããšèšã以å€ã«ãæªæ¥ãæ¹å€ããããã«ããã«ããããã§ã¯ãããŸããã
ç§ã®ãã€ã³ãã¯ãasyncããŒã¯ãŒããé©åã«å®è¡ãããã°ãå°æ¥ã®èšŒæ ãšãªãå¯èœæ§ããããšããããšã§ãã ç¶ç¶ã¯ç§ãæããã®ã§ãããããããä»ã®äººã ãããã«è¯ãã¢ã€ãã¢ãæãä»ãã§ãããã
ããã·ã¥ããŒã¹ã®ã¡ã«ããºã ãšåããããç°¡åã«pollãåŒã³åºãããšãã§ããŸãã
ã¯ãã FutureïŒpollãargsãåŒã³åºããŠããã°ãããã¯çã«ããªã£ãŠããŸãã æ祚ã¯æœè±¡çã§ããå¿ èŠããããããããããå«ããããšã¯ã§ããŸããã 代ããã«ãasyncããŒã¯ãŒãããç¶ç¶ãçºè¡ããåŒæ°ããŒãã®ç¶ç¶ã«å¯ŸããŠFutureãå®è£ ããããšãææ¡ããŠããŸãã
ããã¯ã·ã³ãã«ã§æéã®ããããªãå€æŽã§ãããå ç©ã«ã³ã¹ãããããããšã¯ãããŸããããçŸåš1ã€ã®ã©ã€ãã©ãªå°çšã®ããŒã¯ãŒããåå©çšã§ããŸãã
ãã ããç¶ç¶ã¯ãã¡ããããªããã»ããµã䜿çšããŠå®è£ ããããšãã§ããŸãããããå®è¡ããŸãã æ®å¿µãªãããè±ç³ã¯ééã«ããããé©åãªç¶ç¶ãããè²»çšãããããŸãã
@aepããŒã¯ãŒãïŒ async
ããã³await
ïŒãåå©çšã§ããããã«ããã«ã¯ã©ãããã°ããã§ããïŒ
@Centrilç§ã®çŽ æŽãªã¯ã€ãã¯ãã£ãã¯ã¹ã¯ãFutureã§ã¯ãªãGeneratorãžã®éåæãäžããããšã§ãã ããã«ãããå ç©å°çšã®ããã¯ãšã³ãã§ã¯ãªãããžã§ãã¬ãŒã¿ãŒãé©åãªç¶ç¶ã«åœ¹ç«ã€ããã«ããæéãã§ããŸãã
ãã¶ã10è¡ã®PRã®ããã§ãã ããããç§ã¯ãããããã£ãŠããããã®å·£ç®±ãšæŠãå¿èåããªãã®ã§ãå¥ã®ããŒã¯ãŒããè±ç³ããããã®ååŠçãäœæããŸãã
ç§ã¯éåæã®ãã®ããã©ããŒããŠããªãã®ã§ãããã以å/ä»ã®å Žæã§è°è«ãããŠããå Žåã¯ãè©«ã³ããŸãããéåæããµããŒãããããã®ïŒå®è£
ïŒèšç»ã¯äœã§ãã/ no_std
ãŸããïŒ
AFAICTçŸåšã®å®è£
ã§ã¯TLSã䜿çšããŠWakerãæž¡ããŸããã no_std
/ core
ã¯TLSïŒãŸãã¯ã¹ã¬ããïŒã®ãµããŒãã¯ãããŸããã @alexcrichtonããã Generator.resume
ãåŒæ°ã®ãµããŒããååŸããå ŽåãTLSãåé€ã§ããå¯èœæ§ããããšèããŸããã
éåæã®å®å®åããããã¯ããèšç»/å®è£
ãããŠããno_std
ãµããŒããåŸ
ã€èšç»ã¯ãããŸããïŒ ãŸãã¯ã std
async / await on stableãåºè·ããããã«å®å®åãããéšåãå€æŽããã«ã no_std
ãµããŒããè¿œå ã§ãããšç¢ºä¿¡ããŠããŸããïŒ
@japaric poll
ã¯ãã³ã³ããã¹ããæ瀺çã«ååŸããããã«ãªããŸããã AFAIKãTLSã¯ããå¿
èŠãããŸããã
https://doc.rust-lang.org/nightly/std/future/trait.Future.html#tymethod.poll
ç·šéïŒasync / awaitã«ã¯é¢ä¿ãªããå ç©ã«ã®ã¿é¢ä¿ããŸãã
[...]
std
async / await on stableãåºè·ããããã«å®å®åãããéšåãå€æŽããã«ãno_std
ãµããŒããè¿œå ã§ãããšç¢ºä¿¡ããŠããŸããïŒ
ç§ã¯ããä¿¡ããŠããŸãã é¢é£ããéšåã¯std::future
ã®é¢æ°ã§ããããããã¯ãã¹ãŠãå®å®åãããããšã®ãªãè¿œå ã®gen_future
äžå®å®ãªæ©èœã®èåŸã«é ãããŠããŸãã async
ãã©ã³ã¹ãã©ãŒã ã¯set_task_waker
ã䜿çšããŠãŠã§ã€ã«ãŒãTLSã«æ ŒçŽãã await!
ã¯poll_with_tls_waker
ã䜿çšããŠã¢ã¯ã»ã¹ããŸãã ãžã§ãã¬ãŒã¿ãŒãã¬ãžã¥ãŒã åŒæ°ã®ãµããŒããååŸããå Žåã代ããã«async
ãã©ã³ã¹ãã©ãŒã ã¯ãŠã§ã€ã«ãŒãã¬ãžã¥ãŒã åŒæ°ãšããŠæž¡ãããšãã§ãã await!
ã¯ãããåŒæ°ããèªã¿åãããšãã§ããŸãã
ç·šéïŒãžã§ãã¬ãŒã¿ãŒã®åŒæ°ããªããŠããããã¯éåæå€æã®å°ãè€éãªã³ãŒãã§ãå®è¡ã§ãããšæããŸãã å人çã«ã¯ãä»ã®ãŠãŒã¹ã±ãŒã¹ã«ãžã§ãã¬ãŒã¿ãŒåŒæ°ãè¿œå ããŠãããããã®ã§ãããTLSèŠä»¶ã®æç¡ã«ãããããåé€ã§ãããšç¢ºä¿¡ããŠããŸãã
@japaricåãããŒãã 誰ããå ç©ãçµã¿èŸŒã¿ã§åäœããããšããŠãããã®ãã¹ãŠã®Tier3以æ¥ãããã¯éåžžã«å±éºã§ãã
éåæãä¿®æ£ãããããã¯ããã«å°ãªãäœæ¥ã§æžãéãããã¯ãèŠã€ããŸããïŒã¢ãŒã¯ã§ç¹ããŸã
çæ³çã«ã¯ãFutureã§ã¯ãªããçŽç²ãªãã¯ããŒãžã£ãŒã¹ã¿ãã¯ã«éåæãäžããã ããªã®ã§ãå®è¡æã®ä»®å®ã¯å¿ èŠãªããã«ãŒãã§åŒæ°ãšããŠäžçŽãªç°å¢ãããã·ã¥ã§ããŸãã
ç§ã¯ãããå®è£ ããéäžã§ãã
https://twitter.com/arvidep/status/1067383652206690307
ããããç§ã ãããããæãã§ããã®ãªãããã£ãšè¡ãã®ã¯ç¡æå³ã§ãã
ãããŠããžã§ãã¬ãŒã¿ãŒåŒæ°ãªãã§TLSãªãã®éåæ/åŸ
æ©ãå¯èœãã©ããã«ã€ããŠèããã®ããããããšãã§ããªãã£ãã®ã§ã no_std
proc-macroããŒã¹ã®async_block!
/ await!
ãã¯ããã¢ãå®è£
ããŸããããŒã«ã«å€æ°ã®ã¿ã䜿çšããŸãã
çŸåšã®TLSããŒã¹ã®ãœãªã¥ãŒã·ã§ã³ããžã§ãã¬ãŒã¿ãŒåŒæ°ããŒã¹ã®ãœãªã¥ãŒã·ã§ã³ãããã¯ããã«åŸ®åŠãªå®å šæ§ã®ä¿èšŒãå¿ èŠã§ãïŒå°ãªããšããåºç€ãšãªããžã§ãã¬ãŒã¿ãŒåŒæ°ãå¥å šã§ãããšä»®å®ããå ŽåïŒããããã¯å¥å šã§ãããšç¢ºä¿¡ããŠããŸãïŒèª°ãããªãéãïŒåé¿çãèŠã€ããããšãã§ããªãã£ãããªã倧ããªè¡çããŒã«ã䜿çšããŸããããã¯ãååã®ãªãgensym identã䜿çšããŠéåæå€æãšåŸ æ©ãã¯ãã®éã§éä¿¡ã§ãããããã³ã³ãã€ã©å ã®å®è£ ã§ã¯åé¡ã«ãªããŸããïŒã
OPã§await!
ãstd
ããcore
ã«ç§»åããããšã«ã€ããŠã®èšåããªãããšã«æ°ã¥ããŸãããããããã远跡ããããã®å®å®åã®åã«ã解決ããåé¡ã®ãªã¹ãã«ïŒ56767ãè¿œå ã§ããŸããããã
@ Nemo157 await!
ã¯å®å®åããããšãæåŸ
ãããŠããªãã®ã§ããšã«ãããããã«ãŒã§ã¯ãããŸããã
@Centril誰ãããªãã«await!
ãå®å®ããããšã¯æåŸ
ãããŠããªããšèšã£ãã®ãããããŸãã...ïŒwinkïŒ
@cramertj圌ã¯ãç§ãä¿¡ããŠããããŒã¯ãŒãããŒãžã§ã³ã§ã¯ãªãããã¯ãããŒãžã§ã³ãæå³ããŠããŸãã...
@ crlf0710æé»ã®await /æ瀺çãªéåæãããã¯ããŒãžã§ã³ã«ã€ããŠã¯ã©ãã§ããïŒ
@ crlf0710ç§ããã£ã:)
@cramertjçŸåšãã³ã³ãã€ã©ã«await
ãšawait!
ã®äž¡æ¹ã®ååšãå¯èœã«ããéãããã¯ãããã®ã§ããã¯ããåé€ããããªãã§ããïŒ ãã¯ããå®å®ããããšããã¯ããåé€ã§ããªããªããŸãã
@stjepang await!
ã®æ§æã«ã€ããŠã¯ãåŸçœ®è¡šèšã®äžè¬çãªå¥œã¿ãããããŸãããçºé³ã§ããªã/ Googleã§äœ¿çšã§ããªãèšå·ãå«ããªããšãé€ãã°ãããŸãæ°ã«ããŸããã ç§ã®ç¥ãéããçŸåšã®ææ¡ïŒåªå
é äœãæ確ã«ããããã«?
ã䜿çšïŒã¯æ¬¡ã®ãšããã§ãã
await!(x)?
ïŒä»æ¥ãããã®ïŒawait x?
ïŒ await
�
ãããç·å¯ã«ãã€ã³ããããŸãããããã§ããã¬ãã£ãã¯ã¹è¡šèšã§ãããã¡ãœããããã§ãŒã³ããããã®æ¬åŒ§ãå¿
èŠã§ãïŒawait {x}?
ïŒäžèšãšåãã§ãããææ§ãã解æ¶ããããã«äžæçã«{}
ãå¿
èŠã§ãïŒawait? x
ïŒ await
ã¯ããŸãç·å¯ã«ãã€ã³ããããŸããããããã§ããã¬ãã£ãã¯ã¹è¡šèšãå¿
èŠã§ãã¡ãœããããã§ãŒã³ããããã®æ¬åŒ§ãå¿
èŠã§ãïŒx.await?
ïŒãã£ãŒã«ãã¢ã¯ã»ã¹ã®ããã«èŠããŸãïŒx#
/ x~
/ãªã©ã ïŒããã€ãã®èšå·ïŒx.await!()?
ïŒpostfix-macro-styleã @ withoutboatsãšç§ã¯ããããä»ã®äººã¯postfix-macrosãã¡ã³ã§ã¯ãªããšæããŸãããªããªã圌ãã¯.
ãã¿ã€ãããŒã¹ã®ãã£ã¹ããããèš±å¯ããããšãæåŸ
ããŠããããã§ãã ïŒãé
éãžã®æåã®ã«ãŒãã¯ã await!(x)
ãçéžããã await
ããŒã¯ãŒãåãããæçµçã«ã¯åŸçœ®ãã¯ãã®çŽ æŽãããã人ã
ã«å£²ãã x.await!()
ãè¿œå ã§ããããã«ããããšã ãšæããŸãã
ç§ã¯ãã®åé¡ãéåžžã«å€§ãŸãã«ãã©ããŒããŠããŸãããããã«ç§ã®æèŠããããŸãïŒ
å人çã«ã¯ã await!
ãã¯ãããã®ãŸãŸã§ãããã§èª¬æãããŠããããã«æ°ã«å
¥ã£ãŠããŸãïŒ https ïŒ
ããã¯ãéæ³ãæ°ããæ§æã§ã¯ãªããéåžžã®ãã¯ãã§ãã çµå±ã®ãšãããå°ãªãã»ã©å€ããªããŸãã
ãã®åŸãåã³ãç§ã¯ãŸãã奜é©try!
éãã Try
ããŸã å®å®ããŠããŸããã ãã ãã await!(x)?
ã¯ãç ç³ãšæçœãªååä»ãã¢ã¯ã·ã§ã³ã®éã®é©åãªåŠ¥åç¹ã§ãããããŸãæ©èœãããšæããŸãã ããã«ããããã°ãã¬ãŒã¹ãªã©ã®è¿œå æ©èœãåŠçããããã«ããµãŒãããŒãã£ã©ã€ãã©ãªå
ã®ä»ã®ãã¯ãã«çœ®ãæããããå¯èœæ§ããããŸãã
äžæ¹ã async
/ yield
ã¯ããžã§ãã¬ãŒã¿ãŒã«ãšã£ãŠãåãªããã·ã³ã¿ãã¯ã¹ã·ã¥ã¬ãŒã§ãã JavaScriptãéåæ/åŸ
æ©ãµããŒããååŸããŠããŠãéåæã³ãŒãããã©ã³ã¹ãã€ã«ããŠãžã§ãã¬ãŒã¿ãŒãšPromises / Futuresãéåææäœã«äœ¿çšããBabelãRegeneratorã®ãããªãããžã§ã¯ãããã£ãæ代ãæãåºããŸããããã¯ãåºæ¬çã«ç§ãã¡ãè¡ã£ãŠããããšãšåãã§ãã
æçµçã«ã¯ãéåæãšãžã§ãã¬ãŒã¿ãŒãå¥åã®æ©èœã«ããæœåšçã«ã¯çžäºã«æ§æå¯èœã«ããïŒ Stream
ãçæããïŒå¿
èŠãããããšã«æ³šæããŠãã ããã await!
ãyield
äžãããã¯ããšããŠæ®ãããšã¯ãæ°žç¶çãªè§£æ±ºçã§ã¯ãããŸããã
åŸ ã£ãŠãŸãïŒ ãã äœäžããŠæ©çãŸããäžãããã¯ãã¯ãæä¹ çãªè§£æ±ºçã§ã¯ãããŸããã
yield
ã«äžããããšããŠãŒã¶ãŒã«æ°žç¶çã«è¡šç€ºããããšã¯ã§ããŸãããããã®ããã«å®è£
ãç¶ããããšã¯ã§ããŸãã éåæ+ãžã§ãã¬ãŒã¿ãŒ= Stream
å Žåã§ããããšãã°yield Poll::Pending;
ãšyield Poll::Ready(next_value)
ãŸãã
æçµçã«ã¯ãéåæãšãžã§ãã¬ãŒã¿ãŒãå¥åã®æ©èœã«ããå¿ èŠãããããšã«æ³šæããŠãã ãã
éåæãšãžã§ãã¬ãŒã¿ãŒã¯å¥åã®æ©èœã§ã¯ãããŸãããïŒ ãã¡ããé¢é£ããŠããŸããããããJavaScriptã®ããæ¹ãšããäžåºŠæ¯èŒãããšãéåæã¯ãžã§ãã¬ãŒã¿ãŒã®äžã«æ§ç¯ããããšãã€ãæã£ãŠããŸããã éåæé¢æ°ã§ããå¯äžã®éãã¯ãéåžžã®å€ãšã¯å¯Ÿç
§çã«ã Future
ãè¿ããçæããããšã§ãã ãšã°ãŒãã¥ãŒã¿ã¯ãéåæé¢æ°ãå®è¡ãããã®ãè©äŸ¡ããŠåŸ
æ©ããå¿
èŠããããŸãã ããã«å ããŠãç§ã«ã¯ããããªãããã€ãã®äœåãªç涯ã®ãã®ã
å®éãç§ã¯ãã€ãŠãã®æ£ç¢ºãªããšã«ã€ããŠã©ã€ãã©ãªãäœæããPromises / Futuresãè¿ãéåæé¢æ°ãšãžã§ãã¬ãŒã¿é¢æ°ã®äž¡æ¹ãååž°çã«è©äŸ¡ããŸããã
@cramertj 2ã€ãå¥åã®ãå¹æãã§ããå Žåããã®ããã«å®è£
ããããšã¯ã§ããŸããã ããã«é¢ããããã€ãã®è°è«ãããã«ãããŸãïŒ https ïŒ yield Poll::Ready(next_value)
ã¯å¿
èŠãããŸããã yield next_value
ããåãé¢æ°ã®ä»ã®å Žæã«await
ãŸãã
@rpjohnst
Poll :: ReadyïŒnext_valueïŒãçæããããªãã®ã§ãnext_valueãçæãããã®ã§ãåãé¢æ°ã®ä»ã®å Žæã§åŸ æ©ããŸãã
ã¯ãããã¡ããããã¯ãŠãŒã¶ãŒã«ã¯ã©ã®ããã«èŠãããã§ãããè±ç³ã«é¢ããŠã¯ã yield
ãPoll::Ready
ã§ã©ãããã Poll::Pending
ãè¿œå ããã ãã§ãã yield
ããçæawait!
ã æ§æçã«ã¯ããšã³ããŠãŒã¶ãŒã«ã¯åå¥ã®æ©èœãšããŠè¡šç€ºãããŸãããã³ã³ãã€ã©ãŒã§å®è£
ãå
±æããããšã¯ã§ããŸãã
@cramertjãããïŒ
await? x
@novacrazyã¯ãããããã¯å¥åã®æ©èœã§ãããäžç·ã«æ§æå¯èœã§ããå¿ èŠããããŸãã
ãããŠå®éãJavaScriptã§ã¯ãããã¯æ§æå¯èœã§ãïŒ
https://thenewstack.io/whats-coming-up-in-javascript-2018-async-generators-better-regex/
ãéåæãžã§ãã¬ãŒã¿ãŒãšã€ãã¬ãŒã¿ãŒã¯ãéåæé¢æ°ãšã€ãã¬ãŒã¿ãŒãçµã¿åããããšãã«åŸããããã®ã§ãããããåŸ æ©ã§ããéåæãžã§ãã¬ãŒã¿ãŒããçæã§ããéåæé¢æ°ã®ãããªãã®ã§ãããšåœŒã¯èª¬æããŸããã 以åã¯ãECMAScriptã䜿çšãããšãè²æ©ãŸãã¯åŸ æ©ã§ããé¢æ°ãäœæã§ããŸããããäž¡æ¹ãäœæããããšã¯ã§ããŸããã§ããã ãããã¯ãç¹ã«Fetchãªããžã§ã¯ããã¹ããªãŒã ãå ¬éããå Žåã«ãWebãã©ãããã©ãŒã ã®äžéšã«ãªãã€ã€ããã¹ããªãŒã ãæ¶è²»ããã®ã«éåžžã«äŸ¿å©ã§ããã
éåæã€ãã¬ãŒã¿ã¯Observableãã¿ãŒã³ã«äŒŒãŠããŸãããããæè»æ§ããããŸãã ãObservableã¯ããã·ã¥ã¢ãã«ã§ãã 賌èªãããšãæºåãã§ããŠãããã©ããã«é¢ä¿ãªããã€ãã³ããéç¥ãå šéåã§ççºããããããããã¹ãã«å¯ŸåŠããããã«ãããã¡ãªã³ã°ãŸãã¯ãµã³ããªã³ã°æŠç¥ãå®è£ ããå¿ èŠããããŸãããšTerlsonæ°ã¯èª¬æããŸãã éåæã€ãã¬ãŒã¿ã¯ããã·ã¥ãã«ã¢ãã«ã§ãããå€ãèŠæ±ãããšå€ãéä¿¡ãããŸããããã¯ããããã¯ãŒã¯IOããªããã£ããªã©ã«é©ããŠããŸãã
@Centril okããªãŒãã³ïŒ56974ãããã¯æªè§£æ±ºã®è³ªåãšããŠOPã«è¿œå ãããã®ã«ååæ£ããã§ããïŒ
await
æ§æã®ãã€ã¯ã·ã§ããã«åã³å
¥ããããªãã®ã§ãããå°ãªããšã1ã€ã®ãã€ã³ãã«å¿çããå¿
èŠããããŸãã
å人çã«ã¯ã
await!
ãã¯ãããã®ãŸãŸã§ãããã§èª¬æãããŠããããã«æ°ã«å ¥ã£ãŠããŸãïŒ https ïŒ
ãŸãã次ã®çç±ãæ¡åŒµããããã«ããã¯ããã©ã€ãã©ãªã«å®è£ ããããã¯ãã®ãŸãŸã§ãããšã¯æããªããšè¿°ã¹ãããšã«ã泚æããŠãã ããïŒãŠãŒã¶ãŒã«ãã¯ããšããŠè¡šç€ºããç¶ãããã©ããã¯ç¡èŠããŸãïŒã
|| await!()
ã䜿çšããŠãžã§ãã¬ãŒã¿ãŒãäœæã§ãããšè¿°ã¹ãŠãããããåºç€ãšãªãå®è£
ãé衚瀺ã«ããŸããyield
ã«ãã£ãŠè¿œå ãããawait
ãšããŠãŒã¶ãŒã«ãã£ãŠäœæãããä»ã®yield
åºå¥ããå¿
èŠããããŸãã ããã¯_if_ããŠãŒã¶ãŒããããã£ãããšã¯ãããŸãããäºåã«ãã¯ãå±éã®æ®µéãšããŠè¡ãããš_could_ yield
ãã¯ãã®å
éšããéåžžã«äŸ¿å©ãããyield
ã®ãããª-in-ãã¯ãæ§é yield_from!
ã ãã¯ãå
ã®yield
ãµããŒãããå¿
èŠããããšããå¶çŽããããããããã«ã¯å°ãªããšãawait!
ãçµã¿èŸŒã¿ãã¯ãã§ããå¿
èŠããããŸãïŒå®éã®æ§æã§ãªãå ŽåïŒãno_std
async fn
ããµããŒãããŸãã ç§ã¯ãããå®è£
ãã2ã€ã®æ¹æ³ãç¥ã£ãŠããŸããã©ã¡ãã®æ¹æ³ã§ãããŠã§ã€ã«ãŒãæ ŒçŽãããŠããèå¥åãå
±æããããã«async fn
-created- Future
ãšawait
ãå¿
èŠã§ããäž¡æ¹ãã³ã³ãã€ã©ã«å®è£
ãããŠããå Žåãããã2ã€ã®å Žæã§è¡ççã«å®å
šãªèå¥åãå
±æãããŠããããšãããããŸããããã«ã¯å°ãæ··ä¹±ããããšæããŸãã await!
ãyield
åŒã³åºãã®ã©ãããŒã«å
¬éããŠæ¡åŒµã§ããããã«ããããšã¯ã決ããŠæå³ãããŠããŸããyield
ã await!
ãã¯ãã®ãããªæ§æã®å°æ¥ã¯ãçŸåšã®ã³ã³ãã€ã©ã§ãµããŒããããŠããcompile_error!
ã assert!
ã format_args!
ãªã©ã®å®è£
ãšåãããã«å®è£
ã«äŸåããŸããã³ã³ããã¹ãã«å¿ããŠãç°ãªãã³ãŒãã«ãã·ã¥ã¬ãŒããããšãã§ããŸãã
ããã§ç解ããå¿ èŠãããå¯äžã®éèŠãªç¹ã¯ãææ¡ãããæ§æã®ãããã«ãæå³äžã®å€§ããªéãã¯ãªããšããããšã§ãããããã¯åãªãè¡šé¢æ§æã§ãã
await
æ§æã解ãããã®ä»£æ¿æ¡ãæžããŸãã
ãŸã第äžã«ãç§ã¯await
ãæ¥å°ŸèŸæŒç®åãšããŠçœ®ããšããèãã奜ãã§ãã ãããããã§ã«ææããããã«ã expression.await
ã¯ãã£ãŒã«ãã«éåžžã«äŒŒãŠããŸãã
ã ããç§ã®ææ¡ã¯expression awaited
ã§ãã ããã§ã®æ¬ ç¹ã¯ã awaited
ããŸã ããŒã¯ãŒããšããŠä¿åãããŠããªãããšã§ãããè±èªã§ã¯ããèªç¶ã§ãããRustã§ã¯ãã®ãããªè¡šçŸïŒã€ãŸãã expression [token]
ãããªææ³åœ¢åŒïŒã¯æå¹ã§ã¯ãããŸãããä»ã®ãšãããããã¯æ£åœåã§ããŸãã
ãã®åŸãæã
ã¯æžãããšãã§ããexpression? awaited
åŸ
ã€ããã«Result<Future,_>
ãããã³expression awaited?
åŸ
ã€ããã®Future<Item=Result<_,_>>
ã
@earthengine
ç§ã¯awaited
ããŒã¯ãŒãã§å£²ãããŠããŸããããããªãã¯äœãã«èå³ããããšæããŸãã
ããã§ã®éèŠãªæŽå¯ã¯æ¬¡ã®ãšããã§ãã yield
ãšawait
ã¯return
ãš?
ã§ãã
return x
ã¯å€x
return x
è¿ããŸããã x?
çµæx
ã¢ã³ã©ãããã Err
ã®å Žåã¯æ©æã«æ»ããŸãã
yield x
ã¯å€x
yield x
çæããŸããã x awaited
ã¯å°æ¥ã®x
ã Pending
ã®å Žåã¯æ©æã«æ»ããŸãã
ããã«ã¯çŽ æŽããã察称æ§ããããŸãã ããããawait
å®éã«ã¯æ¥å°ŸèŸæŒç®åã§ããå¿
èŠããããŸãã
let x = x.do_something() await.do_another_thing() await;
let x = x.foo(|| ...).bar(|| ... ).baz() await;
@cramertjã瀺ããæ£ç¢ºãªçç±ãããç§ã¯åŸawait!
/ await
ããã«ãã¹ãããæèŠã¯ãããŸããã ?
ã®ãããªåçŽãã¯ãªããæ¥å°ŸèŸæŒç®åã«äœ¿çšããèšå·ãäžè¶³ããŠããŸã...
å人çã«ã¯ãåã«èª¬æããçç±ãããç§ã¯ãŸã await!
ãæ¯æããŠããŸãã ããã¯ãã³ãæãã§ããã³ã»ã³ã¹ã§ã¯ãããŸããã
ç¹ã«é·ãåŒãé£éåŒã®å Žåãå šäœçãªèªã¿ããããäœäžããŸãã
RustfmtèŠæ Œã§ã¯ãäŸãèšè¿°ããŸãã
let x = x.do_something() await
.do_another_thing() await;
let x = x.foo(|| ...)
.bar(|| ...)
.baz() await;
ãããèªã¿ãããã«ã©ã®ããã«åœ±é¿ãããã¯ã»ãšãã©ããããŸããã
postfixawaitã奜ãã§ãã ã¹ããŒã¹ã䜿ãã®ã¯çããã粟ç¥çãªã°ã«ãŒãåãå£ãåŸåããããšæããŸãã ãã ãã .await!()
ã¯ããŸããã¢ã«ãªãã ?
ã¯åãŸãã¯åŸã®ããããã«é©åãã !
ã¯å¶åŸ¡ãããŒã®çžäºäœçšãå¯èœã«ãããšæããŸãã
ïŒããã«ã¯ãå®å
šã«äžè¬çãªåŸçœ®ãã¯ãã¡ã«ããºã ã¯å¿
èŠãããŸãããã³ã³ãã€ã©ãŒã¯ãç¹å¥ãªå Žåã«.await!()
ãŸããïŒ
æ¥å°ŸèŸawait
ïŒ .
ãŸãã¯()
ïŒã¯ããªãå¥åŠã«èŠããã®ã§ãç§ã¯æ¬åœã«åŒ·ãå«ãã«ãªããŸããawait
ä»ã®èšèªããæ¥ã人ã
ã¯ç§ãã¡ã®ç¢ºãã«è²»çšã ããã¯ç§ãã¡ãçå£ã«åãæ¢ããªããã°ãªããªãã³ã¹ãã§ãã ãã ãã x await
ã¯æããã«é¢æ°åŒã³åºãããã£ãŒã«ãã¢ã¯ã»ã¹ã§ã¯ãªãïŒ x.await
/ x.await()
/ await(x)
ãã¹ãŠãã®åé¡ããããŸãïŒããã¡ã³ããŒãªãã®ã¯å°ãªããªããŸãåªå
é äœã®åé¡ã ãã®æ§æã¯ã ?
ãšã¡ãœããã¢ã¯ã»ã¹ã®åªå
é äœãæ確ã«è§£æ±ºããŸããããšãã°ã foo await?
ãšfoo? await
ã©ã¡ããã foo await?.x
ãšfoo await?.y
ãšåæ§ã«ãæ確ãªåªå
é äœãæã£ãŠããŸãã
ç§ãããæããŸã
stream.for_each(async |item| {
...
}) await;
ããããèªã
await!(stream.for_each(async |item| {
...
});
å šäœãšããŠãç§ã¯ãããæ¯æããã§ãããã
@joshtriplett RE .await!()
åå¥ã«è©±ãåãå¿
èŠããããŸã-æåã¯ããã«ãè³æã§ããããäžè¬çã«postfixãã¯ããååŸã§ããªãå Žåã¯ããããçéžãããã¹ãã§ã¯ãªããšæããŸãã圌ãã«å¯ŸããŠã¯ããªãã®å察ãããïŒæ®å¿µãªçç±ã¯ãããŸããïŒã await
å®å®åã劚ããªãããã«ããããšæããŸãã
ãªãäž¡æ¹ã§ã¯ãªãïŒ
macro_rules! await {
($e:expr) => {{$e await}}
}
ç§ã¯ä»ãpostfixã®é åãããããç解ããŠãããããã€ãã®ã·ããªãªã§ã¯ããããã£ãšå¥œãã«ãªãããšã«åœå¢ãæ¥ããŠããŸãã ç¹ã«äžèšã®ããŒãã§ã¯ãRustèªäœãæäŸããå¿ èŠãããªãã»ã©åçŽã§ãã
ãããã£ãŠãåŸçœ®ã®å Žåã¯+1ã§ãã
åŸçœ®ããŒãžã§ã³ã«å ããŠãå眮æ©èœãå¿ èŠã ãšæããŸãã
åŸçœ®æ§æã®è©³çŽ°ã«ã€ããŠã¯ã .await!()
ãå¯äžã®å®è¡å¯èœãªåŸçœ®æ§æã§ãããšèšã£ãŠããã®ã§ã¯ãããŸããã ç§ã¯å
é ã«ã¹ããŒã¹ãããpostfix await
ãã¡ã³ã§ã¯ãããŸããã
1è¡ã«1ã€ã®ã¹ããŒãã¡ã³ãã䜿çšããŠãã©ãŒãããããå Žåã¯ïŒãŸã çããã§ããïŒåé¡ãªãããã«èŠããŸããã1è¡ã«åçŽãªã¹ããŒãã¡ã³ãããã©ãŒãããããå Žåã¯ã¯ããã«åççã§ã¯ãããŸããã
postfixããŒã¯ãŒãæŒç®åãæ°ã«å
¥ããªãå Žåã¯ã await
é©åãªèšå·æŒç®åãå®çŸ©ã§ããŸãã
ä»ã®ãšãããæ¥å°ŸèŸæŒç®åã®åçŽãªASCIIæåã®æŒç®åãäžè¶³ããŠããŸããã ããããã©ãã§ãã
let x = do_something()â.do_somthing_else()â;
ãã¬ãŒã³ASCIIãæ¬åœã«å¿ èŠãªå Žåã¯ãïŒäžèšã®åœ¢ç¶ã«è§ŠçºãããŠïŒæãã€ããã
let x = do_something()><.do_somthing_else()><;
ãŸãã¯ïŒæ°Žå¹³äœçœ®ã§ã®é¡äŒŒåœ¢ç¶ïŒ
let x = do_something()>=<.do_somthing_else()>=<;
ãã1ã€ã®ã¢ã€ãã¢ã¯ã await
æ§é äœãè§ãã£ãã«ããããšã§ãã
let x = >do_something()<.>do_something_else()<;
ããããã¹ãŠã®ASCIIãœãªã¥ãŒã·ã§ã³ã¯ã <..>
ããã§ã«é床ã«äœ¿çšãããŠãããšããåãåæ Œã®åé¡ãå
±æããŠããã <
ãš>
解æã®åé¡ããããŸãã ãã ãã ><
ãŸãã¯>=<
ã¯ãæŒç®åå
ã«ã¹ããŒã¹ãå¿
èŠãšãããçŸåšã®äœçœ®ã«éããŠãã<
ããªããããããã«é©ããŠããå ŽåããããŸãã
éã«ã¹ããŒã¹ãæ°ã«å ¥ããªãããåŸçœ®ããŒã¯ãŒãæŒç®åã¯åé¡ãªãå Žåã¯ããã€ãã³ã䜿çšããŠãã ããã
let x = do_something()-await.do_something_else()-await;
åãã³ãŒããæžãããã®å€ãã®ç°ãªãæ¹æ³ãããããšã«ã€ããŠãç§ã¯å人çã«ããã奜ãã§ã¯ãããŸããã åããŠã®äººã«ãšã£ãŠããããæ£ããæ¹æ³ãŸãã¯ãããæã£ãŠããããšã®ãã€ã³ããäœã§ããããé©åã«ç解ããããšãã¯ããã«é£ããäž»ãªçç±ã 2çªç®ã®çç±ã¯ãç°ãªãæ§æã䜿çšããå€ãã®ç°ãªããããžã§ã¯ããããããããé£ã³è¶ããŠèªãã®ãé£ããããšã§ãïŒç¹ã«éã³ãã°ããã®äººã«ãšã£ãŠïŒã å®éã«éãããããããã€ãã®å©ç¹ãããå Žåã«ã®ã¿ãç°ãªãæ§æãå®è£ ããå¿ èŠããããšæããŸãã å€ãã®ã³ãŒãã·ã¥ã¬ãŒã¯ãèšèªãåŠã³ãæäœããããšãã¯ããã«é£ããããŠããŸãã
@goffrieã¯ããåãããšãããããã«å€ãã®ç°ãªãæ¹æ³ããšãã¹ãã§ã¯ãªãããšã«åæããŸãã ããããç§ã¯ããŸããŸãªä»£æ¿æ¡ãææ¡ããŠããŸãããã³ãã¥ããã£ã¯1ã€ãéžæããã ãã§æžã¿ãŸãã ãããã£ãŠãããã¯å®éã«ã¯åé¡ã§ã¯ãããŸããã
ããã«ã await!
ãã¯ãã«é¢ããŠã¯ããŠãŒã¶ãŒãç¬èªã®ãã¯ããäœæããŠå¥ã®æ¹æ³ã§å®è¡ããã®ãæ¢ããæ¹æ³ã¯ãããŸãããRustã¯ãããå¯èœã«ããããšãç®çãšããŠããŸãã ãããã£ãŠããåãããšãè¡ãããã®å€ãã®ç°ãªãæ¹æ³ãæã€ãããšã¯é¿ããããŸããã
ç§ã瀺ããåçŽãªãã ãã¯ãã¯ãç§ãã¡ãäœãããŠãããŠãŒã¶ãŒã¯ãšã«ããããããããšãäœã§ãããããšã瀺ããŠãããšæããŸãã ããŒã¯ãŒãã¯ãæ¥é èŸã§ããæ¥å°ŸèŸã§ãããé¢æ°ã®ãããªæ¥é èŸãã¯ãããŸãã¯ããããæ¥å°ŸèŸã®ã¡ãœããã®ãããªãã¯ããååšããå Žåã¯ãã€ã§ãäœæã§ããŸãã await
ã«é¢æ°ãŸãã¯ã¡ãœããã®ãããªãã¯ããéžæããå Žåã§ãããããã¯ããã«å¥ã®ãã¯ãã§å転ãããå¯èœæ§ããããŸãã ããã¯æ¬åœã«åé¡ã§ã¯ãããŸããã
ãããã£ãŠãæè»æ§ãšãã©ãŒãããã«çŠç¹ãåœãŠãå¿ èŠããããŸãã ããããã¹ãŠã®å¯èœæ§ãæãç°¡åã«æºãããœãªã¥ãŒã·ã§ã³ãæäŸããŸãã
ããã«ããã®çãæéã§ç§ã¯æ¥å°ŸèŸã®ããŒã¯ãŒãæ§æã«å·çããããã«ãªããŸãããã await
ã¯ãããããæ¥é èŸã®ããŒã¯ãŒãã§ãããžã§ãã¬ãŒã¿ãŒã§yield
決å®ããããã®ãåæ ããã¯ãã§ãã åŸçœ®ãœãªã¥ãŒã·ã§ã³ãåžæãããŠãŒã¶ãŒã«ãšã£ãŠãã¡ãœããã®ãããªãã¯ãã¯ããããæçµçã«ã¯ååšããã§ãããã
ç§ã®çµè«ã¯ããã¬ãã£ãã¯ã¹ããŒã¯ãŒãawait
ãä»ã®ãšããæè¯ã®ããã©ã«ãæ§æã§ãããããããéåžžã®ã¯ã¬ãŒãããŠãŒã¶ãŒã«await!
ãã¯ãã®ãããªé¢æ°ãæäŸããå°æ¥çã«ã¯ãã¹ããã£ãã¯ã¹ã¡ãœããã®ãããªãã®ãæäŸãããšããããšã§ãã .await!()
ãã¯ãã
@novacrazy
ããã«ããã®çãæéã§ç§ã¯æ¥å°ŸèŸã®ããŒã¯ãŒãæ§æã«å·çããããã«ãªããŸãããã
await
ã¯ãããããæ¥é èŸã®ããŒã¯ãŒãã§ãããžã§ãã¬ãŒã¿ãŒã§yield
決å®ããããã®ãåæ ããã¯ãã§ãã
åŒyield 42
ã¯ã¿ã€ã!
ã«ãããŸããã foo.await
ã¯ã¿ã€ãT
ããã foo: impl Future<Output = T>
ã§ãã @stjepangã¯ãããã§?
ãšreturn
ãšæ£ããé¡äŒŒããŠããŸãã await
ã¯yield
ãŸãã
ãªãäž¡æ¹ã§ã¯ãªãïŒ
macro_rules! await { ($e:expr) => {{$e await}} }
await
ã¯çã®ããŒã¯ãŒãã®ãŸãŸã§ããå¿
èŠãããããããã¯ãã«å¥ã®ååãä»ããå¿
èŠããããŸãã
ããŸããŸãªçç±ãããæ¥é èŸawait
å察ããŠããã®ã§ããããã¯ã¯await { ... }
ãŸãã
ãŸãã await expr?
ã«åªå
é äœã®åé¡ããããäžè²«ããåªå
é äœã¯await (expr?)
ãã (await expr)?
ãå¿
èŠã§ãã åªå
é äœã®åé¡ã®è§£æ±ºçãšããŠã await? expr
ã«å ããŠawait expr
await? expr
ãææ¡ãã人ãããŸãã ããã«ã¯ããŠãããããã³ç¹å¥ãªã±ãŒã·ã³ã°ãšããŠã®await?
ãå¿
èŠã§ãã ããã¯äžåœã§ãããè€éãªäºç®ã®æµªè²»ã§ããã await expr
ã«æ·±å»ãªåé¡ãããããšã瀺ããŠããŸãã
ããã«éèŠãªããšã«ãRustã³ãŒããç¹ã«æšæºã©ã€ãã©ãªã¯ãããããšã¡ãœããåŒã³åºãã®æ§æã®åã«éç¹ã眮ããŠããŸãã await
ããã¬ãã£ãã¯ã¹ã®å Žåãã¡ãœãããåçŽã«é£éãããã®ã§ã¯ãªããäžæçãªletãã€ã³ãã£ã³ã°ãçºæããããã«ãŠãŒã¶ãŒã«ä¿ããŸãã ããã?
ãæ¥å°ŸèŸã§ããçç±ã§ãããåãçç±ã§ã await
ãæ¥å°ŸèŸã§ããå¿
èŠããããŸãã
ããã«æªãã®ã¯await { ... }
ã§ãã ãã®æ§æã¯ã rustfmt
ã«åŸã£ãŠäžè²«ããŠãã©ãŒããããããŠããå Žåã次ã®ããã«ãªããŸãã
let x = await { // by analogy with `loop`
foo.bar.baz.other_thing()
};
ããã¯äººéå·¥åŠçã§ã¯ãªããé¢æ°ã®åçŽæ¹åã®é·ããå€§å¹ ã«èšããŸããŸãã
代ããã«ã ?
ãã¡ãœãããã§ãŒã³ãäžå¿ãšããRustãšã³ã·ã¹ãã ã«é©åãããããåŸ
æ©ããå¿
èŠããããŸãã ããã€ãã®åŸçœ®æ§æãèšåãããŠããŸãã ãããã®ããã€ããèŠãŠãããŸãïŒ
foo.await!()
-ããã¯æ¥å°ŸèŸãã¯ããœãªã¥ãŒã·ã§ã³ã§ãã ç§ã¯postfixãã¯ãã匷ãæ¯æããŠããŸããã httpsïŒ //github.com/rust-lang/rust/issues/50547#issuecomment -454225040ã®@cramertjã«åæããŸããããã¯ãpostfixãã³ãããããªãéãå®è¡ããªãã§
foo await
-ããã¯ããã»ã©æªãã¯ãããŸãããå®éã«ã¯æ¥å°ŸèŸæŒç®åïŒ expr op
ïŒã®ããã«æ©èœããŸããããã®ãã©ãŒãããã«ã¯äœããæ¬ ããŠããããã«æããŸãïŒã€ãŸããã空ããšæããŸãïŒã 察ç
§çã«ã expr?
?
ãexpr
çŽæ¥ã¢ã¿ããããŸãã ããã«ã¯ã¹ããŒã¹ããããŸããã ããã«ããã ?
ã¯èŠèŠçã«é
åçã«èŠããŸãã
foo.await
-ããã¯ãã£ãŒã«ãã¢ã¯ã»ã¹ã®ããã«èŠãããšæ¹å€ãããŠããŸãã ãããŠããã¯æ¬åœã§ãã ãã ãã await
ã¯ããŒã¯ãŒãã§ããããããã®ããã«åŒ·èª¿è¡šç€ºãããæ§æã«ãªãããšãèŠããŠããå¿
èŠããããŸãã IDEãŸãã¯åçã®GitHubã§Rustã³ãŒããèªã¿åãå Žåã await
ã¯foo
ãšã¯ç°ãªãè²ãŸãã¯å€ªåã«ãªããŸãã å¥ã®ããŒã¯ãŒãã䜿çšããŠãããã瀺ãããšãã§ããŸãã
let x = foo.match?;
éåžžããã£ãŒã«ããåè©ã§ããã await
ã¯åè©ã§ãã
foo.await
ã«ã€ããŠã¯æåã®å²ç¬ã®èŠçŽ ããããŸãããèŠèŠçã«é
åçã§ãããªããèªã¿ãããæ§æãšããŠãçå£ã«æ€èšããå¿
èŠããããšæããŸãã
ããŒãã¹ãšããŠã .await
ã䜿çšãããšããããã®ãã¯ãŒãšã IDEã§ããããéåžžæã€ãªãŒãã³ã³ããªãŒããåŸãããŸãïŒ56ããŒãžãåç
§ïŒã ããšãã°ã foo.
ãšæžãããšãã§ãã foo
ãå°æ¥ã®å Žåã await
ãæåã®éžæè¢ãšããŠè¡šç€ºãããŸãã ãããã«å°éããããšã¯å€ãã®éçºè
ãçèã®èšæ¶ã«èšç·Žãããã®ã§ãããããããã¯äººéå·¥åŠãšéçºè
ã®çç£æ§ã®äž¡æ¹ãä¿é²ããŸãã
èãããããã¹ãŠã®æ¥å°ŸèŸã®æ§æã§ã¯ããã£ãŒã«ãã¢ã¯ã»ã¹ã®ããã«èŠããããšã«ã€ããŠã®æ¹å€ã«ãããããããããã¯ç§ã®ãæ°ã«å ¥ãã®æ§æã®ãŸãŸã§ãã
foo#
-ããã¯ãå°ç« #
ã䜿çšããŠfoo
ãåŸ
æ©ããŸãã ?
ãå°ç« ã§ããã軜éã«ãªãã®ã§ãå°ç« ãæ€èšããã®ã¯è¯ãèãã ãšæããŸãã ?
ãšçµã¿åããããšã foo#?
ããã«ãªããŸããããã§åé¡ãããŸããã ãã ãã #
ã¯å
·äœçãªçç±ã¯ãããŸããã ããããããã¯ãŸã å©çšå¯èœãªåãªãå°ç« ã§ãã
foo@
-å¥ã®å°ç« ã¯@
ã§ãã ?
ãšçµã¿åããããšã foo@?
ãŸãã ãã®ç¹å®ã®å°ç« ã®æ£åœåã®1ã€ã¯ã a
-ishïŒ @wait
ïŒã«èŠããããšã§ãã
foo!
-æåŸã«ã !
ãŸãã ?
ãšçµã¿åããããšã foo!?
ãŸãã æ®å¿µãªãããããã«ã¯ç¹å®ã®WTFæããããŸãã ãã ãã !
ã¯ããåŸ
æ©ãã«é©åããå€ã匷å¶ããããã«èŠããŸãã foo!()
ãã§ã«æ£åœãªãã¯ãåŒã³åºãã§ãããšããæ¬ ç¹ããããŸãããã®ãããé¢æ°ã®åŸ
æ©ãšåŒã³åºãã¯(foo)!()
ãšèšè¿°ããå¿
èŠããããŸãã æ§æãšããŠfoo!
ã䜿çšãããšãããŒã¯ãŒããã¯ãïŒäŸïŒ foo! expr
ïŒãæã€æ©äŒã奪ãããŸãã
ãã1ã€ã®å°ç« ã¯foo~
ã§ãã æ³¢ã¯ããšã³ãŒããŸãã¯ãæéããããããšç解ã§ããŸãã ããã§ããRustèšèªã®ã©ãã§ã䜿çšãããŠããŸããã
ãã«ã~
ã¯ãæã¯ããŒãå²ãåœãŠã¿ã€ãã«äœ¿çšãããŠããŸããïŒ https ïŒ
?
ã¯åå©çšã§ããŸããïŒ ãããšãéæ³ãå€ãããŸããïŒ impl Try for T: Future
ã©ã®ããã«ãªããŸããïŒ
@parasyteã¯ããèŠããŠããŸãã ããããããã§ãããã¯ãã£ãšæ¶ããŠããŸããã
@jethrogb impl Try
çŽæ¥æ©èœããŠããããšã確èªããæ¹æ³ã¯ãããŸããã ?
æ瀺çã«return
Try
ã¯ãçŸåšã®é¢æ°ããã®await
ã¯yield
await
ããå¿
èŠããããŸãã
ãã¶ã?
ã¯ããžã§ãã¬ãŒã¿ãŒã®ã³ã³ããã¹ãã§äœãä»ã®ããšãããããã«ç¹å¥ãªå Žåããããé©çšãããåŒã®ã¿ã€ãã«å¿ããŠyield
ãŸãã¯return
ãã«ãªããŸãã ãããããããã©ãã»ã©ç解ã§ãããã¯ããããŸããã ãŸããã©ã®ããã«ããŠãã®çžäºäœçšããFuture<Output=Result<...>>
ãããªããããªããã°ãªããªãlet foo = bar()??;
ã®äž¡æ¹ã«ãªã"ã®await"ãšããååŸOk
ã®ããªã¢ã³ããResult
ïŒãŸãã¯ããžã§ãã¬ãŒã¿ãŒã®?
ã¯ã yield
ã return
ãŸãã¯åäžã®ã¢ããªã±ãŒã·ã§ã³ã§å€ã«è§£æ±ºã§ãããã©ã€ã¹ããŒãç¹æ§ã«åºã¥ããŠããŸããïŒ
ãã®æåŸã®æ¬åŒ§ã§å²ãŸããçºèšã¯ãå®éã«ãããå®è¡å¯èœã§ããå¯èœæ§ããããšç§ã«æãããŸããã¯ãªãã¯ããŠç°¡åãªã¹ã±ãããèŠãŠãã ãã
ãžã§ãã¬ãŒã¿ãŒå
ã® `fooïŒ`ã次ã®ããã«æ¡åŒµãããŸãïŒãã ããããã«ã¯æææš©ã®åé¡ãããã `foo`ã®çµæãã¹ã¿ãã¯ãã³ããå¿
èŠããããŸãïŒenum GenOp<T, U, E> { Break(T), Yield(U), Error(E) }
trait TryGen {
type Ok;
type Yield;
type Error;
fn into_result(self) -> GenOp<Self::Ok, Self::Yield, Self::Error>;
}
loop {
match TryGen::into_result(foo) {
GenOp::Break(val) => break val,
GenOp::Yield(val) => yield val,
GenOp::Return(val) => return Try::from_error(val.into()),
}
}
æ®å¿µãªããããã®ãããªã¹ããŒã ã§wakerã³ã³ããã¹ãå€æ°ãåŠçããæ¹æ³ãããããŸãããããããã ?
ããžã§ãã¬ãŒã¿ãŒã§ã¯ãªãasync
ç¹å¥ãªå Žåã§ãããç¹å¥ãªãã®ã«ãªãå Žåã¯-ããã§ã®ã±ãŒã¹ã§ã¯ãä»ã®ãžã§ãã¬ãŒã¿ãŒã®ãŠãŒã¹ã±ãŒã¹ã§äœ¿çšã§ãããšäŸ¿å©ã§ãã
?
åå©çšã«ã€ããŠã¯@jethrogbãšåãèãã§ããã
@ Nemo157
impl Try
çŽæ¥æ©èœããŠããããšã確èªããæ¹æ³ã¯ãããŸããã?
æ瀺çã«return
sçŸåšã®é¢æ°ããã®Try
ã®çµæã§ãããåŸ æ©ã¯yield
å¿ èŠããããŸãã
ããããã ?
ãšTry
ç¹æ§ã«é¢ãã詳现ãæ¬ ããŠããŸãããããã¯ã©ãã§/ãªãæ瀺ãããŠããã®ã§ããããã ãããŠãéåæã¯ããŒãžã£ã®return
ã¯ããšã«ããyield
ãšæ¬è³ªçã«åãã§ã¯ãªãããã ç°ãªãç¶æ
é·ç§»ã§ããïŒ
ãã¶ã
?
ã¯ããžã§ãã¬ãŒã¿ãŒã®ã³ã³ããã¹ãã§äœãä»ã®ããšãããããã«ç¹å¥ãªå Žåããããé©çšãããåŒã®ã¿ã€ãã«å¿ããŠyield
ãŸãã¯return
ãã«ãªããŸãã ãããããããã©ãã»ã©ç解ã§ãããã¯ããããŸããã
ãªããããæ··ä¹±ããã®ãããããŸããã ?
ããç¶ç¶ãŸãã¯åå²ããšèãããšãåœç¶ã®ããã«æããŸããç§èŠã 確ãã«ãé¢é£ä»ãããããªã¿ãŒã³ã¿ã€ãã«ç°ãªãååã䜿çšããããã«Try
ãã¬ã€ããå€æŽãããšåœ¹ç«ã¡ãŸãã
ãŸããããã¯
Future<Output=Result<...>>
ãšã©ã®ããã«çžäºäœçšããŸãããlet foo = bar()??
ãŸã;
çµæãåŸ
ã¡ããšã©ãŒçµæãæ©æã«çµäºãããå Žåã¯ããããè«çåŒã«ãªããŸãã ç¹å¥ãªãã©ã€ã¹ããŒãTryGen
ã¯ãŸã£ããå¿
èŠãªããšæããŸãã
æ®å¿µãªããããã®ãããªã¹ããŒã ã§wakerã³ã³ããã¹ãå€æ°ãåŠçããæ¹æ³ãããããŸããã ãžã§ãã¬ãŒã¿ãŒã§ã¯ãªãéåæçšã«ç¹å¥ã«ã±ãŒã¹åãããŠããŸããããããã§ç¹å¥ãªã±ãŒã¹ã«ãªãå Žåã¯ãä»ã®ãžã§ãã¬ãŒã¿ãŒã®ãŠãŒã¹ã±ãŒã¹ã§äœ¿çšã§ãããšäŸ¿å©ã§ãã
ãã®éšåãããããŸããã 詳现ãæããŠããã ããŸããïŒ
@jethrogb @rolandsteineræ§é äœã¯ã Try
ãšFuture
äž¡æ¹ãå®è£
ã§ããŸãã ãã®å Žåãã©ã¡ãã?
ã¢ã³ã©ããããå¿
èŠããããŸããïŒ
@jethrogb @rolandsteineræ§é äœã¯ãTryãšFutureã®äž¡æ¹ãå®è£ ã§ããŸãã ãã®å Žåãã©ã¡ãããã¹ãã§ããïŒ ã¢ã³ã©ããïŒ
ããããããã¯ãã©ã³ã±ããimplã®ããã§ã§ããŸããã§ãããTryforTïŒFutureã
æ瀺çãªæ§ç¯ãšæé»çãªåŸ æ©ã®ææ¡ã«ã€ããŠèª°ã話ããŠããªãã®ã¯ãªãã§ããïŒ ããã¯syncioãšåãã§ãããã¹ã¬ããã§ã¯ãªãã¿ã¹ã¯ããããã¯ããŠããã ãã§ãã ã¹ã¬ããã®ãããã¯ã¯ã¿ã¹ã¯ã®ãããã¯ããã䟵襲çã§ãããšããèšããŸããããªãthread-blocking-ioã«ç¹å¥ãªãawaitãæ§æããªãã®ã§ããããã
ããããããã¯ãã¹ãŠèªè»¢è»ã®ã·ã§ãŒãã£ã³ã°ã§ããå°ãªããšãä»ã®ãšãããåçŽãªãã¯ãæ§æawait!(my_future)
ã§è§£æ±ºããå¿
èŠããããšæããŸãã
ããããããã¯ãã¹ãŠèªè»¢è»ã®ã·ã§ãŒãã£ã³ã°ã§ããå°ãªããšãä»ã®ãšãããåçŽãªãã¯ãæ§æ
await!(my_future)
ã§è§£æ±ºããå¿ èŠããããšæããŸãã
ããããããã¯ãããããããå¹³å¡ã§åãã«è¶³ããªããã®ã§ãããã®ããã«ããã ã®ãèªè»¢è»ã®è±èœã§ã¯ãããŸããã await
ããã¬ãã£ãã¯ã¹ãšãã¹ããã£ãã¯ã¹ã®ã©ã¡ãã§èšè¿°ããããã¯ãéåæã³ãŒãã®èšè¿°æ¹æ³ã«åºæ¬çã«åœ±é¿ããŸãã ã¡ãœããã®é£éãšãããã©ã®ããã«æ§æå¯èœã§ãããã await!(future)
å®å®ãããã«ã¯ãããŒã¯ãŒããšããŠã®await
ãæŸæ£ããå¿
èŠããããå°æ¥çã«await
ãããŒã¯ãŒããšããŠäœ¿çšããããšã¯äžå¯èœã«ãªããŸãã ãå°ãªããšãä»ã®ãšãããã¯ãåŸã§ããè¯ãæ§æãèŠã€ããããšãã§ããããã«äŒŽãæè¡çè² åµãç¡èŠããããšã瀺åããŠããŸãã ç§ã¯ãåŸã§çœ®ãæããããããšãæå³ããæ§æã«æ
æã«åéãå°å
¥ããããšã«å察ããŠããŸãã
ãŸããawaitïŒïŒfutureïŒã§ã®å®å®åã«ã¯ãããŒã¯ãŒããšããŠã®awaitãæŸæ£ããããããããŒã¯ãŒããšããŠã®awaitã®å°æ¥ã®äœ¿çšãäžå¯èœã«ãªããŸãã
try
å Žåãšåãããã«ã次ã®ãšããã¯ã§ãããããŒã¯ãŒãã«ããŠããã¯ãã®çã®identæ§æãèŠæ±ããããšãã§ããŸãã
@chpio await
ã¯ã Rust2018ã®ããŒã¯ãŒãã§ãã
@rolandsteiner
ãããŠãéåæã¯ããŒãžã£ã®
return
ã¯ããšã«ããyield
ãšæ¬è³ªçã«åãã§ã¯ãªãããã ç°ãªãç¶æ é·ç§»ã§ããïŒ
yield
ã¯éåæã¯ããŒãžã£ã«ã¯ååšããŸãããããã¯ã async
/ await
æ§æãããžã§ãã¬ãŒã¿ãŒ/ yield
ããŒã€ã³ã°äžã«å°å
¥ãããæäœã§ãã çŸåšã®ãžã§ãã¬ãŒã¿ãŒæ§æã§ã¯ã yield
ã¯return
ãšã¯ããªãç°ãªããŸãããžã§ãã¬ãŒã¿ãŒå€æã®åã«?
å±éãè¡ããããšããã€æ¿å
¥ããããããããŸããã return
ãŸãã¯yield
ã
çµæãåŸ ã¡ããå Žåãnalsoããšã©ãŒçµæã®æ©ã段éã§çµäºããå Žåã¯ããããè«çåŒã«ãªããŸãã
è«ççãããããŸããããéåæé¢æ°ãèšè¿°ããŠããå€ãã®ïŒã»ãšãã©ã®ïŒïŒã±ãŒã¹ãIOãšã©ãŒã«å¯ŸåŠããããã«2åã®??
ã§æºããããããšã¯ç§ã«ã¯æ¬ ç¹ã®ããã§ãã
æ®å¿µãªããããŠã§ã€ã«ãŒã³ã³ããã¹ãå€æ°ãåŠçããæ¹æ³ãããããŸãã...
ãã®éšåãããããŸããã 詳现ãæããŠããã ããŸããïŒ
éåæå€æã¯ãçæãããFuture::poll
é¢æ°ã§wakerå€æ°ãåãåããŸãã次ã«ããããå€æãããawaitæäœã«æž¡ãå¿
èŠããããŸãã çŸåšãããã¯äž¡æ¹ã®å€æãåç
§ããstd
ã«ãã£ãŠæäŸãããTLSå€æ°ã§åŠçãããŸãã代ããã«ã ?
ã_ãžã§ãã¬ãŒã¿ãŒã¬ãã«ã§_åçæãã€ã³ããšããŠåŠçãããå Žåãéåæå€æã¯éäžã§å€±ãããŸãããã®å€æ°åç
§ãæ¿å
¥ããŸãã
2ãæåã®ç§ã®å¥œã¿ãæŠèª¬ããawait
æ§æã«ã€ããŠã®ããã°æçš¿ãæžããŸã
foo await
ã¯ã foo@
ãããªããã€ãã®å°ç« ãããçºæ£ãå°ãªãïŒããæ¥é èŸãåŸ
ã€ããããã¹ãŠçºæ£ããŠããŸãã!
䜿çšããªãæ§æãå®å®ãããããšã奜ã¿ãŸãã async / awaitãæ±ããã¹ãŠã®ãŠãŒã¶ãŒã¯ããªãawaitãéåžžã®å¶åŸ¡ãããŒæ§é ã§ã¯ãªããã¯ãã§ããã®ãçåã«æãã§ããããããã§ã®è©±ã¯æ¬è³ªçã«ãè¯ãæ§æãç解ã§ããªãã£ãã®ã§ãèœã¡çããããšæããŸãããã¯ãã®ããã«èŠããŸããã ããã¯èª¬åŸåã®ããçãã§ã¯ãããŸããã !
ãšå¶åŸ¡ãããŒã®é¢é£ä»ãã¯ããã®æ§æãæ£åœåããã®ã«ååã§ã¯ãªããšæããŸãã !
ã¯ãããªãå
·äœçã«ã¯ãã¯ãã®æ¡åŒµãæå³ãããšæããŸãããããã§ã¯ãããŸããã?
ãšã¯å°ãç°ãªããšæããŸãïŒåå²ããŠ1åæ»ãã ãã§ãªããæºåãã§ãããŸã§ã«ãŒãã§è²ããŸãïŒã ç§ã¯ã1ã€ã®åŒã§2ã3ååŸ
æ©ããã³ãŒãã«çããæã£ãŠããŸãã ããããç¬èªã®letãã€ã³ãã£ã³ã°ã«åŒãåºãå¿
èŠããããšèšã£ãŠãåé¡ãªãããã§ãã ãããã£ãŠã try!
ãš?
ãã¬ãŒããªãã¯ãããã§ã¯ããã»ã©åŒ·ãã¯ãããŸããã ããããŸããç§ã¯äººã
ãå®éã«ã¬ããã«åŒãåºãããã¹ãã§ã¯ãªããšèããŠããã³ãŒããµã³ãã«ãåãå
¥ããã¡ãœãããã§ãŒã³ãšããŠããæ確ã«ãªããŸããããã¯èšã£ãŠãã foo await
ã¯ããããŸã§ã«èŠãäžã§æãå®è¡å¯èœãªåŸçœ®æ§æã§ãã
foo
ã§ã¯ãªãawait
ã«ã¡ãœãããïŒç¡æå³ã«ïŒé©çšãããŠãããšæ¬åœã«æããŠãããšããçç±ã ãã§ã foo await.method()
ãé²ãææ³èŠåãããã°ããã£ãšãããåŸãªããããããŸããïŒèå³æ·±ãããšã«ïŒ foo await?
ã§ã¯ããã¯æããªãïŒãç§ã¯ãŸã ãã¬ãã£ãã¯ã¹æ§æã«åŸåããŠããŸããã await
ã¯ãç§ã«ãšã£ãŠæ¬ç©ã®ã·ã§ãããæã£ãŠããããã«æããæåã®ãã¹ããã£ãã¯ã¹æ§æã ãšæããŸãã
è£è¶³ïŒåªå é äœãæ確ã«ããããã«æ¬åŒ§ã䜿çšããããšã¯åžžã«å¯èœã§ãïŒ
let x = (x.do_something() await).do_another_thing() await;
let x = x.foo(|| ...).bar(|| ... ).baz() await;
ããã¯å¿ ãããçæ³çã§ã¯ãããŸãããã1è¡ã«ããããè©°ã蟌ãããšããŠããããšãèãããšãåççã ãšæããŸãã
ãããŠã @ earthengineãåã«è¿°ã¹ãããã«ãè€æ°è¡ããŒãžã§ã³ã¯éåžžã«åççã§ãïŒäœåãªæ¬åŒ§ã¯ãããŸããïŒïŒ
let x = x.do_something() await
.do_another_thing() await;
let x = x.foo(|| ...)
.bar(|| ... )
.baz() await;
- ãµãŒãã§ã¹ã¬ãã«ã®async / awaitæ§æã¯ãJavaScriptãPythonããŸãã¯CïŒããã®ãŠãŒã¶ãŒã«ã§ããã ã銎æã¿ãããããšãçæ³çã§ãã
try { .. }
å Žåãä»ã®èšèªã«ç²ŸéããŠããããšãèæ
®ã«å
¥ããŸããã ãã ããRustãšã®å
éšæŽåæ§ã®ããPOVããã®æ£ããèšèšã§ããããŸããã ãããã£ãŠããããã®ä»ã®èšèªã«æ¬æãè¡šããŠãRustã®å
éšæŽåæ§ã¯ããéèŠã§ããããã«æããããã¬ãã£ãã¯ã¹æ§æã¯åªå
é äœãŸãã¯APIã®æ§é ã®ãããã®ç¹ã§ãRustã«é©åãããšã¯æããŸããã
- ãŸãã
!
䜿çšããªãæ§æãå®å®ãããããšã奜ã¿ãŸãã async / awaitãæ±ããã¹ãŠã®ãŠãŒã¶ãŒã¯ããªãawaitãéåžžã®å¶åŸ¡ãããŒæ§é ã§ã¯ãªããã¯ãã§ããã®ãçåã«æãã§ããããããã§ã®è©±ã¯æ¬è³ªçã«ãè¯ãæ§æãç解ã§ããªãã£ãã®ã§ãèœã¡çããããšæããŸãããã¯ãã®ããã«èŠããŸããã ããã¯èª¬åŸåã®ããçãã§ã¯ãããŸããã
ç§ã¯ãã®ææ
ã«åæããŸãã .await!()
ã¯ãã¡ãŒã¹ãã¯ã©ã¹ã«ååã«èŠããŸããã
- ç§ã¯äžè¬çã«postfixawaitã®å©ç¹ã«çåãæã£ãŠããŸãïŒå®å šã«ã§ã¯ãªãã_sort of_ã ãã§ãïŒã åŸ æ©ã¯ããã³ã¹ãã®ãããæäœã§ããããããã©ã³ã¹ã¯
?
ãšã¯å°ãç°ãªããšæããŸãïŒåå²ããŠ1åæ»ãã ãã§ãªããæºåãã§ãããŸã§ã«ãŒãã§è²ããŸãïŒã
let
ãã€ã³ãã£ã³ã°ã«ç©äºãæœåºããããšãšè²»çšãã©ã®ããã«é¢ä¿ããŠãããããããŸããã ã¡ãœãããã§ãŒã³ã¯é«é¡ã«ãªãå¯èœæ§ããããå Žåã«ãã£ãŠã¯é«é¡ã«ãªãããšããããŸãã let
ãã€ã³ãã£ã³ã°ã®å©ç¹ã¯ãaïŒèªã¿ããããåäžãããã®ã«æå³ã®ããååãååã«å€§ããéšåã«ä»ããããšãbïŒåãèšç®å€ãè€æ°ååç
§ã§ããããšïŒããšãã°ã &x
ãŸãã¯ã¿ã€ããã³ããŒå¯èœãªå ŽåïŒã
ç§ã¯ã1ã€ã®åŒã§2ã3ååŸ æ©ããã³ãŒãã«çããæã£ãŠããŸãã ããããç¬èªã®letãã€ã³ãã£ã³ã°ã«åŒãåºãå¿ èŠããããšèšã£ãŠãåé¡ãªãããã§ãã
ããããç¬èªã®let
ãã€ã³ãã£ã³ã°ã«åŒãåºãããã¹ãã ãšæããå Žåã§ããpostfix await
䜿çšããŠãã®éžæãè¡ãããšãã§ããŸãã
let temporary = some_computation() await?;
ã¡ãœãããã§ãŒã³ã«åæããã奜ã人ã®ããã«ãæ¥å°ŸèŸawait
éžæã§ããŸãã ãŸããpostfixã¯ãããã§ã¯å·Šããå³ãžã®èªã¿åããšããŒã¿ãããŒã®é åºã«åŸãæ¹ãé©åã ãšæããŸãããããã£ãŠã let
ãã€ã³ãã£ã³ã°ã«æœåºããå Žåã§ããpostfixã䜿çšããããšããå§ãããŸãã
ãŸããpostfix await
ã圹ç«ã€ããã«ãªããŸã§ã2ã3ååŸ
ã€å¿
èŠã¯ãªããšæããŸãã ããšãã°ãïŒããã¯rustfmt
ã®çµæã§ãïŒãèããŠã¿ãŸãããã
let foo = alpha()
.beta
.some_other_stuff()
.await?
.even_more_stuff()
.stuff_and_stuff();
ããããŸããç§ã¯äººã ãå®éã«ã¬ããã«åŒãåºãããã¹ãã§ã¯ãªããšèããŠããã³ãŒããµã³ãã«ãåãå ¥ããã¡ãœãããã§ãŒã³ãšããŠããæ確ã«ãªããŸãã
ç§ãèªãã ãã¯ã·ã¢ã³ãŒãã®ã»ãšãã©ã¯ã let
ãã€ã³ãã£ã³ã°ã«æœåºããã let binding = await!(...)?;
ãšãäžèªç¶ã«æããããŸããã
- åŸçœ®æ§æã«ã€ããŠã¯æ¯èŒçããç¥ãããŠããŸãã ããªããåŠã°ãªããã°ãªããªãã®ã¯ãawaitã¯ãå€§å¹ ã«ç°ãªãæ§æã§ã¯ãªããRustã®åŒã®åã§ã¯ãªããåŒã®åŸã«ãããšããããšã§ãã
ããã§ã®foo.await
奜ã¿ã¯ãäž»ã«ãåªãããªãŒãã³ã³ããªãŒããšãããã®ãã¯ãŒãåŸãããããã§ãã ããã»ã©æ ¹æ¬çãªéããæããŸããã foo.await.method()
æžããšã .method()
ãfoo.await
é©çšãããããšãæ確ã«ãªããŸãã ãããã£ãŠãããã¯ãã®æžå¿µã解決ããŸãã
- ããã«ããããããŸã§ã®åªå é äœã®åé¡ãæ確ã«è§£æ±ºãããŸãã
ããããããã¯åªå é äœã ãã§ã¯ãããŸããã ã¡ãœãããã§ãŒã³ãåæ§ã«éèŠã§ãã
- ã¡ãœãããã§ãŒã³ã§ããŸãæ©èœããªããšããäºå®ã¯ã以åã«è§Šããçç±ããããã¡ãªããã§ã¯ãªããã»ãšãã©ã¡ãªããã®ããã«æããŸãã
ã¡ãœãããã§ãŒã³ã§ããŸãæ©èœããªãçç±ãããããŸããã
foo
ã§ã¯ãªãawait
ã«ã¡ãœãããïŒç¡æå³ã«ïŒé©çšãããŠãããšæ¬åœã«æããŠãããšããçç±ã ãã§ãfoo await.method()
ãé²ãææ³èŠåãããã°ããã£ãšãããåŸãªããããããŸããïŒèå³æ·±ãããšã«ïŒfoo await?
ã§ã¯ããã¯æããªãïŒã
äžæ¹ãæå³çãªãã¶ã€ã³ããŒããŒã«ãããå°å
¥ããæ¥å°ŸèŸawait
æ§æã䜿çšããŠã¡ãœããã®é£éãé²æ¢ããå Žåã foo await
å¿
èŠã¯ãããŸããã
ãã¹ãŠã®ãªãã·ã§ã³ã«æ¬ ç¹ããããããã§ããã®ãã¡ã®1ã€ãéžæãããããšãèªãã... foo.await
ã«ã€ããŠç§ãæ©ãŸããŠããããšã®1ã€ã¯ãæåéã誀解ãããªããšä»®å®ããŠããããã§ããæ§é äœãã£ãŒã«ãã§ããæ§é äœãã£ãŒã«ãã«ã¢ã¯ã»ã¹ããŠããããã«èŠããŸãã ãã£ãŒã«ãã¢ã¯ã»ã¹ã®æå³ã¯ãç¹ã«åœ±é¿ã®ãããã®ã¯äœãèµ·ãã£ãŠããªããšããããšã§ããããã¯ãRustã§æãå¹æã®äœãæäœã®1ã€ã§ãã äžæ¹åŸ
ã£ãŠã¯ãã»ãšãã©å¯äœçšã®ããããã®æäœæ§ã®é«ãã€ã³ãã¯ãã§ããïŒããã¯I / Oæäœã¯ãå°æ¥çã«æ§ç¯ããå¶åŸ¡ãããŒå¹æãæããã®äž¡æ¹ãè¡ããŸãïŒã ãããã£ãŠã foo.await.method()
ãèªãã ãšããè³ã¯.await
ãã¹ãããããããã«èšã£ãŠããŸããããã¯æ¯èŒçé¢çœããªãã®ã§ã泚æãšåªåãæã£ãŠãã®æ¬èœãæåã§ç¡å¹ã«ããå¿
èŠããããŸãã
ããã§ããæ§é äœãã£ãŒã«ãã«ã¢ã¯ã»ã¹ããŠããããã«èŠããŸãã
@glaebhoerlããªãã¯è¯ãç¹ãäœããŸãã ããããæ§æã®åŒ·èª¿è¡šç€ºã¯ããããã©ã®ããã«èŠãããããããŠããªãã®è³ãç©äºãåŠçããæ¹æ³ã«åœ±é¿ãäžããªã/äžååã§ããïŒ å°ãªããšãç§ã«ãšã£ãŠã¯ãã³ãŒããèªããšãã«è²ãšå€§èããéåžžã«éèŠãªã®ã§ãä»ã®ãã®ãšã¯ç°ãªãè²ã®.await
ãã¹ãããããããšã¯ãããŸããã
ãã£ãŒã«ãã¢ã¯ã»ã¹ã®æå³ã¯ãç¹ã«åœ±é¿ã®ãããã®ã¯äœãèµ·ãã£ãŠããªããšããããšã§ããããã¯ãRustã§æãå¹æã®äœãæäœã®1ã€ã§ãã äžæ¹ãåŸ æ©ã¯éåžžã«åœ±é¿åããããæãå¯äœçšã®ããæäœã®1ã€ã§ãïŒå°æ¥æ§ç¯ãããI / Oæäœãå®è¡ããå¶åŸ¡ãããŒå¹æããããŸãïŒã
ç§ã¯ããã«åŒ·ãåæããŸãã await
ã¯ã break
ãreturn
ãããªå¶åŸ¡ãããŒæäœã§ãããæ瀺çã§ããå¿
èŠããããŸãã ææ¡ãããæ¥å°ŸèŸè¡šèšã¯ãPythonã®if
ã®ããã«äžèªç¶ã«æããŸãïŒ if c { e1 } else { e2 }
ãe1 if c else e2
ãšæ¯èŒããŠãã ããã æåŸã«æŒç®åã衚瀺ããããšãæ§æã®åŒ·èª¿è¡šç€ºã«é¢ä¿ãªããããã«ãã€ã¯ãå®è¡ã§ããŸãã
ãŸãã e.await
ãawait!(e)
ãawait e
ãããRustæ§æãšã©ã®ããã«äžèŽããŠãããããããŸããã ä»ã«postfixããŒã¯ãŒãã¯ãããŸããããŸãããã®ã¢ã€ãã¢ã®1ã€ã¯ããŒãµãŒã§ç¹æ®ãªã±ãŒã¹ã«ããããšã ã£ãã®ã§ããããäžè²«æ§ã®ãã蚌æ ã§ã¯ãªããšæããŸãã
@withoutboatsãèšåãã芪ãã¿ãããã®åé¡ããããŸãã ããã€ãã®çŽ æŽãããå©ç¹ãããå Žåã¯ãå¥åŠã§çŽ æŽãããæ§æãéžæã§ããŸãã ããããæ¥å°ŸèŸawait
ã¯ãããããããŸããïŒ
æ§æã®åŒ·èª¿è¡šç€ºã¯ããããã©ã®ããã«èŠãããããããŠããªãã®è³ãç©äºãåŠçããæ¹æ³ã«åœ±é¿ãäžããªã/äžååã§ããïŒ
ïŒè¯ã質åã§ãããããçšåºŠã®åœ±é¿ããããšæããŸãããå®éã«è©ŠããŠã¿ãªããšãã©ãã ãæšæž¬ããã®ã¯é£ããã§ãïŒãããŠãå¥ã®ããŒã¯ãŒãã«çœ®ãæããããšã¯ããããŸã§ã®ãšããããåŸãããŸããïŒãç§ãèšåããåã«ç§ã¯ãæ§æã®åŒ·èª¿è¡šç€ºã¯ãå¶åŸ¡ãããŒå¹æãæã€ãã¹ãŠã®æŒç®åãïŒãã€ã©ã€ããã¹ãã ãšæãããšãreturn
ã break
ã continue
ã ?
ä»...ãšawait
ïŒç¹å¥ãªç¹å¥ãªè²ã§è¡šç€ºãããŸãããç§ã¯æ§æã®åŒ·èª¿è¡šç€ºãæ
åœããŠãããã誰ããå®éã«ãããè¡ã£ãŠãããã©ããã¯ããããŸãããïŒ
ç§ã¯ããã«åŒ·ãåæããŸãã
await
ã¯ãbreak
ãreturn
ãããªå¶åŸ¡ãããŒæäœã§ãããæ瀺çã§ããå¿ èŠããããŸãã
è³æã§ãã è¡šèšfoo.await
ã foo await
ã foo#
ã...ã¯æ瀺çã§ãã æé»ã®åŸ
æ©ã¯ãããŸããã
ãŸãã
e.await
ãawait!(e)
ãawait e
ãããRustæ§æãšã©ã®ããã«äžèŽããŠãããããããŸããã
æ§æe.await
èªäœã¯Rustæ§æãšäžèŽããŠããŸããããpostfixã¯äžè¬çã«?
ãšRust APIã®æ§é ã«ããé©åããŸãïŒã¡ãœããã¯ç¡æã®é¢æ°ãããåªå
ãããŸãïŒã
await e?
æ§æã¯ã (await e)?
ãšããŠé¢é£ä»ããããŠããå Žåã break
ãšreturn
é¢é£ä»ãæ¹æ³ãšå®å
šã«ççŸããŠããŸãã await!(e)
ãäžè²«æ§ããããŸãããããã¯ãå¶åŸ¡ãããŒçšã®ãã¯ãããªããä»ã®ãã¬ãã£ãã¯ã¹ã¡ãœãããšåãåé¡ãããããã§ãã
ä»ã«postfixããŒã¯ãŒãã¯ãããŸããããŸãããã®ã¢ã€ãã¢ã®1ã€ã¯ããŒãµãŒã§ç¹æ®ãªã±ãŒã¹ã«ããããšã ã£ãã®ã§ããããäžè²«æ§ã®ãã蚌æ ã§ã¯ãªããšæããŸãã
ãã§ã«ãã£ãŒã«ãæäœãšããŠåŠçãããŠããã¯ããªã®ã§ãå®éã«libsyntaxã.await
ã«å€æŽããå¿
èŠã¯ãªããšæããŸãã ããžãã¯ã¯ãresolveãŸãã¯HIRã§åŠçãããç¹å¥ãªæ§æã«å€æãããŸãã
ããã€ãã®çŽ æŽãããå©ç¹ãããå Žåã¯ãå¥åŠã§çŽ æŽãããæ§æãéžæã§ããŸãã ããããæ¥å°ŸèŸ
await
ã¯ãããããããŸããïŒ
åè¿°ã®ããã«ãã¡ãœããã®é£éãšRustã®ã¡ãœããåŒã³åºãã®å¥œã¿ãåå ã§ãããšç§ã¯äž»åŒµããŸãã
.awaitã¯ãã§ã«ãã£ãŒã«ãæäœãšããŠåŠçãããŠããã¯ããªã®ã§ãå®éã«ã¯libsyntaxãå€æŽããå¿ èŠã¯ãªããšæããŸãã
ããã¯æ¥œããã§ãã
ãããã£ãŠãã¢ã€ãã¢ã¯self
/ super
/ ...ã®ã¢ãããŒããåå©çšããããšã§ããããã¹ã»ã°ã¡ã³ãã§ã¯ãªããã£ãŒã«ãã«äœ¿çšããŸãã
ããã«ããã await
ã¯äºå®äžãã¹ã»ã°ã¡ã³ãããŒã¯ãŒãã«ãªããŸãïŒè§£æ±ºãããããïŒããã®ãããçã®èå¥åã
#[derive(Default)]
struct S {
r#await: u8
}
fn main() {
let s = ;
let z = S::default().await; // Hmmm...
}
æé»ã®åŸ æ©ã¯ãããŸããã
ãã®ã¢ã€ãã¢ã¯ããã®ã¹ã¬ããã§æ°ååºãŠããŸããïŒãæé»ã®åŸ æ©ãææ¡ïŒã
å¶åŸ¡ãããŒçšã®ãã¯ãã¯ãããŸãã
try!
ïŒããã¯ãã®ç®çãããªãããŸãæãããŸããïŒãšããããéæšå¥šã®select!
ãŸãã await
ã¯return
ãããã匷åãã§ãããããã³ãŒãã§?
ã®return
ããã衚瀺ãããããšãæåŸ
ããã®ã¯äžåçã§ã¯ãããŸããã
ç§ã¯ãã¡ãœããã®é£éãšRustã®ã¡ãœããåŒã³åºãã®å¥œã¿ãåå ã§ãããšäž»åŒµããŸãã
ãŸãããã¬ãã£ãã¯ã¹å¶åŸ¡ãããŒæŒç®åã®ïŒããç®ç«ã€ïŒèšå®ããããŸãã
åŸ ã£ãŠãŸããïŒ æ§æãïŒeãåŸ ã€ïŒãšããŠé¢é£ä»ããããŠããå ŽåïŒ ãã¬ãŒã¯ã¢ã³ããªã¿ãŒã³ã¢ãœã·ãšãŒãã®æ¹æ³ãšå®å šã«ççŸããŠããŸãã
ç§ã¯await!(e)?
ã await { e }?
ãããã¯ãããã{ await e }?
ã奜ã¿ãŸã-åŸè
ãè°è«ãããŠããã®ãèŠãããšããªããšæããŸãããããŠãããããŸããããã©ããã¯ããããŸããã
ç§ã¯å·Šããå³ãžã®ãã€ã¢ã¹ããããããããªãããšãèªããŸãã _ããŒã_
ããã«ã€ããŠã®ç§ã®æèŠã¯ãæªéã®ä»£åŒè
ãèªåèªèº«ã«æŒããŠãããã®ããã«ãåé¡ãèŠããã³ã«å€ããããã§ãã ãã®äžéšã¯ãç§ãèªåã®å
ç©ãã¹ããŒããã·ã³ãæžãããšã«æ
£ããŠããããã§ãã poll
ã®ã«ã¹ã¿ã ãã¥ãŒãã£ãŒã¯å®å
šã«æ£åžžã§ãã
ãããããããã¯å¥ã®æ¹æ³ã§èããå¿ èŠããããŸãã
ç§ã«ãšã£ãŠãRustã®ãŒãã³ã¹ãã®æœè±¡åãšã¯ãå®è¡æã®ãŒãã³ã¹ããšãããéèŠãªç²Ÿç¥çãªãŒãã³ã¹ãã®2ã€ãæããŸãã
å ç©ãå«ãRustã®ã»ãšãã©ã®æœè±¡åã«ã€ããŠã¯ãåãªãã¹ããŒããã·ã³ã§ãããããéåžžã«ç°¡åã«æšè«ã§ããŸãã
ãã®ç®çã®ããã«ããŠãŒã¶ãŒã«ã»ãšãã©éæ³ãå°å
¥ããªãåçŽãªè§£æ±ºçãååšããå¿
èŠããããŸãã 圌ãã¯äžå¿
èŠã«éæ³ãæããã®ã§ãå°ç« ã¯ç¹ã«æªãèãã§ãã ããã«ã¯ã .await
éæ³ã®ãã£ãŒã«ããå«ãŸããŸãã
ããããæè¯ã®è§£æ±ºçã¯ãæãç°¡åãªãã®ãå
ã®await!
ãã¯ãã§ãã
ãããã£ãŠããããã®ä»ã®èšèªã«æ¬æãè¡šããŠãRustã®å éšæŽåæ§ã¯ããéèŠã§ããããã«æããããã¬ãã£ãã¯ã¹æ§æã¯åªå é äœãŸãã¯APIã®æ§é ã®ãããã®ç¹ã§ãRustã«é©åãããšã¯æããŸããã
ã©ãããŠããã®ãããããªãâŠïŒ await(foo)?
/ await { foo }?
ã¯ãæŒç®åã®åªå
é äœãšRustã§ã®APIã®æ§é ã®ç¹ã§å®å
šã«åé¡ãªãããã§ãããã®æ¬ ç¹ã¯ãæ¬åŒ§ã®åé·æ§ãšïŒèŠç¹ã«ãã£ãŠã¯ïŒé£éã§ãããåäŸãå£ããããçŽããããã
try!
ïŒããã¯ãã®ç®çãããªãããŸãæãããŸããïŒãšããããéæšå¥šã®select!
ãŸãã
ããã§ã®æå¹ãªåèªã¯éæšå¥šã ãšæããŸãã 䜿çšããŠtry!(...)
é2018幎ã«ããŒããšã©ãŒã§ããç§ãã¡ã¯ããè¯ãããã¡ãŒã¹ãã¯ã©ã¹ãããã³æ¥å°ŸèŸã®æ§æãå°å
¥ããŠããããä»ã¯ããŒããšã©ãŒã§ãã
await
ã¯return
ãããã匷åãã§ãããããã³ãŒãã§?
ã®return
ããã衚瀺ãããããšãæåŸ ããã®ã¯äžåçã§ã¯ãããŸããã
?
æŒç®åãåæ§ã«ïŒ Result
以å€ã®å®è£
ãéããŠïŒå¯äœçšããããå¶åŸ¡ãããŒãå®è¡ãããããéåžžã«ã匷åãã§ãã ãããè°è«ããããšãã ?
ã¯ããªã¿ãŒã³ãé ããŠããããšèŠèœãšããããããšéé£ãããŸããã äºæž¬ã¯å®å
šã«å®çŸã§ããªãã£ããšæããŸãã ç¶æ³åã await
ã¯ç§ãšãã䌌ãŠããããã§ãã
ãŸãããã¬ãã£ãã¯ã¹å¶åŸ¡ãããŒæŒç®åã®ïŒããç®ç«ã€ïŒèšå®ããããŸãã
ãããã®ãã¬ãã£ãã¯ã¹å¶åŸ¡ãããŒæŒç®åã¯ã !
ã¿ã€ãã§å
¥åãããŸãã äžæ¹ãã³ã³ããã¹ãimpl Try<Ok = T, ...>
ãåãåãã ?
T
ã¯åŸçœ®ã§ãã
ã©ãããŠããã®ãããããªãâŠïŒ
await(foo)?
/await { foo }?
ã¯ãæŒç®åã®åªå é äœãšRustã§ã®APIã®æ§é ã®ç¹ã§ãŸã£ããåé¡ãªãããã§ã-
await(foo)
æ§æã¯ãåè
ã«æ¬åŒ§ãå¿
èŠã§åŸè
ã«æ¬åŒ§ãå¿
èŠãªå Žåã await foo
ãšåãã§ã¯ãããŸããã åè
ã¯åäŸã®ãªããã®ã§ãããåŸè
ã«ã¯åªå
é äœã®åé¡ããããŸãã ?
ããã§ãããŒãã®ããã°æçš¿ãããã³Discordã§èª¬æããŸããã await { foo }
æ§æã¯ãä»ã®çç±ã§åé¡ããããŸãïŒhttps://github.com/rust-lang/rust/issues/50547#issuecomment-454313611ãåç
§ïŒã
ãã®æ¬ ç¹ã¯ãåäŸãå£ãããæ··ä¹±ããããããªããæ¬åŒ§ãšïŒããªãã®èŠç¹ã«å¿ããŠïŒé£éã®èšèé£ãã§ãã
ããããAPIã¯æ§é åãããŠããããšããæå³ã§ãã Rustã§ã¯ãã¡ãœãããšã¡ãœãããã§ãŒã³ãäžè¬çã§æ
£çšçã ãšæããŸãã ãã¬ãã£ãã¯ã¹ãšãããã¯ã®æ§æã¯ãããããš?
ããŸãæ§æãããŠããŸããã
ç§ã¯ãã®æèŠã§å°æ°æŽŸãããããŸããããããããªããç§ãç¡èŠããŠãã ããïŒ
prefix-vs-postfixã®ãã£ã¹ã«ãã·ã§ã³ãå éšã¹ã¬ããã«ç§»åããŠãããçµæãããã«æ»ãã®ã¯å ¬å¹³ã§ããããïŒ ããããã°ã远跡ã®åé¡ãç¶æããŠæ©èœã®ã¹ããŒã¿ã¹ã
@seanmonstarãããç§ã¯è¿œè·¡ã®åé¡ã«é¢ããè°è«ãå¶éããããšããé¡æã«åŒ·ãå ±æããå®éã«ã¯åãªãã¹ããŒã¿ã¹ã®æŽæ°ã§ããåé¡ãæ±ããŠããŸãã ããã¯ãRFCããã»ã¹ãšäžè¬çãªåé¡ã®ç®¡çæ¹æ³ã®ããã€ãã®æ¹èšã§åãçµãããšãã§ãããšç§ãæãã§ããåé¡ã®1ã€ã§ãã ä»ã®ãšãããç§ã¯ããã§æ°ããåé¡ãéããŠãè°è«ã«äœ¿çšã§ããããã«ããŸããã
ãã¹ãŠã«ãšã£ãŠéèŠïŒããã«await
æ§æã®è°è«ã¯ããã«è¡ãã¹ã
await
æ§æã«é¢ããä»åŸã®è°è«ãé©åãªåé¡ã§è¡ãããããã«ãäžæçã«1æ¥ããã¯ããŸãã
2019幎1æ15æ¥ç«ææ¥ã07ïŒ10ïŒ3ââ2AM -0800ã«ãPauanã¯æ¬¡ã®ããã«æžããŠããŸãã
è£è¶³ïŒåªå é äœãæ確ã«ããããã«æ¬åŒ§ã䜿çšããããšã¯åžžã«å¯èœã§ãïŒ
let x = (x.do_something() await).do_another_thing() await; let x = x.foo(|| ...).bar(|| ... ).baz() await;
ããã¯ãpostfixawaitã®äž»ãªå©ç¹ãæã¡è² ãããŸãã
æžã蟌ã¿/èªã¿åãããpostfix ?
ããã«ãpostfix awaitã¯ãå¶åŸ¡ãããŒãèš±å¯ããŸãã
å·Šããå³ã«ç§»åãç¶ããã«ã¯ïŒ
foo().await!()?.bar().await!()
await!
ããã¬ãã£ãã¯ã¹ã ã£ãå ŽåããŸãã¯try!
ããã¬ãã£ãã¯ã¹ã ã£ãå ŽåããŸãã¯
æ¬åŒ§ã§å²ãã«ã¯ãã®å·ŠåŽã«æ»ãå¿
èŠããããŸã
æžã蟌ã¿ãŸãã¯èªã¿åãæã®åŒã
ç·šéïŒç§ã¯é»åã¡ãŒã«ã§æåããæåŸãŸã§ã³ã¡ã³ããèªãã§ããŸãããããã®ã¡ãŒã«ãéä¿¡ãããŸã§ãäŒè©±ãä»ã®åé¡ã«ç§»åãããã³ã¡ã³ãã¯è¡šç€ºãããŸããã§ããã
ãªã³ã¯ã®æŽæ°ïŒ https ïŒ https://github.com/rust-lang/rust/issues/53447ãéããããããã§ãã https://github.com/rust-lang-nursery/futures-rs/issues/1199ã¯https://github.com/rust-lang/rust/issues/53548ã«ç§»åãããããã§ãã
Async-awaitã¹ããŒã¿ã¹ã¬ããŒãïŒ
http://smallcultfollowing.com/babysteps/blog/2019/03/01/async-await-status-report/
async-awaitã®ã¹ããŒã¿ã¹ã«é¢ããç°¡åãªæŽæ°ãæçš¿ãããã£ã
åªåã çãããŒãžã§ã³ã¯ãç§ãã¡ãããŒã ã¹ãã¬ããã«ãããšããããšã§ã
ããçš®ã®å®å®åããããŸãããããã€ãã®éèŠãªç¹ãæ®ã£ãŠããŸã
å
æãã¹ã質åã
ãã®ããã·ã¥ã®äžç°ãšããŠãç§ãã¡ã¯
async-awaitå®è£
ã¯ãŒãã³ã°ã°ã«ãŒãã ãã®ã¯ãŒãã³ã°ã°ã«ãŒã
async-awaitã®åãçµã¿å
šäœã®äžéšã§ããã
å®è£
ã§ãããã³ã³ãã€ã©ããŒã ã®äžéšã§ãã ããªãããããå Žå
éåæãååŸããã®ã«åœ¹ç«ã¡ãŸã-ãã£ããã·ã¥ã©ã€ã³ãåŸ
ã£ãŠãã ãããç§ãã¡ã¯åé¡ã®ãªã¹ããæã£ãŠããŸã
ç§ãã¡ãééããªãå©ããæ±ããŠãããšããïŒç¶ããèªãïŒã
ãèå³ã®ããæ¹ã¯ãå¶æ¥æéãããçšæããŠãããŸããç«ææ¥ã«äºå®ãããŠããŸãïŒ[ã³ã³ãã€ã©ããŒã ã®ã«ã¬ã³ããŒ]ãåç
§ïŒ -
[Zulip]ã«è¡šç€ºã§ããã®ã§ãçæ³çã§ãã ïŒããããããã§ãªãå Žåã¯ãããããããããã€ã³ããã ãã§ã
æéãïŒ
..ã
std::future::Future
ã¯ãã€å®å®ããŸããïŒ async awaitãåŸ
ã€å¿
èŠããããŸããïŒ ãšãŠãçŽ æµãªãã¶ã€ã³ã ãšæããŸããã³ãŒãã®ç§»æ€ãå§ããããšæããŸãã ïŒå©èã§äœ¿çšããã·ã ã¯ãããŸããïŒïŒ
@ryã¯ãæ°ãã远跡ã®åé¡ãåç §ããŠãã ããïŒ //github.com/rust-lang/rust/issues/59113
async / awaitã®å¥ã®ã³ã³ãã€ã©ã®åé¡ïŒ https ïŒ
ãŸããäžéšã®æçš¿ã®https://github.com/rust-lang-nursery/futures-rs/issues/1199ãä¿®æ£ãããããããã§ãã¯ãªãã§ããããšã«ã泚æããŠ
HRLBãšéåæã¯ããŒãžã£ã«åé¡ãããããã§ãïŒ //github.com/rust-lang/rust/issues/59337ã ïŒãã ããRFCãåã¹ããã³ã°ããŠããéåæã¯ããŒãžã£ãéåæé¢æ°ãšåãåŒæ°ã©ã€ãã¿ã€ã ãã£ããã£ã®å¯Ÿè±¡ã«ãªãããšã¯å®éã«ã¯æå®ãããŠããŸããïŒã
ãããéåæã¯ããŒãžã£ã«ã¯ããããã®åé¡ããããå®å®åã®æåã®ã©ãŠã³ãã«å«ããã¹ãã§ã¯ãããŸããã çŸåšã®åäœã¯closure + asyncãããã¯ã§ãšãã¥ã¬ãŒãã§ããŸããå°æ¥çã«ã¯ãè¿ãããfutureããã¯ããŒãžã£ãŒã®upvarsãåç §ã§ããããŒãžã§ã³ã確èªããããšæããŸãã
çŸåšawait!(fut)
ã§ã¯fut
ãUnpin
å¿
èŠãããããšã«æ°ã¥ããŸããïŒ https ïŒ
ããã¯æåŸ ãããŠããŸããïŒ RFCã«å«ãŸããŠããªãããã§ãã
ãšã©ãŒãäžããawait!
ã¯ãªã@Ekleog ã await!
æŠå¿µçã«æž¡ãããå
ç©ãã¹ã¿ãã¯ãã³çãããŠã !Unpin
å
ç©ã䜿çšã§ããããã«ããŸãïŒç°¡åãªéã³å Žã®äŸïŒã ãã®ãšã©ãŒã¯ã impl Future for Box<impl Future + Unpin>
ã®å¶çŽã«èµ·å ããŸããããã«ããã次ã®ãããªæäœãåæ¢ããã«ã¯ãfutureãUnpin
ã§ããå¿
èŠããããŸãã
// where Foo: Future + !Unpin
let mut foo: Box<Foo> = ...;
Pin::new(&mut foo).poll(cx);
let mut foo = Box::new(*foo);
Pin::new(&mut foo).poll(cx);
Box
ã¯Unpin
ãããããããå€ã移åã§ããããã1ã€ã®ããŒãã®å Žæã§æªæ¥ãäžåºŠããŒãªã³ã°ããŠãããããã¯ã¹ããæªæ¥ã移åããŠæ°ããããŒãã®å Žæã«é
眮ããããŒãªã³ã°ããããšãã§ããŸããããäžåºŠã
awaitã¯ãå°æ¥ãæ¶è²»ããããã Box<dyn Future>
ãèš±å¯ããããã«ç¹å¥ãªå Žåãå¿
èŠã«ãªãå¯èœæ§ããããŸã
ãã¶ãIntoFuture
ç¹æ§ã¯await!
ã§åŸ©æŽ»ããå¿
èŠããããŸããïŒ Box<dyn Future>
ã¯ã Pin<Box<dyn Future>>
å€æããããšã§ãããå®è£
ã§ããŸãã
ãããasync / awaitã®æ¬¡ã®ãã°ã§ãïŒ async fn
ã®æ»ãåã®åãã©ã¡ãŒã¿ãŒã«é¢é£ä»ããããåã䜿çšãããšæšè«ãå£ããŸãïŒ //github.com/rust-lang/rust/åé¡/ 60414
ããããã¹ãã®ãªã¹ãã«ïŒ60414ãè¿œå ããå¯èœæ§ãããããšã«å ããŠïŒãŸã 䜿çšãããŠãããã©ããããããªã-githubã©ãã«ãæãæ¹ãè¯ããããããŸãããïŒïŒããrust-lang /ã®è§£æ±ºçããšæããŸãã IIRCã®Future
ç¹æ§ãæè¿å®å®ãããããrfcsïŒ2418ãã«ãã§ãã¯ããŒã¯ãä»ããããšãã§ããŸãã
ç§ã¯Redditã®æçš¿ããæ¥ãã°ããã§ãpostfixæ§æã¯ãŸã£ãã奜ãã§ã¯ãªããšèšããããåŸãŸããã ãããŠãRedditã®å€§å€æ°ããããæ°ã«å ¥ããªãããã§ãã
ç§ã¯ãããæžã
let x = (await future)?
ãã®å¥åŠãªæ§æãåãå ¥ãããããã
ãã§ãŒã³ã«é¢ããŠã¯ãã³ãŒãããªãã¡ã¯ã¿ãªã³ã°ããŠã await
ãè¶
ããªãããã«ããããšãã§ããŸãã
ãŸããå°æ¥ã®JavaScriptã¯ãããè¡ãããšãã§ããŸãïŒã¹ããŒããã€ãã©ã€ã³ææ¡ïŒïŒ
const x = promise
|> await #
|> x => x.foo
|> await #
|> x => x.bar
ãã¬ãã£ãã¯ã¹await
ãå®è£
ãããŠããå Žåãããã¯await
ããã§ãŒã³ã§ããªãããšãæå³ããŸããã
@KSXGitHubããã¯å®éã«ã¯ãã®è°è«ã®å Žã§ã¯ãããŸããããããžãã¯ã¯ããã«æŠèª¬ãããŠãããå€ãã®äººã ã«ãã£ãŠäœã¶æã«ãŸãhttps://boats.gitlab.io/blog/post / await-decision /
@KSXGitHubç§ããæçµçãªæ§æãå«ããŸãããããã¯åºããïŒ57640ã§è°è«ãããŠããhttps://internals.rust-lang.org/t/await-syntax-discussion-summary/ ã HTTPSïŒ//internals.rust- lang.org/t/a-final-proposal-for-await-syntax/ ãããã³ä»ã®ããŸããŸãªå Žæã å€ãã®äººã ãããã§åœŒãã®å¥œã¿ãè¡šæããŸããããããŠããªãã¯äž»é¡ã«æ°ããè°è«ããããããŠããŸããã
ããã§èšèšäžã®æ±ºå®ã«ã€ããŠè°è«ããªãã§ãã ããããã®æ確ãªç®çã®ããã®ã¹ã¬ããããããŸã
ããã§ã³ã¡ã³ãããäºå®ãããå Žåã¯ãè°è«ããã§ã«ããªãè¡ãããŠããããšãèŠããŠãããŠãã ãããå®è³ªçãªçºèšãããããšã確èªããã¹ã¬ããã§ä»¥åã«çºèšãããŠããªãããšã確èªããŠãã ããã
@withoutboatsã¯ãæçµçãªæ§æããã§ã«åæãããŠããããšãç解ããŠããŸããããããããããå®äºãšããŠããŒã¯ãããšãã§ããïŒ ïŒèµ€é¢ïŒ
7æ4æ¥ã®æ¬¡ã®ããŒã¿ã«ããã«éã«åãããã«å®å®ãããæå³ã¯ãããŸããããããšããããã¯ãã°ã解決ããã«ã¯å¥ã®ãµã€ã¯ã«ãå¿ èŠã§ããïŒ A-async-awaitã¿ã°ã®äžã«ã¯æªè§£æ±ºã®åé¡ããããããããŸãããã©ãã ããéèŠãã¯ããããŸããã
ããã«ã¡ã¯ïŒ ãã®æ©èœã®å®å®ãããªãªãŒã¹ãæåŸ ããå¿ èŠãããã®ã¯ãã€ã§ããïŒ ãããŠãããããã€ããªãŒãã«ãã§ã©ã®ããã«äœ¿çšã§ããŸããïŒ
@MehrdadKhnzd https://github.com/rust-lang/rust/issues/62149ã«ã¯ããªãªãŒã¹äºå®æ¥ãªã©ã«é¢ããæ å ±ãå«ãŸããŠããŸã
async fn
ã«ãã£ãŠçæãããå
ç©ã«Unpin
ãèªåçã«å®è£
ããèšç»ã¯ãããŸããïŒ
å ·äœçã«ã¯ãçæãããFutureã³ãŒãèªäœãåå ã§ãUnpinãèªåçã«äœ¿çšã§ããªãã®ãããããšãåç §ãåŒæ°ãšããŠäœ¿çšã§ããã®ããçåã«æã£ãŠããŸãã
@DoumanAshéåæfnãyieldãã€ã³ãã§ã¢ã¯ãã£ããªèªå·±åç §ãæããªãå ŽåãçæãããFutureã¯ãããã
ã_this_borrowã®ããã«Unpin
ã¯ãªãããšããéåžžã«åœ¹ç«ã€ãšã©ãŒã¡ãã»ãŒãžãšã代ããã«ãã®æªæ¥ãããã¯ã¹åã§ããããšãããã³ãã䌎ãå¿
èŠããããšæããŸãã
ïŒ63209ã®å®å®åPRã¯ãããã¹ãŠã®ãããã«ãŒãéããããŸããããšè¿°ã¹ãŠããŸãã ãããŠ8æ20æ¥ã«æ¯æ©äžéžãããããä»é±åŸåã«ããŒã¿ã«ããã«åãããŸããã 8æ20æ¥ä»¥éãããã€ãã®æ°ããããããã³ã°ã®åé¡ãå ±åãããŠããããšã¯æ³šç®ã«å€ããŸãïŒAsyncAwait-Blockingã¿ã°ã«ãã£ãŠè¿œè·¡ãããŸãïŒã ãããã®ãã¡ã®2ã€ïŒïŒ63710ãïŒ64130ïŒã¯ãå®éã«ã¯å®å®åã劚ããªã䟿å©ãªæ©èœã®ããã«èŠããŸãããä»ã«3ã€ã®åé¡ïŒïŒ64391ãïŒ64433ãïŒ64477ïŒã«ã€ããŠèª¬æãã䟡å€ãããããã§ãã ãããã®åŸè ã®3ã€ã®åé¡ã¯é¢é£ããŠããããããã¯ãã¹ãŠAsyncAwait-Blockingåé¡ïŒ63832ã«å¯ŸåŠããããã«äžéžããPRïŒ64292ãåå ã§çºçããŸãã PRïŒ64584ã¯ãåé¡ã®å€§éšåã«å¯ŸåŠããããã«ãã§ã«çéžããŠããŸããã3ã€ã®åé¡ã¯ä»ã®ãšããæªè§£æ±ºã®ãŸãŸã§ãã
éè²ã®è£æã¡ã¯ã3ã€ã®æ·±å»ãªãªãŒãã³ãããã«ãŒããã³ã³ãã€ã«ããå¿ èŠãããã³ãŒãã«é¢ä¿ããŠããããã«èŠããããçŸåšã¯ã³ã³ãã€ã«ãããŠããªãããšã§ãã ãã®æå³ã§ãasync / awaitã®ããŒã¿åãšæçµçãªå®å®åã劚ããããšãªããåŸã§åå°ã®ä¿®æ£ãšäžäœäºææ§ããããŸãã ããããç§ã¯ãã®éåæã瀺åããã®ã«ååãªæžå¿µãããLANGããŒã ãã誰ããããã§ãã®äœããèããŠãããã©ãããæã£ããã ãã©/ã®awaitã¯ãããèãããããããäžå¿«ãšããŠãè¿ éãªãªãªãŒã¹ã¹ã±ãžã¥ãŒã«ã®ç¹ã§ãããïŒå¥ã®ãµã€ã¯ã«ã®ããã«æ¯æ©ã«çŒãå¿ èŠããããŸãçµå±ïŒã
@bstrie ãAsyncAwait-Blockingããåå©çšããŠããã®ã¯ããé«åªå 床ããšããŠãããã瀺ãããã®ããè¯ãã©ãã«ããªãããã§ããå®éã«ã¯ãããã¯ããŠããŸããã æ··ä¹±ãå°ãªãããããã«ãã©ãã«ä»ãã·ã¹ãã ãããã«å·æ°ããå¿ èŠããããŸããcc @ nikomatsakisã
...è¯ããããŸãã... async-awaitãæåŸ ããŠ1.38ãéããŸããã ã«ãŠã³ããããªãã£ãããã€ãã®ãåé¡ãã®ããã«ã1.39ãåŸ ããªããã°ãªããŸãã...
@earthengineããã¯ç¶æ³ã®å ¬æ£ãªè©äŸ¡ã§ã¯ãªããšæããŸãã çºçããåé¡ã¯ãã¹ãŠçå£ã«åãçµã䟡å€ããããŸãã 人ã ãå®éã«ããã䜿ãããšããŠãããã®åé¡ã«ééããã®ãåŸ ã€ã ãã§éåæã«çéžããã®ã¯è¯ããããŸãã:)
æãåèã«ãªãã³ã¡ã³ã
æ§æã«ã€ããŠïŒåçŽãªããŒã¯ãŒããšããŠ
await
ãæ¬åœã«æ¬²ããã§ãã ããšãã°ãããã°ã®æžå¿µäºé ãèŠãŠã¿ãŸããããç§ã¯ããã§åæããŸãããäžãã£ãã¯æªã§ãã
?
åªå é äœã¯await
ãããäœããããã§çµããããšãèŠããŠããæ¹ãç°¡åã ãšæããŸããèªã¿ãããããªãã¡ã¯ã¿ãªã³ã°ãç°¡åã§ãã ç§ã¯ãããããè¯ãã¢ãããŒãã ãšä¿¡ããŠããŸãã
æäœãå®è¡ãããé åºãããããç解ã§ããŸãããèªã¿ã«ãããªããŸãã
await foo?
ãæåã«await
å®è¡ãããšãåé¡ã¯ãªããšæããŸãã ããããåå¥çã«ã¯ãã£ãšçµã³ã€ããŠããŸãããawait
ã¯å·ŠåŽã«ããã?
ã¯å³åŽã«ãããŸãã ãããã£ãŠãæåã«await
ããã®åŸã«Result
ãåŠçããã®ã«ååè«ççã§ããæèŠã®çžéãããå Žåã¯ã話ãåãããã«ãã®æšãè¡šæããŠãã ããã ãµã€ã¬ã³ãããŠã³æ祚ãäœãæå³ããã®ãããããŸããã ç§ãã¡ã¯çãRustã«è¯ãããšãé¡ã£ãŠããŸãã