Rust Part7

■ このスレッドは過去ログ倉庫に格納されています
2019/07/14(日) 23:31:47.54ID:PySyhRf9
Mozilla発のRust言語のスレ

公式
https://www.rust-lang.org/
https://blog.rust-lang.org/
https://github.com/rust-lang/rust

Web上の実行環境
https://play.rust-lang.org

前スレ
Rust Part6
http://mevius.5ch.net/test/read.cgi/tech/1532714678/
2019/07/28(日) 21:21:52.37ID:GSiaruU8
現状静的配列が使い物にならないから const generics は必要だと思う
2019/07/28(日) 21:26:23.70ID:B+3CJM6Y
いらねーだろ
それでどんだけ速くなんだよ
2019/07/28(日) 21:30:14.25ID:GSiaruU8
ゼロコスト抽象化を標榜してる以上は行列計算をVecでやれとは言えんだろ
2019/07/28(日) 21:36:32.69ID:B+3CJM6Y
それはzero costの履き違え
2019/07/28(日) 21:37:48.82ID:GSiaruU8
お前にとってはそうなんだろう
2019/07/28(日) 23:01:30.64ID:jklii+Ft
>try-finallyやGoのdeferなんて、絶対書き忘れてリソースリークするパターンだろ。
一理あるが、資源を正しく管理するデストラクタ書くのそんなに楽じゃねーぞ。
舐めすぎだわ。
2019/07/28(日) 23:39:20.86ID:G08azDw2
>>86
他言語でもさんざん書いたからデストラクタの難しさは知ってるつもりだけど、
ライブラリ作成者が注意深く書いたデストラクタをみんなで使うのと、各自finallyやdeferを正しく実装しましょう、なら前者がましでは?
88デフォルトの名無しさん
垢版 |
2019/07/28(日) 23:58:54.12ID:5UHV96py
ちょっデストラクタで開放処理を書けない資源とかもはやプロセスをkillするしか、
2019/07/29(月) 00:07:34.10ID:9xGY09/M
Vecはただのfat pointerのnewtype patternだからアラインが合えば自動ベクトル化できるんじゃないの?

>>80
gcあるならref objectあるだろ。今どき。
90sage
垢版 |
2019/07/29(月) 00:09:11.34ID:bStHYZl0
ていうかデストラクタ自体は問答無用に資源を開放するように作ればよいのであって
そうならないのは上位の設計がおかしい
例外のスローが許されないなどただでさえ制約が厳しいところに小難しいロジックを押し込んでどうするんじゃ…

資源の開放に一定の手順が必要ならそれはデストラクタの中ではなくデストラクタが呼ばれる前にすませるべきだし、
必要な手順が抜かされたみたいなバグのケースの救済までデストラクタの任に負わせるのはおかしい
資源の開放自体にエラーの危険性があるならインスタンスの製造元(ファクトリ)にエラー通知してから死ぬ等の
パターンに従うべき
2019/07/29(月) 00:23:30.71ID:ovYGqPmP
>>89
ref objectがなんなのかよく分からないが、GCにリソース解放させる場合の問題はタイミングを制御できないことだと思ってる。
スコープを抜けて回収可能になったからといってすぐ回収されるわけではないから次の確保が早すぎると死ぬ。
まぁたいていの場合問題ないってのはあるけど、本質的にはGCに合ってないと思う。
2019/07/29(月) 00:34:54.17ID:bStHYZl0
すぐに開放されないだけの問題なら開放されるまで待てば良いではありませんか、
さすがに今日日のGCは開放可能な資源の発生と資源の獲得要求がmeetした場合に何もしないほど馬鹿ではないと思われ
(meetのトリガタイミングがなんと2回もある

致命的に問題なのはGCには資源に空きがあるように見えるが、GCが知りようがない上位のロジックで循環依存が生じる場合
ファイルをN個まで同時に複数開けるシステムで、a、bの2個しかファイルが開かれていないんだけど
スレッドAがファイルaを出力し終えた後ファイルbのクローズを待っており、スレッドBはファイルaのクローズを待ってからbを出力せんとしている場合等、
2019/07/29(月) 01:10:00.62ID:X0vpIRmF
>>87
俺は後者のがマシだと思うけどね。
資源解放のパターンをオブジェクトで判断するとか自然な設計だと思えんよ。
解放ルーチンなりをシチュエーションごとに用意する方が明らかに自然だわ。
2019/07/29(月) 01:17:46.83ID:ovYGqPmP
>>92
実際問題例えばC#のGCはそれくらい馬鹿ではある。
というかファイルハンドルの中身と次のリソース要求を見て、適切に回収してくれるGCってあるの?
メモリ解放のタイミングでたまたまその他のリソースも解放されてるだけでは?
2019/07/29(月) 21:42:08.32ID:CSar0obt
https://i.imgur.com/l91swsP.jpg
96デフォルトの名無しさん
垢版 |
2019/07/30(火) 00:57:12.66ID:ZDjzCSg/
>>95
グロ
2019/07/31(水) 21:59:30.06ID:BBGtrgFp
効率的なTreeの書き方どこかに書いてあったはずなんだけど忘れてしまった

どこにかいてあるかわかるひといますか?
2019/07/31(水) 22:04:33.03ID:BBGtrgFp
enumをつかっていたような気がするんですが・・・
2019/08/01(木) 00:10:45.06ID:zC1laZAw
効率的なTreeってなに?
代数的データ型なら普通はsum type(rustのenum)で書くけど。
2019/08/03(土) 11:04:41.72ID:RLY9hdXo
???@???
Rustとの戦いにつかれたのでDを触った次第

↑RustでコンパイラとかVM作ってる人のツイート
Rustってそんなに難しい?
2019/08/03(土) 13:51:49.63ID:aqiFUikh
配列で親ノードIDや子ノードのID持たせるとかじゃなかったか。
所有権引っかからんようにするとそんな感じになる。
2019/08/03(土) 22:29:28.05ID:Pq9Lnt2C
他言語でもGUIのグラフとかは結局そうなるんだけどな。
103デフォルトの名無しさん
垢版 |
2019/08/05(月) 09:41:10.02ID:VmFTmeN2
>>100
面倒くさい
2019/08/06(火) 13:13:46.53ID:trr4oLNQ
Javaとの違いは何
2019/08/07(水) 01:19:35.26ID:go9nzBX4
今日知って驚愕したのだがJavaは構造体の参照を返すということができず、
どうしても参照返ししたいときは構造体のメンバを書き換えて返すという歪な手段を使う
↓こんなやつ
 class CWDPath {
  String mPath = "";
 }  
 boolean getCWD(CWDPath result) {
  result.mPath = "SomeDir";
  return true;  // 性交ステータス
 }

これはresultの寿命がmPathに代入するデータの寿命を下回らないケースでしかRustでは書けないハズ
つまりJavaはRustのアンチパターンで大々的に書くことを余儀なくされる危険な言語
2019/08/07(水) 01:49:51.15ID:KVZqz5pU
性交ステータス
2019/08/07(水) 08:31:50.75ID:eqkXQjzY
Javaすら理解できてないのにRustを使おうとするとは勇ましい
2019/08/07(水) 12:04:18.71ID:Fq68/ECQ
何もかも間違っていて突っ込む気も起こらん
2019/08/07(水) 21:02:26.47ID:bj+hpOaY
javaに構造体はないってことくらい突っ込んでやれ。
value typeは当分先だ。
2019/08/08(木) 05:27:28.23ID:FTUf1Nuq
いや正しいていうかこの話にvalue typeは関係無い(返そうとしているStringは参照型
間違っているというならreturn mPath以外の方法でgetCWD()からStringを返してみると良い
2019/08/08(木) 05:51:36.26ID:FTUf1Nuq
んまー不用意に構造体と書いてしまったのは陳謝するのですよ
2019/08/08(木) 07:38:49.45ID:097LZjtE
組み込みの値型以外は全て参照型で管理されてる事が理解できてないって事?
2019/08/08(木) 13:27:41.32ID:+iXEwaHu
Javaにおける参照はオブジェクトへのポインタのことで、RustやC++の参照とは違う概念なのだよ
2019/08/08(木) 13:30:51.54ID:+iXEwaHu
だから参照を返すという言葉の意味も Java と Rust では違う
2019/08/08(木) 14:49:51.48ID:bpfrenBa
何言いたいのかさっぱりわからん
コンパイルエラーになるがやりたいことを書いてくれ
2019/08/08(木) 15:16:04.89ID:6plAwatI
JVM上で動くJRustはまだか?
117デフォルトの名無しさん
垢版 |
2019/08/08(木) 15:54:03.06ID:YYsAu0ua
皮肉や冗句を言うにも一定のセンスと知能が必要と言う証左
2019/08/08(木) 22:35:10.82ID:FTUf1Nuq
>>115
C#の例(これは動く
void Main() { string str = new string(); bool bResult = getCWD(ref str); Console.WriteLn(str); // "some_dir"が表示される }
bool getCWD(ref string str) { str = "some_dir"; return true; // 性交ステータスとしてのtrue }

Javaで同じ事をしようとすると>>105になって、Stringを返すためだけのためにCWDPathみたいなクラスを作らねばならない

>>117
藻前は顔だけは賢そうだな
2019/08/08(木) 22:43:00.72ID:+Da//rmi
脳がC言語で止まってると色々気苦労が多くて大変だな
2019/08/08(木) 22:49:15.66ID:FTUf1Nuq
で、Javaでは何で>>105みたいな変なことになるかというと、参照の参照をとることができないため
ここで参照とは何かというと>>113の前半部で良い
参照自体はレジスタに代入したりスタックに1語で積める値型の一種とみなせる
C#ではrefキーワードにより、参照の参照をgetCWD()に渡すことができる
Javaは参照しかgetCWD()に渡せない。よって、CWDPathみたいなクラスの参照を渡してやって、
そのクラスがメンバとして所有する参照を上書きするという手段で返さざるおえない
2019/08/08(木) 22:54:58.10ID:FTUf1Nuq
>>119
参照型を引数として関数に渡すしくみはCで完成しているのだから>>119の言い様では批判になんね
Cではポインタやんけというのは本質ではない
参照自体はレジスタに代入したりスタックに1語で積める値型の一種とみなせる(>>120)
なのであって機械語レベルでみたらオブジェクトを指すポインタに他ならない
で、Java、C#、C++、Go、Rustいずれも参照型の関数渡しは参照をスタックに積んで渡すモデルであることは変わりない
2019/08/08(木) 23:28:59.60ID:+Da//rmi
とりあえず参照渡しという単語を調べなよ
2019/08/08(木) 23:33:17.49ID:FTUf1Nuq
調べてなお問題があると言うなら>>122の理解にこそ問題がある
2019/08/09(金) 00:50:26.80ID:3pQudWDx
>>118
最初説明したこととまるで違うじゃないか。用語は正しく使えよ。

結論は、戻り値で成功不成功を返そうとしたお前が全部悪い。>>119が正しい
2019/08/09(金) 01:47:43.61ID:A3Et6VBe
・カレントディレクトリを取得する
・取得の失敗を検出したい
というのが要求だとして
Javaでそんな変なことせずに
もっとまともな書き方あるから批判する前に
勉強しろや
2019/08/09(金) 02:00:37.01ID:hvzVkerT
>>118
Javaの場合は普通 >>105 みたいなことをせずに、getCWD() の返り値を CWDPath にして、失敗の場合には null を返す
CWDPathみたいなものを二つ返したいなら Pair を使うし、たくさん返したい場合に初めてクラスを作る
Java の進化系である Kotlin はこの辺を確実簡易に行うために nullable とか data class とかがある
2019/08/09(金) 07:24:48.24ID:L3ygUsvb
optional型とかnullable型みたいなヤツは色んな言語であるわな
2019/08/09(金) 10:03:40.29ID:Fvfs1Ycj
>>120
gcあるからそんなことしない
2019/08/09(金) 21:22:16.39ID:0u6cxkej
CWDてなんなんそもそもw
pwdコマンドにあるようにワーキングディレクトリってことでいいの?
それが失敗する時があるってのが想像できない
2019/08/09(金) 21:48:39.98ID:hvzVkerT
想像力が足りない
Unix だと実行中のプロセスのカレントディレクトリを消すことができるので、
そこでそのプロセスが getcwd すると No such file or directory のエラーになる
2019/08/09(金) 22:06:06.07ID:0u6cxkej
>>130
レスとんくす
勉強になりました
2019/08/09(金) 22:07:54.17ID:f7i7jNks
Cの知識しか無いけどJava語っちゃう痛い人が、参照渡しだの値渡しだのを問題にしたがる
Cを使えるからってプログラミングの技術全てが語れるわけじゃないのにね
2019/08/09(金) 23:42:56.34ID:W/azuYkt
go9nzBX4が最初から間違ってるのは置いといてFTUf1Nuqは結局なんだったの?
2019/08/10(土) 00:03:38.47ID:6zXh0uMN
僕はこう解釈したんだという日記
2019/08/10(土) 13:42:02.08ID:lQ/anG82
>>124
一連のレスの中で漏れが一度も「参照渡し」という用語を使っていない件について:
参照型の参照渡しする、という状況は比較的新しい話で、
Javaはあえてかなんだか知らんが古来からある値型の参照渡しに類似の動作に対応していない
つまり呼び出し先で引数として渡された参照型自体を交換したり出力したりできない
JavaScriptやC#は対応している(呼び出し先で参照型自体を交換できいる。C#の例は>>118。refよりoutキーワードを使ったほうが良かったかもしれん…)

>>126
それで十分使いやすいと思われたのならそれで良いが、後発言語が参照型の参照渡しに対応しているという事実、

>>133
C++脳に汚染されていたのでclassとstructの区別がなかったんじゃ
2019/08/10(土) 13:45:47.02ID:lQ/anG82
すまんまつがえたorz
JavaScriptの参照の渡し方はJavaと同じやった、
2019/08/10(土) 13:58:32.51ID:lQ/anG82
なんか今ググると参照渡しの説明に真っ先にJavaScriptが出てくるが
世の中では参照型については参照型が保持するデータを呼び出し先が書き換えられることをもって参照渡しと言っているのかそうか、
しかしそれでは渡された参照型を呼び出し先が交換したり出力したりできず、
そうしたい場合に>>105>>126(Pairの使用、ただし2個まで)みたいな技巧を要する
138デフォルトの名無しさん
垢版 |
2019/08/10(土) 14:09:40.55ID:HCvhh7in
書き込むスレをいつまで経っても間違ったまま
そのことにすら無自覚で気付けないやつは
何してもだめ
2019/08/10(土) 16:21:29.50ID:SX6PRfyx
とりあえずrust全く関係なくね?
2019/08/10(土) 16:31:04.83ID:dHQR6WD8
Java入門スレに来て何言ってるの?
2019/08/10(土) 17:36:21.57ID:EB3chQuK
Cのときからある混乱だよな

単にポインタ渡してるだけなのに
ポインタを値渡してるだけなのに
「ポインタ渡し」だとか「参照渡し」だとか言っちゃう
そーいうブログや個人サイトが今もいっぱいある

そもそもこんな状況だから
これについての議論はスタート地点からもうやる気ほぼ出ない
2019/08/10(土) 18:04:04.89ID:lQ/anG82
>ポインタを値渡してるだけ
フォートランスレにでもしてほしいのけ?
2019/08/10(土) 18:12:12.30ID:0AyH8q+k
>>141
> 単にポインタ渡してるだけなのに
> ポインタを値渡してるだけなのに
> 「ポインタ渡し」だとか「参照渡し」だとか言っちゃう

お前がまず混乱してね?
2019/08/10(土) 18:38:36.22ID:EB3chQuK
×単にポインタ渡してるだけなのに
○単にポインタを渡してるだけなのに

失礼、こう書いたほうが良かったねこの場合
2019/08/10(土) 18:39:45.26ID:EB3chQuK
×ポインタを値渡してるだけなのに
○ポインタを値渡ししてるだけなのに

こっちは完全なるタイプミス
146デフォルトの名無しさん
垢版 |
2019/08/10(土) 18:41:40.47ID:SA5rOGgq
佐渡さんと書いて、サドさんと読む人と、サワタリさんと読む人がいるから、紛らわしい!
2019/08/10(土) 21:24:12.25ID:IjQF8yoC
Javaに文句付ける以前に色々基礎知識足りない
2019/08/10(土) 22:21:45.80ID:Wv9w5VNh
じゃばはお茶ですか?
2019/08/10(土) 23:44:39.00ID:lQ/anG82
Rustは身から出た錆
2019/08/10(土) 23:47:37.52ID:nUaGQOUP
名前渡しとか嫌いじゃないよ
2019/08/11(日) 23:57:30.28ID:8dEtrjnB
結局、JITがあるからRustよりJavaの方が速いんじゃないんの?
2019/08/12(月) 02:07:24.69ID:Enx+gBa4
ベンチマークサイトだとRustのが早いっぽい
https://benchmarksgame-team.pages.debian.net/benchmarksgame/fastest/rust-java.html
gcがない分p999とかのレイテンシはRustの圧勝になりそう
2019/08/12(月) 07:11:17.23ID:SKKCu+1X
RustとかC/C++は機械語までコンパイルするから速いんじゃなくて無駄なことをしないから速いのでJITとかそういう問題ではない
2019/08/12(月) 09:05:01.58ID:QXujyVaw
JITコンパイルで性的コンパイル結果より速くなるというのは都市伝説
JITのしくみを考えたらワカル

理論上は分岐の実行時統計をとって最適化することによりローカルループがありえないぐらい爆速になって
JITコンパイラ大勝利!と言うことも考えられないではないが統計をとるオーバーヘッドが生じるし
そこまでやっているJITコンパイラは商用のにはないはず
2019/08/12(月) 09:21:07.56ID:87XSRLvd
性的コンパイル
2019/08/13(火) 02:44:50.22ID:6DdfCCpK
えっち
157デフォルトの名無しさん
垢版 |
2019/08/13(火) 08:48:40.97ID:fZHFtPHB
僕の女の子とのリンカーはどこ?
158デフォルトの名無しさん
垢版 |
2019/08/13(火) 09:05:59.58ID:6zR84Szz
優しいリンカー
2019/08/16(金) 18:52:17.34ID:0C07dzAa
Rust学び始めたけど難しすぎる...
慣れるのにどれくらいかかるだろうか
ちなc/c++経験ほとんどなし
関数型言語は少しだけ分かるっていう程度

手を出すのは無謀?
160デフォルトの名無しさん
垢版 |
2019/08/16(金) 19:38:11.01ID:T3AL3pts
なにを作ろうとしてるのかによるよ
わたしは二ヶ月くらいかかったかな
2019/08/16(金) 21:24:02.93ID:eUh+GOjO
async/await、勉強するのに良いものある?
162デフォルトの名無しさん
垢版 |
2019/08/16(金) 23:18:30.16ID:T3AL3pts
まだstableじゃないからなんとも
tokio::netとかはasync/awaitでサンプル出してたりするけどどうかな
2019/08/16(金) 23:43:23.26ID:wNXKziRk
>>159
substructural type systemとregionの前提知識がないならコンパイラに怒られるだけ時間の無駄。
先に必要な知識つけてから。

>>161
stable待つよろし。
2019/08/16(金) 23:44:14.39ID:thOVjQYW
cくらいはやっとらんとなんでこんな事してるんだって思うだけだろ。
メモリイメージがないならrustなんか使う意味がない。
165デフォルトの名無しさん
垢版 |
2019/08/17(土) 06:44:20.91ID:7ZAIflK1
そんなに大仰なことかなあ?
書いてればそのうち分かるっしょ
166デフォルトの名無しさん
垢版 |
2019/08/17(土) 07:11:11.72ID:vMO96NW+
メモリイメージちゃんとしてるならCでいいだろ
167デフォルトの名無しさん
垢版 |
2019/08/17(土) 09:56:37.40ID:wqyoFpBF
それな
168デフォルトの名無しさん
垢版 |
2019/08/17(土) 10:00:51.09ID:BwITc4Uh
>>159
C/C++やってからでも遅くない

っていうかC/C++を先にやった方が近道かも知れん
2019/08/17(土) 10:46:08.44ID:9n/jDoCG
寧ろ関数型プログラミングに慣れ親しんだ人ならimmutableなオブジェクトだけでプログラミングしてしまい、
Rustが何も言わなかったりして…
2019/08/17(土) 10:51:56.69ID:0Qq/TjEN
>>160
2ヶ月ですかー
用途としてはとりあえず簡単なCLIツールを考えています

>>168
c++はともかくcはちゃんとやっておいたほうがいいですかね

「低レイヤを知りたい人のためのCコンパイラ作成入門」を読んだのでメモリイメージ的なことは最低限は分かるかも

rubyとかpythonとかからrust始めた人もいるみたいだし気合入れて頑張ってみますか
2019/08/17(土) 11:28:04.92ID:w0cmMCtq
>>170
ガンバ
2019/08/17(土) 12:01:03.69ID:ZxqGKdv4
なんでこんなめんどくさいことやってんだ
というのを理解するにはC/C++の知識があると早い
2019/08/17(土) 12:55:15.72ID:5bHKRRQf
C++で痛い目にあった人達が作った言語だからな
2019/08/17(土) 13:26:05.40ID:ON6K/mb3
苦しめられたほうがラクなんよね
一見苦しい縛りの結果、整理された構造という一粒の宝石を残してくれる
175デフォルトの名無しさん
垢版 |
2019/08/18(日) 13:26:59.04ID:j9EKYeL3
お邪魔します
エディタを紹介してもらえませんか?

The Rust Programming Language を読みながら自習しています
第12章 Refactoring to Improve Modularity and Error Handling の最後の節
Splitting Code into a Library Crate まできたのですが
( https://doc.rust-lang.org/book/ch12-03-improving-error-handling-and-modularity.html#splitting-code-into-a-library-crate )
Listing 12-14 のように src/main.rs を変更すると
エディタが minigrep なんて知らんと文句を言いはじめました
これでは Config や run を補完で出してくれません

mod lib;
use lib as minigrep

を入れれば補完してくれますが、cargo build が通りません

この状況に対応しているエディタを紹介してくださると大変助かります
2019/08/18(日) 16:43:08.87ID:HnqnQvDm
-use lib as minigrep
+use lib::Config;
2019/08/18(日) 16:53:31.22ID:HnqnQvDm
ごめんなんか勘違いしてた
vscodeで普通に通るよ
178デフォルトの名無しさん
垢版 |
2019/08/18(日) 17:36:07.73ID:j9EKYeL3
助かります
ありがとう
2019/08/20(火) 14:01:19.61ID:gT4uMEVl
トレイト境界をトレイト拘束に置換する拡張機能を書いた
2019/08/20(火) 15:27:32.97ID:hKY2TKrp
RustのArcとかBoxとか複数組み合わせてちゃんと動くってイメージが湧かないんだけどそんなもん?
■ このスレッドは過去ログ倉庫に格納されています
5ちゃんねるの広告が気に入らない場合は、こちらをクリックしてください。

ニューススポーツなんでも実況