21/07/23 13:58:58.67 c2hWXBFi.net
>>357の言う「タスク」って1つのasync関数のように読めるんだが、そういう理解で合ってるのか?
370:デフォルトの名無しさん
21/07/23 14:46:14.22 eQcO0XNp.net
>>362
tokio::spawnなどの引数に渡すものがタスク
async関数やブロックの場合もあるし、それらをコンビネーターでしたものの場合もある
371:デフォルトの名無しさん
21/07/23 15:12:50.36 c2hWXBFi.net
だとすると「スレッドよりさらに小さい」ってのは変だな。大きい小さいあるいは包含関係が決められるものじゃない。
372:デフォルトの名無しさん
21/07/23 15:14:21.60 6EkuYiQH.net
そもそも直交する概念だし用途によって使い分けるものでもあるし
373:デフォルトの名無しさん
21/07/23 16:49:32.73 +8+VImv7.net
スレッドより軽量という意味での小さいなら分かる
374:デフォルトの名無しさん
21/07/23 19:17:06.47 Nx0yKcVz.net
Elixirのプロセスは、軽量プロセスと言われていて、
OSのプロセスやスレッドではなく、Greenスレッドです
カーネルではなく、VMでスケジューリングされるので軽量、
コンテキストスイッチが発生しない
1軽量プロセスで約300ワードです
375:デフォルトの名無しさん
21/07/23 19:46:36.80 j3QjPF86.net
ここはRustスレ
376:デフォルトの名無しさん
21/07/23 21:20:19.48 O9MjyOb4.net
いつものRubyキチガイだろう
何言っても無駄だからスルーするしかない
377:デフォルトの名無しさん
21/07/23 21:25:52.66 c2hWXBFi.net
>>366
スレッドで動くんだから「スレッドより軽量」ってことはない。
378:デフォルトの名無しさん
21/07/23 21:50:34.41 TZPR0HeA.net
>>367
軽量プロセスでもコンテキストスイッチは発生するよ
379:デフォルトの名無しさん
21/07/23 22:59:27.49 eQcO0XNp.net
>>370
タスクと同じことをスレッドでやろうとした場合の比較ね
タスクと同じ数のスレッドを作った場合スタックだけで結構な量のメモリが必要になったりする
あとコンテキストスイッチのコストは少なく済んだりするんじゃないかな
380:デフォルトの名無しさん
21/07/23 23:08:30.77 c2hWXBFi.net
>>372
「タスク」の定義が>>363のようなものならそれはスレッドと直交する概念だと思うが?
381:デフォルトの名無しさん
21/07/24 00:30:53.20 LBBZ+Kmj.net
心臓のスイッチ切って死なねえかなこいつら
382:デフォルトの名無しさん
21/07/24 01:45:40.45 5ex845z5.net
>>370
async/awaitでのタスクはスレッドよりリソースを喰わず軽量
例えば1つのスレッドの上に1万個のタスクでも動作可能でいわゆるC10K問題も対応できる軽量さ
>>373
直交する概念ではなく重量順に
OSプロセス≧OSスレッド≧タスク
(それぞれ=となるのは1プロセス1スレッドおよび1スレッド1タスクで用いる時)
383:デフォルトの名無しさん
21/07/24 02:52:34.75 F/fcX2Mm.net
タスクって名前が良くないな
一般的にはタスクってプロセスのことじゃない?
384:デフォルトの名無しさん
21/07/24 02:57:53.91 UokC4u3Y.net
んなことないでしょ???
385:デフォルトの名無しさん
21/07/24 04:00:31.27 NjCPGO8Q.net
タスクってのは内部実装的には非同期I/Oを使ったシングルスレッドでしょ。
386:デフォルトの名無しさん
21/07/24 07:37:56.03 vPIKycwR.net
>>375
OSプロセスは複数のスレッドを持つ場合があるから≧でいいが、>>363の言うタスクなら
1スレッドで同時に実行できるのは1タスクしかないと思うが?
387:デフォルトの名無しさん
21/07/24 09:29:01.55 qEX1axDl.net
Rustのasyncについて知りたければ「async-book」は必読なので
次からテンプレに入れよう
URLリンク(rust-lang.github.io)
>>980
よろしこ
388:デフォルトの名無しさん
21/07/24 10:59:35.94 /TMjuFD+.net
>>379
1スレッドで同時に実行されるタスクが1つというのは正しい
従来のスレッドでの並列化(1スレッド1タスク)の場合、IO処理を呼び出すと処理完了するまでの間はスレッドはsleep状態になってしまっていた
sleepしている間に他のタスクを実行させるためには、実行するタスクと同じ数だけのスレッドを生成する必要があるが
スレッド生成で消費するリソースが多いため数万タスクを同時に捌くことは難しかった
async-awaitではIO処理完了までの間スレッドをsleep状態にするのではなく別のタスクを実行する
これによりスレッドあたりの処理可能タスク数が増えるため、アプリケーション全体で同時に捌けるタスク数も増える
従来の手法でもスレッドをsleepさせないようなプログラミングは可能だけどプログラムの構造を大きく書き換えないといけなかった
普通のスレッド並列のプログラムと同じ書き味でより多くのタスクを捌けるプログラムが書けるというのがasync-awaitの一番のメリット
ただし常にasync-awaitが望ましいわけでもない
async-awaitで効率的に実行できるのはIO待ちが発生するタスクの場合で、CPUをぶんまわす処理には向いていない
適材適所で従来のスレッドによる並列化手法と組み合わせて使うことになる
389:デフォルトの名無しさん
21/07/24 11:28:00.32 0bHT8/gy.net
>>379
いいえ
1つのスレッド上で同時に複数のタスクを並行(concurrent)に実行できるのがasync/awaitのタスクです。
C10Kと言われるように1つのスレッド上で10000のタスクでも並行に実行できます。
ちなみに1つのスレッド上で並列(parallel)に実行されるのは1つのタスクのみなのは当たり前なので、わざわざ言うことはないです。
今回はasync/awaitの話なので、
『1つのスレッド上で同時に複数のタスクを並行(concurrent)に実行できる』が正解です。
390:デフォルトの名無しさん
21/07/24 11:33:29.24 vPIKycwR.net
>>381
その1スレッドが時分割で複数タスクを実行できるということのちょうど裏返しで、1タスクは複数スレッドから実行され得る。
つまりそこに大小関係、包含関係などは無い直交した概念。
軽量云々てのはOSスレッドとグリーンスレッドの話とごっちゃになってんじゃないかねぇ。
391:デフォルトの名無しさん
21/07/24 12:05:51.45 F/fcX2Mm.net
>>382
>C10Kと言われるように1つのスレッド上で10000のタスクでも並行に実行できます。
本当に並行に実行される?
キューイングされたコールバックを順に呼んでるだけじゃなくて?
392:デフォルトの名無しさん
21/07/24 12:13:15.89 XrocH4ML.net
ねえこの引っ込みがつかなくなったゴミクズ共のメンチの切り合いっていつまで続くの?
393:デフォルトの名無しさん
21/07/24 12:14:13.90 XrocH4ML.net
包丁刺し合って死んで終わらないからネットのマウ
394:ント取り合いって性質が悪いんだよね
395:デフォルトの名無しさん
21/07/24 12:17:43.31 sVj/Jq99.net
5chに何も期待してるのか
396:デフォルトの名無しさん
21/07/24 12:21:52.26 K4Uz+tqB.net
>>384
あなたは初心者のようだから
まずは基礎知識である並行(concurrent)と並列(parallel)の違いを理解してから
あらためて>>382を読み直して理解しましょう
397:デフォルトの名無しさん
21/07/24 12:40:53.43 F/fcX2Mm.net
>>388
理解した
並列じゃないってことね
398:デフォルトの名無しさん
21/07/24 12:41:30.17 F/fcX2Mm.net
間違った
並行じゃないってことね
399:デフォルトの名無しさん
21/07/24 12:42:53.22 F/fcX2Mm.net
で、実際のところランタイムってlongjmpみたいなことしてるの?
400:デフォルトの名無しさん
21/07/24 12:49:05.14 yYYDVwTY.net
>>391
しない
Futureを実装したオブジェクトのメンバとして持ち回る
クロージャがFnMut/FnOnceを実装したオブジェクトのメンバとして状態を持ち回るのと同じ
401:367
21/07/24 12:51:25.18 zz8rVX09.net
Elixir, Go の軽量プロセスと同じでしょ?
OS は関係ない。
言語(VM)内で切り替えているだけだから
402:デフォルトの名無しさん
21/07/24 13:02:35.92 yYYDVwTY.net
タスクの厳密な定義が気になるのってFutureを必要とする動機が無いんじゃないかね
別に新しいことができるわけじゃないし、必要無ければ知らなくていいよ
403:デフォルトの名無しさん
21/07/24 13:54:25.17 lC8WbEdp.net
C10k問題がまずあって、それをselect/epollで解決するってシナリオをまず理解しておかないと
何でめんどくさい事わざわざやってんの?としかならんでしょ
モチベーションが大事
404:sage
21/07/24 14:51:29.52 HHfUZBfC.net
まともにテストしてねーじゃん
URLリンク(lkml.org)
405:デフォルトの名無しさん
21/07/25 01:04:24.12 2QCCz/RS.net
オライリーのrustの本ってどう?
これから勉強するんだけど、これ使っても時代に遅れない?
406:デフォルトの名無しさん
21/07/25 02:38:56.34 kViuqetF.net
4年前の本だからおすすめはしないな
407:デフォルトの名無しさん
21/07/25 02:43:00.77 xzEFH2+d.net
>>383
マルチスレッドなランタイムを使えばスレッドとタスクはm:nだけど
シングルスレッドなランタイムを使えばスレッドとタスクは1:n
いずれの場合でもタスクはスレッドより軽量な存在であり直交する概念ではない
408:デフォルトの名無しさん
21/07/25 09:01:27.23 gzVcIMN0.net
>>397
原著の第2版がオススメ
といってもasyncの章が追加されたのを除くとコアなところは第1版と同じ
今のところオライリー本が圧倒的に良いので他の本で学ぶくらいなら第1版の訳書のほうがいい
古くなってるところはEdition Guideやasync-book、Rust Blogで補完
409:デフォルトの名無しさん
21/07/25 09:12:18.43 vKIU/TO0.net
俺もそう思う。古かろうがオライリー本が圧倒的に良い。
410:デフォルトの名無しさん
21/07/25 09:59:11.23 jOyNlFI3.net
>>397
言語仕様的なのが延々と書いてあっても辛くないタイプの人ならオススメ
自分はそういうのが好きだが、「サンプルアプリを作りながら学びましょう」ってタイプではないので合わない人はいると思う
411:デフォルトの名無しさん
21/07/25 11:34:17.97 CXQT/x9B.net
Rust はサンプルコードを見ながら真似ていれば雰囲気で書けるようになる……
なんていう言語ではないので基礎的な理屈を体系的に (それでいてわかりやすく)
説明してくれるオライリー本はとても良いよ。
確かに理屈っぽいが、 Rust がそういう言語なのでオライリーの本がつらいと思う人は
そもそも Rust がつらいタイプの人なんだと思う。
412:デフォルトの名無しさん
21/07/25 19:04:19.16 HNTE1GP9.net
Rustlingsのこれやっててよくわかんなかったんだけどさあ
URLリンク(github.com)
自分の解答は
pub fn bigg
413:er(a: i32, b: i32) -> i32 { if a > b{ return a; } b } これなんだけど、「return a;」のところってなんで「a」だけじゃダメなの?
414:デフォルトの名無しさん
21/07/25 19:46:35.31 gzVcIMN0.net
elseがあればいいんじゃない?
415:デフォルトの名無しさん
21/07/25 19:49:48.51 Wj/gwJho.net
>>404
関数の最後じゃにゃいから
416:デフォルトの名無しさん
21/07/25 21:25:46.69 2QCCz/RS.net
オライリー買ってくる
417:デフォルトの名無しさん
21/07/25 21:31:05.59 HNTE1GP9.net
ありがとう
最後の式だ特別なのか
418:デフォルトの名無しさん
21/07/26 20:33:20.42 FeBtPwa3.net
文と式を区別しましょう
419:デフォルトの名無しさん
21/07/26 21:31:17.41 H6CQkre6.net
ブロック式が値を持つなら式文も値を持たせればよかったと思うんだけど、それだと何か都合が悪いのかな。
420:デフォルトの名無しさん
21/07/26 21:53:51.50 6YP5cq8/.net
それは式文を構成する式と何が違うのか
421:デフォルトの名無しさん
21/07/26 22:05:31.99 H6CQkre6.net
最後だけセミコロンを外すとかしなくて済む。
422:デフォルトの名無しさん
21/07/26 22:09:46.01 x+l/EPbt.net
セミコロンあるなしで意味が変わるのって、バグを産む原因になりそう
423:デフォルトの名無しさん
21/07/26 22:26:28.18 6YP5cq8/.net
その流れ前スレでも見た気がする
424:デフォルトの名無しさん
21/07/27 00:03:59.51 rFi02BpK.net
どちらかというと;の有無で()を返すかどうか制御できる方がいい気がするけどな
式文も値を持つならわざわざ();って書かないといけない
(まぁわざわざ書かせるのもRustらしい気もするが)
>>413
間違えたら型エラーになるからバグにはならんと思うよ
425:デフォルトの名無しさん
21/07/27 03:17:46.37 MlLztw4F.net
() を返す場合は関数省略だからreturn必須でよかったな
426:デフォルトの名無しさん
21/07/27 05:41:20.63 QHeETuJ4.net
if-elseとかmatchとかでひたすら();書くのさすがにやばくない?
427:デフォルトの名無しさん
21/07/27 08:21:13.66 fovpYeUo.net
どうしても () を返さなきゃならない場面ってそんなに多いんだっけ?
428:デフォルトの名無しさん
21/07/27 08:35:39.46 XvzwJYSJ.net
コード例がないから全然わからん
429:デフォルトの名無しさん
21/07/27 08:54:31.16 D32lY0Gw.net
Ok(())とか?
430:デフォルトの名無しさん
21/07/27 09:50:38.86 UmdqpWnl.net
最初アホみたいにReturn合った方が…とか思ってたけど慣れると全く要らん境地になるから不思議
431:デフォルトの名無しさん
21/07/27 10:35:08.16 KNfqOmw/.net
>>418
少なくともletは値を返すわけにはいかないので()だね
まぁCopyなら返せなくもないけど、Copyかどうかで挙動が変わるのはさすがに…
();を明示する、みたいにするとletだけ特別扱いになるし、結局今のルールでいいんじゃないかと
432:デフォルトの名無しさん
21/07/27 11:00:19.20 +VH8W8kj.net
elseのないif式で偽の時の値の話だと思ってた
433:デフォルトの名無しさん
21/07/27 11:03:48.76 MlLztw4F.net
>>417
書き方が悪かった
returnは値を返す時は必須だけどreturnがない場合は省略する。 関数の返り値と同じ法則で
434:デフォルトの名無しさん
21/07/27 19:22:36.90 AoeS3kCP.net
でも、関数の最後じゃなくてもさあ
文があったら、そこでリターンしてくれたらいいのにな
まあ、ミスってても気づき辛くなるからダメなんかな?
435:デフォルトの名無しさん
21/07/27 19:47:32.00 klQCV9Qk.net
2文目以降は一切評価されないってことか
斬新だね
436:デフォルトの名無しさん
21/07/27 21:44:05.27 fovpYeUo.net
>>422
特別扱いってのがよくわからないなぁ。
let x が () なら let x; も () でいいし (); を明示する必要もないと思うんだけど。
437:デフォルトの名無しさん
21/07/27 21:53:09.04 fgL6LRsn.net
そもそもletは式じゃないし
438:デフォルトの名無しさん
21/07/27 22:40:27.72 KUIeKdyD.net
XXXがstatementだとか、XXXはe
439:xpressionだとか そういう議論が出る時点でダメ言語のオーラが 言語オタクには楽しいかもしれないけど
440:デフォルトの名無しさん
21/07/27 22:47:11.69 fovpYeUo.net
だから式文じゃない文は () でいいんじゃね?特に特別扱いとは思わんが。
441:デフォルトの名無しさん
21/07/27 23:18:47.62 rFi02BpK.net
文は()という単純なルールを崩してまで式文から値を得たいモチベーションがよくわからん
単に;を取って式にすればいいだけなのに
442:デフォルトの名無しさん
21/07/27 23:20:35.98 3rBo4v1y.net
Rust書いてて式と文を意識して区別しないといけないことなんて無いよ
CやPythonならあるけど
443:デフォルトの名無しさん
21/07/27 23:30:43.54 fgL6LRsn.net
関数末尾だけセミコロン外すのが気に入らないなら、C/C++でやってたようにreturn x;とすればいい
それで不都合を生むことはない
444:デフォルトの名無しさん
21/07/28 00:01:15.04 SAGnL8kO.net
clippy先生に注意される
445:デフォルトの名無しさん
21/07/28 01:30:00.88 ch5q2ifJ.net
全てはclippy先生の仰せのままに
446:デフォルトの名無しさん
21/07/28 01:47:51.35 QoybXfTv.net
#![allow(clippy::foo)] を書けばいいじゃん
447:デフォルトの名無しさん
21/07/28 04:09:34.57 96ImUxMy.net
なるほど
>Rustのセミコロンは意味と構文からそれぞれ説明できる。
>意味論的には、以下の原則を覚えておけば十分である。
>
>・セミコロンで終端された文は強制的に () 型となる。
>・ブロックの途中の文は () 型でなければならない。
>・ブロックの型はブロックの最後の文の型と等しい。(文がひとつもない場合は ())
448:デフォルトの名無しさん
21/07/28 07:29:31.85 o1sqfUmC.net
>・ブロックの途中の文は () 型でなければならない。
これがあるから1行目の仕様なんだろうけど、これの理由ってなんなのかな。
449:デフォルトの名無しさん
21/07/28 08:03:12.35 LX2CDHAF.net
文に型なんてないよ
450:デフォルトの名無しさん
21/07/28 08:14:26.64 9WJC0mlm.net
文って値を返さないのかと思ってたけれど、
()を返してるって事?
451:デフォルトの名無しさん
21/07/28 08:37:40.51 LX2CDHAF.net
ブロックの型はブロックの最後の「式」の型と等しい。(「ブロックの最後に式がない」場合は())
ここの間違いが他のすべての説明によく分からない辻褄合わせを持ち込んでいるだけだと思う
452:デフォルトの名無しさん
21/07/28 09:58:43.22 rdzsGCBs.net
>>437
>・ブロックの途中の文は () 型でなければならない。
そもそもブロックの途中の文を()以外にすることってできるの?
{ foo; bar } みたいなブロックを{ foo bar }とは書けないし
453:デフォルトの名無しさん
21/07/28 10:29:08.57 LX2CDHAF.net
>>442
それは型の問題以前に文法の問題
型だけの問題だというなら、{ let foo = (); foo bar }と書けばコンパイルできるはずだが、
もちろんそんなことはない
454:デフォルトの名無しさん
21/07/28 11:58:08.16 ch5q2ifJ.net
Facebook、次期ビルドシステムの開発でRust言語の採用を明らかに
URLリンク(www.publickey1.jp)
455:デフォルトの名無しさん
21/07/28 11:59:44.89 rdzsGCBs.net
>>443
文法の問題を解決しつつブロックの途中の文を()以外にする方法がわからんってことよ
456:デフォルトの名無しさん
21/07/28 12:46:01.08 LX2CDHAF.net
>>445
何度でも言う
文に型はない
457:デフォルトの名無しさん
21/07/28 12:58:11.75 LX2CDHAF.net
「文を()にする/()以外にする」の正確な意味を言語化してほしい
「文が評価されて結果として()/()以外が得られる」という意味で言っているのなら、文は評価されて結果を返すものではない
評価されて結果を返すものは式と呼ばれる
文は式ではない
458:デフォルトの名無しさん
21/07/28 13:10:10.87 rdzsGCBs.net
>>447
俺もそのへんはよくわからんが、
式文は「文が評価されて結果として()が得られる」って認識で使ってた
これが誤りならまあすまん
ここにこだわるつもりは全然なくて、
ようするに>>437の「ブロックの途中の文は () 型でなければならない。」ってのがどういうこっちゃってこと
この表現だと() 型じゃなくする方法があるように読めるからさ
459:デフォルトの名無しさん
21/07/28 13:12:38.58 YxciSlP+.net
この一連の議論の評価値は ()
460:デフォルトの名無しさん
21/07/28 13:27:20.45 LX2CDHAF.net
>>448
自分は>>441で書いた通りその部分は辻褄合わせだと思ってるよ
まあでも、自分もRust入門したころは似たようなことでこんがらがってたような気はする
ブロックが式だなんて思ってなかったからかな
461:デフォルトの名無しさん
21/07/28 14:29:43.24 x93GMB6T.net
>>449
コンパイルエラーだよ
462:デフォルトの名無しさん
21/07/28 14:52:26.31 QoybXfTv.net
セミコロン省略できる式文(?)の型が()ではない場合は型エラーになるね
URLリンク(play.rust-lang.org)
セミコロンをつけたり、型を()にしたりするとエラーにならない
URLリンク(play.rust-lang.org)
URLリンク(play.rust-lang.org)
463:デフォルトの名無しさん
21/07/28 17:33:51.84 Ns6HtioT.net
最も単純化してこれはコンパイル通るけど
fn main() {
if true {
1
} else {
0
};
()
}
しかし上記のifの尻のセミコロン無しだとコンパイルエラー【値が()ではない】となる
セミコロン無しでも数字1と0を()へ変えればコンパイルが通る
つまり
>>437
>・ブロックの途中の文は () 型でなければならない。
ifをセミコロン無しで値が数字だと上記の条項を満たせないためエラー
ifをセミコロン無しで値が()だと上記の条項を満たせる
あるいは
>・セミコロンで終端された文は強制的に () 型となる。
値が数字でもifをセミコロン終端させれば上記の条項を満たせる
464:デフォルトの名無しさん
21/07/28 17:46:15.09 SAGnL8kO.net
で?って感じだけど
とりあえずリファレンス見てくれば?
URLリンク(doc.rust-lang.org)
465:デフォルトの名無しさん
21/07/28 18:03:06.43 zh3fVAA3.net
>>454
そのリファレンスの説明だけだと
以下はコンパイル通るけど、関数内の3つの()のうち任意の1つでも数値に変えるとコンパイルエラーとなる説明はどの部分になる?
fn main() {
if true {
()
} else {
()
}
()
}
466:デフォルトの名無しさん
21/07/28 18:13:09.38 gOp2Ufou.net
今問題になってるのはこっちだね
最後の方に「;省略した式文は()でないといけない」となっている
URLリンク(doc.rust-lang.org)
467:デフォルトの名無しさん
21/07/28 18:38:39.95 SAGnL8kO.net
>>455
Note: As a control flow expression, if a block expression is the outer expression of an expression statement, the expected type is () unless it is followed immediately by a semicolon.
URLリンク(doc.rust-lang.org)
An expression that consists of only a block expression or control flow expression, if used in a context where a statement is permitted, can omit the trailing semicolon. This can cause an ambiguity between it being parsed as a standalone statement and as a part of another expression; in this case, it is parsed as a statement. The type of ExpressionWithBlock expressions when used as statements must be the unit type.
When the trailing semicolon is omitted, the result must be type ().
URLリンク(doc.rust-lang.org)
あとif式はifのブロックとelseのブロックで型が揃ってないとだめだよ
468:デフォルトの名無しさん
21/07/28 20:25:06.81 o1sqfUmC.net
>>440
「値を返さない」と「()を返す」は同義だと思う。
469:デフォルトの名無しさん
21/07/28 20:32:49.95 lhnCplqc.net
>>458
値を返さないことはnever typeとして別途定義されてるから()を返すこととは違うよ
470:デフォルトの名無しさん
21/07/28 21:30:00.41 o1sqfUmC.net
never は値どころか制御も返さないから別物では?
()を返す(値は返さない)ことはできるけど、neverは返すことも不可能だと思う。
471:デフォルトの名無しさん
21/07/28 21:34:29.80 iYnBfOfY.net
>>455
2つのエラー要因がある
ifは式(rustでは式文と呼ぶのか)なので、
472:then節とelse節が同じ型でないといけない mainはTerminationトレイトを実装していないといけないので最後の()は数値にできない
473:デフォルトの名無しさん
21/07/28 21:51:43.19 iYnBfOfY.net
>>458
値を返さない、という言葉が今この場では曖昧に見える
本当にrustが値を返すものじゃない、と定義しているのは文法レベルで定義しているのはletや関数定義などの文
これは型チェック入る前にエラーになる
文法的に正しい、けど「値を返さない型」としか呼べないような式も存在して、それはrustだとnever type (!) と呼んでいる
loop {} とかif true { return 10} else { return 0 }とか、こいつらは式だけど決して値にならない
474:デフォルトの名無しさん
21/07/28 23:11:13.67 SAGnL8kO.net
>>458
違うって
何回も指摘されてるやん
475:デフォルトの名無しさん
21/07/28 23:15:38.71 fFOGvJ3Q.net
>>461
じゃあどうしてこれがコンパイルエラーとなるの?
fn main() {
if true {
1
} else {
0
}
()
}
476:デフォルトの名無しさん
21/07/28 23:25:02.98 SAGnL8kO.net
The syntax for a block is {, then any inner attributes, then any number of statements, then an optional expression, called the final operand, and finally a }.
The type of a block is the type of the final operand, or () if the final operand is omitted.
URLリンク(doc.rust-lang.org)
let foo = { fn_call(); }; // final operandがないのでブロックの型は()
let bar = { fn_call() }; // final operandがあるのブロックの型はfn_call()の型
式文が()を返すわけじゃない
477:デフォルトの名無しさん
21/07/28 23:28:39.35 SAGnL8kO.net
>>464
fn main() {
if true { 1 } else { 0 } // <- 式。文法的にfinal operand以外は文じゃないとダメ。if式の型が()の場合のみセミコロンを省略可。
() // <- final operand
}
478:デフォルトの名無しさん
21/07/28 23:34:19.58 2+fvqic5.net
>>466
なぜ『if式の型が()の場合のみセミコロンを省略可。』という謎ルールがあるの??
479:デフォルトの名無しさん
21/07/29 00:18:18.96 J3IrN4Ey.net
>>467
使い勝手がいいから
fn main() {
if true { 1 } else { 0 }
()
}
↑この`if true { 1 } else { 0 }`に意味ないでしょ?
意味持たせるには`let foo = if true { 1 } else { 0 };`みたいに評価結果の値を何かしら使う形にする必要がある
意味がないけどセミコロンで式文にして「値を無視します」と表明すればエラーにはしない
表明がなければ「お前意味ないことやってるぞ」とエラーにしてくれる
`if condition { println!(“1”) } else { println!(“0”) }`みたいに()に評価されるif式は
副作用を起こしたいケースなので評価結果の値を何かしら使う形じゃなくても意味がある
この使い方の時にセミコロンを必須にすると他言語習得者にとってはめちゃくちゃ使い勝手が悪い
知ってれば役に立つことはあっても普段コードを書く時に意識する必要のないルール
480:デフォルトの名無しさん
21/07/29 00:18:47.37 +vgAr19b.net
>>467 他の言語での一般的な書き方も出来るようにだと思う
481:デフォルトの名無しさん
21/07/29 00:23:32.99 vLI97hvR.net
>>467
if式から値が返ってきた場合、次の行まで式が継続するのか;省略なのかが曖昧になるから
()ならそれに対してなにか操作はできないから、式が継続する可能性は消えて、;省略が確定する
482:デフォルトの名無しさん
21/07/29 00:27:10.13 J3IrN4Ey.net
>>468
>`let foo = if true { 1 } else { 0 };`
一応補足しておくと↑この場合のセミコロンは文法的にはlet statementのセミコロン
483:デフォルトの名無しさん
21/07/29 08:55:08.12 KzEq3JVg.net
>>470
構文解析フェーズで型を意識してるの?
484:デフォルトの名無しさん
21/07/29 22:05:11.47 0uhLIXqL.net
>>470
こういうことかな
if true { () } else { () } - 2 【値-2】
if true { 1 } else { 0 } - 2 【エラー】
if true { 1 } else { 0 }; - 2 【値-2】
(if true { 1 } else { 0 }) - 2 【値-1】
485:デフォルトの名無しさん
21/07/30 02:02:42.06 VAfd9CHU.net
rust version 1.54.0 リリース
486:デフォルトの名無しさん
21/07/30 11:59:34.52 3yGih40v.net
URLリンク(twitter.com)
(deleted an unsolicited ad)
487:デフォルトの名無しさん
21/07/30 13:41:26.16 bSJbrTlR.net
Cは、明確にポインタをつかって書くことで手作業で最適化できるが、
Rustのsafeモードは、見た目は参照もポインタも使わず実体コピーのような
書き方をする。例えば、
let a = Box::new(オブジェクト名:{・・・});
や、
let b = Box::new(オブジェクトを返す関数(・・・));
のように。
これはちゃんとコピーが生じないように最適化されているのだろうか?
C++は、同様の書き方をする場合は、無駄をなくすために例えば、
vector::emplace_back()
なるものがあり、最適化に任さずに明確にコピーを省略するマクロの様な
働きをするらしい。
488:デフォルトの名無しさん
21/07/30 14:17:32.88 bSJbrTlR.net
>>476
あと、C++の場合、
CPerson person = CPerson(・・・);
と書いた場合は、代入にならずに必ず、
CPerson person(・・・);
と書いた場合と全く同様にコンストラクタが呼び出されることが決まっている。
Rustの場合、そういうことが全くドキュメント化されてない。
C++プログラマはそのことを理解しているから高速なコードが書けるが、
Rustは書いてないのでテキトーに書くしかない。
結果、あまり速くないコードになって、しかもどこが原因かも分からなく
なりそう。
489:はちみつ餃子
21/07/30 14:26:14.81 qMgk6unv.net
>>476
URLリンク(doc.rust-lang.org)
490:デフォルトの名無しさん
21/07/30 14:26:20.43 uBYlPp6h.net
それよりdropがいつ走るかわからない方が怖いわ
491:デフォルトの名無しさん
21/07/30 15:17:37.81 bSJbrTlR.net
Rustでは、CPersonのメンバ関数 new()の中で Heapにオブジェクトを作る時、
fn new(yyy) {
return Box::new( CPerson {
age: xxxx,
name: xxxx
} );
}
みたいに書くしかないらしい。しかし、C++だと、コンストラクタの中で、
GetSystemModuleName(&name, zzz);
のような書き方も出来る。
何が言いたいかと言えば、Rustだと代入形式でしか書けないので柔軟性に
欠けるということ。
492:デフォルトの名無しさん
21/07/30 15:19:00.34 bSJbrTlR.net
>>478
リンク先間違ってない?
493:デフォルトの名無しさん
21/07/30 15:31:40.72 87Gl51wF.net
bindings_after_at stableになったのうれしい
494:デフォルトの名無しさん
21/07/30 16:14:14.47 ghy/bFcm.net
>>480
メモリ安全性を保つのが困難になっていくからそれを避ける方法がベストだよ
495:デフォルトの名無しさん
21/07/30 16:42:36.73 bSJbrTlR.net
>>483
なんともなあ。
496:デフォルトの名無しさん
21/07/30 16:53:36.97 SwFfvD28.net
せっかくだしこっち使ってくれよ
スレリンク(tech板)
497:デフォルトの名無しさん
21/07/30 16:58:32.68 9xDw6FKV.net
>>476
コピーが生じないように最適化される。
つまり、スタック上の一時オブジェクトをヒープにコピーするのではなく、ヒープ上に直接オブジェクトを作成する。
498:デフォルトの名無しさん
21/07/30 17:02:02.06 lHY+syIy.net
>>480
具体的にこのように書きたいけどエラーになるというRustのコードを示してください。(他の言語のコードは不要)
それによりようやく初めて、何を問題としているのか、何が問題なのか、がはっきりします。
499:デフォルトの名無しさん
21/07/30 17:29:20.46 nNXXdoxJ.net
VeqDequeに二分探索実装されてるけどそもそもソートできなくない???
500:デフォルトの名無しさん
21/07/30 18:21:23.96 N3W+nBLQ.net
>>488
make_contiguousかas_mut_slicesで中身の可変スライスを受け取って
そのスライスのsortかsort_byを使えばソートできそう(試してない)
make_contiguousが本線っぽいからリファレンス読んでくれ
501:デフォルトの名無しさん
21/07/30 18:33:31.64 nNXXdoxJ.net
make_contiguousするならそのあとのas_mut_slicesに対して二分探索でよくない????
502:デフォルトの名無しさん
21/07/30 19:00:01.19 N3W+nBLQ.net
その辺はもう「お好きにどうぞ」としか言えない
503:デフォルトの名無しさん
21/07/30 20:35:47.56 Lxzkaxvv.net
contiguousじゃないがsortされてることが保証されてるケースで使いたいのかね
504:デフォルトの名無しさん
21/07/30 21:37:49.30 7fXRNBDL.net
sort順を壊さない位置に要素を挿入するのにbinary_searchを使う
505:デフォルトの名無しさん
21/07/30 21:46:04.82 Lxzkaxvv.net
URLリンク(github.com)
506:デフォルトの名無しさん
21/07/30 23:01:01.92 YV3ifLwI.net
>>486
オブジェクトを返す関数を Box::new()のパラメータの位置に書いてもそうなるの?
507:デフォルトの名無しさん
21/07/30 23:11:44.30 ZatLdYYe.net
>>477
explicitでなければな
508:デフォルトの名無しさん
21/07/31 16:04:12.94 4L+o4Dn8.net
配列の添え字はusize以外も許容してほしいなー
509:デフォルトの名無しさん
21/07/31 16:11:02.83 zwQwPVDS.net
std::ops::Index を実装すればええんちゃう?
510:デフォルトの名無しさん
21/07/31 16:31:36.36 4L+o4Dn8.net
>>498
おお、こんなのあるのか。知らなかった。
511:デフォルトの名無しさん
21/08/02 06:51:52.57 rcivjOzc.net
Tokio @tokio_rs
Announcing Axum - An ergonomic and modular web framework that takes full advantage of the Tokio, Hyper, and Tower ecosystem.
URLリンク(tokio.rs)
512:デフォルトの名無しさん
21/08/02 10:51:16.95 /2ZmNaA8.net
Rocketが統一するんじゃなかったんかい
513:デフォルトの名無しさん
21/08/02 11:07:27.91 IM57Srba.net
axumはシンプルかつ洗練されており柔軟性もあって、よりRustっぽい
それでいてtokio直轄だから今後の主流になりそう
514:デフォルトの名無しさん
21/08/02 11:09:36.24 gKjubcDS.net
actix-webと比較するとどう?
515:デフォルトの名無しさん
21/08/02 11:22:47.21 LBPYCkqw.net
asyncも結局Tokioが覇権になるんかな?
516:デフォルトの名無しさん
21/08/02 11:40:06.27 txHGxpYt.net
高収入エンジニアは「ラスト」に注目、ファインディ調査:日本経済新聞
URLリンク(www.nikkei.com)
517:デフォルトの名無しさん
21/08/02 11:52:00.11 XqEhhKmo.net
tokio、名前がダサすぎて無理w
async-std勢にもっと頑張ってほしい
518:デフォルトの名無しさん
21/08/02 13:37:03.39 b7V5cI6n.net
どうしても沢田研二を思い出すからな
519:デフォルトの名無しさん
21/08/02 13:48:07.46 cEvsPyTU.net
客の入りが悪くてダサいヤツ
520:デフォルトの名無しさん
21/08/02 14:35:12.33 txHGxpYt.net
Tokioの名前の由来って普通に東京の可能性があるのか
>I enjoyed visiting Tokio (Tokyo) the city and I liked the "io" suffix and how it plays w/ Mio as well. I don't know... naming is hard so I didn't spend too much time thinking about it.
URLリンク(www.reddit.com)
521:デフォルトの名無しさん
21/08/02 18:57:04.81 +XZCqP9q.net
axumのimpl IntoResponseとかはaxcixより命名規則とかディレクトリ構造とかよかったけどappの組み立て方が微妙だなー
n-texとかがかなりいいよね
522:デフォルトの名無しさん
21/08/02 21:06:18.53 K5Gz/oHK.net
tokioは問題のある挙動が発覚しそうで嫌
523:デフォルトの名無しさん
21/08/02 23:22:29.33 5JIyBWeF.net
async-stdなら発覚しない?
524:デフォルトの名無しさん
21/08/03 05:46:07.98 NdBhyyWi.net
ランタイムはasync-std, tokio, actixの3系統という認識であっていますか?
今回は組み込みとか除外で、ウェブ使う前提での根幹の非同期ランタイムに限る話として。
それぞれの系統のデメリットは何ですか?
525:デフォルトの名無しさん
21/08/03 10:52:22.44 C59tapei.net
actixは内部でtokio使ってるから実質tokio
526:デフォルトの名無しさん
21/08/04 05:06:56.84 vy1xC0f1.net
ここ反tokio派が多いようなので
見習ってasync-std派になろうと思います
デメリットなどあれば教えてください
527:デフォルトの名無しさん
21/08/04 13:06:46.39 i8X/nYqM.net
ワタシはtokio派
528:デフォルトの名無しさん
21/08/04 13:23:10.51 djLthEM6.net
どうせ遊びコードだろうしどれでもいっしょだろ
529:デフォルトの名無しさん
21/08/04 14:08:55.46 kUGuSA9v.net
遊びコードなら非同期なんか要らないだろ
同期処理のフレームワークにしとけ
530:デフォルトの名無しさん
21/08/04 14:41:35.72 wzpAdwFh.net
tokioは巨大な一枚岩になっていて方針がおかしくね?
531:デフォルトの名無しさん
21/08/04 18:03:25.14 ixF3VIJu.net
smolってどうなの
532:デフォルトの名無しさん
21/08/05 00:05:10.42 +sKg5038.net
>>520
smolはasync-ioやasync-fsやasync-netやasync-executorなどの親分だね
それらsmolのサブクレートであるasync-*シリーズはsmol以外のところでも使われてる
533:デフォルトの名無しさん
21/08/05 06:32:52.89 vEltfgyn.net
RustではじめるWebAssembly入門~JavaScriptを超える高速なWebアプリ開発を実践しよう
URLリンク(codezine.jp)
534:デフォルトの名無しさん
21/08/05 22:19:57.77 CdYIb2/R.net
昔はtokioも同じように多数のtokio-xxxから成り立っていた
しかしどんどん合併していき巨大な一枚岩tokioになってしまった
535:デフォルトの名無しさん
21/08/05 23:44:46.85 igzlcjJl.net
最終的に各機能は連携するので整合性を維持したまま保守し続けることを考えたら
全体でひとつのパッケージにしてしまうのが楽というのはわかる。
536:デフォルトの名無しさん
21/08/06 00:29:20.56 BpKFUZU0.net
featureで機能on/offするtokio方式の方が使う側も楽では
537:デフォルトの名無しさん
21/08/06 05:47:54.70 uymdWrFB.net
>>520
smolもasync-stdもStjepan Glavinaが立ち上げた
だからasync-ioなど両者共にベースとしている
538:デフォルトの名無しさん
21/08/07 08:24:17.06 xZrMsPjx.net
オライリーの本で勉強始めたんだが、説明なしにいきなりSomeとか出てきてもやもやしながら読み進んでいる。
索引にも見つからないし。この本のどこかにSomeの説明があるなら誰かページ数教えて。
539:デフォルトの名無しさん
21/08/07 08:54:25.11 pHhntc3E.net
Somewhere
言いたかっただけだから叩かないで蹴らないで
540:デフォルトの名無しさん
21/08/07 09:03:20.19 Xj8Oc6zx.net
わいの持ってるオライリーの『プログラミング Rust』だと27ページ(§2.6.1)でOptionの説明してる
541:デフォルトの名無しさん
21/08/07 09:03:35.46 7YRCcDcM.net
索引に「Option<&T>」はない?
542:デフォルトの名無しさん
21/08/07 09:10:40.92 xZrMsPjx.net
同じ本です。そこで使っているSome(T)の説明がなかったので。
文脈からするとT型の値を持っている何かなんだろうけど、正体がわからないのがもやもやして。
543:デフォルトの名無しさん
21/08/07 09:22:21.99 Xj8Oc6zx.net
列挙型(enum)なら10章で取り上げてるね
Optionは出てこないかもしれないけど
544:デフォルトの名無しさん
21/08/07 09:30:04.54 xZrMsPjx.net
あ、なるほど。Some(T)とい型があるのかと思ってしまったけど、Some<T>じゃないですね。
Option<T>の値の一つとしてSomeがあって、それがTの値を持っていると。
545:デフォルトの名無しさん
21/08/07 09:31:53.94 tg14s6ns.net
オライリー、はやく改訂してくれええあええぃ!
546:デフォルトの名無しさん
21/08/07 11:16:06.74 KHlBD2QX.net
Rustの特徴のうち今回の件だと以下の3つの側面を理解するまでが初心者あるあるですもんね
・Rustのenumは値付きenumすなわちタグ付きunionである
・enumのうちResultとOptionの時だけmatch/return構造のsyntax sugarとして? operatorがある
・そのためRustにはtry/catchの大域脱出機構が無いけども同様の利便性を途中の関数呼び出しに?の1文字付けるだけでスルー出来る
547:デフォルトの名無しさん
21/08/07 12:12:56.92 VbMntA3z.net
>>534
原著の新しい版持ってるけど26~27ページにあるOption<T>の説明は特に変わりないよ
サンプルコードのOption<u32>がOption<usize>になってるくらい
>>535
>そのためRustにはtry/catchの大域脱出機構が無いけども同様の利便性を途中の関数呼び出しに?の1文字付けるだけでスルー出来る
実際に書いてれば分かると思うけど受け渡しするための型を常に意識する必要があるからスルーとはちょっと違う
Javaの検査例外前提なら同様の利便性と言えるかもしれないけど
548:デフォルトの名無しさん
21/08/07 12:23:21.41 nftxz994.net
>>536
エラー返す関数はResult<T,Error>で統一されているから、呼び出す自分もそれを見習うだけでしょ。
そしてエラーをcatchしたいところではmatchして、エラーをスルーしたいところでは『?』
549:デフォルトの名無しさん
21/08/07 13:32:55.26 Xj8Oc6zx.net
>>537
Result<T, Error>のErrorの部分の型が違うと?演算子は使えない
struct MyError; // 独自エラー型
fn task() -> Result<(), MyError> {
let file = std::fs::File::open("foo.txt")?; // std::io::Error ≠ MyError だから駄目
// ...
Ok(())
}
ただ型が違ってもFromを実装することで?演算子を使えるようになるのは知っておくと便利
// ↓があると↑はコンパイルできる
impl From<std::io::Error> for MyError {
fn from(error: std::io::Error)-> MyError {
MyError
}
}
550:デフォルトの名無しさん
21/08/07 14:50:06.24 GahNZGHc.net
?はintoを呼び出してるから
まで知っているとモテる
551:デフォルトの名無しさん
21/08/07 17:42:21.09 FYrxKjUH.net
dyn で全部キャッチするようにするから大丈夫!
552:デフォルトの名無しさん
21/08/07 18:01:27.03 +ABrS84s.net
不要なuse削除してくれる便利な機能ってもしかしてあったりしますか?
553:デフォルトの名無しさん
21/08/07 19:24:08.57 7Hk1t5D8.net
>>541
Go使え
554:デフォルトの名無しさん
21/08/07 19:33:00.30 +7+FQ4Xg.net
cargo fixで消せたっけ?
555:デフォルトの名無しさん
21/08/07 21:44:09.86 5+EnO1ft.net
Optionすら知らない人が、いきなりオライリー読んでも分からんのでは…
無料で読めるBookから読んだ方が良くない?
556:デフォルトの名無しさん
21/08/08 01:21:05.48 pbwTdSH0.net
Rustlingsの構造体のところやってるんだけどさあ
↓この構造体があった場合に、なんで後に出てくるダメって方のじゃ動かないの???
struct ColorClassicStruct {
name :String,
hex :String,
}
//ダメ
//テキ�
557:Xト領域に"green"や"#00FF00"が書き込まれて、それに対する参照が渡されるからダメってこと!? let green = ColorClassicStruct{ name: "green", hex: "#00FF00", }; //OK let green = ColorClassicStruct{ name: "green".to_string(), hex: "#00FF00".to_string(), };
558:デフォルトの名無しさん
21/08/08 02:00:43.05 VDR20IrG.net
"green"の型は&'static strで"green".to_string()の型はString
ただそれだけの話
559:デフォルトの名無しさん
21/08/08 07:20:41.65 3PQxbLEp.net
>>545
型が異なる
どちらも文字列実体はUTF8の[u8]配列だが
String
・Vec<u8>を利用
・つまり文字列実体は[u8]配列をヒープに領域確保(この場所は伸長により自動的に移動あり)
・そこへのポインタと確保メモリの長さと文字列の長さの『3つ組』を持つ
・文字列の長さは可変で確保メモリの長さを超えるとヒープ再割り当てが自動的に起きる
&str
・スライス&[u8]を利用
・つまり文字列実体の[u8]は既にどこかに確保されている
・そこへのポインタと文字列の長さの『2つ組』を持つ
・文字列の長さを変えるという概念はない
560:デフォルトの名無しさん
21/08/08 14:26:56.33 UvnbNG8C.net
Rustとかまだ生きてるのか
561:デフォルトの名無しさん
21/08/08 14:30:32.33 ZbQryp6F.net
逆にイキイキし始めた
562:デフォルトの名無しさん
21/08/08 17:42:08.00 AtnJJ/4w.net
現状LLVM上でしか動かないらしいけど
将来的にC/C++並みにターゲットプラットホーム増やすって動きはないの?
563:デフォルトの名無しさん
21/08/08 17:57:57.87 8fWNQyKy.net
>>550
そのプラットホームって何を指して言ってる?
564:デフォルトの名無しさん
21/08/08 17:58:17.99 f8nEzm+l.net
それはLLVMの仕事です
565:デフォルトの名無しさん
21/08/08 18:23:12.96 YO4aMRa7.net
>>550
gccバックエンドとかのプロジェクトは進んでいる
566:デフォルトの名無しさん
21/08/08 18:26:41.67 hfCzmf6o.net
なんかあんまり順調に進んでないように見えるけど
URLリンク(github.com)
567:デフォルトの名無しさん
21/08/08 18:34:13.86 YO4aMRa7.net
gccrsはやってること考えたらすごい勢いで進んでるとは思うけどね
実用になるのはこっちが早いかと
URLリンク(github.com)
568:デフォルトの名無しさん
21/08/08 18:37:27.80 hfCzmf6o.net
JVMバックエンドで動くJRustも欲しい
あ、Rust.NETもいるな
569:デフォルトの名無しさん
21/08/08 19:39:21.77 Sm1ghOWg.net
>>556
メリットは?
570:デフォルトの名無しさん
21/08/08 19:46:05.12 hfCzmf6o.net
>>557
豊富な既存ライブラリを利用できる
571:デフォルトの名無しさん
21/08/08 20:10:03.36 7dicyYlk.net
聳え立つクソの山の間違えだろ
572:デフォルトの名無しさん
21/08/08 20:12:30.23 Sm1ghOWg.net
ランタイムを変える必要はなくて、FFIでいいんじゃないだろうか
573:デフォルトの名無しさん
21/08/08 20:22:22.71 o6Sz00kX.net
純粋に興味だけで言えば面白そうだけど
C++/CLIの二の舞になりそう
574:デフォルトの名無しさん
21/08/08 21:30:40.77 T1ZtDM68.net
JVM上で動かすなんて、既存資産扱うところでGC避けられなくなる訳だから嬉しさが皆無では。
JVM上で現代的なプログラミングしたいだけならScalaやKotlinのほうがよっぽどいい。
575:デフォルトの名無しさん
21/08/08 21:30:47.94 pbwTdSH0.net
>>546
>>547
どっちも参照っぽいのに何が違うのか全然わ買ってなかったよ
ありがとう!
576:デフォルトの名無しさん
21/08/08 21:41:24.86 Cdmlpdjr.net
>>561
二の舞って、MSがサポートを投げだした以外は別に悪いところは無かったと思うが。
577:デフォルトの名無しさん
21/08/09 00:22:56.88 Xf+oNAim.net
Googleもサポートやめる
578:デフォルトの名無しさん
21/08/09 00:45:05.35 iRm2fJ4Y.net
C++/CLIのCLIってマイクロソフト.NETのでしょ
579:デフォルトの名無しさん
21/08/09 16:05:33.35 bWVDlgk2.net
LLVMのバックエンドがgcc並みになれば万事解決
580:デフォルトの名無しさん
21/08/09 16:10:16.25 OWI9S7jW.net
>>564
それが全てだろ。
開発コミュニティが長期的に維持されない (維持される見込みがない) なら
他の何が良くても産業的に使い難い。
581:デフォルトの名無しさん
21/08/09 16:57:51.57 qYrd5+ip.net
はぁ。
>>561はGCを持った仮想マシン環境に移植することがC++/CLIと似た状況だと言っていたのかと思ったが、
そこは全然これっぽっちも関係ない話なわけね。
開発コミュニティが途中で投げ出す恐れなんて言っていたらあらゆるものが当てはまりそうだが。
582:デフォルトの名無しさん
21/08/09 20:27:58.38 xgGPGjpP.net
競プロでRustを使ってみようと思って勉強してたんだけど、
再帰関数がめっちゃ面倒なのね
関数の外のスコープの変数の読み取りができないから、
全部引数に記述しなくちゃいけなくて凄い面倒
処理速度が速かったので期待してたんだけどな(´・ω・`)
583:デフォルトの名無しさん
21/08/09 20:38:14.63 yQGrG0lM.net
>>545
ダメの方で通るでしょ
宣言でStringを&'static strにする
"green"とだけ書けばプログラムコードのread onlyエリアに確保されて&'static strのライフタイムになる
Stringを使うとheapエリアを余分に使ってしまうので損
もちろん文字列が伸びたり一部書き換わったりなど対応したい時ならばStringを使う
584:デフォルトの名無しさん
21/08/09 21:19:46.40 9eWGuwAZ.net
>>570
全部引数渡しは当然だろう
問題なのは末尾再帰が出来ない事
585:デフォルトの名無しさん
21/08/09 21:26:05.96 fbmhz8DS.net
>>570
グローバル変数使いたいなら static mut 使えば良いのでは
unaafe 必要だけど別に安全性欲してないでしょ?
586:デフォルトの名無しさん
21/08/09 21:59:43.94 xgGPGjpP.net
>>573
マジかそんなんあんのか!!!!
static mut test: i32 = 0;
fn main() {
unsafe {
test = 1;
unsafe fn calc() {
if test == 1 { println!("yes") }
}
calc();
}
}
yes表示キタ━━(゚∀゚)━━!!
ありがとうありがとうヽ(´ー`)ノ
587:デフォルトの名無しさん
21/08/10 00:56:57.83 u04QFiKf.net
純粋なグローバル変数は仕方ないけど、thread_localは
もっと簡単な使い方にしてほしかったなー
コールバック関数みたいに引数で渡せないパターンが面倒
588:デフォルトの名無しさん
21/08/10 01:04:05.56 1P7sVbl8.net
引数だけで解決できないなら設計が悪い
589:デフォルトの名無しさん
21/08/10 01:17:00.79 mSeKT5En.net
>>575
どうなって欲しいの?
590:デフォルトの名無しさん
21/08/10 02:01:49.31 pisrhHbj.net
競プロに向いてるかって言われるとそうでもない気はする
591:デフォルトの名無しさん
21/08/10 02:02:54.83 ukJY1zau.net
>>573-574
static mutは割とめんどくさい問題があるみたいだぞ
URLリンク(qiita.com)
592:デフォルトの名無しさん
21/08/10 02:13:08.50 KzRmJx3E.net
>>570
グローバル変数の代わりに関数の引数を増やすと毎回連れ回す形で見にくくなるけれど
再帰関数ではなく再帰メソッドにしてしまえば引数を増やさずにいくらでもパラメータを使えます
例えば「再帰で1からnまでの和や積」を求める例で「差分diff」が可変パラメータとした場合
struct Arith { diff: i32 }
impl Arith {
fn sum(&self, n: i32) -> i32 { if n <= 0 { 0 } else { n + self.sum(n - self.diff) } }
fn mul(&self, n: i32) -> i32 { if n <= 1 { 1 } else { n * self.mul(n - self.diff) } }
}
fn main() {
let diff1 = Arith { diff: 1 };
assert_eq!(diff1.sum(10), 55); // 1+2+3+4+5+6+7+8+9+10
assert_eq!(diff1.mul(7), 5040); // 1*2*3*4*5*6*7
let diff2 = Arith { diff: 2 };
assert_eq!(diff2.sum(10), 30); // 2+4+6+8+10
assert_eq!(diff2.mul(7), 105); // 1*3*5*7
}
今回はdiffの部分が1個だけですが複数のパラメータにもできます
こうすることで「グローバル変数を使わず」&「引数を毎回連れ回さず」に書けます
593:デフォルトの名無しさん
21/08/10 04:53:07.24 yd00h36W.net
>>574
キャプチャしたいだけならクロージャ使えばいいけど
let test = 1;
let calc = || {
if test == 1 { println!("yes") }
};
calc();
再帰ならaccumulator的なものを連れ回すほうがいいと思う
594:デフォルトの名無しさん
21/08/10 05:14:22.44 gCWS4DSe.net
>>581
moveしなくていいの?
595:デフォルトの名無しさん
21/08/10 05:38:40.18 2mfgVpK+.net
struct使ってimplで&mut selfを持ち回せばいい気が
596:デフォルトの名無しさん
21/08/10 09:41:32.99 u04QFiKf.net
>>576
全部自分で作れるんならね
既存のライブラリとかOSのAPIとかの制限は自分じゃどうにもならん
597:デフォルトの名無しさん
21/08/10 09:51:21.46 u04QFiKf.net
>>577
.with使うのが面倒 .borrow_mutもね
そのまま読み書きしたい
そもそもstaticな時点で生存期間のチェックなんていらないんじゃないかと
598:デフォルトの名無しさん
21/08/10 14:05:16.63 mSeKT5En.net
>>585
可変参照が複数同時に存在すると即UBだから safe なコンテキストでは with や borrow は必須にせざるを得ないだろうね
RefCell とかと同じ
599:デフォルトの名無しさん
21/08/10 15:05:08.24 QyXjq7Ed.net
みんなありがとう、なんとなく再帰できたよ。やり方あってるかわからんけども
以下お試しプログラム
URLリンク(paiza.jp)
use std::*;
fn main() {
let mut str = String::new();
io::stdin().read_line(&mut str).unwrap();
let mut nums0: Vec<i32> = str.trim().split(" ").map(|it| it.parse().unwrap()).collect();
let mut test = Test { nums: nums0 };
println!("{}", test.calc(0));
}
pub struct Test {
nums: Vec<i32>,
}
impl Test {
pub fn calc(&mut self, id: i32) -> i32 {
if id == self.nums[0] { return 1; }
let mut res0: i32 = 0;
for i in 1..=3 {
if id + self.nums[i] <= self.nums[0] {
res0 += self.calc(id + self.nums[i as usize]);
}
}
return res0;
}
}
600:デフォルトの名無しさん
21/08/10 15:09:12.73 QyXjq7Ed.net
ちな、同じプログラムをkotlinで
fun main() {
var numList = readLine()!!.split(" ").map { it.toInt() }.toIntArray();
fun calc(id: Int): Int {
if (id == numList[0]) return 1
var res: Int = 0
for (i in 1..3) {
if (id + numList[i] <= numList[0])
res += calc(id + numList[i])
}
return res;
}
println(calc(0))
}
601:デフォルトの名無しさん
21/08/10 15:34:52.35 yd00h36W.net
>>587
このケースだとmutの必要もないし
単に`fn calc(id:i32, nums:Vec<i32>) -> i32`にすればよくない?
602:デフォルトの名無しさん
21/08/10 16:13:38.39 QyXjq7Ed.net
とりあえずできるかどうか適当に書いたものだからw
あと、これはindexだけを順繰りに送っていけばいいので引数1個でいいけど、
複雑な問題だとindexに、3次元配列の添え字として3つ、その配列本体、比較する配列の文字列とか、
さらにメモ化するためには、メモする配列もとか、めっちゃ引数がもの凄くなることがあるのね
だから、なんとかグローバル変数にアクセスできないかと思って
逆に構造体に全部の参照したい変数をまとめて、それだけを持ち回るとかもいいかもw
603:デフォルトの名無しさん
21/08/10 22:09:35.86 OZBv7QiC.net
再帰使うならもっと再帰っぽく書いてくれ
numsの初項とそれ以降の数値の意味が全く違うなら同じ変数に入れないでくれ
書き捨てや試行錯誤の途中ですらやらないぞこんなの
604:デフォルトの名無しさん
21/08/10 22:40:39.77 OOQ3UOoB.net
競プロってそういうもんだし……
605:デフォルトの名無しさん
21/08/10 22:43:09.06 QyXjq7Ed.net
>numsの初項とそれ以降の数値の意味が全く違うなら同じ変数に入れないでくれ
確かにそうなんだが、一度配列にいれちゃったからいいと思ってw
そして十分に再帰っぽいと思うけどなあ
↓スキルがありそうな人のご意見なので、もし良ければ再帰での美しい実装を披露して欲しい
↓参考にしたいのでよろしくお願いします
URLリンク(paiza.jp)
606:デフォルトの名無しさん
21/08/11 00:14:29.43 KIBLBTNR.net
スマン競プロなの失念してた。ならしょうがないゴメンよ
607:デフォルトの名無しさん
21/08/11 01:42:26.90 z0BKpdQB.net
dpに関しては再帰使わない方が計算量少なそう
608:デフォルトの名無しさん
21/08/11 02:02:46.71 umCpXnDX.net
>>592
競技プログラミングが何の実用的な実力に結びつかず、全く役に立たない遊びに過ぎない、と言われているのはそこですね
609:デフォルトの名無しさん
21/08/11 02:13:25.09 haNghl2/.net
再帰でメモ化したバージョンとループでボトムアップにしたバージョン
URLリンク(play.rust-lang.org)
テストはしてない
610:デフォルトの名無しさん
21/08/11 02:37:36.02 z0BKpdQB.net
メモ化するならグローバル変数(もしくは引数で渡す)にした方が良いんじゃないの?
611:デフォルトの名無しさん
21/08/11 02:55:43.83 oifoaA/x.net
>>596
競プロは戦闘機でいうところのアクロバット技術と同じようなものだな
アクロバット飛行はときに見るものを魅了するし部分的には実戦に通じるような高度な技術も必要だが
それ自体は実戦では役にたたず実戦でアクロバット飛行のような飛び方をしようものなら撃墜される
612:デフォルトの名無しさん
21/08/11 06:37:52.46 MmQ+sLSI.net
>>593
やってみた
入出力例のassertも通ったけどこれでいい?
fn main() {
assert_eq!(17, count(10, &vec![2, 3, 4]));
}
fn count(n: i32, abc: &[i32]) -> i32 {
if n < 0 { 0 } else if n == 0 { 1 } else { abc.iter().map(|a| count(n - a, abc)).sum() }
}
613:デフォルトの名無しさん
21/08/11 17:20:51.95 haNghl2/.net
>>598
そだね
少し数が増えるとめちゃ効率悪かったわ
614:デフォルトの名無しさん
21/08/11 18:22:13.11 iayIuizo.net
>>600
おお 与えられた数値をmapのなかでラムダ式で計算して、リストのsumするところが素晴らしいw
この場合はカウントだからsumだけど、最小値のminとか最大値のmaxとかでも利用できそうだ
615:デフォルトの名無しさん
21/08/11 20:10:22.26 iayIuizo.net
>>600
いま試しにやってみたけど、メモ化は必須だから、その美しさは保つことができなかった(´・ω・`)
616:デフォルトの名無しさん
21/08/11 20:23:36.62 haNghl2/.net
メモを連れ回す方式に修正した
borrowだと面倒なのでmoveにしたがRefCell使うともう少し速くなったりするのかもしれない
URLリンク(play.rust-lang.org)
617:デフォルトの名無しさん
21/08/11 20:39:47.21 zSuiQf57.net
競プロって計算量を落とせるアルゴリズムを考えることがポイントだと思うんだけど
実装言語の差異はどれくらい影響してくるの?
618:デフォルトの名無しさん
21/08/11 20:46:12.70 iayIuizo.net
>>605
あくまで参考だけど、こういうのがあるよ
URLリンク(twitter.com)
ただ3次元配列になると途端に速度が落ちるとか、そういうのもあるので鵜呑みにはできないけど傾向ってことで
あと、各言語の時間制限をしているサイトもある
URLリンク(paiza.jp)
この各言語の時間制限をみると、運営が考えている言語ごとの速度の違いが大まかにわかる
(deleted an unsolicited ad)
619:デフォルトの名無しさん
21/08/11 21:01:22.52 +LwnMsCS.net
競プロやっても日本の情報処理産業の国際的地位向上に結びつく気がしない
620:デフォルトの名無しさん
21/08/11 21:19:11.26 iayIuizo.net
そら趣味だもの。仕事とは関係ない
ただ、言ってる論理構成が、某小学生youtuberが義務教育なんか
必要ないって言ってる理屈と同じだなと感じる
621:デフォルトの名無しさん
21/08/12 00:24:49.53 pB2NXWq+.net
>>603
メモ化するならこう
fn main() {
let mut input_line = String::new();
std::io::stdin().read_line(&mut input_line).unwrap();
let input_numbers: Vec<i32> = input_line.split_whitespace().filter_map(|s| s.parse().ok()).collect();
let n = input_numbers[0];
let abc = &input_numbers[1..];
let mut memo: Vec<i32> = vec!(1);
memo.resize((n + 1) as usize, -1);
println!("{}", count(n, abc, &mut memo));
}
fn count(n: i32, abc: &[i32], memo: &mut [i32]) -> i32 {
abc.iter().map(|a| { let m = n - a; if m < 0 { 0 } else { if memo[m as usize] == -1 { memo[m as usize] = count(m, abc, memo); }; memo[m as usize] }}).sum()
}
622:デフォルトの名無しさん
21/08/12 02:22:16.40 WcppFbZK.net
>>608
むしろ義務教育でyoutube撮影方法教えるべきだとか主張するアホと一緒だろ
623:デフォルトの名無しさん
21/08/12 04:12:25.44 /wS1lumL.net
>>608
資格主義や学歴主義もだけど戦略不在でそれ自体が目的化しているように感じる
手段が目的化して迷走している事例は腐るほどあるような
624:デフォルトの名無しさん
21/08/12 14:49:35.08 xCjM/E2I.net
競プロはある種のパズル
パズルを解いたり競ったりを楽しむのもの
パズルをたくさん解くことで仕事のプログラミングに活きる部分がなくも無いが
その二つを同一視してる人は有害
625:デフォルトの名無しさん
21/08/12 15:56:43.60 id/zPgju.net
同一視してるというか
同一視された方が有利になれる人が同一視するように仕向けている
それ誰よっていうと、サロン屋や人材屋
626:デフォルトの名無しさん
21/08/12 18:29:44.63 /wS1lumL.net
○○検定とかも同じ臭いがする
627:デフォルトの名無しさん
21/08/12 18:49:01.38 5/ThobAf.net
キャベツ?
628:デフォルトの名無しさん
21/08/13 02:12:49.72 nWHbUrjv.net
Rustlingsの問題なんだけど、これの37行目のmutってなんで必要なの???
URLリンク(ideone.com)
参照するアドレスが変わるわけでもないのに・・・・どう理解すればいいものなんだろう・・・・
それと、ある構造体を構成するメンバーって、全部がmutか否かの二択になっちゃうわけ?混ぜれないの???
629:デフォルトの名無しさん
21/08/13 02:51:10.09 FruLH7M6.net
>>616
え?どこに参照が出てきているの?構造体そのものでしょ
そして直後に構造体の中を書き換えているからmutが必要
そして構造体のメンバーはバラバラに生死貸借が起きることはないからメンバー個別の指定の必要性はない
630:デフォルトの名無しさん
21/08/13 02:55:04.80 E7XaaQej.net
38,39でその構造体のメンバーに代入するのに必要
631:デフォルトの名無しさん
21/08/13 11:51:53.45 FT9FF6Ap.net
>>616
1. let mut x = create_order();
2. let mut x = &create_order();
3. let y = &mut create_order();
4. let mut y = &mut create_order();
それぞれ何がmutableなのか違う
「参照するアドレスが変わるわけでもないのに」ってのは3番目をイメージしてると思われる
632:デフォルトの名無しさん
21/08/13 18:27:47.71 fDsS9u/P.net
let mut your_name = Some(String::from("変更前"));
match robot_name {
Some(ref mut name) => *name = String::from("変更後"),
None => (),
}
println!("君の名は。: {:?}", your_name);
633:デフォルトの名無しさん
21/08/14 04:36:12.68 ndgh8Ezu.net
初歩的な申し訳ないんだが
let x = "hello".to_string(); // convart text to a string テキストを文字列に変換
let y = String::from("hello"); // get text directly テキストを直接取得
これの違いがわかりません
やってること同じですよね?
出力の違いが出る例とかあれば教えてもらえないでしょうか?
634:デフォルトの名無しさん
21/08/14 06:01:03.88 AK8F+nV0.net
to_stringはinlineでString::fromしてるから全く同じ
impl ToString for str {
#[inline]
fn to_string(&self) -> String {
String::from(self)
}
}
635:デフォルトの名無しさん
21/08/14 06:06:43.67 ndgh8Ezu.net
>>622
早朝からレス感謝
もやもやがとれて勉強に集中できそうです
ありがとうございました
636:デフォルトの名無しさん
21/08/15 13:09:40.85 QO3tNTj5.net
社員120人が原則テレワーク、「在宅勤務を語ろうチャット」で不安解消 ピクスタ流の働き方
URLリンク(www.itmedia.co.jp)
正社員ゼロ、会議ゼロのベンチャーが、急成長している驚きの秘密
URLリンク(president.jp)
テレワーク率95%をキープ! “全員原則テレワーク企業”が導入した「Uber手当」「Zoom飲み会代」
URLリンク(www.itmedia.co.jp)
驚異のテレワーク率「9割超」 営業利益16倍の企業は、生産性が「下がった」社員をどのようにケアしたのか
URLリンク(www.itmedia.co.jp)
Withコロナ時代の営業改革とは?アステリアが説く「ワークログ」と「マイクロラーニング」の重要性
URLリンク(saleszine.jp)
出社率100%→50% オフィスレイアウトの変更例 社員が「オフィスに行く理由」を考慮せよ
URLリンク(www.itmedia.co.jp)
キャンピングカーでテレワーク 京急などが実証実験
URLリンク(www.itmedia.co.jp)
コロナ禍で働き方が激変 これからのシェアオフィスに必要なものとは?
URLリンク(www.itmedia.co.jp)
【サンフロンティア不動産】~通うオフィスから“集うオフィス”へ
アフターコロナ時代の働き方を提案するワークプレイス「LIT(リット)」2021年5月オープン
URLリンク(prtimes.jp)
637:デフォルトの名無しさん
21/08/16 09:44:36.63 MZWGbmHz.net
loop式はbreakで指定した値を返せるのに
なぜwhile式やfor式は値を返せないの?
Option型にしてbreakで値を指定した時だけSome(値)としてそれ以外はNoneとすれば便利なのに
638:デフォルトの名無しさん
21/08/16 10:30:33.78 rx7L9F9W.net
(while true のような実質無条件ループを除き)条件付きループをbreakで抜けるのは可読性を下げる要因になるから一般的にはRustに限らずできるだけ避けるだろ
悪い作法を推奨するような機能は付けるべきではない
639:デフォルトの名無しさん
21/08/16 10:39:16.03 WTBg47DG.net
ほぉたしかにそうゆうのあれば便利な時もありそう
macroで似たような物は作れそうな気がする
たしかにlispとかでもwhileはnil returnだな(´・ω・`)
640:デフォルトの名無しさん
21/08/16 12:47:44.44 meTevnZp.net
>>626
forでお目当てのものが見つかったらその時の値を欲しい時
当然そこで打ち切りたいから普通にbreakすると思うが君は回り続けるのかね?
641:デフォルトの名無しさん
21/08/16 14:09:14.90 ScFkjf4y.net
>>628
打ち切りたいなら、take_whileの結果を対して回せばよくね?
642:デフォルトの名無しさん
21/08/16 14:32:54.40 ebJKRLr3.net
手間かけて機能拡張するほどのメリットがないってことだろうね
URLリンク(github.com)
643:デフォルトの名無しさん
21/08/16 16:29:22.27 RqqPeHPy.net
つまりforやwhileではなくiterを使うかloopを使えってことか
644:デフォルトの名無しさん
21/08/16 16:36:53.53 iL7TnNF0.net
awaitとか ? が絡むとループ使いたい場合はあるかもね
645:デフォルトの名無しさん
21/08/16 16:57:08.35 QDTL5fKB.net
>>632
それらメソッドチェーン部分ではもちろん使えるけど
iter系で指定するクロージャの中でも使えるんだっけ?
646:デフォルトの名無しさん
21/08/16 20:57:35.53 iL7TnNF0.net
>>633
Item が Option や Result なら ? は使えるけど
await は async fn か async block の中でしか使えないからほぼ使えないと思ってよさそう
647:デフォルトの名無しさん
21/08/16 22:05:08.22 bBW7ChkS.net
featuresは?
648:デフォルトの名無しさん
21/08/16 23:25:05.01 e18AJ9DT.net
>>634
?の方だけど、NoneやErrを除外してSomeやOkの皮を外すのはfilter_map使わないとメンドイね
例えばこんな感じで「?」はクロージャ内で使えた
println!("{}", std::env::args().filter_map(|x| std::char::from_u32(x.parse::<u32>().ok()?+110)).collect::<String>());
実行結果
$ cargo run 4 test 7 5 987654321 6
rust
649:デフォルトの名無しさん
21/08/17 01:06:37.74 diXkc4zq.net
>>636
これは filter_map よりも map().collect::<Result<String, _>>() の方がよさそう
650:デフォルトの名無しさん
21/08/17 01:42:37.78 2Xo4qCNa.net
全く関係ないけど、
for x in v
には、
for x in &v
for x in &mut v
for x in v.iter()
のようなバリエーションもあるようだけど、
for &x in v
のような書き方も出来るの?
あと、v と書いても v.iter() の省略なの?
この辺の話はどこに書いてる?
651:デフォルトの名無しさん
21/08/17 01:44:24.62 2Xo4qCNa.net
>>638
ついでに、
let x = &y;
は、
let &x = &y;
let &x = y;
みたいに書くことも出来るの???
652:デフォルトの名無しさん
21/08/17 01:46:10.93 yPn/BtRt.net
>>638-639
左辺と右辺はパターンマッチで対応するメカニズムになっている。
653:デフォルトの名無しさん
21/08/17 02:15:00.92 Ok9gkDKS.net
>>638
forの展開はこ�
654:フ辺とか。.iter()じゃなくて.into_iter()やね https://doc.rust-lang.org/reference/expressions/loop-expr.html#iterator-loops
655:デフォルトの名無しさん
21/08/17 03:20:14.87 q/ldIEfm.net
この言語の敷居の高さの上げ方は異常すぎる。誰も全容分かってない
656:デフォルトの名無しさん
21/08/17 03:39:07.39 yPn/BtRt.net
C++ よりマシ。
657:デフォルトの名無しさん
21/08/17 04:00:51.74 run+2ZVZ.net
それだと最初のエラーを拾ってしまうけど今回はエラーになる引数を与えてそれらを無視して拾い集めるコード
もしエラーにならない引数だけを与えて成功するコードならばその方針もいいかも
あとfrom_u32はOptionを返すのでResultでなく全体をOptionにするとして
最後にunwrapも必要なのでmap().collect()のコードは以下になると思いますが
元の>>636より長くなってしまいますね
println!("{}", std::env::args().skip(1).map(|x| std::char::from_u32(x.parse::<u32>().ok()?+110)).collect::<Option<String>>().unwrap());
実行結果
$ cargo run 4 7 5 6
rust
658:デフォルトの名無しさん
21/08/17 09:39:00.09 Wyc5eeHq.net
小中学生あたりでもわかる本ある?
659:デフォルトの名無しさん
21/08/17 09:48:35.92 uTdncVPo.net
きったねぇコードだな
660:デフォルトの名無しさん
21/08/17 13:39:50.79 hwU1GG4D.net
参照型の変数xをlet文で新しい変数yの初期値にした場合、
let a = 123;
let x:&i32 = &a;
let y = x;
y は参照型になるんだっけ?
そもそも、最初の文は
let x = &a;
と書いても全く同じ意味だっけ? さらに、
let x:&i32 = a;
と書いても同じ?
661:デフォルトの名無しさん
21/08/17 14:30:13.21 082KifEP.net
>>647
試してみるといいよ
yの型を知りたければtype_of(&y)で
fn type_of<T>(_: &T) -> &str {
std::any::type_name::<T>()
}
let a = 123;
let x = &a;
let y = x;
println!("{}:{}, {}:{}", x, type_of(&x), y, type_of(&y));
662:デフォルトの名無しさん
21/08/17 14:31:53.69 hwU1GG4D.net
答えを知ってる人に書いて欲しい。
この言語、試してみないと型すら分からないんだったら困るな。
663:デフォルトの名無しさん
21/08/17 14:35:58.73 Ok9gkDKS.net
>>647
> y は参照型になるんだっけ?
なる
> そもそも、最初の文は
> let x = &a;
> と書いても全く同じ意味だっけ?
ほぼ同じ
下だとaの型がi32に固定されない点だけ違う
> さらに、
> let x:&i32 = a;
> と書いても同じ?
これは全然違う
そもそも型エラーでコンパイルできない
664:デフォルトの名無しさん
21/08/17 14:41:24.86 QXNoWfC2.net
>>647
めちゃ基本的なことなので入門書を読もう
665:デフォルトの名無しさん
21/08/17 14:45:56.55 hwU1GG4D.net
本を読んだけど、明確には書いてなかったと思う。
let文に置いて参照型が右辺の場合、左辺も参照型になるということなのか。
ということは、letを書かない代入文で左辺に参照型で無い型を
書いて、右辺に参照型がある場合にはエラーになるのか???
わけが分からん。
666:デフォルトの名無しさん
21/08/17 14:51:57.21 WvkHdE3s.net
C++出身の人かな
667:デフォルトの名無しさん
21/08/17 15:00:35.72 hwU1GG4D.net
C++出身だ。
Rustにおける参照型の変数の規則性が分からない。
668:デフォルトの名無しさん
21/08/17 15:06:15.30 Ok9gkDKS.net
>>654
Rustの参照はC++の参照じゃなくてポインタのほうが近いよ
669:デフォルトの名無しさん
21/08/17 15:06:32.93 uFWUzCTr.net
Rustから入る人や
色々な言語をやってきた人は理解が早い
しかしC++だけやJavaだけしか経験ない人は
自己中な思い込みが激しくて素直に学習しようとせずに間違った解釈したりして無駄な質問ばかりしがち
670:デフォルトの名無しさん
21/08/17 15:06:36.98 hwU1GG4D.net
Rustは例はあるが、ちゃんとした論理的な言葉や数式の様なもので、規則性が
書いてないのではない?
C++だともっと厳密に書いてある。
671:デフォルトの名無しさん
21/08/17 15:10:48.52 +ZvfT+RK.net
>>652
何て本?
672:デフォルトの名無しさん
21/08/17 15:11:29.96 hwU1GG4D.net
>>656
そうではなくて、規則性を言葉で書いてくれ、ということだよ。
試してみてなんとなくの経験法則とかじゃなく。
673:デフォルトの名無しさん
21/08/17 15:12:37.71 hwU1GG4D.net
>>658
bookの印刷版も読んだが、途中読み飛ばしたページもあるが
読んだところにはちゃんと書いてなかったと思う。
数学的な規則が欲しいんだ。
文学的な言葉や例ではなく。
674:デフォルトの名無しさん
21/08/17 15:13:56.74 Ok9gkDKS.net
>>657
そういう位置付けのドキュメントはこれだね
ただし冒頭にもある通り完全ではない
The Rust Reference
URLリンク(doc.rust-lang.org)
675:デフォルトの名無しさん
21/08/17 15:15:28.48 Y5PdM7En.net
>>656
まずはC++を忘れろ
思い込みは習得の邪魔になる
あるいは様々な言語をやってきていれば各言語で概念や書式や用語などが少しずつ異なることが理解できるはずだ
676:デフォルトの名無しさん
21/08/17 15:18:24.83 hwU1GG4D.net
>>662
めんどくさいので試してないんだよ。
試さなくても数学の用に読んで理解できる規則が欲しい。
Cのポインタは難しいとされるが、俺は数学が得意なので本を読んだだけで
完璧に理解できた。
C++探せばちゃんと書いてある本がある。
677:デフォルトの名無しさん
21/08/17 15:23:08.50 hwU1GG4D.net
>>661
BNFで書いてあるようだが、具体的にどこに書いてあるか示してくれ。
ちなみにBNFだと意味論までは語れ無い事があるので無理かも知れない。
678:デフォルトの名無しさん
21/08/17 15:24:30.00 +8wra73u.net
「俺は数学が得意なんだ!」
ワロタ
いつものBoxおじいさんじゃん
679:デフォルトの名無しさん
21/08/17 15:24:31.45 hwU1GG4D.net
目次を見てもReferenceの文字が見当たらないが。
C++だとちゃんとあるぞ。
どうしてReferenceも型のはずなのに、目次すらないんだよ。
680:デフォルトの名無しさん
21/08/17 15:25:31.33 hwU1GG4D.net
>>665
トップだったからな。
681:デフォルトの名無しさん
21/08/17 15:27:48.00 bPhCjiXF.net
>>660
そこまで言うならば十数種類あるRustドキュメントのうち、
editionとapiとstdとreferenceとtheとcookとexampleあたりにあとはcliとasyncくらいまでが基礎かな。
あと外部たがcargoとrustcにrustdocなどのbookも。
unstableやnomiconは後でいい。
wasmやembedded系bookも必要なら。
682:デフォルトの名無しさん
21/08/17 15:28:18.82 jTG+Bjsl.net
IQ87の人でしょ
相手しちゃダメ
683:デフォルトの名無しさん
21/08/17 15:29:44.40 hwU1GG4D.net
>>668
なんで、この言語に置いて最も重要な型の一つの規則性がそんな何千ページもの
本を読まないと解説されてないんだよ。
684:デフォルトの名無しさん
21/08/17 15:30:14.32 hwU1GG4D.net
>>669
お前の友達と一緒にすんな。
685:デフォルトの名無しさん
21/08/17 15:35:47.16 JF4CPCdG.net
>>667
数学得意ならRustも深く理解しやすい
強い静的な型システムの元にある
そして生死貸借も明確で数学的にメモリ安全性を保証
利便性のための参照&外し自動適用を除いて型キャストが暗黙に自動で行われることともない
686:デフォルトの名無しさん
21/08/17 15:44:19.09 hwU1GG4D.net
>>672
さっきから聞いているのに、ちゃんとした論理的規則を語った人は誰も居ない。
つまり、今このスレに居る人達は誰も理解してない証拠だろう。
つまりこれは、Rustが試してみないと分からない言語だからではないか。
687:デフォルトの名無しさん
21/08/17 15:46:21.18 diXkc4zq.net
>>673
5chじゃなくて users.rust-lang.org あたりで聞いてみたら
専門家がいっぱいいるよ
688:デフォルトの名無しさん
21/08/17 15:48:51.11 hwU1GG4D.net
>>674
参照型はRustにとって最重要の型。
それがそんなところに質問しなければ分からないというのは困ったことだぞ。
689:デフォルトの名無しさん
21/08/17 15:56:13.41 UjpqRJxn.net
ポインタを理解するのにもRustを理解するのにも数学の得意不得意は関係なくね?
ポインタを理解できない人をあまり多く見たことがないから実際のところどうなのかよく分からないんだが
690:デフォルトの名無しさん
21/08/17 15:57:56.00 U4J278+6.net
>>670
どこにも記述されていないことを君が自己中心的な思い込みで間違いなく判断や間違った推測をしているから>>647や>>652の書き込みになっている
let文や呼び出し引数はirrefutable pattern matchingであり各種destruturingはあっても個々の型は対応する
Tと&Tがmatchingすることはない
691:デフォルトの名無しさん
21/08/17 15:59:25.04 hwU1GG4D.net
>>677
どから、それがどこに書いているのかリンクを張ってくれ。
あなたの独自説ではなく、公式のな。
692:デフォルトの名無しさん
21/08/17 16:06:26.36 KRsjniKD.net
>>672
>利便性のための参照&外し自動適用を除いて型キャストが暗黙に自動で行われることともない
rustではcoercionと呼んでるものが暗黙の型変換だぞ
693:デフォルトの名無しさん
21/08/17 17:16:17.31 uVOQbHaf.net
グリーンスレッド何それ?さんだっけ?
694:デフォルトの名無しさん
21/08/17 17:20:32.19 apgY8ckc.net
公式の言葉が欲しいってならreferenceのlet statement, reference patternsあたりでもみりゃいいんじゃないっすかね知らんけど
695:デフォルトの名無しさん
21/08/17 17:32:50.74 fMgDzJWA.net
rustは思ったより流行りそうにないなぁ。
使用者爆発的に増えてくるハズがC++知らん人は
そもそも使う層じゃないし、
C++知ってる人は、逆にめんどくさいから様子見、流行らなければスルー
ぐらいかね。
696:デフォルトの名無しさん
21/08/17 18:03:44.37 PENy3uzh.net
ぶっちゃけ1言語のみしか使えないようなプログラマが有能だとはとても思えないが
実際にそういう人はいるけど融通効かないし生産性が高いとも思えない
所詮ドカタじゃないの
697:デフォルトの名無しさん
21/08/17 18:14:54.04 yPn/BtRt.net
>>682
C++ で疲弊した人が Rust に移ってるってのはあるぞ。
698:デフォルトの名無しさん
21/08/17 18:21:01.37 diXkc4zq.net
>>675
だからそう主張してくればよいじゃん
ここにいる人じゃ話にならないんでしょ?
699:デフォルトの名無しさん
21/08/17 20:01:51.20 uTdncVPo.net
疲弊というかドロップアウター
700:デフォルトの名無しさん
21/08/17 21:03:40.91 iE5VyQYC.net
>>647
上3つの式は正しいのに、なんで下2つの式はそうなるのか
701:デフォルトの名無しさん
21/08/17 21:04:44.45 iE5VyQYC.net
>>687
見間違えた
一番下の式だけだね
702:デフォルトの名無しさん
21/08/17 21:18:21.30 sY2NwSu8.net
実際はc++わからんけどrustわかればマウント取れそうじゃね?って馬鹿しか手を出してないという現実。
703:デフォルトの名無しさん
21/08/17 21:24:14.87 hwU1GG4D.net
Rustは、GoogleTrendsでは他の言語に比べて低空飛行だけど(Kotlinと同じくらい
ではあるが)、他の言語が下がる傾向があるのに対してRustだけは少しずつ上がってる。
Stackoverflowでは既にC++の30%~40%位まで質問の量が迫ってきているとか。
なので良く分からない。
GoogleTrendsが実際と合ってないという説も見かけた。