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/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とか複数組み合わせてちゃんと動くってイメージが湧かないんだけどそんなもん?
2019/08/20(火) 15:37:20.44ID:WLDVnSvX
トレイトしばり
2019/08/20(火) 18:36:33.19ID:oenkL37i
そんなもんってどんなもんや?
2019/08/21(水) 12:01:21.04ID:inIEkQey
ちゃんと動く
2019/08/21(水) 22:01:34.30ID:YTqLEh4a
>>180
それ関連のバグが確か上がってたはず。
185デフォルトの名無しさん
垢版 |
2019/08/21(水) 22:17:56.76ID:zqKd/4GT
嘘乙。
違うというなら証拠を出せ。
2019/08/22(木) 12:21:26.09ID:7th+iyEr
バグを見たことがあるからちゃんと動くというイメージが沸かないのか?
187デフォルトの名無しさん
垢版 |
2019/08/26(月) 20:55:57.18ID:hNXwMePN
https://play.rust-lang.org/?version=stable&;mode=debug&edition=2018&gist=8c44bed658726ada0deff031799664b7
1. std::env::current_exe()で実行ファイルのフルパスを得る
2. file_name()でファイル名だけにする
3. to_str()で&strにする
4. 途中でErrやNoneが返ってきた場合はデフォルトの値"foo"を使う

ということをやりたいのですが、エラーでビルドできません。
どのように書けばいいでしょうか?
2019/08/26(月) 21:16:34.03ID:e+wL38/M
std::env::current_exe() は PathBuf の"値"を返す
PathBuf::file_name() は PathBuf の中身の部分的な参照を返す

PathBuf::file_name() で生成される &OsStr を参照から値に変換するか、
std::env::current_exe() で生成されるPathBufを変数に束縛して所有権取らせてから、改めて参照を取得するかしないとダメ
2019/08/27(火) 19:57:54.12ID:u0PkUgfg
>>188
ありがとうございます、所有権を意識してto_ownedを使ったらいけました。
2019/08/29(木) 18:47:18.36ID:DitGoMrU
>>27の元ネタだが
We need a safer systems programming language
ttps://msrc-blog.microsoft.com/2019/07/18/we-need-a-safer-systems-programming-language/
Why Rust for safe systems programming
ttps://msrc-blog.microsoft.com/2019/07/22/why-rust-for-safe-systems-programming/
あたりを読むとあっちの会社はホント合理的だなと痛感する。C/C++を用いた安全な大規模システムの開発はムリゲーとし
同業他社の方針やツールを認め導入してしまう。日本の大手システム屋にこういう事を出来るところってあるんだろうか
2019/08/29(木) 20:39:56.79ID:7sVXLGAA
合理的ね。。
「戦うプログラマー」読む限りはそうは思えんが。
都合のいいとこだけ切り取ってるな。
むしろ無理やり言語使わせるとかもろSIerのやり口だろ。ばかすぎる。
2019/08/29(木) 21:33:28.37ID:Bp0lvm+/
闘うプログラマーと言えば当時からC++は魔境過ぎてヤベェみたいな記載があって笑った記憶ある。
2019/08/30(金) 12:23:15.14ID:Q74gFuRN
無理矢理使わせてるということは今後出てくるMSプロダクトは全部Rust製になるのか?
2019/08/30(金) 12:35:18.57ID:ATaHXAWZ
>>193
C++で作るようなものを全部Rustにする
ってなったらすごいことになるな
2019/08/30(金) 13:06:45.92ID:KMS/yKjh
JavaScript → TypeScript(型チェック) とか C++ → Rust(借用チェック) みたいな
用途・特性が似通った言語でより安全な方を使わせるってのは、単なるリスクマネジメントであって
SIerのナンデモJava事案とは違うと思う
2019/08/30(金) 15:21:18.59ID:cnXxJRuX
ポストC/C++の座にRustを据えるかどうかはともかくC/C+お払い箱は確定事項じゃね
つーかMSRCの記事の何処にも無理矢理使わせているなんて書いていないぞ?
197デフォルトの名無しさん
垢版 |
2019/08/30(金) 15:28:58.11ID:GEn/r+mZ
Cは永遠に不滅です
C++は知らん
2019/08/30(金) 18:16:53.32ID:XBvkkCPm
Rust学び始めたけど噂通りむずい...
やりたいのはcli/tuiとかwebなので習得が無理そうだったら大人しくGoを使うことにする...(´・ω・`)
2019/08/30(金) 18:25:46.18ID:uWYoaax5
結局C以外でOSは厳しくないかと思うのよね
2019/08/30(金) 22:21:40.26ID:Q3blvaVM
>>199
CでOS書いた事あんの?
C意外でOS書いたことあんの?
それとも想像だけ?
2019/08/30(金) 22:22:25.51ID:HNXTienF
OSはアセンブラで書くのが常識だった
2019/08/30(金) 22:58:53.71ID:Okk0GWIA
>>200
OS書かなくても自家製メモリ管理作ってみれば想像できるだろ。
2019/08/31(土) 00:42:16.72ID:aUMbNTSE
ちゃんとしたmallocを作ること自体が難しいのであってCかRustかは難しさへは影響しない
2019/08/31(土) 15:15:02.18ID:j8rV2wO1
GCはクソ!だからRust最高!
とイキがってた奴がボローチェッカにボコボコにされてGCの良さを体感するまでが通過儀礼

どっかにドリルないですかね。>187みたいな問題がサラッと解けるようになりたい
2019/08/31(土) 16:16:15.52ID:pCVRgCCA
GCがクソだと思ったからRust使うという意識なかったな
2019/08/31(土) 20:44:28.04ID:BqsPi00f
>>187 みたいな感じのはリファレンス読んで関数やメソッドが参照返すのか値返すのか調べるだけ
2019/08/31(土) 21:13:02.78ID:apjBRhon
Rustはボローチェッカーのご機嫌取りが必要だが
GCある言語で性能が欲しいとか言い出すとGCのご機嫌取りが始まる
2019/08/31(土) 21:20:45.92ID:ny+pXiR9
結局乗りこなしたものが勝ちか、
209デフォルトの名無しさん
垢版 |
2019/08/31(土) 21:23:30.02ID:z8QlYv6E
所有権という概念をつかむのに苦労はしたけど、結果的にはプログラミングを簡単にしてくれていると思う
2019/08/31(土) 23:46:50.72ID:4X1UTBje
ライブラリの開発者以外に所有権意識させたのは良いと思う
211デフォルトの名無しさん
垢版 |
2019/09/01(日) 01:29:28.40ID:sYwYgS29
GCが糞っていうより
糞実装のGCが多過ぎて
大抵の人はGCで糞な思いをするから
GCが糞だと言う誤解というか評判になってるだけ
実際糞だが
2019/09/01(日) 02:04:31.88ID:n9Ep1hQW
ガベッジだって言う人もいるけど
俺は宝物って呼んでる
2019/09/01(日) 04:36:12.23ID:t9AOVqXM
世界を止めて宝物集めするプログラム
214デフォルトの名無しさん
垢版 |
2019/09/01(日) 10:19:52.00ID:ee5jndrf
それで >>187 はどう書くのが定番なの?
215デフォルトの名無しさん
垢版 |
2019/09/01(日) 10:31:43.36ID:kCJZVLuH
続きを読むには会員登録が必要です
■ このスレッドは過去ログ倉庫に格納されています