公式
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を学びたい人はまず最初に公式のThe Bookを読むこと
https://doc.rust-lang.org/book/
※Rustを学ぶ際に犯しがちな12の過ち
https://dystroy.org/blog/how-not-to-learn-rust
※Rustのasyncについて知りたければ「async-book」は必読
https://rust-lang.github.io/async-book/
※C++との比較は専用スレへ
C++ vs Rust
https://mevius.5ch.net/test/read.cgi/tech/1619219089/
※次スレは原則>>980が立てること
前スレ
Rust part14
https://mevius.5ch.net/test/read.cgi/tech/1644596656/
Rust part15
■ このスレッドは過去ログ倉庫に格納されています
2022/05/12(木) 18:28:20.99ID:cuIcFT6k
304デフォルトの名無しさん
2022/05/23(月) 21:10:50.44ID:aUQlcplw305デフォルトの名無しさん
2022/05/23(月) 21:18:12.89ID:gtDJ5U8B https://www.reddit.com/r/rust/comments/3wubj0/comment/cxzlvt4/
num_traitsによるジェネリクスは絶対の正解ではないから適当なところで諦めようね
num_traitsによるジェネリクスは絶対の正解ではないから適当なところで諦めようね
306デフォルトの名無しさん
2022/05/23(月) 21:23:42.08ID:iRCkPDCQ307デフォルトの名無しさん
2022/05/23(月) 21:33:03.23ID:9psioJ1p >>296
コピーもmoveも同じでそれがボトルネックかどうかが重要
数値プリミティブの場合はコピーを他の方法に変えたところでボトルネックが解消されることはまずないから気にする必要はない
BigUint前提ならVecと同じでmoveやクローンやのオーバーヘッドはそれなりに気にした方がいい
逆に現実的にはオーバーフロー考慮する必要がなくなるからCheckedAddが余計なオーバーヘッドになる
特性の違う物をジェネリック等でまとめたほうがいい場面なのかそれぞれ別の実装を用意したほうがいい場面なのか判断できることが大事
コピーもmoveも同じでそれがボトルネックかどうかが重要
数値プリミティブの場合はコピーを他の方法に変えたところでボトルネックが解消されることはまずないから気にする必要はない
BigUint前提ならVecと同じでmoveやクローンやのオーバーヘッドはそれなりに気にした方がいい
逆に現実的にはオーバーフロー考慮する必要がなくなるからCheckedAddが余計なオーバーヘッドになる
特性の違う物をジェネリック等でまとめたほうがいい場面なのかそれぞれ別の実装を用意したほうがいい場面なのか判断できることが大事
308デフォルトの名無しさん
2022/05/23(月) 21:43:43.53ID:Ayvhc9bp >>307
それは間違ってるぜ
BigUintのchecked_add()は常にSomeを返すためにチェックとSomeは消えてオーバーヘッドとならない
さらにRustのジェネリックは各型にmonomorphizationされるためジェネリックで書いてもプリミティブ型やBigUint型のコードはそれぞれに最適化される
それは間違ってるぜ
BigUintのchecked_add()は常にSomeを返すためにチェックとSomeは消えてオーバーヘッドとならない
さらにRustのジェネリックは各型にmonomorphizationされるためジェネリックで書いてもプリミティブ型やBigUint型のコードはそれぞれに最適化される
309デフォルトの名無しさん
2022/05/23(月) 22:04:52.01ID:gtDJ5U8B ヒント:
Ratio<T> where T: Integer + Clone + CheckedAdd + CheckedMulは>>295の条件を満たす
Ratio<T> where T: Integer + Clone + CheckedAdd + CheckedMulは>>295の条件を満たす
310デフォルトの名無しさん
2022/05/23(月) 22:25:54.83ID:xQdLaNrd fibonacci_iter::<Ratio<u8>>()すると
ちゃんと最後233で止まるのね
ジェネリック凄い
ちゃんと最後233で止まるのね
ジェネリック凄い
311デフォルトの名無しさん
2022/05/23(月) 22:34:47.31ID:gtDJ5U8B ククク……RatioのCheckedAddの実装を見ても果たして同じことが言えるかな
312デフォルトの名無しさん
2022/05/23(月) 22:37:22.49ID:HY9DKb05 汚染が始まった!
313デフォルトの名無しさん
2022/05/23(月) 22:55:06.68ID:GQTw0VDg >>311
たしかにRatioの実装が悪いな
まずAddと同様に
if self.denom == rhs.denom {の分岐をし
そして1の場合は
self.numberとrhs.numberでchecke_addするくらいはしないとな
たしかにRatioの実装が悪いな
まずAddと同様に
if self.denom == rhs.denom {の分岐をし
そして1の場合は
self.numberとrhs.numberでchecke_addするくらいはしないとな
314デフォルトの名無しさん
2022/05/23(月) 23:14:26.50ID:bbzZFnmN ジェネリックに書いてもRatio専用コードを書いても
どちらもRatioの実装を使わざるをえないのだから同じ結果となる
そしてRatio専用コードを書こうとしても外部からは工夫のしようがないため
ジェネリックからコンパイル時にモノモーフィゼーションされるコードと全く同じになる
どちらもRatioの実装を使わざるをえないのだから同じ結果となる
そしてRatio専用コードを書こうとしても外部からは工夫のしようがないため
ジェネリックからコンパイル時にモノモーフィゼーションされるコードと全く同じになる
315デフォルトの名無しさん
2022/05/23(月) 23:46:45.42ID:lhQpV8J5 このスレごちゃごちゃした書き込み多すぎ
316デフォルトの名無しさん
2022/05/24(火) 00:53:51.91ID:PPYrRT7r 各型を個別に確認しないと良いか悪いか判断できないならジェネリックにしちゃだめでしょ
317デフォルトの名無しさん
2022/05/24(火) 01:46:13.03ID:Y7WsYtba318デフォルトの名無しさん
2022/05/24(火) 07:59:54.71ID:fUfb5k5z >>307
>特性の違う物をジェネリック等でまとめたほうがいい場面なのかそれぞれ別の実装を用意したほうがいい場面なのか判断できることが大事
禿同だわ
コードパズルやってるやつにいつも感じる違和感の原因はこれだな
こういう能力って何て言うんだろ?
>特性の違う物をジェネリック等でまとめたほうがいい場面なのかそれぞれ別の実装を用意したほうがいい場面なのか判断できることが大事
禿同だわ
コードパズルやってるやつにいつも感じる違和感の原因はこれだな
こういう能力って何て言うんだろ?
319デフォルトの名無しさん
2022/05/24(火) 08:06:11.71ID:eTAydD0N320デフォルトの名無しさん
2022/05/24(火) 08:45:23.72ID:ie6AbIfB 男の人って気持ち悪い…
どうして少女をそんなに汚したがるの?
お母さんに悪いとわおもわないの?
どうして少女をそんなに汚したがるの?
お母さんに悪いとわおもわないの?
321デフォルトの名無しさん
2022/05/24(火) 08:52:13.15ID:anVhILE8322デフォルトの名無しさん
2022/05/24(火) 11:37:27.58ID:0VHIsXBI KISS原則だろ
323デフォルトの名無しさん
2022/05/24(火) 19:12:35.28ID:VR6742Ui324デフォルトの名無しさん
2022/05/24(火) 22:16:43.51ID:oAG0OLUi prev, currの状態管理だとcurrの値をprevに代入するのと戻り値として使うのと2箇所に必要になるからね
curr, nextで管理すればいい
curr, nextで管理すればいい
325デフォルトの名無しさん
2022/05/24(火) 22:24:27.19ID:LZzc/1GO326デフォルトの名無しさん
2022/05/24(火) 23:52:58.32ID:m/W944BH フィボナッチ数のような単純な問題でもプログラミングセンスに差が出るものなんだな
327デフォルトの名無しさん
2022/05/25(水) 09:34:10.65ID:veJPShsI328デフォルトの名無しさん
2022/05/25(水) 13:26:51.10ID:4b57184O Webシステム中心ならRustとRails どっちを中心に勉強すればいい?
どうせ仕事で使うのPHPとjsだけど
どうせ仕事で使うのPHPとjsだけど
329デフォルトの名無しさん
2022/05/25(水) 13:32:36.84ID:pqSOGvoX RustでETみたいなのって書けるん?
てかテンプレートはC++みたいに汎用性高いの?
それともC#みたいに適用範囲絞ってる?
てかテンプレートはC++みたいに汎用性高いの?
それともC#みたいに適用範囲絞ってる?
330はちみつ餃子 ◆8X2XSCHEME
2022/05/25(水) 13:40:48.57ID:9QZiEKx+ >>329
C++ で言うところのテンプレートは Rust には無いよ。 ジェネリクスは ML 風の型システムでやってる。
マクロは Lisp 風と言えると思うけどトークンが型付けされてるから Template Haskell とかのほうが近いかもしれない。
C++ で言うところのテンプレートは Rust には無いよ。 ジェネリクスは ML 風の型システムでやってる。
マクロは Lisp 風と言えると思うけどトークンが型付けされてるから Template Haskell とかのほうが近いかもしれない。
331デフォルトの名無しさん
2022/05/25(水) 20:05:45.57ID:G6RbJxKu なんだじゃあRustだめじゃん。
332デフォルトの名無しさん
2022/05/25(水) 20:20:43.79ID:2d7iZvnp >>331
むしろC++のテンプレートよりもRustのの方がほとんどの利用方法で便利かつプログラミングしやすく快適になった
むしろC++のテンプレートよりもRustのの方がほとんどの利用方法で便利かつプログラミングしやすく快適になった
333デフォルトの名無しさん
2022/05/25(水) 20:47:56.26ID:L8VrP5Wq >>331
そうだよ。ダメだから君もRustは使わないほうがいい
そうだよ。ダメだから君もRustは使わないほうがいい
334デフォルトの名無しさん
2022/05/25(水) 21:47:24.60ID:pqSOGvoX 行列クラスを作って
X += A*(B+C)/D
みたいな演算子の多重定義して、すっきり1式で書くことできますか?
X += A*(B+C)/D
みたいな演算子の多重定義して、すっきり1式で書くことできますか?
335デフォルトの名無しさん
2022/05/25(水) 22:02:04.30ID:pqSOGvoX Matrix<Complex> X(2,2 );
Matrix<double> Y(2,2 );
Y << 1., 2.,
3., 5.;
X = (double)(Y^3);
みたいなことrustで書きたい
Matrix<double> Y(2,2 );
Y << 1., 2.,
3., 5.;
X = (double)(Y^3);
みたいなことrustで書きたい
336デフォルトの名無しさん
2022/05/25(水) 22:12:09.13ID:L8VrP5Wq >>335
もちろんできる
こういうのがほしいんでしょ
https://docs.rs/simple-matrix/latest/simple_matrix/
初心者の題材としては適切そうだから、自分で実装してみてはいかがか
もちろんできる
こういうのがほしいんでしょ
https://docs.rs/simple-matrix/latest/simple_matrix/
初心者の題材としては適切そうだから、自分で実装してみてはいかがか
337デフォルトの名無しさん
2022/05/25(水) 22:17:54.75ID:pqSOGvoX スマソ
X=(Complex)Y^3
だた
X=(Complex)Y^3
だた
338デフォルトの名無しさん
2022/05/25(水) 22:26:34.33ID:pqSOGvoX339デフォルトの名無しさん
2022/05/25(水) 22:36:32.50ID:9QZiEKx+ とりあえず一度は the book を読め。
根本的な言語デザインが違うからそこだけ抜き出して詳しい説明なんてできないよ
根本的な言語デザインが違うからそこだけ抜き出して詳しい説明なんてできないよ
340デフォルトの名無しさん
2022/05/26(木) 00:08:48.87ID:U/g7+l0+ rustてこんなコードも許すんだな
fn main() {
println!("Hello, world!");
main();
}
https://play.rust-lang.org/
でやってみるとスタック溢れて死んだけど一応実行できるのねww
fn main() {
println!("Hello, world!");
main();
}
https://play.rust-lang.org/
でやってみるとスタック溢れて死んだけど一応実行できるのねww
341デフォルトの名無しさん
2022/05/26(木) 07:58:26.46ID:a0cw3gsx そんなことで草生やすのはおそらくキミひとり
他の人らは真顔でキミの発言を見守ってるよ
他の人らは真顔でキミの発言を見守ってるよ
342デフォルトの名無しさん
2022/05/26(木) 08:48:32.43ID:8L/oafM1 >>341
いや、そんなふうに思ってるのはキミひとりだから
いや、そんなふうに思ってるのはキミひとりだから
343デフォルトの名無しさん
2022/05/26(木) 09:21:13.14ID:U/g7+l0+ エントリポイントであるmainの停止条件のない再帰が
何のerrorもwarningもなくコンパイルできてしまい、
当然スタックオバフロで停止してしまうなんて間抜けすぎると思ったんだけどね
これが先進言語なのか?ww
何のerrorもwarningもなくコンパイルできてしまい、
当然スタックオバフロで停止してしまうなんて間抜けすぎると思ったんだけどね
これが先進言語なのか?ww
344デフォルトの名無しさん
2022/05/26(木) 09:45:45.88ID:wRvm8KMl >>343
最適化したら、ループに変換されて死ななくなるとか?
最適化したら、ループに変換されて死ななくなるとか?
345デフォルトの名無しさん
2022/05/26(木) 10:23:40.75ID:m4beE+3q Go でやってみたら gopls(Language Server)で infinite recursive call って warning が出た
実行できるけど、
runtime: goroutine stack exceeds 1000000000-byte limit
と表示されて強制終了
実行できるけど、
runtime: goroutine stack exceeds 1000000000-byte limit
と表示されて強制終了
346デフォルトの名無しさん
2022/05/26(木) 10:39:49.31ID:EVCXwRA4 >>343
警告出るよ
https://play.rust-lang.org/?version=stable&mode=debug&edition=2021&gist=2c7c027a6cf5a2e1c065faaad3a63680
warning: function cannot return without recursing
警告出るよ
https://play.rust-lang.org/?version=stable&mode=debug&edition=2021&gist=2c7c027a6cf5a2e1c065faaad3a63680
warning: function cannot return without recursing
347デフォルトの名無しさん
2022/05/26(木) 18:28:21.56ID:MJ/jCOeZ じゃあGoのほうが良いんじゃん。
348デフォルトの名無しさん
2022/05/26(木) 19:07:49.07ID:wwtlTazs そこに気づくとはやはり天才か
349デフォルトの名無しさん
2022/05/26(木) 19:23:40.54ID:0K7pUhl0350デフォルトの名無しさん
2022/05/26(木) 21:03:33.74ID:TOBg/lde 草
351デフォルトの名無しさん
2022/05/26(木) 21:33:44.65ID:F8bskD+f イキッてスタックを増し続ける再帰を書くのは愚か、まともなら限界値でブレイクする、天才と努力家は末尾再帰でスタックを増やさない
352デフォルトの名無しさん
2022/05/26(木) 21:43:27.13ID:BmMYHIjm リリースビルドだと最適化されてスタックオーバーフローにならない
loopと同じになる
fn main() {
loop{ println!("Hello, world!"); }
}
loopと同じになる
fn main() {
loop{ println!("Hello, world!"); }
}
353デフォルトの名無しさん
2022/05/26(木) 21:45:32.94ID:p077Q+tt あれ?
前にRustは末尾呼び出し最適化はしないって聞いたけど
前にRustは末尾呼び出し最適化はしないって聞いたけど
354デフォルトの名無しさん
2022/05/26(木) 21:53:44.25ID:BmMYHIjm355デフォルトの名無しさん
2022/05/26(木) 22:19:48.49ID:LHrMwKV/ わかりやすい例
確実にスタックが溢れるusize::MAX回の再帰
fn main() {
assert_eq!(usize::MAX, count(usize::MAX));
}
fn count(n: usize) -> usize {
// println!("{:p}", &n);
match n {
0 => 0,
n => 1 + count(n - 1),
}
}
①デバッグモードだとスタックオーバフロー
②リリースモードだと溢れずアサートも通る
③リリースモードでもコメントになっているprintlnの//を外すと最適化されなくなるようでスタックオーバフロー
確実にスタックが溢れるusize::MAX回の再帰
fn main() {
assert_eq!(usize::MAX, count(usize::MAX));
}
fn count(n: usize) -> usize {
// println!("{:p}", &n);
match n {
0 => 0,
n => 1 + count(n - 1),
}
}
①デバッグモードだとスタックオーバフロー
②リリースモードだと溢れずアサートも通る
③リリースモードでもコメントになっているprintlnの//を外すと最適化されなくなるようでスタックオーバフロー
356デフォルトの名無しさん
2022/05/26(木) 22:41:19.49ID:chFOJ7KS357デフォルトの名無しさん
2022/05/26(木) 23:01:45.92ID:LHrMwKV/358デフォルトの名無しさん
2022/05/26(木) 23:18:51.46ID:LHrMwKV/ ごめん
n表示だけでもあかんわ
ループ化されず溢れる
調査のために、printよりもっと軽くて最適化で消えない操作、何かないかな
n表示だけでもあかんわ
ループ化されず溢れる
調査のために、printよりもっと軽くて最適化で消えない操作、何かないかな
359デフォルトの名無しさん
2022/05/27(金) 10:47:17.91ID:KGTH7nqA360デフォルトの名無しさん
2022/05/27(金) 23:42:23.72ID:QNNDwom0 traitでasync fnなメソッドを宣言してはいけない理由を教えてください
361デフォルトの名無しさん
2022/05/28(土) 00:48:37.27ID:1czNjiXi362デフォルトの名無しさん
2022/05/28(土) 18:21:29.07ID:DPDd3/od async fnはsyntax sugarだから例えば以下は同じ
async fn delayed_add(a: i32, b: i32) -> i32 {
sleep(Duration::from_secs(5)).await;
a + b
}
fn delayed_add(a: i32, b: i32) -> impl Future<Output = i32> {
async move {
sleep(Duration::from_secs(5)).await;
a + b
}
}
つまり現在のRustコンパイラではまだimpl Traitを使える場所が限定されているというもっと大きな問題のために今は使えない
GATsなど現在進行中の諸問題が解決すればいずれ使えるようになるはず
async fn delayed_add(a: i32, b: i32) -> i32 {
sleep(Duration::from_secs(5)).await;
a + b
}
fn delayed_add(a: i32, b: i32) -> impl Future<Output = i32> {
async move {
sleep(Duration::from_secs(5)).await;
a + b
}
}
つまり現在のRustコンパイラではまだimpl Traitを使える場所が限定されているというもっと大きな問題のために今は使えない
GATsなど現在進行中の諸問題が解決すればいずれ使えるようになるはず
363デフォルトの名無しさん
2022/05/28(土) 18:34:44.90ID:DPDd3/od 現状の対策方法としてはimpl FutureをdynにしてBox::pinして返す
trait Foo {
fn delayed_add(a: i32, b: i32) -> Pin<Box<dyn Future<Output = i32>>>;
}
impl Foo for () {
fn delayed_add(a: i32, b: i32) -> Pin<Box<dyn Future<Output = i32>>> {
Box::pin(async move {
sleep(Duration::from_secs(5)).await;
a + b
})
}
}
fn main() {
block_on(async {
let x = <() as Foo>::delayed_add(1, 2).await;
println!("x = {x}");
});
}
これでtraitにて非同期関数を使える
trait Foo {
fn delayed_add(a: i32, b: i32) -> Pin<Box<dyn Future<Output = i32>>>;
}
impl Foo for () {
fn delayed_add(a: i32, b: i32) -> Pin<Box<dyn Future<Output = i32>>> {
Box::pin(async move {
sleep(Duration::from_secs(5)).await;
a + b
})
}
}
fn main() {
block_on(async {
let x = <() as Foo>::delayed_add(1, 2).await;
println!("x = {x}");
});
}
これでtraitにて非同期関数を使える
364デフォルトの名無しさん
2022/05/28(土) 18:41:39.92ID:DPDd3/od それを手動で変換するのは面倒かつコードも見にくいので自動変換してくれる#[async_trait]を使えばasync fnと書ける
use async_trait::async_trait;
#[async_trait]
trait Foo {
async fn delayed_add(a: i32, b: i32) -> i32;
}
#[async_trait]
impl Foo for () {
async fn delayed_add(a: i32, b: i32) -> i32 {
sleep(Duration::from_secs(5)).await;
a + b
}
}
use async_trait::async_trait;
#[async_trait]
trait Foo {
async fn delayed_add(a: i32, b: i32) -> i32;
}
#[async_trait]
impl Foo for () {
async fn delayed_add(a: i32, b: i32) -> i32 {
sleep(Duration::from_secs(5)).await;
a + b
}
}
365デフォルトの名無しさん
2022/05/28(土) 19:10:23.06ID:Hw+E7BcY おじさん調査お疲れ様でした。
366デフォルトの名無しさん
2022/05/28(土) 19:23:54.07ID:6Sv+ENTH ・塩野義製薬が週休3日制導入へ 来年4月、副業も解禁
・塩野義製薬が「週休3日」選択可能に 給与は『週休2日の8割』副業や学び直しを支援
・【フォーカス】サタケ/週休3日制 通年導入めざし夏季のみ試行中 交代制で水曜を休日に
・旅館なのに週休3日!?陣屋・若女将の常識を覆した組織改革
・“時代錯誤”から残業ゼロ、週休3日に! 鳥取の不動産会社が
レガシー企業からDX先進企業になれたワケ
・ネクスウェイ、週休4日制・1日3時間勤務選択できる勤務体系を導入
・日本初「週休4日制度」で、優秀な人材を採用するしくみとは? ?
ナレッジソサエティ久田社長に聞いてみた
・塩野義製薬が「週休3日」選択可能に 給与は『週休2日の8割』副業や学び直しを支援
・【フォーカス】サタケ/週休3日制 通年導入めざし夏季のみ試行中 交代制で水曜を休日に
・旅館なのに週休3日!?陣屋・若女将の常識を覆した組織改革
・“時代錯誤”から残業ゼロ、週休3日に! 鳥取の不動産会社が
レガシー企業からDX先進企業になれたワケ
・ネクスウェイ、週休4日制・1日3時間勤務選択できる勤務体系を導入
・日本初「週休4日制度」で、優秀な人材を採用するしくみとは? ?
ナレッジソサエティ久田社長に聞いてみた
367デフォルトの名無しさん
2022/05/28(土) 20:19:11.57ID:NcTZ/5Yj もう借りまっか
368デフォルトの名無しさん
2022/05/28(土) 21:23:09.11ID:sd5VBl3q ジェネレーターはいつstableになりますか
369デフォルトの名無しさん
2022/05/28(土) 23:09:24.03ID:Gdd1cvMp stableを期待しているということは現状の仕様で納得なんだろうけど
resumeの仕方とか値の受け取り方とか軽快じゃなくね?
let mut generator = || {
yield 1;
yield 2;
yield 3;
return "end"
};
assert_eq!(GeneratorState::Yielded(1), Pin::new(&mut generator).resume(()));
assert_eq!(GeneratorState::Yielded(2), Pin::new(&mut generator).resume(()));
assert_eq!(GeneratorState::Yielded(3), Pin::new(&mut generator).resume(()));
assert_eq!(GeneratorState::Complete("end"), Pin::new(&mut generator).resume(()));
例えばresume構文を用意して記述を見やすくするとか
return値は廃止してOption<T>で返しreturn;でNoneにするとか
resumeの仕方とか値の受け取り方とか軽快じゃなくね?
let mut generator = || {
yield 1;
yield 2;
yield 3;
return "end"
};
assert_eq!(GeneratorState::Yielded(1), Pin::new(&mut generator).resume(()));
assert_eq!(GeneratorState::Yielded(2), Pin::new(&mut generator).resume(()));
assert_eq!(GeneratorState::Yielded(3), Pin::new(&mut generator).resume(()));
assert_eq!(GeneratorState::Complete("end"), Pin::new(&mut generator).resume(()));
例えばresume構文を用意して記述を見やすくするとか
return値は廃止してOption<T>で返しreturn;でNoneにするとか
370デフォルトの名無しさん
2022/05/28(土) 23:30:01.77ID:sd5VBl3q 個人的にはIteratorがyield使って実装できるようになれば満足なのでGeneratorそのものの型とかはそんなに気にしてなかった
371デフォルトの名無しさん
2022/05/28(土) 23:58:46.72ID:Gdd1cvMp372デフォルトの名無しさん
2022/05/29(日) 01:25:03.17ID:B9rZUQzM またイテレータの話してる……
373デフォルトの名無しさん
2022/05/29(日) 01:35:28.37ID:crc4m1b3 結局イテレータを作るには構造体か何かを用意してnext()実装するしかないぜ
それが面倒ならfrom_fnやunfoldなどの汎用イテレータ作成関数を使うしかないな
こんな感じか
fn iter_from_generator<G: Generator + Unpin>(mut generator: G) -> impl Iterator<Item = G::Yield> {
iter::from_fn(move || {
match Pin::new(&mut generator).resume(()) {
GeneratorState::Yielded(n) => Some(n),
_ => None,
}
})
}
fn main() {
let one_two_three = || {
yield 1;
yield 2;
yield 3;
};
for n in iter_from_generator(one_two_three) {
println!("{n}");
}
}
それが面倒ならfrom_fnやunfoldなどの汎用イテレータ作成関数を使うしかないな
こんな感じか
fn iter_from_generator<G: Generator + Unpin>(mut generator: G) -> impl Iterator<Item = G::Yield> {
iter::from_fn(move || {
match Pin::new(&mut generator).resume(()) {
GeneratorState::Yielded(n) => Some(n),
_ => None,
}
})
}
fn main() {
let one_two_three = || {
yield 1;
yield 2;
yield 3;
};
for n in iter_from_generator(one_two_three) {
println!("{n}");
}
}
374デフォルトの名無しさん
2022/05/29(日) 10:29:01.34ID:8RN2vwsK 複クンなんですぐここに貼り付けてしまうん?
それお母さんに見てもらうだけでは不満なん?
それお母さんに見てもらうだけでは不満なん?
375デフォルトの名無しさん
2022/05/29(日) 16:18:25.46ID:G8u1ZvmQ すまんが、関数とジェネリックについてわかんないんだけどさ
https://play.rust-lang.org/?version=stable&mode=debug&edition=2021&gist=c548f2825b9f164eeabdd479c4950484
これってなんで動かないん?
https://play.rust-lang.org/?version=stable&mode=debug&edition=2021&gist=c548f2825b9f164eeabdd479c4950484
これってなんで動かないん?
376デフォルトの名無しさん
2022/05/29(日) 16:49:19.09ID:B9rZUQzM377デフォルトの名無しさん
2022/05/29(日) 16:52:27.60ID:oSeq4vhZ378デフォルトの名無しさん
2022/05/29(日) 17:03:06.39ID:G8u1ZvmQ そういうことなのか!ありがとう!
だからサンプルコードみんなTを引数で受け取って戻値Tを返してるのばっかなのか
だからサンプルコードみんなTを引数で受け取って戻値Tを返してるのばっかなのか
379デフォルトの名無しさん
2022/05/29(日) 17:10:58.33ID:+aZOCBrD 「(i64 の) 1 から変換可能な型」という制約を付けるのであればたとえばこんな感じかな。
https://play.rust-lang.org/?version=stable&mode=debug&edition=2021&gist=73e1d04ceeb2c0aff1dae461126dfb6e
https://play.rust-lang.org/?version=stable&mode=debug&edition=2021&gist=73e1d04ceeb2c0aff1dae461126dfb6e
380デフォルトの名無しさん
2022/05/29(日) 18:07:23.25ID:RPMq4FMA >>378
Tを引数に取らずにTを返すことも一般的に可能
その場合もTに何らかのトレイト境界を付けてそのトレイトのメソッドを呼ぶ形で実現する
fn c<T>() -> T {
T { b: 1 }
}
↓修整
fn c<T: Trait1>() -> T {
T::method1()
}
自分を返すmethod1()を持つトレイトTrait1を宣言しておく
trait Trait1 {
fn method1() -> Self;
}
そして型Aに対してそのトレイトを実装すれば動く
impl Trait1 for A {
fn method1() -> Self {
Self { b: 1 }
}
}
もちろんmethod1を引数付きのメソッドにしてもOK
Tを引数に取らずにTを返すことも一般的に可能
その場合もTに何らかのトレイト境界を付けてそのトレイトのメソッドを呼ぶ形で実現する
fn c<T>() -> T {
T { b: 1 }
}
↓修整
fn c<T: Trait1>() -> T {
T::method1()
}
自分を返すmethod1()を持つトレイトTrait1を宣言しておく
trait Trait1 {
fn method1() -> Self;
}
そして型Aに対してそのトレイトを実装すれば動く
impl Trait1 for A {
fn method1() -> Self {
Self { b: 1 }
}
}
もちろんmethod1を引数付きのメソッドにしてもOK
381デフォルトの名無しさん
2022/05/29(日) 18:42:28.03ID:bkDUG0E+382デフォルトの名無しさん
2022/05/29(日) 19:12:40.72ID:X/raLWS5 >>381
Tに依存する箇所のコンパイルを保留してから、実際にT=Aとしてみてインスタンス生成するからね。
https://wandbox.org/permlink/zOH2lP3k2MEPYwsp
conceptで制限はかけられるけど本質は変わらん
https://wandbox.org/permlink/CdKBg61cUgFy2tBs
Tに依存する箇所のコンパイルを保留してから、実際にT=Aとしてみてインスタンス生成するからね。
https://wandbox.org/permlink/zOH2lP3k2MEPYwsp
conceptで制限はかけられるけど本質は変わらん
https://wandbox.org/permlink/CdKBg61cUgFy2tBs
383デフォルトの名無しさん
2022/05/29(日) 19:30:37.85ID:a9qKdJW4 なんだじゃあRustダメじゃん。
384デフォルトの名無しさん
2022/05/29(日) 20:03:03.02ID:vh1lNXiO そうだよ
ダメだからお前はRust使わないほうがいいよ
ダメだからお前はRust使わないほうがいいよ
385デフォルトの名無しさん
2022/05/29(日) 20:16:50.49ID:JtP99XwD386デフォルトの名無しさん
2022/05/29(日) 20:38:31.90ID:ckaCEYgU 未定義動作ではない。
387デフォルトの名無しさん
2022/05/29(日) 20:38:35.33ID:4wBUBbtY 単一の機関が作ってるなら未定義動作なんて生じないんだけどなw
388デフォルトの名無しさん
2022/05/29(日) 20:50:06.03ID:JtP99XwD C++では未初期化部分がある時
そこを利用した全体が未定義動作となる
そこを利用した全体が未定義動作となる
389デフォルトの名無しさん
2022/05/29(日) 21:08:46.86ID:9wc9mAAQ390デフォルトの名無しさん
2022/05/29(日) 21:14:08.45ID:oq8K5mm2 未初期化領域があっても未初期化領域を読み出さなければ未定義動作にはならない
なので後からでも読み出す前にデータを書き込めば合法
なので後からでも読み出す前にデータを書き込めば合法
391デフォルトの名無しさん
2022/05/29(日) 21:23:18.26ID:B9rZUQzM そもそも初期化されます
https://ja.cppreference.com/w/cpp/language/aggregate_initialization
struct A { int x; int y; int z; };
A a{.y = 2, .x = 1}; // エラー、指示子の順序が宣言の順序と一致しません。
A b{.x = 1, .z = 2}; // OK、 b.y は 0 に初期化されます。
https://ja.cppreference.com/w/cpp/language/aggregate_initialization
struct A { int x; int y; int z; };
A a{.y = 2, .x = 1}; // エラー、指示子の順序が宣言の順序と一致しません。
A b{.x = 1, .z = 2}; // OK、 b.y は 0 に初期化されます。
392デフォルトの名無しさん
2022/05/29(日) 23:05:13.03ID:a9qKdJW4 >>385
嘘つき。
嘘つき。
393デフォルトの名無しさん
2022/05/29(日) 23:38:42.10ID:SnN+FeMM Rustのジェネリクスは
型Tに対してトレイト境界を増やせば増やすほど型Tを使って様々なことができるようになっていく
今回のように型Tに対してトレイト境界が何も無ければ任意の型に適用できる代わりにできることが非常に少ない
例えばC++とは異なりRustではデフォルト値で初期化することすら指定なしにはできない
Defaultトレイトをトレイト境界に持ち、さらにそのメソッドを用いてT::default()することで、
初めてようやくデフォルト値で初期化されたT型を得ることができる
これにより「ある型にとってデフォルト値とは何か」「そもそもその型にデフォルト値はあるのか」「デフォルト値が使われるのはいつか」
といった諸問題を全て解決している
C++の複雑なルールと異なりRustでは非常に簡単でわかりやすくなっている
型Tに対してトレイト境界を増やせば増やすほど型Tを使って様々なことができるようになっていく
今回のように型Tに対してトレイト境界が何も無ければ任意の型に適用できる代わりにできることが非常に少ない
例えばC++とは異なりRustではデフォルト値で初期化することすら指定なしにはできない
Defaultトレイトをトレイト境界に持ち、さらにそのメソッドを用いてT::default()することで、
初めてようやくデフォルト値で初期化されたT型を得ることができる
これにより「ある型にとってデフォルト値とは何か」「そもそもその型にデフォルト値はあるのか」「デフォルト値が使われるのはいつか」
といった諸問題を全て解決している
C++の複雑なルールと異なりRustでは非常に簡単でわかりやすくなっている
394デフォルトの名無しさん
2022/05/30(月) 00:14:44.37ID:S6YD6bxt 一方C++erはデフォルトコンストラクタを使ってデフォルト値を定義した
395デフォルトの名無しさん
2022/05/30(月) 00:34:37.40ID:Wa35ZTPi 長いからデフコンって略したほうが良くないっすか?
396デフォルトの名無しさん
2022/05/30(月) 00:37:19.04ID:QyLPQBc1 全てを明瞭シンプルにしたことがRustの勝因
397デフォルトの名無しさん
2022/05/30(月) 00:39:32.57ID:Wa35ZTPi なんだじゃあJavaと一緒じゃん。
398デフォルトの名無しさん
2022/05/30(月) 00:45:18.57ID:L0CO9j2x 明示的に指示されないメンバも初期化されることに気づけなかったのはC++の仕様が複雑すぎるため
僕が悪いのではないことは明らか
僕が悪いのではないことは明らか
399デフォルトの名無しさん
2022/05/30(月) 02:47:26.12ID:ccLFuKy8 Rustは綺麗に整理されてるいるから複雑な個別ルールを覚えなくて済むね
400デフォルトの名無しさん
2022/05/30(月) 08:58:04.28ID:Pjv5EPMb トレイトを増やしすぎて普段は必要ない補完候補が気持ち悪いぐらい出てくる破綻言語
401デフォルトの名無しさん
2022/05/30(月) 09:26:55.13ID:PFXjMGN7 C#は良い言語ですよ
402デフォルトの名無しさん
2022/05/30(月) 18:11:00.15ID:ByAGrxv3 >>400
ほんこれ
ほんこれ
403デフォルトの名無しさん
2022/05/30(月) 18:37:20.51ID:9QWL5Xmb そんなに補完優秀だったっけ?
rust-analyzer?
rust-analyzer?
■ このスレッドは過去ログ倉庫に格納されています
ニュース
- 【速報】中国、水産物輸入停止と通達 「処理水」理由、日本政府へ ★5 [おっさん友の会★]
- 【速報】中国、水産物輸入停止と通達 「処理水」理由、日本政府へ ★6 [おっさん友の会★]
- 高市首相答弁を“引き出した”立民・岡田克也氏が改めて説明「なぜ慎重な答弁をされなかったのか。非常に残念に思っている」 [ぐれ★]
- 中国側が首相答弁の撤回要求、日本側拒否★7 [夜のけいちゃん★]
- NHK会長 新語・流行語大賞ノミネート「オールドメディア」に反論「言われる筋合いはない」「新しいメディアだと思っている」 [muffin★]
- 【速報】 米大使「はっきりさせておこう、米国は尖閣諸島含め日本の防衛に全面コミット、中国がどうしようが変わらない」 [お断り★]
- 【総裁選】記者「進次郎メモ見過ぎ」高市早苗「w」小泉進次郎「責任ある者は適切な慎重さを備えるべき」 [175344491]
- 【速報】高市首相「つい言い過ぎた」 存立危機事態の答弁について [237216734]
- 【悲報】トランプおやびん、高市有事にダンマリ [834922174]
- 【速報】中国、水産物輸入停止★2 [989870298]
- 【高市訃報】ホタテ業者、死亡😇😇😇 [573041775]
- 中国、アメリカ産大豆を早速過去最大の規模でお買い上げ。トランプさん「中国との関係は非常に良好である」【高市悲報】 [709039863]
