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 Part7
http://mevius.5ch.net/test/read.cgi/tech/1563114707/
Rust part8
■ このスレッドは過去ログ倉庫に格納されています
2020/01/24(金) 11:47:52.41ID:9oO1hUHl
392デフォルトの名無しさん
2020/04/05(日) 23:13:46.13ID:dvIeqTXE スタック上に長さ不定のデータが作れるとバグの温床になる。
他の言語だと大体の値がヒープに乗せること前提で動いているんで気にしたことが無いのだと思われる。
C/C++でも非推奨なんだけど、初心者向け釣りサイトでは平気でやってることがあるし、できちゃうから面倒
他の言語だと大体の値がヒープに乗せること前提で動いているんで気にしたことが無いのだと思われる。
C/C++でも非推奨なんだけど、初心者向け釣りサイトでは平気でやってることがあるし、できちゃうから面倒
393デフォルトの名無しさん
2020/04/06(月) 00:16:34.72ID:WU94L+3C 配列サイズが決められてないかつ、関数内で配列生成するけど返り値はサイズ固定のスライス記法の書き方するようにする方法ってない?
つまりはVecのアロケートが嫌な場合
fn name(v: Vec<A>) -> Vec<A> {
v.iter().map(***).collect
}
これだとスタック確保できるけど無駄なデータ入ってるし、動的なサイズの配列を返せない
fn name(v: Vec<A>) -> [i32; 10] {
let mut arr = [0; 10];
for (i, x) in v { arr[i] = x}
arr
}
こういうスライスのスタック版みたいな感じのことがしたい
fn name(v: Vec<A>) -> [A] {
let mut arr = [0; v.len()];
for (i, x) in v { arr[i] = x}
arr
}
つまりはVecのアロケートが嫌な場合
fn name(v: Vec<A>) -> Vec<A> {
v.iter().map(***).collect
}
これだとスタック確保できるけど無駄なデータ入ってるし、動的なサイズの配列を返せない
fn name(v: Vec<A>) -> [i32; 10] {
let mut arr = [0; 10];
for (i, x) in v { arr[i] = x}
arr
}
こういうスライスのスタック版みたいな感じのことがしたい
fn name(v: Vec<A>) -> [A] {
let mut arr = [0; v.len()];
for (i, x) in v { arr[i] = x}
arr
}
394デフォルトの名無しさん
2020/04/06(月) 00:54:32.32ID:jrbG9hxT395デフォルトの名無しさん
2020/04/06(月) 00:59:52.27ID:jrbG9hxT あと関数内部で配列生成したら
そのlifetimeが関数内に閉じるので参照も返せないね
そのlifetimeが関数内に閉じるので参照も返せないね
396デフォルトの名無しさん
2020/04/06(月) 01:07:26.57ID:jrbG9hxT やるとしたら
外側のスコープで固定サイズの配列をバッファとして作っておいて
関数ではバッファを満たして返すイメージ
外側のスコープで固定サイズの配列をバッファとして作っておいて
関数ではバッファを満たして返すイメージ
397デフォルトの名無しさん
2020/04/06(月) 01:16:22.32ID:FD55gb+K C言語でいうところの if ( (c=foo()) == bar) { ...(cを使う処理)
みたいなことやりたいんですがどうすればいいですか?
fooが結構重くて2回呼び出したくないのですが、
let c = foo();
if c == bar {...
とやるしかない?
みたいなことやりたいんですがどうすればいいですか?
fooが結構重くて2回呼び出したくないのですが、
let c = foo();
if c == bar {...
とやるしかない?
398デフォルトの名無しさん
2020/04/06(月) 01:49:32.44ID:JJIxYQHA matchとifガード使えば似たようなことは出来る
399デフォルトの名無しさん
2020/04/06(月) 02:48:45.03ID:WU94L+3C400デフォルトの名無しさん
2020/04/06(月) 03:03:32.80ID:jrbG9hxT >>397
@ bindingってのを使う
https://play.rust-lang.org/?version=stable&mode=debug&edition=2018&gist=b2a16356c2c790985ddd937ccc2ca826
@ bindingってのを使う
https://play.rust-lang.org/?version=stable&mode=debug&edition=2018&gist=b2a16356c2c790985ddd937ccc2ca826
401デフォルトの名無しさん
2020/04/06(月) 04:04:37.66ID:FD55gb+K >>398
match foo() {
c if c == bar => { .. },
_ => (),
}
こういう感じでしょうか。この場合だと記載量としてはかなり微妙ですが何かに使えそうなので覚えときます。
ありがとうございます。
>>399
今回の場合はfoo()がboolじゃないのと、barが変数なのでシャドーイングされてうまくいかないようです・・・。
if let foo @ bar = foo() { ...
みたいなことやろうとしましたがダメでした。
https://play.rust-lang.org/?version=nightly&mode=debug&edition=2018&gist=d580f91c98f26cf52a23791489914ec3
match foo() {
c if c == bar => { .. },
_ => (),
}
こういう感じでしょうか。この場合だと記載量としてはかなり微妙ですが何かに使えそうなので覚えときます。
ありがとうございます。
>>399
今回の場合はfoo()がboolじゃないのと、barが変数なのでシャドーイングされてうまくいかないようです・・・。
if let foo @ bar = foo() { ...
みたいなことやろうとしましたがダメでした。
https://play.rust-lang.org/?version=nightly&mode=debug&edition=2018&gist=d580f91c98f26cf52a23791489914ec3
402デフォルトの名無しさん
2020/04/06(月) 22:14:10.89ID:/YOLus+e403デフォルトの名無しさん
2020/04/06(月) 22:57:49.62ID:2RUK7fME Vecとかのコンテナ系の使い方は大分変わるよ
例えばイベント駆動の何かを作るときには考えた方が良いかと思う
struct XEventSource {
listeners : Vec<Box<dyn Handler>>,
...
}
trait Handler { fn handle(ev: &XEvent) -> () }
impl XEventSource {
fn addLisnter(&mut self, listener : Box<dyn Handler>) -> () {
self.listeners.push(listener);
}
fn emit(&self) -> () {
XEvent ev = ...;
for listener in listeners.iter() {
listener.handle(&ev);
}
}
}
みたいに作ると、利用者が好きに作った構造体でもHandlerをimplすればlistenersに足せる
ジェネリクスだとイベントリスナの実際の型1つしかaddできないので不便
例えばイベント駆動の何かを作るときには考えた方が良いかと思う
struct XEventSource {
listeners : Vec<Box<dyn Handler>>,
...
}
trait Handler { fn handle(ev: &XEvent) -> () }
impl XEventSource {
fn addLisnter(&mut self, listener : Box<dyn Handler>) -> () {
self.listeners.push(listener);
}
fn emit(&self) -> () {
XEvent ev = ...;
for listener in listeners.iter() {
listener.handle(&ev);
}
}
}
みたいに作ると、利用者が好きに作った構造体でもHandlerをimplすればlistenersに足せる
ジェネリクスだとイベントリスナの実際の型1つしかaddできないので不便
404デフォルトの名無しさん
2020/04/06(月) 23:45:59.83ID:TaQVQ6iW >>402
実行時に型を振り分けるとなると仮想関数テーブルを辿る必要があるんで実行時コストが少し増えるよ。
(Rust では仮想関数って言わないのかな? 正確な用語がわからん。)
トレイトを実装している型を実際には一種類しか使わないのだったら、
実行時間を除けば見かけ上の動作で違いはないかもしれんな。
でも基本的にはやりたいことを出来る範囲で制約は厳しい方がいい。
間違いの検出される可能性が高まるから。
制約をどのように表現するかというのはプログラミング言語の設計においては重要なトピックで、
構造化プログラミングが提唱されたのも goto だと制御をどこへ移動するのか制約を付けられないってのがある。
さらにそれを発展させた形として型で制約を付けようってのが色々と考えられてきたし、
Rust では更にオブジェクトの寿命に制約を付けようという考えが実現された。
その関数では何ができるのか、そして「何をしてはいけないのか」ってのを考えると
Rust らしいプログラムが出来ると思う。
実行時に型を振り分けるとなると仮想関数テーブルを辿る必要があるんで実行時コストが少し増えるよ。
(Rust では仮想関数って言わないのかな? 正確な用語がわからん。)
トレイトを実装している型を実際には一種類しか使わないのだったら、
実行時間を除けば見かけ上の動作で違いはないかもしれんな。
でも基本的にはやりたいことを出来る範囲で制約は厳しい方がいい。
間違いの検出される可能性が高まるから。
制約をどのように表現するかというのはプログラミング言語の設計においては重要なトピックで、
構造化プログラミングが提唱されたのも goto だと制御をどこへ移動するのか制約を付けられないってのがある。
さらにそれを発展させた形として型で制約を付けようってのが色々と考えられてきたし、
Rust では更にオブジェクトの寿命に制約を付けようという考えが実現された。
その関数では何ができるのか、そして「何をしてはいけないのか」ってのを考えると
Rust らしいプログラムが出来ると思う。
405デフォルトの名無しさん
2020/04/07(火) 08:14:23.99ID:FPXvnSDp APIサーバーでJSON受け取るときに値の型が違ったりオーバーフローするときってどうしてる?
serde_json::from_str で構造体の属性でエラーメッセージとかつけれたらいいのにな
serde_json::from_str で構造体の属性でエラーメッセージとかつけれたらいいのにな
406デフォルトの名無しさん
2020/04/07(火) 15:06:01.62ID:+YUDNjw9 from_strの結果そのまま使ってるけどダメなの
シンタックスエラーとか含めると大変じゃない
シンタックスエラーとか含めると大変じゃない
407デフォルトの名無しさん
2020/04/07(火) 15:54:15.51ID:FPXvnSDp 海外向けサーバーだったらいいけど日本向けサーバーの場合は?
serde_jsonのエラーメッセージcustomizableじゃないから辛い
serde_jsonのエラーメッセージcustomizableじゃないから辛い
408デフォルトの名無しさん
2020/04/07(火) 16:02:31.28ID:+YUDNjw9 serde_json::Error を見ると行と列と大雑把な原因はとれるみたい
細かくやるなら置換するしかなさそうだね
細かくやるなら置換するしかなさそうだね
409デフォルトの名無しさん
2020/04/08(水) 10:01:13.64ID:qyTF9Er6 reached the configured maximum number of stack frames
でスタックフレームの制限にかかるんだけどオプションとかで変えれる?
でスタックフレームの制限にかかるんだけどオプションとかで変えれる?
410デフォルトの名無しさん
2020/04/11(土) 23:13:20.24ID:EhWtF4tX impl<'_, T> Drop for std::collections::vec_deque::Drain<'_, T>
こういう風にちゃんとパス書かれたのもあれば、デフォルトインポートされてないのに省略されてる型あるけどどうなってるの?
https://doc.rust-lang.org/std/ops/trait.Drop.html
こういう風にちゃんとパス書かれたのもあれば、デフォルトインポートされてないのに省略されてる型あるけどどうなってるの?
https://doc.rust-lang.org/std/ops/trait.Drop.html
411デフォルトの名無しさん
2020/04/11(土) 23:59:49.19ID:Ni1vKiQd フルパス書かなくてもいいように
mod.rsに指定されてるものとされてないもの
mod.rsに指定されてるものとされてないもの
412デフォルトの名無しさん
2020/04/12(日) 23:38:47.63ID:dFThPQBr クロージャの再帰呼び出しってできないんですか?
413デフォルトの名無しさん
2020/04/13(月) 09:02:25.60ID:45YCco/F それが必要な理由は?ここはお前の便利帳じゃねーんだから
有益な使い方が有れば紹介してから聞け
有益な使い方が有れば紹介してから聞け
415デフォルトの名無しさん
2020/04/13(月) 11:59:07.30ID:WFzH9Pd8416デフォルトの名無しさん
2020/04/14(火) 07:17:51.31ID:WrIQImmd Copyでの関数呼び出しとポインタ作成ってコスト的にはプリミティブのどの型からが処理重い?
ここらへんCSの知識ないからわかんない
ここらへんCSの知識ないからわかんない
417デフォルトの名無しさん
2020/04/15(水) 02:35:11.54ID:rawye3jg Rust仕事で使ってる人〜
ウチはコロナの影響でプロジェクト吹き飛んだよん( ;∀;)
ウチはコロナの影響でプロジェクト吹き飛んだよん( ;∀;)
418デフォルトの名無しさん
2020/04/15(水) 02:44:45.60ID:hMxv+37E あらら(´・ω・`)
419デフォルトの名無しさん
2020/04/15(水) 05:30:29.65ID:SZSUFLJC 組み込みで試験的に導入したけどムズイ
まあ慣れの問題もあるのだろうけど
まあ慣れの問題もあるのだろうけど
420デフォルトの名無しさん
2020/04/15(水) 21:10:37.56ID:mcKFmUGe 組み込みでrustに似た言語。ATS2が。
421デフォルトの名無しさん
2020/04/15(水) 21:11:58.85ID:60TKpqE+ Nimは?
422デフォルトの名無しさん
2020/04/15(水) 21:27:25.14ID:8I3eMZIA ATS2ってRust以上にドキュメントが少なくてHaskell以上に難解なアレじゃないですかやだー!
423デフォルトの名無しさん
2020/04/15(水) 23:28:51.38ID:hMxv+37E やだー!
424デフォルトの名無しさん
2020/04/16(木) 09:03:49.64ID:YGIESbh5 Rust界隈で一番貢献度高いのってAlexとかになるかな?
425デフォルトの名無しさん
2020/04/17(金) 14:41:30.42ID:SjHnVlOc Microsoftに期待してるんだが今はそれどころじゃ無さそう
426デフォルトの名無しさん
2020/04/18(土) 00:35:43.07ID:Dq0Xmd2Y Alexは人の話聞けっていう
427デフォルトの名無しさん
2020/04/18(土) 07:35:23.99ID:mN+EtaBg428デフォルトの名無しさん
2020/04/18(土) 15:23:13.66ID:8wM3wY+l 勉強がてらこちらの二分探索木を真似してみたのですが、コンパイルエラーが出てしまいます。
https://codereview.stackexchange.com/questions/133209/binary-tree-implementation-in-rust
playgroundで試してみた結果がこれです。
https://play.rust-lang.org/?version=stable&mode=debug&edition=2018&gist=fc1fe0d2a4c39c6b28d017539419fa2a
どうやら古いRustならコンパイルが通るようなのですが、今のRustでコンパイルを通すにはどうすればよいのでしょうか?
https://codereview.stackexchange.com/questions/133209/binary-tree-implementation-in-rust
playgroundで試してみた結果がこれです。
https://play.rust-lang.org/?version=stable&mode=debug&edition=2018&gist=fc1fe0d2a4c39c6b28d017539419fa2a
どうやら古いRustならコンパイルが通るようなのですが、今のRustでコンパイルを通すにはどうすればよいのでしょうか?
429デフォルトの名無しさん
2020/04/18(土) 18:14:53.19ID:EW6Y9RQI Alexが人の話聞かないってこと?
430デフォルトの名無しさん
2020/04/19(日) 10:46:13.87ID:8Q+7ObaB ダメ出しよろ https://ideone.com/fswv4P
431デフォルトの名無しさん
2020/04/19(日) 12:14:31.72ID:lAlWodFD 非常に良いと思います。flagの意図を読み解くのが少し難しいくらいです。
432デフォルトの名無しさん
2020/04/20(月) 08:24:43.01ID:JR6Mr590 確かにflagが読みづらいからコメントは欲しいかな
個人的にはuse Exp::*;とExp::V => Exp::Valueにするのとテストケース増やしてmod testsにするかな
let exp = Value("MITSU").add(Value("MITSU")).add(Value("MITSU")).eql(Value("CORONA"));
let solver = Solver::new(exp);
// prints solved exp
solver.solve();
最初のインスタンスは読みにくいからこうするかも、それかマクロかビルダー作るか
個人的にはuse Exp::*;とExp::V => Exp::Valueにするのとテストケース増やしてmod testsにするかな
let exp = Value("MITSU").add(Value("MITSU")).add(Value("MITSU")).eql(Value("CORONA"));
let solver = Solver::new(exp);
// prints solved exp
solver.solve();
最初のインスタンスは読みにくいからこうするかも、それかマクロかビルダー作るか
433デフォルトの名無しさん
2020/04/23(木) 19:29:00.20ID:WjWrG05V トレイトって機能を追加するときどういう機能であるかの特徴を一見して分かりやすくするためだけのもの?
434デフォルトの名無しさん
2020/04/23(木) 20:53:30.42ID:87GHMCpD 振る舞いや
435デフォルトの名無しさん
2020/04/23(木) 22:36:03.84ID:5udoMUF9436デフォルトの名無しさん
2020/04/25(土) 02:58:36.79ID:FXjmUrQ8 これライフタイム記述を省略できないのなんで? https://git.io/JfL6t
437デフォルトの名無しさん
2020/04/25(土) 21:29:12.23ID:2AkpFzKs 省略してコンパイラ通るけどstableは無理なん?
438デフォルトの名無しさん
2020/04/26(日) 00:34:16.68ID:eoUYVhAX 関数内で同じ一連の処理を複数回実行するときマクロにまとめるのが一般的?それともクロージャ?
他にやりかたある?
https://play.rust-lang.org/?version=stable&mode=debug&edition=2018&gist=30449f979231232b68016cab5cd1fb1e
https://play.rust-lang.org/?version=stable&mode=debug&edition=2018&gist=e5fc7f66785bb3794df19104d5c479ff
他にやりかたある?
https://play.rust-lang.org/?version=stable&mode=debug&edition=2018&gist=30449f979231232b68016cab5cd1fb1e
https://play.rust-lang.org/?version=stable&mode=debug&edition=2018&gist=e5fc7f66785bb3794df19104d5c479ff
439デフォルトの名無しさん
2020/04/26(日) 01:44:31.54ID:bgNhzTiH440デフォルトの名無しさん
2020/04/26(日) 01:49:37.98ID:bgNhzTiH https://play.rust-lang.org/?version=stable&mode=debug&edition=2018&gist=b03bef5cb6f98821032c5fb1cce618a1
441デフォルトの名無しさん
2020/04/26(日) 08:01:37.17ID:eoUYVhAX そのコードは実際に使うコードじゃなくてさあ、変数が何個もあったりすると関数切り出しは引数が地獄になるじゃん
442デフォルトの名無しさん
2020/04/26(日) 11:00:13.57ID:bgNhzTiH その例でマクロかクロージャの二択ならクロージャだけど
>>438のは外側の変数をキャプチャすることで複雑化してるから&tangoを渡すようにする
https://play.rust-lang.org/?version=stable&mode=debug&edition=2018&gist=ec760be4190e2ad4ab21fbea3c84b0ed
そうすると結局クロージャも関数と同じように適切なシグニチャを考える必要があるから
関数化に比べて楽ってことはないんじゃないかと思う
>>438のは外側の変数をキャプチャすることで複雑化してるから&tangoを渡すようにする
https://play.rust-lang.org/?version=stable&mode=debug&edition=2018&gist=ec760be4190e2ad4ab21fbea3c84b0ed
そうすると結局クロージャも関数と同じように適切なシグニチャを考える必要があるから
関数化に比べて楽ってことはないんじゃないかと思う
443デフォルトの名無しさん
2020/04/26(日) 12:20:05.30ID:9haVb0dh Rustの問題集みたいなのってあったりする?
444デフォルトの名無しさん
2020/04/26(日) 12:50:17.90ID:9haVb0dh この連休である程度かけるようになりたい
445デフォルトの名無しさん
2020/04/26(日) 14:52:26.46ID:WcQXqCZk 連休だけでRustかけると思うことが間違ってるよ
446デフォルトの名無しさん
2020/04/26(日) 15:59:36.18ID:bgNhzTiH 公式のGithubにrustlingsっていう簡単な練習問題がある
The Bookを読んだ後に基本文法をおさらいしたい人向け
https://github.com/rust-lang/rustlings
The Bookを読んだ後に基本文法をおさらいしたい人向け
https://github.com/rust-lang/rustlings
447デフォルトの名無しさん
2020/04/26(日) 16:01:54.22ID:9haVb0dh >>446
うおおおおおおサンクス
うおおおおおおサンクス
448デフォルトの名無しさん
2020/04/27(月) 05:09:42.36ID:4dCrlHPD ↓Vecだと動くのに配列にするとコンパイルできないの何で?
https://play.rust-lang.org/?version=stable&mode=debug&edition=2018&gist=6321129e5cc3853ef1421d706e19a136
https://play.rust-lang.org/?version=stable&mode=debug&edition=2018&gist=6321129e5cc3853ef1421d706e19a136
449デフォルトの名無しさん
2020/04/27(月) 06:06:02.00ID:9c9dxgXm 配列にinto_iterしてもmoveされずに参照が返るから
450デフォルトの名無しさん
2020/04/27(月) 09:24:11.80ID:xj40wisa rustいつのまにか蟹のイメージになってるけど、オライリーの影響?それとももっと前から何かあるのかな?
451デフォルトの名無しさん
2020/04/27(月) 09:35:35.74ID:qLbh0tK5 よくしらんけどこれじゃね?
https://rustacean.net/
https://rustacean.net/
452デフォルトの名無しさん
2020/04/27(月) 12:48:32.95ID:vsE9eV5m let mut heap = BinaryHeap::new();
heap.push(10);
heap.push(9);
heap.push(20);
for x in &heap {
println!("{:?}", x);
}
これでバイナリヒープすると
20
9
10
ってなるんだけどバグ?
heap.push(10);
heap.push(9);
heap.push(20);
for x in &heap {
println!("{:?}", x);
}
これでバイナリヒープすると
20
9
10
ってなるんだけどバグ?
453デフォルトの名無しさん
2020/04/27(月) 12:51:07.20ID:On5R6UtW >>448
配列のIntoIteratorは
&[T; N]と&mut [T; N]に対して実装されてるが[T; N]に対しては実装されてないのでmove不可
対してVecのIntoIteratorは
&Vec<T>と&mut Vec<T>だけでなくVec<T>に対しても実装されてるので
moveが必要なコンテキストならIntoIterator for Vec<T>が選択されmove可能
配列のIntoIteratorは
&[T; N]と&mut [T; N]に対して実装されてるが[T; N]に対しては実装されてないのでmove不可
対してVecのIntoIteratorは
&Vec<T>と&mut Vec<T>だけでなくVec<T>に対しても実装されてるので
moveが必要なコンテキストならIntoIterator for Vec<T>が選択されmove可能
454デフォルトの名無しさん
2020/04/27(月) 12:53:27.20ID:ucpPL8Eb >>452
ドキュメントに書いてある通り、iterは適当な順序で出てくるので仕様。
https://doc.rust-lang.org/std/collections/struct.BinaryHeap.html
ドキュメントに書いてある通り、iterは適当な順序で出てくるので仕様。
https://doc.rust-lang.org/std/collections/struct.BinaryHeap.html
455デフォルトの名無しさん
2020/04/27(月) 13:16:59.92ID:On5R6UtW >>448
配列でやりたい場合はFooにClone実装してfoo.clone()
https://play.rust-lang.org/?version=stable&mode=debug&edition=2018&gist=8fdb065f764ac7a0be3a3de161bfa984
配列でやりたい場合はFooにClone実装してfoo.clone()
https://play.rust-lang.org/?version=stable&mode=debug&edition=2018&gist=8fdb065f764ac7a0be3a3de161bfa984
456デフォルトの名無しさん
2020/04/27(月) 14:12:45.55ID:ZRv/ULjO 学術の巨大掲示板群 - アルファ・ラボ
ttp://x0000.net
数学 物理学 化学 生物学 天文学 地理地学
IT 電子 工学 言語学 国語 方言 など
PS 連続と離散を統一した!
ttp://x0000.net/topic.aspx?id=3709-0
ttp://x0000.net
数学 物理学 化学 生物学 天文学 地理地学
IT 電子 工学 言語学 国語 方言 など
PS 連続と離散を統一した!
ttp://x0000.net/topic.aspx?id=3709-0
457デフォルトの名無しさん
2020/04/27(月) 15:43:57.57ID:vsE9eV5m >>454
thx 見逃してた
thx 見逃してた
458デフォルトの名無しさん
2020/04/27(月) 17:58:08.76ID:4dCrlHPD 配列のIntoIteratorにmoveが実装されてないの何で?
459デフォルトの名無しさん
2020/04/27(月) 18:30:46.65ID:On5R6UtW >>458
詳しいことはよくわからないけど実装が難しかったみたいよ
興味あればこのissue読んでみて
https://github.com/rust-lang/rust/issues/25725
nightly使えばmoveできる機能はあるみたい
https://play.rust-lang.org/?version=nightly&mode=debug&edition=2018&gist=6a22ab054f5ec52ea942a1186710a516
詳しいことはよくわからないけど実装が難しかったみたいよ
興味あればこのissue読んでみて
https://github.com/rust-lang/rust/issues/25725
nightly使えばmoveできる機能はあるみたい
https://play.rust-lang.org/?version=nightly&mode=debug&edition=2018&gist=6a22ab054f5ec52ea942a1186710a516
460デフォルトの名無しさん
2020/04/27(月) 22:17:40.40ID:e7WQ8CRR >>457
型制約見ればええんやで。
`pub fn iter(&self) -> Iter<T>`は`impl<T> BinaryHeap<T>`。
`impl<T> BinaryHeap<T> where T: Ord,` に`pub fn into_sorted_vec(self) -> Vec<T>`てあるやろ。
rustのOrdは全順序や!
型制約見ればええんやで。
`pub fn iter(&self) -> Iter<T>`は`impl<T> BinaryHeap<T>`。
`impl<T> BinaryHeap<T> where T: Ord,` に`pub fn into_sorted_vec(self) -> Vec<T>`てあるやろ。
rustのOrdは全順序や!
461デフォルトの名無しさん
2020/04/28(火) 01:18:27.68ID:barKq4nx この場合はifを使うのとmatchを使うのとどっちがおすすめ?
if nanika_shori().filter(hoshiimonokana).is_some() {
hoge();
mitsukatta();
} else {
fuga();
mitsukaranakatta();
}
match nanika_shori() {
Some(butsu) if hoshiimonokana(butsu) => {
hoge();
mitsukatta();
}
_ => {
fuga();
mitsukaranakatta();
}
}
if nanika_shori().filter(hoshiimonokana).is_some() {
hoge();
mitsukatta();
} else {
fuga();
mitsukaranakatta();
}
match nanika_shori() {
Some(butsu) if hoshiimonokana(butsu) => {
hoge();
mitsukatta();
}
_ => {
fuga();
mitsukaranakatta();
}
}
462デフォルトの名無しさん
2020/04/28(火) 01:37:40.02ID:aaB86vh6463デフォルトの名無しさん
2020/04/28(火) 02:09:21.04ID:nfkWT3p7 テレワーク中なのか連休入ったせいなのか知らんけど猛者が全部回答してくれるから助かるわ
464デフォルトの名無しさん
2020/04/28(火) 07:51:49.83ID:SJTliuFD >>461
前者
前者
465デフォルトの名無しさん
2020/04/28(火) 11:46:15.82ID:nnss28av >>461
match nanika_shori().filter(hoshiimonokana) {
Some(x) => {…},
None => {…}
}
か
if let Some(x) = nanika_shori().filter(hoshiimononanoka) {…} else {…}
か
boolを返す関数作ってif else
fn are_aruka(hoshiimono: Hoge) -> bool {
match nanika_shori() {
Some(x) if x == hoshiimono => true,
_ => false
}
}
match nanika_shori().filter(hoshiimonokana) {
Some(x) => {…},
None => {…}
}
か
if let Some(x) = nanika_shori().filter(hoshiimononanoka) {…} else {…}
か
boolを返す関数作ってif else
fn are_aruka(hoshiimono: Hoge) -> bool {
match nanika_shori() {
Some(x) if x == hoshiimono => true,
_ => false
}
}
466デフォルトの名無しさん
2020/04/28(火) 12:32:50.40ID:GQyYGa/W filter(...).is_some()
って形はかなり読みにくい
ようは設計が悪い
って形はかなり読みにくい
ようは設計が悪い
467デフォルトの名無しさん
2020/04/29(水) 02:11:05.39ID:mpM8GrXg ResultやOptionが複数ネストしたやつをイイカンジにmapとかやれるか
468デフォルトの名無しさん
2020/04/29(水) 18:51:17.07ID:F+b7zcTP flatMap 的な?
469デフォルトの名無しさん
2020/04/29(水) 20:08:03.11ID:lsvcqJYy Rustやる前に軽くScalaとかHaskellやっとけば
コレクションライブラリ見たときに「あっ、これ進研ゼミでやったところだ!」って
なるから理解が早いよ
コレクションライブラリ見たときに「あっ、これ進研ゼミでやったところだ!」って
なるから理解が早いよ
470デフォルトの名無しさん
2020/04/29(水) 23:56:45.59ID:VSyDHJCJ ゼミ講習の変態度が高過ぎるわ
471デフォルトの名無しさん
2020/04/30(木) 05:16:29.11ID:yR2jzUGm このコードがコンパイル通って実行できて期待した実行結果にならない
https://play.rust-lang.org/?version=stable&mode=debug&edition=2018&gist=4472067bedcd681b8154620b3023f278
https://play.rust-lang.org/?version=stable&mode=debug&edition=2018&gist=4472067bedcd681b8154620b3023f278
472デフォルトの名無しさん
2020/04/30(木) 11:08:02.17ID:aC6sOq5z >>471
警告を消しなよ
警告を消しなよ
473デフォルトの名無しさん
2020/05/01(金) 05:37:23.81ID:+OCTqmPQ HashMapでキーを参照にしたときキーがアドレス値にならないのなんで?
https://play.rust-lang.org/?version=stable&mode=debug&edition=2018&gist=9f33505748c782a7b5a2cd22481e5b68
https://play.rust-lang.org/?version=stable&mode=debug&edition=2018&gist=9f33505748c782a7b5a2cd22481e5b68
474デフォルトの名無しさん
2020/05/01(金) 09:19:46.17ID:xXuuls7c >>473
&strのEqはアドレス比較じゃないから
&strのEqはアドレス比較じゃないから
475デフォルトの名無しさん
2020/05/01(金) 10:58:05.97ID:gc2qK0CV476デフォルトの名無しさん
2020/05/01(金) 12:59:00.58ID:wrmDV0oq Rustは、Releaseモードでも、Runtimeをstatic linkする場合は、61MB、
dynamic linkする場合は、8.2MBになるらしい。
dynamic linkで、さらにサイズ重視最適化した場合、4.6MB、strip した場合、
3.1MBになる。
でも、C++に変わる言語を標榜するにしては大きすぎる。
https://www.quora.com/Why-are-the-Rust-and-Go-binaries-so-large-compared-to-C-or-Pascal
dynamic linkする場合は、8.2MBになるらしい。
dynamic linkで、さらにサイズ重視最適化した場合、4.6MB、strip した場合、
3.1MBになる。
でも、C++に変わる言語を標榜するにしては大きすぎる。
https://www.quora.com/Why-are-the-Rust-and-Go-binaries-so-large-compared-to-C-or-Pascal
477デフォルトの名無しさん
2020/05/01(金) 13:58:13.26ID:xXuuls7c >>476
>Rustは、Releaseモードでも、Runtimeをstatic linkする場合は、61MB、
>dynamic linkする場合は、8.2MBになるらしい。
Debugモードが61MB
Releaseモード(デフォルト設定)が8.2MB って書いてるよ
それにlinkするのはRuntimeではない
もう少しちゃんと読もう
>Rustは、Releaseモードでも、Runtimeをstatic linkする場合は、61MB、
>dynamic linkする場合は、8.2MBになるらしい。
Debugモードが61MB
Releaseモード(デフォルト設定)が8.2MB って書いてるよ
それにlinkするのはRuntimeではない
もう少しちゃんと読もう
478デフォルトの名無しさん
2020/05/01(金) 13:58:40.83ID:i4mzH/oB479デフォルトの名無しさん
2020/05/01(金) 20:43:43.74ID:suCtdez/480デフォルトの名無しさん
2020/05/01(金) 21:17:00.16ID:iuGoF6Kh https://lifthrasiir.github.io/rustlog/why-is-a-rust-executable-large.html
これとかは結構限界まで削ってる感じかな。ちょっと古いけど。
あと
https://github.com/johnthagen/min-sized-rust/blob/master/README.md
にサイズ最適化したいときのやり方一覧がある。
これとかは結構限界まで削ってる感じかな。ちょっと古いけど。
あと
https://github.com/johnthagen/min-sized-rust/blob/master/README.md
にサイズ最適化したいときのやり方一覧がある。
481デフォルトの名無しさん
2020/05/02(土) 00:00:07.90ID:rieFiUeI release profileでもデバッグシンボル含めてるからprofileオプション安定化までお預けかな。
482デフォルトの名無しさん
2020/05/02(土) 01:05:23.19ID:RJOTvgjs アイデアありませんか?
https://play.rust-lang.org/?version=stable&mode=debug&edition=2018&gist=88804aace268a5d6adbdf8a8e4423fe4
https://play.rust-lang.org/?version=stable&mode=debug&edition=2018&gist=88804aace268a5d6adbdf8a8e4423fe4
483デフォルトの名無しさん
2020/05/02(土) 02:00:10.73ID:HIdampCl scanでどうでしょ
https://play.rust-lang.org/?version=stable&mode=debug&edition=2018&gist=0092b046fa5b3fa9f1aba90d35a93f4a
https://play.rust-lang.org/?version=stable&mode=debug&edition=2018&gist=0092b046fa5b3fa9f1aba90d35a93f4a
484デフォルトの名無しさん
2020/05/02(土) 10:05:59.92ID:8Sc54whm お前らおっぱいだって大きいほうが好きなくせに何バイナリのファイルサイズが大きめだからって文句言ってるんだよ
485デフォルトの名無しさん
2020/05/02(土) 10:07:50.85ID:aaZCC6Sm 貧乳が至高
これだけは譲れない
これだけは譲れない
486デフォルトの名無しさん
2020/05/02(土) 11:59:56.20ID:UBE5VHp1 バイナリサイズの話題ってずーっと昔に出てたよな
ここで出たのかどこで見たのか忘れたけど
Why are Rust executables so huge?
https://stackoverflow.com/questions/29008127
これかなぁ?
ここで出たのかどこで見たのか忘れたけど
Why are Rust executables so huge?
https://stackoverflow.com/questions/29008127
これかなぁ?
487デフォルトの名無しさん
2020/05/02(土) 12:05:15.40ID:UBE5VHp1488デフォルトの名無しさん
2020/05/02(土) 15:10:30.93ID:f7vdsp57 let hoge = match s {
"hage" => hage,
"moge"=> moge, // 何かの関数や構造体を返そうとしたがhogeは一意の型しか受け取らないから無理
_=> return
}
loop {
hoge()
}
的な事やろうと色々試したけど、超絶複雑な事になってヤバい匂いしかしない。
ループの外でループ内で呼ぶ関数の分岐を書くのは何かのアンチパターンなのか
そもそも、ループの中でMatch書いても外からイミュータブルな値を渡すの分かってるなら
コンパイラが最適化してループ毎に分岐なんてしないから普通に入れて書けば良い?
"hage" => hage,
"moge"=> moge, // 何かの関数や構造体を返そうとしたがhogeは一意の型しか受け取らないから無理
_=> return
}
loop {
hoge()
}
的な事やろうと色々試したけど、超絶複雑な事になってヤバい匂いしかしない。
ループの外でループ内で呼ぶ関数の分岐を書くのは何かのアンチパターンなのか
そもそも、ループの中でMatch書いても外からイミュータブルな値を渡すの分かってるなら
コンパイラが最適化してループ毎に分岐なんてしないから普通に入れて書けば良い?
489デフォルトの名無しさん
2020/05/02(土) 16:28:13.09ID:0Y98m9EQ >>482
inclusiveなtake_untilは標準では無いみたいだから自分で作るかcrate探すかになるっぽい
https://play.rust-lang.org/?version=stable&mode=debug&edition=2018&gist=b74ec6655adc38e1e790a35485eee01c
https://github.com/rust-lang/rust/issues/62208
既存Traitを拡張するのはめんどくさいから
自分ならイテレータを受け取ってイテレータを返す関数で我慢する
inclusiveなtake_untilは標準では無いみたいだから自分で作るかcrate探すかになるっぽい
https://play.rust-lang.org/?version=stable&mode=debug&edition=2018&gist=b74ec6655adc38e1e790a35485eee01c
https://github.com/rust-lang/rust/issues/62208
既存Traitを拡張するのはめんどくさいから
自分ならイテレータを受け取ってイテレータを返す関数で我慢する
490デフォルトの名無しさん
2020/05/02(土) 16:54:44.18ID:4YXjnjKT491デフォルトの名無しさん
2020/05/02(土) 16:58:06.87ID:4YXjnjKT あるいはFnとかにして型を揃えれば
loop内の分岐はなくなるかな。
たださっきも書いた通り分岐をなくすことに
それほど意味があるとも思えない。
loop内の分岐はなくなるかな。
たださっきも書いた通り分岐をなくすことに
それほど意味があるとも思えない。
492デフォルトの名無しさん
2020/05/03(日) 03:41:22.86ID:HKq7AyzP こういうパターンマッチの使い方ってマイナー?保守性が悪い?
https://play.rust-lang.org/?version=stable&mode=debug&edition=2018&gist=29945c6422cbc643197b73631691211b
https://play.rust-lang.org/?version=stable&mode=debug&edition=2018&gist=29945c6422cbc643197b73631691211b
■ このスレッドは過去ログ倉庫に格納されています
ニュース
- 高市首相答弁を“引き出した”立民・岡田克也氏が改めて説明「なぜ慎重な答弁をされなかったのか。非常に残念に思っている」 ★9 [ぐれ★]
- 【野球】大谷翔平、佐々木朗希、山本由伸らがWBC辞退なら広がる不協和音… 『過去イチ盛り上がらない大会』になる可能性も★2 [冬月記者★]
- 【国際】ロシアはすでに戦争準備段階――ポーランド軍トップが警告 ★2 [ぐれ★]
- 【news23】小川彩佳アナ「ここまでの広がりになるということを、高市総理はどれだけ想像できていたんでしょうね」 日中問題特集で [冬月記者★]
- 「町中華」の“息切れ倒産”が増加 ブームにも支えられ職人技で踏ん張ってきたが… 大手チェーンは値上げでも絶好調 [ぐれ★]
- 毛寧(もう・ねい)報道官「中国に日本の水産品の市場は無い」 高市首相の国会答弁に「中国民衆の強い怒り」 ★2 [ぐれ★]
- 犯罪者たち「刑事罰受けて罪は償った!被害者への賠償金?もう反省済みだから一円も払わねーよばーかwww」 [177178129]
- 【高市トイレ】 15億5000万円「黄金の便器」 落札される [485983549]
- ㊗157円 [194819832]
- __CIA・FBI向け保険会社、中国に買収され危機、米国は売却を取り消し、トランプ政権下で外国資本規制の強化へ [827565401]
- ちょwwwwwwwwwwwwwwお前ら「論破力」って書き込んでみろwwwwwwwwwwwwwwwwwwwwwwwwwwwwww
- 【疑問】国政選挙義務投票制議論ってなんで無いの?
