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/
358356
垢版 |
2019/09/25(水) 18:23:59.57ID:GHCxkzpX
>>357
怒られなくなりました
ありがとうございます

```
#[allow(non_snake_case)]
pub fn dummy() {
let hWnd = 0;
}
```
2019/09/25(水) 18:52:38.83ID:YV2E2PPu
そんなことで警告出るのか
360デフォルトの名無しさん
垢版 |
2019/09/25(水) 18:54:51.99ID:it7hFznu
ノンスネークケースを表す識別子がスネークケースとはいかがなものか。
allow(non_snake_case)
これ自身を
allow(nonSnakeCase)
と書きたいものである
361デフォルトの名無しさん
垢版 |
2019/09/25(水) 20:08:08.16ID:r0+GDB9/
そんなことって言うけど大事なことだよね
362デフォルトの名無しさん
垢版 |
2019/09/25(水) 20:21:48.81ID:bkoUXP+/
ErrorやWarningを出力するときにHelpやNoteで解説も出力してくれてすごく助かる
2019/09/25(水) 22:38:57.35ID:LBtfjA7U
IEEE top programming language 2019が公開
https://spectrum.ieee.org/computing/software/the-top-programming-languages-2019

Rは5位や
2019/09/25(水) 22:53:25.25ID:68BFbOjP
えっ
2019/09/25(水) 23:26:32.08ID:rQhNlpv9
どういうことなの…
2019/09/25(水) 23:55:26.38ID:mTIaTH5b
ここはRはRでもRustスレだぞ
2019/09/25(水) 23:57:15.10ID:8yvlK+3a
ほとんどいっしょじゃん
2019/09/26(木) 16:03:54.65ID:JiUn+jUB
ジェネリクスとPhantomData使って特定の関数呼んだかとかの条件付けるんならせめてエラーメッセージもちゃんとして欲しい(´・ω・`)
2019/09/26(木) 16:19:41.45ID:qa4bTo/t
要らない何も捨ててしまおう君を探し彷徨うマイソウッ!
2019/09/26(木) 17:11:23.47ID:RE9M+3kx
関数呼んだかチェックを実行時でなくてコンパイル時にできるってこと?
2019/09/26(木) 23:30:20.63ID:HeylAp30
Rust 1.38.0リリース!
2019/09/27(金) 02:38:10.86ID:boczQ2su
キタ━━━━(゚∀゚)━━━━!!
2019/09/27(金) 13:19:26.24ID:I3+hYE7s
RustとRの違い

R
データサイエンティストが仕事で使う
言語として結果を出している
速度は残念ながら遅い

Rust
陰キャが気持ちよくなるために使う
実績ナシ
速度は速いらしい(ソース無し)
374デフォルトの名無しさん
垢版 |
2019/09/27(金) 13:24:28.05ID:bGFj4S5H
R指定
2019/09/27(金) 14:09:17.54ID:foryHhOm
RustとRubyの違い

とか書くとスレが荒れる時代はもう過去なのかな
2019/09/27(金) 15:06:25.40ID:I3+hYE7s
RubyとRustの違い

Ruby
陽キャのおもちゃ
負債作成の実績がある
遅い

Rust
陰キャのおもちゃ
なにも作られてないので負債も作られていない
さすがにRubyよりは速い
2019/09/27(金) 15:10:10.66ID:FRvVNNut
FirefoxのCSSエンジンとかFirecrackerとかDropboxとかnpmとかあるけど見たくないヤツには見えないからなあ
2019/09/27(金) 18:38:35.49ID:/s5L2MEw
自分では書きたくない言語
確定申告のようなコーディングスタイル
2019/09/27(金) 19:04:11.92ID:ikgA/i06
>確定申告
わかる
380デフォルトの名無しさん
垢版 |
2019/09/27(金) 20:01:19.53ID:PO8lPJ5D
dieselなんかこれじゃない感あるなと思ったらアクティブRecord作った人が作ってるのか
代替ないのかね
2019/09/28(土) 13:12:58.36ID:VxLIFoZc
>>376
プログラマーな時点で陽キャはない
ウェイかつオタクという最悪な種族
2019/09/28(土) 19:09:22.19ID:kbZ6IYig
RustネイティブでQtやGtkレベルのツールキットがほすぃ(´・ω・`)
2019/09/28(土) 22:50:10.69ID:gNXUW3Qt
どれもやる気なくてダメポ
ttps://gitlab.com/bloom42/research/rust_gui_ecosystem
2019/09/29(日) 02:52:49.38ID:TRtZnyIq
>>382
ぼくも(´・ω・`)
2019/09/29(日) 13:43:42.91ID:FBG2HAFw
人それぞれだと思うんであくまで参考に聞かせて欲しいんだけど
どれくらいのサイズまで#[derive(Copy)]つけます?
2019/09/29(日) 15:19:26.29ID:i6efVVcg
Copyって所有権の話であってサイズとは関係なくない?
2019/09/29(日) 16:30:03.01ID:L34oTjKk
所有権の観点からCopy実装してはならないケースはあるだろうけど、
してもしなくてもいい場合に考慮するのはサイズと意味だろ。
サイズに関して言えば、自分はu64の10倍くらいまでって感じ。
2019/09/29(日) 18:25:18.99ID:hzqyoCtf
Rust Language Cheat Sheet
15.09.2019
https://cheats.rs/
389デフォルトの名無しさん
垢版 |
2019/09/29(日) 19:21:30.01ID:GZbu7mvl
極力付けないな
ぱっと見分かんないから
2019/09/29(日) 20:25:18.89ID:FBG2HAFw
いろいろ感謝

よく例題にありそうな
struct Point { x: i32, y: i32 }
みたいなのなら#[derive(Copy)]しても害はないかなと思って聞いてみた
速度を考えてサイズがusizeの3〜4倍ぐらいまでが相場かなと思ったんだけどね
2019/09/29(日) 20:46:09.39ID:SwLAQNn/
俺が間違ってんのかな、どうもCopyとMoveの意味を勘違いしてるような…

https://doc.rust-lang.org/std/marker/trait.Copy.html
こことかにも書いてあるけどMoveでもCopyでも構造体の値自体は(所有権の意味ではなくmemcpyとしての意味での)コピーされるんだから一緒じゃないの?
2019/09/29(日) 21:03:36.26ID:L34oTjKk
例えば
let x = y;

let x = y.clone();
があったときに前者はノーコストで後者は結構重いかもしれないって感覚があると思うけど、
大きなstructにCopyを実装すると前者で大きなmemcpyが発生してびっくりする、という話。
2019/09/29(日) 21:26:23.34ID:FBG2HAFw
イメージした状況は違うけどそんな感じ
参照経由で扱いたい大きなデータなのに
うっかりコピーされる状況にしちゃって勝手にコピーされるのはちょっと
でも小さいデータならコピーされてもいい
2019/09/29(日) 21:30:49.24ID:PihB9u3J
MicrosoftのC#のドキュメントに何バイトまでstruct (C#における#[derive(Copy)])使う方がいいか
書いてあるのを見た気がする
値は忘れた
395デフォルトの名無しさん
垢版 |
2019/09/29(日) 21:33:28.20ID:GZbu7mvl
Sizedなのは当然としてクリッピーなりラストシーが怒ってくれれば気軽に使えるだけどな
2019/09/29(日) 22:03:15.24ID:ciotleRh
>>394
クラスまたは構造体の選択
https://docs.microsoft.com/ja-jp/dotnet/standard/design-guidelines/choosing-between-class-and-struct

> インスタンスのサイズは 16 バイト未満である。

C#では16byte (128bit) か
397デフォルトの名無しさん
垢版 |
2019/09/29(日) 23:57:00.22ID:6uuCovZS
使用頻度にも依るんだから計測しろよ
別に難しいことじゃ無いし
2019/09/30(月) 00:27:00.93ID:k5ErHMsi
>>392>>393
Copyを実装してようがいまいが(=Move)
let x = y;
したのならどちらも同様にその構造体自体のmemcpyによる複製は行われてるよ?
(もちろんフィールド内の参照が指す先の話じゃなく)
2019/09/30(月) 06:40:12.68ID:URkXaUjC
それはわかってるつもり
関数定義で引数を参照にしそこねた場合とかをイメージしてた
Copyつきだとmoveされずに残るから気づきにくい
2019/09/30(月) 08:53:42.19ID:i9kRAMDA
それで問題なく動いてるならどうでもいいだろ
遅かったら直せば?
どれだけ速かろうが、なんら価値を産まないプログラムの価値はゼロだよ
2019/09/30(月) 09:35:07.62ID:URkXaUjC
動くのは前提で最初( >>385 )から速度の話をしてるんですよ
流れで所有権の有効性の一面がでてきたわけですがね
他の人はどれくらいの速度低下を許容しているのか知りたいってのが発端
2019/09/30(月) 09:49:38.90ID:Fmg7ESu9
呼び出し規約でレジスタに乗る範囲は意識するかな
大きいのは論外だとして、小さいのは
プロファイルとっても表面化しないまま積み重なっていくだけだから
遅かったらあとで直すってのはまず実施されないよね
2019/09/30(月) 10:10:48.53ID:4XC9Ks9U
価値を生まないプログラムの価値はゼロ
とかいうひどい重言
2019/09/30(月) 10:27:48.78ID:Fmg7ESu9
でも速いソフトウェアは価値があるよね、一般的に
2019/09/30(月) 10:45:45.14ID:mReccqCd
>>399
しつこくてごめんね、でも分かってるようには思えないなぁ
CopyだろうがMoveだろうがメモリの使用量も速度も何も変わらないよ?
>>391に書いてあるけど複製前の値が使えるか使えないかっていう、所有権の違いだけ


It's important to note that in these two examples, the only difference is whether you are allowed to access x after the assignment.
Under the hood, both a copy and a move can result in bits being copied in memory, although this is sometimes optimized away.

CopyとMoveの違いはassign後のxにアクセスできるか出来ないかの違いしかない
内部的にはどちらもビット単位のコピーが行われる

When should my type be Copy?
Generally speaking, if your type can implement Copy, it should.
Keep in mind, though, that implementing Copy is part of the public API of your type.
If the type might become non-Copy in the future, it could be prudent to omit the Copy implementation now, to avoid a breaking API change.

一般的にCopyが実装可能ならするべき
将来的に非Copyになる予定ならAPIが変わることになるので実装しないべき
2019/09/30(月) 11:23:56.92ID:ZVXF2Iws
moveのmemcpy()って最適化でだいたい消えるんじゃないの?
2019/09/30(月) 11:43:56.12ID:URkXaUjC
>>405
だからcopyもmoveもしたくないんですよ
勝手にcopyを渡されるのでなく参照を渡してアクセスすべきstructのサイズがありますよね
copy vs move でなく copy/move vs 参照 ということ
勝手にcopyされないようにCopyを実装しないサイズについて
他の人の考えを聞きたかったんです

たぶん >>393 にそんな感じって書いたのが良くなかったんだろうな
>>392 の問題点を指摘するべきでした
2019/09/30(月) 12:46:09.32ID:/ExrEdFZ
>>382
X.orgとWin32はいいとしてCocoaが厄介だな
2019/09/30(月) 13:02:43.26ID:7L7I6CKJ
128bitくらいまでならコピーでいいんじゃね
ttps://www.forrestthewoods.com/blog/should-small-rust-structs-be-passed-by-copy-or-by-borrow/
410デフォルトの名無しさん
垢版 |
2019/09/30(月) 15:22:11.50ID:zXgxGRIB
although this is sometimes optimized away.
の部分も訳してよ
2019/09/30(月) 16:59:35.99ID:/ExrEdFZ
じょぶじょぶ〜
とりま、場合によっては最適化されるっしょ
2019/10/01(火) 20:25:14.82ID:lajlXQ9x
moveでも何かコピーされるの知らんかった。どうしてなの?
2019/10/01(火) 20:50:44.63ID:fK9M+/VL
このレベルの高速化が必要な処理なら #[inline] つけたら
2019/10/01(火) 22:05:50.22ID:iKbLcHR3
>>412
大抵は最適化でコピー省略だろうけど
寿命の短い変数から長い変数へmoveする場合は面倒な予感
2019/10/01(火) 23:19:08.32ID:5ranOfZi
め、memmove()はmemcpy()、、
moveが真にmoveになるのはハンドルや参照やFATで指し示されたブツだけなのではないか
bittableなオブジェクトでcopyメソッドの付加をケチっても仕方が無い
bittableなコピーは所有権フリーでふつくしい
2019/10/02(水) 00:51:11.12ID:Eszh3Zaw
>>413
今や言語を超えてもLTO出来るので#[inline]を付ける意味ないんじゃないかな
2019/10/02(水) 09:53:31.95ID:QICDvY23
LTOは重い
2019/10/02(水) 09:56:56.52ID:79uWriwX
LTOってよく分からん
.soとかどうなるの?
2019/10/02(水) 10:06:07.00ID:QICDvY23
その境界は当然越えられないよ
静的なリンクのものだけ
2019/10/02(水) 13:10:54.18ID:GoUXMchS
Result<(),Box<dyn Error>>を返す関数の中で、Errorトレイトを実装していない外部のクレートのエラーFooErrorを返す関数
fn f() -> Result<(),FooError>{}
に対して f()? のように?演算子を使いたい場合どうすれば良いんでしょうか?
421デフォルトの名無しさん
垢版 |
2019/10/02(水) 13:43:42.50ID:Ra0M0x2i
Errorトレイトが自分で作ったものならFooErrorにimplする
そうでないならenun MyErrorを作ってErrorをimplし、From<FooError> for MyErrorを実装する
規模が大きいなら後者のパターンで全てのエラーを包んでResult<(), MyError>を返すようにした方がよいっぽい
2019/10/02(水) 14:03:30.89ID:GoUXMchS
https://play.rust-lang.org/?version=stable&;mode=debug&edition=2018&gist=7e31f88718f5c8a1e9a11cdda48e91e4
>>421
ありがとうございます
Foo::f()?の部分はどうやって書けば良いんでしょうか…
423デフォルトの名無しさん
垢版 |
2019/10/02(水) 14:19:47.22ID:qs4Bbmku
すまん不完全な解答だった
外出ちゃったからコードいじれないんだすまん
はintoを自動的に発行するので対応するFromを書けばいけるはず
ただBoxだとどうかな、やってみて
2019/10/02(水) 14:24:05.29ID:GoUXMchS
>>423
いえ、ありがとうございます
もうちょっと試行錯誤してみます
425デフォルトの名無しさん
垢版 |
2019/10/02(水) 22:03:54.08ID:+yvFYHag
https://play.rust-lang.org/?version=stable&;mode=debug&edition=2018&gist=54aff502bb9829108b97270581494855

帰ってきたよ
これでいけたよ
426デフォルトの名無しさん
垢版 |
2019/10/02(水) 23:45:01.99ID:xTOjXinC
moveってしゃろーこぴー?
2019/10/03(木) 10:09:25.46ID:UFT9wl4W
>>425
ありがとうございます!
2019/10/05(土) 11:22:10.79ID:Kz6nPZqe
LTOって何ですか?
long transfer object? great teacher Onizuka?
429デフォルトの名無しさん
垢版 |
2019/10/05(土) 11:41:40.70ID:IzmeWHwu
レズ・トランスジェンダー・おっぱいの略。
2019/10/05(土) 11:45:44.92ID:oRBX06Fv
磁気テープ
2019/10/05(土) 15:31:30.78ID:JszGfLQj
DebugとDisplayってどう使い分けたり実装すれば良いんでしょうか

ドキュメントには前者はプログラマ向け、後者ははユーザー向けの出力とかって書いてあるので例えば数値なんかは
前者は「99u8」、後者はただ「99」みたいに表示されるのかと思ったんですが実際はどっちも同様にただ「99」としか表示されないですよね?
2019/10/05(土) 16:20:44.53ID:Kz6nPZqe
Debug は
ID: 530, name: "ほのおのつるぎ(売却可)", attack: 63, equippable: "戦士、勇者"
みたいにユーザーに見せるもんじゃない詳細とかを適当なフォーマットで含むじゃろ。
Display は
ほのおのつるぎ
みたいにエンドユーザーにフォーマルにみせる情報を、変にフォーマットせずに含むのが普通じゃろ
433デフォルトの名無しさん
垢版 |
2019/10/06(日) 14:09:28.34ID:UJBvNAqw
RustでVulkanを使いたいのですが、現状非公式のバインディングを使うしか無いのでしょうか…?
434デフォルトの名無しさん
垢版 |
2019/10/06(日) 16:42:20.66ID:u0a4L4+0
デバッグビルドの時に、リリースビルドした依存クレートを使う簡単な方法はありますか?
target/release/depsをtarget/debug/depsに名前を調整して移すとできてる感じですが
もっと簡単にできないでしょうか。
2019/10/06(日) 19:52:43.72ID:vdo0Vbvr
Nightly向けには実装されてるね
俺も早くこれ欲しい
https://github.com/rust-lang/rust/issues/48683#issuecomment-483665255
436デフォルトの名無しさん
垢版 |
2019/10/06(日) 21:45:30.41ID:u0a4L4+0
なるほど
当面自作のスクリプトでdebug/depsいじります
2019/10/07(月) 19:36:11.62ID:ygKDuPd1
Rustに限った話じゃないんだがGUIツールキットもゲームエンジンもC++が主流
でもC/C++以外でC++の呼び出しが出来る処理系はほとんどない。うぼあー
438デフォルトの名無しさん
垢版 |
2019/10/07(月) 19:40:49.20ID:PWOdjrjM
スマホゲームとか一時はUnityだらけだと思ったけど今は違うの?
2019/10/07(月) 20:36:38.94ID:MItW4Ls8
「C/C++以外で」ってCで呼べるんだ・・・
2019/10/07(月) 20:52:58.22ID:QQWXmaql
CどころかC++同士の異コンパイラ間ですら呼べなかったと思うけど。
2019/10/07(月) 23:30:27.88ID:AKFeYH7t
(´・ω・`)
2019/10/08(火) 00:43:17.33ID:EV6VUNWa
ウィンドーズホンだとC#からC++/CXを経由してネイティブなC++が呼べたお
2019/10/08(火) 00:45:06.10ID:0ezsQlmk
なるほど。開発環境が決まっててABI決めうちできるならいけるのか。
2019/10/09(水) 09:16:04.87ID:ffKM9u5G
Dがあるじゃん
2019/10/09(水) 11:04:16.03ID:+5ZYxB02
ここの住民の低レベルさが確定した
2019/10/09(水) 11:15:47.99ID:7UOBKYJf
レベルの高い話題くれ
2019/10/09(水) 17:58:10.09ID:PhcKq1+0
Cは社交界のオキテを知らない村娘だから
不用意に呼ぶとズッキュウウウンしちゃったりするのよ
だから簡単に呼べなかったりするけど呼べるときはシャワーも浴びずにすっ飛んでくる、そんな子
2019/10/09(水) 19:00:00.88ID:xdNe6xdo
C++のライブラリへのバインディングでほとんどのAPIがunsafe&unsafeって書いて無い奴もunsafeかもしれんから自分で気をつけてね☆
みたいのがあるんやが

これってRustで書く意味無くね…?
449デフォルトの名無しさん
垢版 |
2019/10/10(木) 00:27:32.81ID:sVTH7Uak
貴方がRustで書き直せば喜ぶ人もいるんじゃない?
450デフォルトの名無しさん
垢版 |
2019/10/10(木) 09:54:53.26ID:yMym0WfO
ま〜つもと
いけいけまつもと
がんばれまつもと
451デフォルトの名無しさん
垢版 |
2019/10/10(木) 10:51:54.74ID:LImRHacY
>>448
C++のライブラリ使うからだろ。
Rustで書かれたもの使うか、Rustで書き直せ。
2019/10/10(木) 13:45:05.68ID:sZ93Becg
Box<T>のTを初期化せずに返すunsafe fn box_t() -> Box<T> があったとして
let mut t;
unsafe {
t = box_t();
// Tの初期化
}
にするのと
let mut t = unsafe { box_t() };
// Tの初期化
ですますのとどっちが良いRust?
2019/10/10(木) 14:05:19.62ID:p3GDnYn8
Rustプログラミング入門
https://www.ohmsha.co.jp/book/9784274224355/
454デフォルトの名無しさん
垢版 |
2019/10/10(木) 14:59:57.87ID:MXl+fq4L
>>452
unsafeで囲む範囲はどの言語でも最小限にしろよ
初期化にunsafe要らんのなら囲むな
2019/10/10(木) 19:40:43.29ID:tKt5RHA7
なんでUnsafeメモリ領域にしなかったんだ…
2019/10/10(木) 21:10:29.28ID:emWne1To
ムンッ
2019/10/11(金) 09:08:20.83ID:15rXT0oG
>>448
unsafeなAPIに対してrustで安全なラッパーを被せてやれれば意味がある
■ このスレッドは過去ログ倉庫に格納されています