55% of Rust users develop on Linux 24% develop on Windows 23% develop on macOS 0621デフォルトの名無しさん2020/06/01(月) 15:59:56.59ID:QCREwpDy 間違った知識を他人に教えるのは説明書読む以前の問題 0622デフォルトの名無しさん2020/06/01(月) 16:00:16.74ID:o7IiynR8 回答者がターゲットとしているプラットフォームも以下の様に書かれているが、回答者がWebBackendを職業にしている人が多いことに対応している可能性が高い : Linux: 36.9%、 Windows: 16.3%、 maxOS: 14.7% WebAssembly: 14.4% Embedded: 7.6% iOS: 2.9% BSD: 2.7% Android: 2.4%
When it comes to what platforms using are targeting for their applications Linux remains the first choice with 36.9%,with Windows as second at 16.3%. Following close behind Windows are macOS and Web Assembly at 14% each 0623デフォルトの名無しさん2020/06/01(月) 17:53:49.92ID:o7IiynR8 Some a = xxx; // 何か初期済みであると仮定 let b1 = Box::new(a); let b2 = b1; とした場合、b1が持っていた所有権はb2に移ってしまい、 b1はこれ以後使えなくなるという理解で有ってますか? 0624デフォルトの名無しさん2020/06/01(月) 18:03:59.31ID:o7IiynR8 初心者なもので、正しく(?)は、 let b1 = Box<Some>::new(); let b2 = b1; なのかも知れません。 0625デフォルトの名無しさん2020/06/01(月) 18:07:45.72ID:lLamlcG6>>623 とりあえずThe Bookの所有権のところを一通り読んでから質問してください その質問の答えも試し方も全部書いてますので https://doc.rust-lang.org/book/ch04-01-what-is-ownership.html0626デフォルトの名無しさん2020/06/01(月) 18:23:13.55ID:o7IiynR8>>625 そこは一時間ほど前に読みましたが、>>623のことは分からないので質問しました。 0627デフォルトの名無しさん2020/06/01(月) 18:36:04.96ID:0yVOdbpz>>623 お前が正しく理解してるかどうか知らんけど個別の事例として言えば Yes だ。 所有権は移動して、元の変数はもう使えない。
だけどそんなことはやってみたらわかりやすいエラーメッセージが出るじゃないの。
fn main() { let a = 20; let b1 = Box::new(a); let b2 = b1; println!("{}", b1); }
みたいなことを書いたら
error[E0382]: use of moved value: `b1`
って出るし、どこでムーブ (所有権の移管) 済みかまでも表示してくれる。 Rust のエラーメッセージはめっちゃ親切なんだから、 「この場合はどうですか」なんて質問する間があったらやってみりゃいいんだよ。 0628デフォルトの名無しさん2020/06/01(月) 19:13:13.12ID:is4FQXAW Rustのエラーメッセージがすごく親切なのは分かるんだけど、小手先で直そうとするとどんどん修正範囲が広くなっていって最終的に「設計が悪い」みたいな結論になっちゃう 他言語よりコーディング時に考慮すべき点が多いというか違うというか…慣れればそういうことも無くなるのかね 0629デフォルトの名無しさん2020/06/01(月) 22:13:40.55ID:o7IiynR8>>628 色々調べてる途中だけど、どうも、C言語で出来ていたことの何割かは Rustでは禁止されていて出来ないと思う。 https://stackoverflow.com/questions/40875152/reference-to-element-in-vector を見てもRustではarrayの1つの要素に対する参照は作れないようだし。 C/C++では当然、そのようなものへの参照やポインタが好きなように作れる。 これが出来ないことである種の組み合わせ爆発が起こりがちになり、 C/C++よりプログラムがしにくくなるだろう。 0630デフォルトの名無しさん2020/06/01(月) 22:19:12.08ID:o7IiynR8>>729 例えばの話、C言語だと1つのCPerson型のデータをファイルに出力する関数を void write(FILE *fp, CPerson const *person); のように作りさえすれば、 CPerson persons[100]; for (int idx=0; idx<100; idx++ ) { write(fp, &persons[idx]); } でCPersonの配列にも対応できてしまう。 このようなことがRustではできなくなるはず。 無理やり観が有るが、CPersonのメンバ関数としてwrite()関数を作ってしまうことで対応できるかも知れない。 0631デフォルトの名無しさん2020/06/01(月) 22:50:56.49ID:CYB5du4X rustはまだ勉強中だけど、630がアホなこと言ってるのは俺でもわかる。 0632デフォルトの名無しさん2020/06/01(月) 22:53:23.54ID:6zq2VOrY ID:T0vrM+QLやID:bf1cRh+Bと同一人物だね 0633デフォルトの名無しさん2020/06/01(月) 22:54:16.92ID:6zq2VOrY 荒らしの相手するやつも荒らし 0634デフォルトの名無しさん2020/06/01(月) 23:37:56.02ID:QCREwpDy もうこのスレで公式すら読んでないような初心者質問するやつ無視でよくね。文章から見て同一人物っぽいし それとそのテンプレ追加も次立てる人お願い >>9990635デフォルトの名無しさん2020/06/02(火) 10:45:35.24ID:7ZgjbGq0>>629 https://doc.rust-lang.org/1.9.0/book/structs.html によれば、構造体メンバのアドレスを参照型変数に代入することができるらしい。 0636デフォルトの名無しさん2020/06/02(火) 10:57:29.35ID:UmuMxSnR diesel辛いっていう人多いけど、乗り換えるならどんなクレートになんだろうね 0637デフォルトの名無しさん2020/06/02(火) 11:19:09.02ID:7ZgjbGq0>>627>>634 読んでも書いてない。 0638デフォルトの名無しさん2020/06/02(火) 19:18:24.00ID:wGjSvc+B 結局c++やらんとrustを理解するなんて無理なんだよ 0639デフォルトの名無しさん2020/06/02(火) 20:16:57.29ID:N0F889O8>>638 こないだ C++ スレで >>623 の ID は見たぞ。 0640デフォルトの名無しさん2020/06/03(水) 02:21:24.02ID:TdRUmxlvhttps://users.rust-lang.org/t/isnt-rust-too-difficult-to-be-widely-adopted/6173/37 ↑のサイトに寄れば、Blandy & Orendorff の Programming Rust の 評判が良いらしい: I’m also new to Rust and have found the “Programming Rust” book by Blandy & Orendorff to be very helpful. Especially the chapters on ownership and references. It is an expensive book though.
I also didn’t need Box, Rc, RefCell, or friends. 0641デフォルトの名無しさん2020/06/03(水) 02:34:58.13ID:TdRUmxlv>>638 (C++は、C++11から大幅に改定されたので)、海外のサイトに寄れば、 C++11より前のC++からRustを学ぼうとすると大変だが、C++11以後 からだと対応関係が分かり易くて楽なのだそうだ。 unique_ptrとBox<T>が対応しているような話か。 ただ、C++の特徴であるtemplateに相当するものがまだRustにはないことが 残念だと書かれていた。 0642デフォルトの名無しさん2020/06/03(水) 02:45:19.00ID:TdRUmxlv そのサイトに寄れば、Rustで難しいのは、借用や所有の概念ではなく、 lifetimeなのだそうだ。 個人的にも、構造体のlifetimeについて説明不足を感じた。 構造体の変数のスコープと構造体のメタ部分で記述するライフタイムの 関係性がbookなどでは書かれて無いように思えた。 分からんけど。 0643デフォルトの名無しさん2020/06/03(水) 02:59:40.24ID:TdRUmxlv 2018/04 の時点でも、まだ、lifetimeに関する資料が足りてないと感じている人がいたそうだ。 Can we maybe have a book or booklet exclusively covering lifetimes? I don’t think the first level of instruction material on lifetimes which is found in the rust book and others which talks about the syntax and the aliasing rules and elision is enough. It leads to an incomplete model which only frustrates when you discover its incompleteness. Rust nominoc does go further. For example it shows with detailed examples how lifetimes start with a let binding and how they interact with other lifetimes in the same scope. This is fundamental stuff and absolutely essential to understanding. But there are still aspects not covered there. For instance I realized that lifetimes can be shrunk as needed by the compiler only from this forum (thanks @vitalyd) which invalidated my previous model. And I’m sure there are other aspects I don’t know about. I think we just need one place where one can learn everything about lifetimes and be done with it. 0644デフォルトの名無しさん2020/06/04(木) 10:31:48.72ID:E8yK5u0i>>641 グロ 0645デフォルトの名無しさん2020/06/04(木) 12:10:41.88ID:4kMLpsX6>>636 sqlxじゃないか 0646デフォルトの名無しさん2020/06/04(木) 13:20:58.04ID:YCN7KCgu 難しいのはネストした場合のオブジェクトに対するイミュータブルかどうかとライフタイムだろう。 0647デフォルトの名無しさん2020/06/04(木) 14:06:07.27ID:hCECm/yf ライフタイムはコンパイラが親切丁寧に指摘してくれるから難しくは無いだろ 依存関係とか指摘出来ない系のエラーで詰まる事のが多い 0648デフォルトの名無しさん2020/06/04(木) 19:40:21.91ID:pT22FhoL>>647 コンパイラに指摘されれば問題ないかというと総でも無い。 プログラミングはコンパイルする前に予想可能で無いと困る。 0649デフォルトの名無しさん2020/06/04(木) 20:10:09.15ID:pX62chi4 競馬かな? 0650デフォルトの名無しさん2020/06/04(木) 20:37:04.46ID:ZbgQHKA+>>648 難しくないってのは「学習は」難しくないって話じゃね? いずれは自分でわかるようになるというのは当然の前提で、 まあわかるようになっても間違えることはあるのでそれを指摘してくれるのもありがたい。 0651デフォルトの名無しさん2020/06/04(木) 22:06:35.88ID:x+eVDE0s>>650 ところが、コンパイラを実際に動かさなくても、仕様書や例を見ただけで 理解できる言語も多いんだよ。 たとえば、CやBASIC,JS,Java,C#,Ruby,Python,Perlなどがそれに該当する。 C++は、03まではまあ分かったが、だんだん難しくなっていった。 もはやSTLのソースも仕様書ですらも理解できるのは一部の特殊な人に 限定されてきているかも知れない。STLの forward()の意味を理解したりどう実装されているかをソースを見て理解できる る人は本の一握りだろう。 move()とforward()の役割の違いも実装レベルでどれだけの人間が理解できることか。 でもRustも同じように難しくて同じようなことは起こると考えている。 0652デフォルトの名無しさん2020/06/04(木) 22:49:18.31ID:VyuaeUph そのレベルで理解できてない人がC++使うのはどういうメリットがあるのだろうか 0653デフォルトの名無しさん2020/06/04(木) 22:52:33.61ID:x+eVDE0s 実はC++は、forwardやmove, templateなどの詳細を理解できてなくても高級言語的な部分だけを使ってプログラムすることは出来る。 それはRustでも同じ。 0654デフォルトの名無しさん2020/06/04(木) 23:01:33.43ID:iTcUmNL8 C++は仕様が難しいというより 仕様ではないけど当然知ってるべきイディオムが たくさんあってきつい、という感じがするな。 0655デフォルトの名無しさん2020/06/05(金) 01:02:20.04ID:D80WdA6t 将棋しか知らない人が囲碁というゲームを見ると 何やってるかわからないしなんだかむずかしそうと言う しかし実は囲碁はルールそのものはおそろしくシンプルなのだ ところがルールだけ知っていても、囲碁は打てない (打てるけど次に何していいかわからなくなる) なぜなら囲碁はルールとは別に「こういう場面はこういう風に 打ち回す」というイデォムが大量にあってそれを知る必要があるからだ C++はそれに似ている 0656デフォルトの名無しさん2020/06/05(金) 01:41:15.67ID:27EcDywu そもそもRustの仕様って難しいか? いろんな言語から取り込んだ概念があって C一筋とかRuby一筋みたいな人には学ぶべきことが多いとは思うけど、 特に複雑な仕様って思い当たらないんだけどな。 JSの型変換の仕様とかの方がよっぽど複雑だしワケわからんと思う。 0657デフォルトの名無しさん2020/06/05(金) 09:30:38.65ID:9qGH+5zI>>651 C が仕様や例で理解できるってどんな超人だよ。 コンパイルエラーにも実行時エラーにもならない未定義だの処理系定義だのが山もりだろうが。 初心者の書くコードで完全に仕様に沿ったコードなんて見たことないぞ。 0658デフォルトの名無しさん2020/06/05(金) 09:38:30.26ID:9qGH+5zI Haskell の入門書を一通りは読んでたから Rust の型システムは似たようなものとして理解できたなぁ。 ライフタイムもプログラムの字面に書きこそしないでも C/C++ では意識せざるを得ないし、 複雑になるとわけわからんってときは C/C++ で書いてもわけわからんようになるやつ。 0659デフォルトの名無しさん2020/06/05(金) 12:01:32.43ID:lHXK6is7 きっとそういう感じでべた褒めする人が多いから、Rubyみたいに一回大人気言語になった後、急速に衰退する気がする。 Rubyも最初は良いと思われていた。 0660デフォルトの名無しさん2020/06/05(金) 12:13:12.11ID:lHXK6is7>>657 Cの仕様はシンプルで、 ポインタと明示的な型宣言と文字列比較をstrcmp()で行うという以外、 基本的な枠組みは既存の言語と変わりはなかったので理解は難しくなかった。 0661デフォルトの名無しさん2020/06/05(金) 12:14:22.73ID:9qGH+5zI Ruby は今でも十分に使われているよ。 (俺は使ってないけど。) 適切ではないところまで広がった分がそぎ落とされてちょうどいい感じに落ち着いたってだけ。 プログラミング言語の良さはスカラ値で測定できるようなものではなくて、用途による。 利用事例が減ったからといってその勢いで衰退して消えるっていうような話ではない。
Rust language is too hard to learn and use, says user survey A survey of Rust users finds difficulty and frustration with the language’s highly touted features for memory safety and correctness.