Rust part10

■ このスレッドは過去ログ倉庫に格納されています
2021/04/02(金) 21:38:04.11ID:L7IeSfpL
Mozilla発のRust言語のスレ

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

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

日本語の情報
https://rust-jp.rs/

前スレ
Rust part9
https://mevius.5ch.net/test/read.cgi/tech/1598112455/
380デフォルトの名無しさん
垢版 |
2021/05/01(土) 00:25:31.33ID:6VZJr73m
これ見てたら、いきなり日本語で「ネコ」って出てきてびっくりした
https://www.programming-idioms.org/cheatsheet/Rust
実は、お前らの中の誰かが書いてんのか?
2021/05/01(土) 05:47:22.98ID:5xLRGYfU
>>380
https://www.publickey1.jp/blog/21/http35firefoxmozillaquicrustneqo.html
今、プログラムやる若い層じゃアニメとアニメに出てくる簡単な日本語は基礎教養だぞ
github見たらアニメキャラアイコンだらけだ
2021/05/01(土) 08:00:51.92ID:GEnkdmRT
NANI
2021/05/01(土) 17:02:13.98ID:1WejqaZh
>>379
>マイクロソフトがwindows書くのにc++使って後悔した話
興味有るので詳しく :
2021/05/01(土) 17:21:37.61ID:m+tkSw04
>>379
流出したソースを見る限り、MS は C で Windows を書いていたようですよ‥‥
2021/05/01(土) 17:53:57.44ID:/Wzn7OVr
そういえば初期WindowsのWindow管理のサンプルコード見た記憶がある
ツリーリンクリストが構造体に埋め込む形で自作されてた
2021/05/01(土) 17:54:25.77ID:/Wzn7OVr
コードの8割方コメントだった
2021/05/02(日) 09:31:00.53ID:/RYlgP4n
The Windows Research Kernel AKA WRK
https://github.com/zhuhuibeishadiao/ntoskrnl
2021/05/02(日) 09:42:02.70ID:3kB7D+rP
9割がCか
2021/05/02(日) 09:51:42.31ID:3kB7D+rP
まあLinuxもCと一部アセンブラだから似たようなものか
2021/05/02(日) 12:27:53.91ID:Jc9e5ibu
当時の言語状況からして他に選択肢なんかなかったと思うがねぇ。
他の言語選択してたら駆逐されてた可能性すらある。
2021/05/02(日) 12:37:35.62ID:anCj3LhS
NT kernelが開発されたのが1990年代か
C++も既にあったがまだ浸透してなかったかな
392デフォルトの名無しさん
垢版 |
2021/05/02(日) 13:45:15.23ID:c1rmI49h
チュートリアルやってたらトレートオブジェクトってのの説明が意味不明級だったぜ
https://tourofrust.com/82_ja.html
なんじゃこりゃ
2021/05/02(日) 14:35:17.11ID:n4dQrb8u
>>392
Javaの知識があれば
 trait object: interfaceとして渡されたオブジェクト
という感じで説明できるけど何か使い慣れた言語はあるかね
394デフォルトの名無しさん
垢版 |
2021/05/02(日) 15:05:16.82ID:c1rmI49h
>>393
もしかしてExistential Container(和訳不明)が独立のオブジェクトとして括り出さている感じですか?
なおC#が一番使い慣れているのですが、この範囲ではJavaと大きく違わなさそうでしょうか・・・・
2021/05/02(日) 15:36:14.52ID:hSgvj4Ff
>>392
The Bookの該当箇所を読むのを勧める
Java/C#のインターフェースと基本的には同じだけど違う部分もある
https://doc.rust-lang.org/book/ch17-02-trait-objects.html

その少し後に出てくるBoxのコードに出てくる
`animals: Vec<Box<dyn NoiseMaker>>`の
Box<dyn NoiseMaker>がTrait Object

Trait Objectは動的サイズの型なので&NoiseMakerやBox<dyn NoiseMaker>のようにポインタの形になる
そのチュートリアルは前後のページとどう関係があるのかについて説明がほぼないのでわかりにくいかもね
2021/05/02(日) 15:50:22.98ID:VAfyzxcR
他の言語の概念と対応付けるよりはそれ自体として理解したほうがいいのは確かだと思う。
(理解できずに行き詰まるくらいなら雑な理解でも一旦前に進んだほうがいいかもしれんけど。)

言語機能ってひとつだけを取り出して使えるものじゃなくて、他の言語機能との連携の中で活きてくるものだから
個別の言語機能を他言語の言語機能と対応付けて理解しても綺麗に繋がらない感じがする。
2021/05/02(日) 15:58:09.22ID:TmCNx2ML
https://doc.rust-lang.org/reference/types/trait-object.html

こっちじゃ`dyn Trait`のことをtrait objectと呼んでいるようだけど
というか俺はこれだと思ってた
Traitを実装する具体型の値のアドレスと、その型に対するTrait実装のvtableの組
2021/05/02(日) 16:04:49.31ID:n4dQrb8u
>>394
C#はあまり詳しくないけど、例えばListのAddRange関数の引数の(IEnumerable collection)が近いかな
AddRangeにはIEnumerableを実装してればどんな型でも渡せるはず(ArrayList、HashSet, etc)

これをAddRangeの視点で見ると、渡されたcollectionが実際に何の型かは分からないけど
IEnumerable(interface≒trait)を実装してることは分かってるから
そのGetEnumeratorを呼んでIEnumeratorを受け取ってそこから取り出せる要素を全部追加すれば
目的の動作は果たせることになる

このAddRangeの引数のcollectionがIEnumerableトレイトを実装したtrait objectって感じ
2021/05/02(日) 17:25:27.83ID:hSgvj4Ff
>>397
正確に言うとリファレンスに書いてる通りdyn Trait型のオブジェクトがTrait Object
&dyn TraitやBox<dyn Trait>はTrait Objectを指してるfat pointer

でも実用上は&dyn TraitやBox<dyn Trait>のfat pointerのこと自体を
Trait Objectというものとして理解したほうがわかりやすいので
The Bookや他の解説書でも区別してないのが多い
2021/05/03(月) 09:09:00.34ID:AyvebyYK
>>76
Visual Rust#やろ
2021/05/03(月) 11:04:52.91ID:L2uysNOu
https://marketplace.visualstudio.com/items?itemName=vosen.VisualRust
2021/05/03(月) 15:28:19.67ID:lWPqbdGD
囲い込んでブラックボックス強要するあたりはMSと相性いいかもな
2021/05/04(火) 15:41:01.40ID:6lvPuDrb
facebookも財団に参加したのか
appleも時間の問題かな

intelとかのCPUメーカーにも参加して欲しい所だが
2021/05/04(火) 17:15:37.01ID:lMvsmKDJ
CPUメーカーが参加するとどういうことが嬉しいの?
LLVMなら分かるんだけど
2021/05/04(火) 20:03:06.80ID:6lvPuDrb
まあ元intelのエンジニアも開発に参加しとるけどね
2021/05/04(火) 20:33:44.63ID:PCq3WtR4
え?脆弱で有名なあのインテル?
ヤバいじゃないですかぁ
2021/05/04(火) 21:04:23.81ID:mgj/rIpW
rustが低レイヤーの開発言語としては覇権取りそうね
今から勉強しとくのが良さそう
2021/05/04(火) 22:09:05.61ID:mvlmOZ0b
低レイヤーの仕事をしたことないってのがよくわかるわ。
2021/05/05(水) 00:03:56.29ID:UOumGkwv
>>405
エンジニア個々人が参加するのは普通にあると思うんだけど
企業として支援することにどんなうまみがあるのかなと思って

ただ改めて思うとintelもソフトウェアたくさん出しててrust使う旨みはあるから支援する意味はありそうだね
2021/05/05(水) 01:46:02.42ID:E1emjEBd
SHやArmのRustコンパイラをメーカーが出たらガチ
2021/05/05(水) 03:09:13.31ID:o0iQ7lyN
うまみっていうか、それが上手くいくかどうかなんて事前にはわからん。
ほどほどに有用そうなものに支援してたらどれかひとつくらいはいい感じって程度の話だろ。
2021/05/05(水) 05:31:11.89ID:rumk0idO
協力し合うと同時にあまり勝手しないように牽制するのも目的なので
2021/05/05(水) 12:35:13.44ID:UNdhfIGe
どうも頭の悪い輩が多いなと思ってたけど、
この言語、ある程度まではスクリプト的に書けるからなんだな。。
なんとなくおかしなこと言ってる奴の感覚がわかってきたわ。
2021/05/05(水) 13:37:38.31ID:ZpSbA1Y5
>>413
> この言語、ある程度まではスクリプト的に書けるからなんだな。。
短く簡単に書けるようにするのはRustの課題の一つだと思ってるので、どういう観点から「スクリプト的に書ける」とおっしゃるのか伺いたいです
よく比較に上がるC++よりはよっぽど記述量多くなるよね?
2021/05/05(水) 14:30:15.37ID:UNdhfIGe
そりゃautoなんかを使いまくった最近のスクリプト厨のc++ならそうだろうけれど、
普通に仕事で読むc++コードはそういう感じではないからね。
てかc++と一口に言っても年代で全く別言語だわ。
そういうスクリプト的な書き方をした場合、rustのがc++より快適に感じるのはまあわかるよ。
問題もrustのが少なく感じる。そういう書き方だけしてる場合はね。
2021/05/05(水) 14:59:14.54ID:ZpSbA1Y5
炎上学習法かってくらい何も理解してない感じでワロス
2021/05/05(水) 15:13:12.13ID:UOumGkwv
autoと動的型付けの区別が付いていない...?
2021/05/05(水) 15:19:43.76ID:nBZStdai
型再構築なんてむしろ厳格に型付けされた言語から生まれたんだが
2021/05/05(水) 15:21:51.15ID:2WIXJ/st
C#でvarキーワードが導入された時も
基本型の変数にvar使うのやめましょうみたいな規約を
意味不明な根拠で良い規約と信じて導入しようとする
おかしな人達がそこら中に居た
後にEffective C#かそこらの書籍で
ローカル変数はvar使えと明確に書かれるようになって
老害ザマァと思ったものだ
2021/05/05(水) 15:46:10.02ID:sMGymnD4
正義が世俗の愚劣さに屈した
2021/05/05(水) 15:47:19.58ID:o0iQ7lyN
ローカル変数の場合は型がすぐ隣に書いてあるような状況だろうからな。
2021/05/05(水) 16:17:27.41ID:UNdhfIGe
ほらね。
好き勝手な自分流でコード書いてるだけで人のコードを読んでないのが丸わかりなコメントしてても
全く気づかないバカしかいない。
2021/05/05(水) 16:25:26.72ID:GNJam4rN
>>421
ようするに型情報を二重に書いてるようなものだよな
情報の多重化であり
小さなDRY原則違反
こんな簡単な理屈を理解出来ない奴が不思議
2021/05/05(水) 16:30:24.49ID:sMGymnD4
書かれておらずメソッドで戻り値を取得するような場合
C#もJavaも型で呼び出し先が変わる仕組みなので
意図せずに処理の流れまで変わってしまう
2021/05/05(水) 16:44:03.35ID:GNJam4rN
>>424
お前は日本語勉強しろよ
普通に読解不能なんだよ

必要な所には型を書く
当たり前
不要な所に書いてると
「何故書いてるのだろうか?
何か理由を見落としてるだろうか?」
と注意深いプログラマを考えさせるのでエネルギーの無駄
2021/05/05(水) 16:50:12.99ID:tRoHSHAj
>>416
>炎上学習法

懐かしい言葉ですね‥‥
2021/05/05(水) 16:59:13.24ID:sMGymnD4
>>425
varにするようになったら全部varにするだろ?
2021/05/05(水) 17:40:56.63ID:iUhohRzs
>>416
相手してるお前も同罪やぞ
すぐ見分けつくだろ
2021/05/05(水) 18:09:53.05ID:UOumGkwv
VSCode + rust-analyzer だとletやメソッドチェーンのところに型が表示されるし
今時の開発環境使っていればローカル変数の型がぱっと見で分からなくて苦労することは少ないのでは
2021/05/05(水) 18:14:24.50ID:GNJam4rN
>>427
何を言っとるんだお前は?
右辺値と同じ型で「困る」時は型を書くに決まってるだろ
下手するとvarの仕様も理解せずに混乱した事を書いてんじゃないだろうな
2021/05/05(水) 18:51:20.46ID:cJbqSzge
ゲェーQZ居着いてんのかよこのスレ
バカなくせに出しゃばりでウザいからC++スレから出てくんなよ
2021/05/05(水) 19:01:51.22ID:sMGymnD4
>>430
後から右辺値の型が変わったら気が付かないうちに影響が波及するじゃん
2021/05/05(水) 19:41:05.57ID:E1emjEBd
var xの型が何であるかはxの初期化のときただ一度きりの右辺の型で決まるんジャネーノ
だとしたら後から右辺値の型が変わることに関して
varの導入で傷口が広がったことにはならない
2021/05/05(水) 19:44:32.97ID:E1emjEBd
二回目以降の右辺値はxに対する代入でしかありえない
それらはxに対して(暗黙の型変換等を経て)代入可能ならコンパイルが通るし、
代入不可能ならエラーになる。
xの初期化時にvarを使おうが使うまいが(明示的に型を書こうが)変わらない話
2021/05/05(水) 20:38:12.35ID:UOumGkwv
せめてletの話をしろよ
2021/05/05(水) 20:48:36.67ID:vgXZGrp9
RustのletはJS由来? それともHaskell?
2021/05/05(水) 21:09:59.09ID:1EwqoC8k
JavaScriptにもletあるけど語源調べたら普通に英単語のletで短縮形ってわけじゃないらしい
2021/05/05(水) 21:24:20.68ID:ra+BilqN
BASICの時代からletはあったけどな
2021/05/05(水) 21:31:43.51ID:ZsCzZm1J
letはlisp系から始まったイメージ。
2021/05/05(水) 22:26:24.94ID:vWJ975z5
RustのletはML系由来だろ
2021/05/05(水) 22:44:48.04ID:UOumGkwv
最初のrustcはocamlで書かれてたくらいだしML系の影響は色濃そう
2021/05/05(水) 22:49:49.94ID:tRoHSHAj
>>431
https://mevius.5ch.net/test/read.cgi/tech/1610096040/839
2021/05/06(木) 01:02:12.67ID:SpjdL+PT
let mut にするか var にするかの決定で、
目立たないけどRustに貢献した人という記事が最近書かれたので貼っとく
https://brson.github.io/2021/05/02/rusts-most-unrecognized-contributor
2021/05/06(木) 01:05:25.16ID:ut0g6JOd
>>443
3行でまとめて
2021/05/06(木) 01:35:02.38ID:SpjdL+PT
デイブ・ハーマン(Dave Herman)というECMAScript委員会のMozillaの代表者の人がいました。
リポジトリ上のコミットログでは目立ちませんが、彼の好みがRustチームの好みを作り、チームの組織と維持に重要な役割を果たしていました。
彼はチームの決定をほとんど穏やかに受け入れていましたが、let mut と var のどちらにするかについては var を使うというチームの決定に同意しませんでした。
2021/05/06(木) 01:36:11.91ID:V2I8vwdu
>>421
でも、
BYTE c = 'a';

let c = 'a';
では間違い易さが違う。後者は、int か BYTE か SBYTE か分からない。
2021/05/06(木) 01:37:37.69ID:V2I8vwdu
Rustだと、明示するには、
let c:i8 = 'a';
とキータイプが多くなってしまうな。
2021/05/06(木) 01:40:47.77ID:V2I8vwdu
例えばの話、演算子も優先順位が決まっているので、
if ( (a >= 5 && a <= 10) || (b>=10 && b <=20) ) {・・・}
見たいな条件も、優先順位の括弧を省略できるかも知れないが、勘違いや
記憶違いを防ぐために書いた方がいいと言われている。
int c = 'a';
char c ='a';
auto c = 'a';
ではやはり、autoはバグの原因になりそう。
2021/05/06(木) 01:47:50.96ID:V2I8vwdu
それと、型を明示した方が後から見たときにプログラマの脳内の想定もわかり易い。
float a = 1.0f;
float b = a + 5.0f;
みたいなものも、もし、
auto a = 1.0f;
auto b = a + 5.0f;
と書くと b は、double 型になってしまうかもしれないが、テストしても
間違いに気づかず、僅かに速度低下やメモリーを多く食ってしまう
かもしれない。また、思想にもよるが、1.0f などと書かずに
float a = 1;
float b = 5;
と書きたい人も居ると思う。これの方が、後から double 型に変えたときに
右辺を訂正する必要がないメリットもある。
2021/05/06(木) 03:19:29.71ID:EVf7RH7G
>>446
rustの文字リテラルはu8でもi8でもなくてcharな

それはそれとして型やら括弧やらを明示的に書くことは禁じられてないんだから書けばよいのでは
言語の問題というよりはコーディング規約でなんとかすべき領域かと

タイプ数が多くなるとかはデフォルトをどちらに倒すかの問題で世間の嗜好とずれてるなら多少手間がかかるのは諦めるしかない
2021/05/06(木) 03:21:51.36ID:EVf7RH7G
誤解を招きそうだから補足しておくとrustのcharはユニコードのコードポイントが格納される32bit符号なし整数型な
2021/05/06(木) 06:46:11.97ID:AMAuzv83
>>443
こういうのいいな
2021/05/06(木) 10:08:34.61ID:VcsxCBNr
>>445
var使おうとしてたってマジかー
let (mut a, b) = get_foo_tuple();
みたいなやつとかvarじゃ困るから必然だと思ってたのに
2021/05/06(木) 10:15:22.90ID:lmEaR3VD
>>445の要約の最後たぶん間違ってる
デイブ氏はキーワードを重ねるとmutableな変数の使用を躊躇させる効果が生じて
プログラマのコーディング方式の選択を咎めることになるから反対だったらしい
チームの決定は初めからlet mutで彼は(珍しく)反対したけど最終的には受け入れた
2021/05/06(木) 11:35:13.23ID:hCHdFqbq
つまり暗黙の型変換は癌
2021/05/06(木) 11:48:56.26ID:fowE0ZYM
varでいいじゃん
あとはideが勝手に型直してくれるよ
2021/05/06(木) 11:52:26.38ID:a37uwZNi
いないいない
2021/05/06(木) 14:35:25.59ID:SpjdL+PT
>>454
すまん、指示代名詞の指してる先を読み違えた
デイブ氏はvar押しだったんだな
2021/05/06(木) 16:00:35.75ID:acc3YL8w
タイプ数で優劣を決めようとするアホとは次元が違うな
2021/05/06(木) 16:31:20.99ID:q/dBsf9f
タイプ数は少ない方が問答無用で良い
2021/05/06(木) 17:13:47.97ID:EVf7RH7G
fn, ret, cont, break の時代に回帰するか
2021/05/06(木) 17:27:07.40ID:ut0g6JOd
タイプ数は少ない
って基本型が少ない言語が好みなのかと思った
2021/05/06(木) 19:28:16.24ID:fowE0ZYM
<?rust
println!("hello rust!!");
?>
2021/05/06(木) 21:17:13.93ID:O03dxxkK
>>448
型を明示したってバグるくせによく言うのぜ
2021/05/06(木) 22:42:35.79ID:pupGSg3O
タイプ数が少ないようが絶対良いんなら
むかしGAMEとかいうすべてのキーワードが1文字の言語があったからそれでも使え
2021/05/06(木) 23:22:18.38ID:fowE0ZYM
Rust 〜地図にない場所〜
2021/05/07(金) 03:50:05.38ID:vAByX/Kb
>>464
型明示はバグの軽減に繋がる。
>>465
絶対的に良いわけではないが、let a:i32 = 5; と int a = 5; だと後者の方が楽。
2021/05/07(金) 07:04:16.43ID:aU3MjDw9
>>467
intが32bitだといつから錯覚していた?
2021/05/07(金) 08:21:08.42ID:Dsa6ajo4
Announcing Rust for Windows v0.9
https://blogs.windows.com/windowsdeveloper/2021/05/06/announcing-rust-for-windows-v0-9/
2021/05/07(金) 09:19:02.07ID:iG4irUX1
言ってる側から落とし穴に嵌っててワロタ
2021/05/07(金) 10:35:21.40ID:8IfDDxiK
let a = 5_i32;

型は右側だけで決めるのじゃ
両側で合わせるのは無駄、変更するときも面倒じゃろ

・・なに?
aがi32だと明示してバグを軽減したいじゃと?

それなら行を分けるのじゃ
1行にまとめるとせっかくの明示が埋もれてしまうからの

let a: i32; // この行の存在は大きいぞい
a = 5_i32;
2021/05/07(金) 12:08:53.04ID:B2UdQUpV
>>468
そこまでいうなら、int32 a = 5; や i32 a = 5; と書けばいい。
なお、Rustではこの書き方が出来ない。
2021/05/07(金) 12:20:12.52ID:B2UdQUpV
>>468
ちなみに、組み込み以外のほとんどのC/C++コンパイラでは、intは32BIT型。
デスクトップマシン用のC/C++では、32BIT/64BIT のどちらでも、intは、
32BIT型のはずで、少なくとも VC++では必ず int は 32BIT。
2021/05/07(金) 12:24:00.34ID:w+YL5YRG
>>472
int32_tな
2021/05/07(金) 12:51:05.27ID:B2UdQUpV
>>474
typedef int int32;
typedef int i32;
とすればよいだけ。
2021/05/07(金) 12:57:04.52ID:w+YL5YRG
>>475
それintが32bitじゃない環境でアホみたいにミスリーディングになるけど?
いい加減スレチだし「int32_t 標準ライブラリ」でググって理解したらこの話終わりにして?
2021/05/07(金) 13:31:50.44ID:B2UdQUpV
>>476
そんな基本的なことは当たり前で、そのような環境では、
typedef __int32 int32;
typedef __int32 i32;
とする。
2021/05/07(金) 13:40:18.27ID:8gopO5Ce
どういうバグを作る可能性があるかという点が共有されてないから議論空回りしている感
2021/05/07(金) 13:42:32.36ID:B2UdQUpV
というか、int32_t という型名を考えた人が馬鹿すぎるので、長くて困るという話
だと思ったんだ。もし、int32_t が使える環境で賢く使いたい人は、
typedef int32_t int32;
typedef int32_t i32;
typedef int32_t Int32;
などとすればいいという話。
前提とする知識が低すぎる人がいるから困る。
■ このスレッドは過去ログ倉庫に格納されています
5ちゃんねるの広告が気に入らない場合は、こちらをクリックしてください。

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