公式
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のasyncについて知りたければ「async-book」は必読
https://rust-lang.github.io/async-book/
※C++との比較は専用スレへ
C++ vs Rust
https://mevius.5ch.net/test/read.cgi/tech/1619219089/
前スレ
Rust part11
https://mevius.5ch.net/test/read.cgi/tech/1623857052/
Rust part12
■ このスレッドは過去ログ倉庫に格納されています
2021/08/24(火) 22:55:27.78ID:972JwtmU
131デフォルトの名無しさん
2021/08/27(金) 19:45:18.24ID:+7PBhugx132デフォルトの名無しさん
2021/08/27(金) 19:48:14.38ID:+wfLaYar C++で苦しんできた連中は
Rustのやろうとしたことは分かるし
例え失敗に終わっても責める気にはならん
どうころんでもしょせん死屍累々
Rustは人類の明日への尊い礎になるだけ
Rustのやろうとしたことは分かるし
例え失敗に終わっても責める気にはならん
どうころんでもしょせん死屍累々
Rustは人類の明日への尊い礎になるだけ
133デフォルトの名無しさん
2021/08/27(金) 19:57:25.52ID:2e6D9xTm134デフォルトの名無しさん
2021/08/27(金) 21:00:14.71ID:lzIWzz0k135デフォルトの名無しさん
2021/08/27(金) 21:03:28.03ID:lzIWzz0k 人々の関心の高さは感じるけどな。twitterとか見てると。
136デフォルトの名無しさん
2021/08/27(金) 21:07:48.98ID:lzIWzz0k でもtwitterでは、Pythonも活況だし、KotlinもRustと似たり寄ったりの数、検索される。
なぜかQtやRailsは検索されにくい。Djangoは沢山検索される。
cplusplusは僅かに検索される。C++やC#は直接的にはそもそもtwitterでは検索できない。
Rustの話題性がPythonやKotlinやDjangoと比べて取り立てて多いということではないようだ。
なぜかQtやRailsは検索されにくい。Djangoは沢山検索される。
cplusplusは僅かに検索される。C++やC#は直接的にはそもそもtwitterでは検索できない。
Rustの話題性がPythonやKotlinやDjangoと比べて取り立てて多いということではないようだ。
137デフォルトの名無しさん
2021/08/27(金) 21:44:01.80ID:pUsRfODL The Bookは読まないくせにどうでもいいTwitter検索ばっかりしやがって
あーあのTwitterで独り言つぶやき続けてるひとだっけ?
忘れてた
あーあのTwitterで独り言つぶやき続けてるひとだっけ?
忘れてた
138デフォルトの名無しさん
2021/08/27(金) 21:51:00.96ID:6al70LN5 とにかく仕様が必要ならC++使えばよいのでは。主要メンバーがC++標準理解しているようなすごい人ばかりなんだろう
139デフォルトの名無しさん
2021/08/27(金) 21:58:56.53ID:LFxFkvSL140デフォルトの名無しさん
2021/08/27(金) 22:04:01.75ID:cMIVTei2 実際は、Rails : Laravel = 8:2。
Django は、0
どこの学校・サロンもほぼ、Ruby on Rails
Django は、0
どこの学校・サロンもほぼ、Ruby on Rails
141デフォルトの名無しさん
2021/08/27(金) 23:00:14.26ID:n5qLAlq9 確実にinline展開する方法ってある?
手動で書く?
マクロだとどうにかなる?
手動で書く?
マクロだとどうにかなる?
142デフォルトの名無しさん
2021/08/27(金) 23:01:33.75ID:81/NfoJ7143デフォルトの名無しさん
2021/08/27(金) 23:13:16.52ID:EkQRESx5 #[inline(always)]でも100%ではないんだっけ?
144デフォルトの名無しさん
2021/08/27(金) 23:22:31.27ID:i+fGpSJz >>138
把握してないから必要なときにそれを調べればいいというようなまとまったものが必要なんだよ。
把握してないから必要なときにそれを調べればいいというようなまとまったものが必要なんだよ。
145デフォルトの名無しさん
2021/08/27(金) 23:40:58.77ID:Q0/jYufH Rust以外で高信頼性指向だとAdaとかMISRA Cとか?
146デフォルトの名無しさん
2021/08/27(金) 23:45:38.03ID:8/O2Ek7n >>143
実装はわからんけど、スペック的にはalwaysも飽くまでヒントらしい
実装はわからんけど、スペック的にはalwaysも飽くまでヒントらしい
147デフォルトの名無しさん
2021/08/27(金) 23:52:40.05ID:8/O2Ek7n148デフォルトの名無しさん
2021/08/28(土) 00:02:42.33ID:sJf3n258 ファッション感覚のバカしかアピールしてない言語だわ。
c++理解してない奴がライフタイムをまともに理解できるとも思わん。
それもわからんバカがcをバインディングなんかしたら事故しか起きんわ。
安全性もクソもない。
c++理解してない奴がライフタイムをまともに理解できるとも思わん。
それもわからんバカがcをバインディングなんかしたら事故しか起きんわ。
安全性もクソもない。
149デフォルトの名無しさん
2021/08/28(土) 00:03:44.74ID:7QeSIxjF 組み込み向けRustって1冊本が出たみたいだけど
実際のとこ、見込みありそうなの?
ただのホビー?
実際のとこ、見込みありそうなの?
ただのホビー?
150デフォルトの名無しさん
2021/08/28(土) 00:05:05.86ID:V8MBAFoh >>148
C++ はわかっててもミスるんだってば。
C++ はわかっててもミスるんだってば。
151デフォルトの名無しさん
2021/08/28(土) 01:13:09.37ID:d8vtmqNS C/C++知らないと〜と言う人には型理論知ってる?って聞きたくなる
コンパイルが通れば大体ちゃんと動くようになってるって感覚はhaskellとかOCaml寄りだと思う
コンパイルが通れば大体ちゃんと動くようになってるって感覚はhaskellとかOCaml寄りだと思う
152デフォルトの名無しさん
2021/08/28(土) 01:30:02.36ID:V8MBAFoh Haskell の型システムは好きなんだけど
さすがに副作用 (Haskell 的にはアクションだが……) の扱いがしんどすぎるし
元から C++ には慣れてるので C++ (というか C) 風な文法や意味論と
組み合わせた言語があったらいいなぁと思ってたので
Rust の台頭にはばんじゃーい ∩( ・ω・)∩
さすがに副作用 (Haskell 的にはアクションだが……) の扱いがしんどすぎるし
元から C++ には慣れてるので C++ (というか C) 風な文法や意味論と
組み合わせた言語があったらいいなぁと思ってたので
Rust の台頭にはばんじゃーい ∩( ・ω・)∩
153デフォルトの名無しさん
2021/08/28(土) 01:31:18.92ID:RscIlgzn おまえらスルー力低すぎやろw
154デフォルトの名無しさん
2021/08/28(土) 07:36:29.05ID:sJf3n258155デフォルトの名無しさん
2021/08/28(土) 08:21:08.61ID:t8+wI51G ガファムがファッションでプログラミングしてるとは知らなかった
156デフォルトの名無しさん
2021/08/28(土) 08:46:20.33ID:YWpKrN9v twitterでRustは話題性があるように見えるが、ためしにLISPやSchemeや
Clojure(言語)を検索してみてもRustと似たり寄ったりの書き込みがあった。
Haskelが次代を担う言語だ、的な書き込みすらある。
Clojure(言語)を検索してみてもRustと似たり寄ったりの書き込みがあった。
Haskelが次代を担う言語だ、的な書き込みすらある。
157デフォルトの名無しさん
2021/08/28(土) 09:10:33.46ID:sJf3n258 今のgoogleじゃまともなc++プログラマもだいぶ減ってるわな。。
kumagiとかイキってるだけでまともに理解してねーじゃん。
kumagiとかイキってるだけでまともに理解してねーじゃん。
158デフォルトの名無しさん
2021/08/28(土) 10:14:03.36ID:M1lC0AeK159デフォルトの名無しさん
2021/08/28(土) 11:32:23.88ID:70jgR/1l CG無し
160デフォルトの名無しさん
2021/08/28(土) 11:39:53.86ID:mx2u+dFv 特撮オンリーでいくわけですねわかります
161デフォルトの名無しさん
2021/08/28(土) 11:48:49.70ID:H94428G1 >>145
MISRAに従ってコーディングするの辛いぞ。
MISRAに従ってコーディングするの辛いぞ。
162デフォルトの名無しさん
2021/08/28(土) 12:14:36.47ID:UcVwcAtV >>160
特撮にはCG有るぞ
特撮にはCG有るぞ
163デフォルトの名無しさん
2021/08/28(土) 12:24:36.28ID:WeXzUgff 次のようなloop文のプログラム(可動)を
while文やfor文に書き換えてわかりやすくしたいのですが
上手く値をbreakできないので助けてください
fn main() {
let a = [3, 5, 1, 6, 9, 4];
print_first_even_else_zero(&a);
}
fn print_first_even_else_zero(a: &[i32]) {
let mut i = a.iter();
let even = loop {
if let Some(&n) = i.next() {
if n % 2 == 0 {
break n;
}
} else {
break 0; // not found
}
};
println!("{}", even);
}
例えばwhile文なら let even = while let Some(&n) = i.next() { となりそうで
さらに可能ならfor文で let even = for &n in a { となるかと思うのですが
while文やfor文に書き換えてわかりやすくしたいのですが
上手く値をbreakできないので助けてください
fn main() {
let a = [3, 5, 1, 6, 9, 4];
print_first_even_else_zero(&a);
}
fn print_first_even_else_zero(a: &[i32]) {
let mut i = a.iter();
let even = loop {
if let Some(&n) = i.next() {
if n % 2 == 0 {
break n;
}
} else {
break 0; // not found
}
};
println!("{}", even);
}
例えばwhile文なら let even = while let Some(&n) = i.next() { となりそうで
さらに可能ならfor文で let even = for &n in a { となるかと思うのですが
164デフォルトの名無しさん
2021/08/28(土) 12:44:34.41ID:t8+wI51G let even = a.iter().find(|n| *n % 2 == 0).unwrap_or(&0);
165デフォルトの名無しさん
2021/08/28(土) 13:03:12.27ID:WeXzUgff >>164
当然それはわかりますが、for式やwhile式ではどうなるのか、という質問です
当然それはわかりますが、for式やwhile式ではどうなるのか、という質問です
166デフォルトの名無しさん
2021/08/28(土) 13:07:44.67ID:lHkfX/Au 前スレより
625 デフォルトの名無しさん 2021/08/16(月) 09:44:36.63 ID:MZWGbmHz
loop式はbreakで指定した値を返せるのに
なぜwhile式やfor式は値を返せないの?
Option型にしてbreakで値を指定した時だけSome(値)としてそれ以外はNoneとすれば便利なのに
630 デフォルトの名無しさん sage 2021/08/16(月) 14:32:54.40 ID:ebJKRLr3
手間かけて機能拡張するほどのメリットがないってことだろうね
https://github.com/rust-lang/rfcs/issues/1767#issuecomment-292678002
625 デフォルトの名無しさん 2021/08/16(月) 09:44:36.63 ID:MZWGbmHz
loop式はbreakで指定した値を返せるのに
なぜwhile式やfor式は値を返せないの?
Option型にしてbreakで値を指定した時だけSome(値)としてそれ以外はNoneとすれば便利なのに
630 デフォルトの名無しさん sage 2021/08/16(月) 14:32:54.40 ID:ebJKRLr3
手間かけて機能拡張するほどのメリットがないってことだろうね
https://github.com/rust-lang/rfcs/issues/1767#issuecomment-292678002
167デフォルトの名無しさん
2021/08/28(土) 13:08:21.57ID:t8+wI51G そうでしたかすみません
forとwhileは値を返さないのでご想像のようにはなりません
forとwhileは値を返さないのでご想像のようにはなりません
168デフォルトの名無しさん
2021/08/28(土) 14:07:01.17ID:WeXzUgff >>166
なるほど
そこでの議論を読むと一番の肝が、
「for式が()を返さないと、最後がfor式で終わる関数の返り値で互換性が無くなる」
というところにあるようですが
「break;」が()を返すことにすれば特に問題ないように見えます
実際にloop式で値なしのbreakだと()を返しています
つまり
・「for/while/loop式が返す型」は「break式の型」とする
・「値指定のない『break;』の型」は()とする
・「break式がない場合の型」も()とする
ここまでは現状と同じになりますね
問題はfor/while式はbreakせずともループを抜けるので、値を返すには、
・「『break 値;』があるfor/while式」は「else節を取ってbreak式と同じ型を返す」
という単純ルールだけで済むように見えます
何か見落としがあるでしょうか?
なるほど
そこでの議論を読むと一番の肝が、
「for式が()を返さないと、最後がfor式で終わる関数の返り値で互換性が無くなる」
というところにあるようですが
「break;」が()を返すことにすれば特に問題ないように見えます
実際にloop式で値なしのbreakだと()を返しています
つまり
・「for/while/loop式が返す型」は「break式の型」とする
・「値指定のない『break;』の型」は()とする
・「break式がない場合の型」も()とする
ここまでは現状と同じになりますね
問題はfor/while式はbreakせずともループを抜けるので、値を返すには、
・「『break 値;』があるfor/while式」は「else節を取ってbreak式と同じ型を返す」
という単純ルールだけで済むように見えます
何か見落としがあるでしょうか?
169デフォルトの名無しさん
2021/08/28(土) 14:41:22.43ID:AMsYRDZ6170デフォルトの名無しさん
2021/08/28(土) 15:14:25.46ID:WeXzUgff >>169
なるほどありがとうございます
ところで現状のRustで>>163の例のloop式をfor式で行おうとすると
即時関数を使ってbreakをreturnに置き換えることで
let even = (|| {
for &n in a {
if n % 2 == 0 {
return n;
}
}
0
})();
と実現できることを思いつきましたが
この方法は表記コストはともかく実行コストもかかってしまいますか?
ちなみにこの「最初の偶数を見つけるコード」はあくまでも例として単純化したものを出しているだけで
実際には様々な例でこのパターン(=forやwhileで値を返せると便利)が出てくるので簡略な例題として話をしています
なるほどありがとうございます
ところで現状のRustで>>163の例のloop式をfor式で行おうとすると
即時関数を使ってbreakをreturnに置き換えることで
let even = (|| {
for &n in a {
if n % 2 == 0 {
return n;
}
}
0
})();
と実現できることを思いつきましたが
この方法は表記コストはともかく実行コストもかかってしまいますか?
ちなみにこの「最初の偶数を見つけるコード」はあくまでも例として単純化したものを出しているだけで
実際には様々な例でこのパターン(=forやwhileで値を返せると便利)が出てくるので簡略な例題として話をしています
171デフォルトの名無しさん
2021/08/28(土) 15:30:38.48ID:TLYe8gOd >>168
イテレータのコードのほうが遥かにわかりやすい上に簡潔なので
新しく文法を拡張する価値がないと開発陣は考えてる点を見落としてる。る?
特にPythonの失敗例を鑑みれば機能追加される可能性は限りなくゼロ
イテレータのコードのほうが遥かにわかりやすい上に簡潔なので
新しく文法を拡張する価値がないと開発陣は考えてる点を見落としてる。る?
特にPythonの失敗例を鑑みれば機能追加される可能性は限りなくゼロ
172デフォルトの名無しさん
2021/08/28(土) 15:43:20.61ID:M1lC0AeK173デフォルトの名無しさん
2021/08/28(土) 16:01:24.35ID:Zz3t2OiP Rustに限った話じゃないけど新しめの言語だとイテレータで記述可能な
ループは、出来るだけイテレータで記述するのが主流じゃね
forだのwhileはループ条件の誤りから簡単にバグが生まれるし
使わないで済むならそれに越したことはない
CやCの派生系言語がメインの人には理解しがたいかもしれないが
ループは、出来るだけイテレータで記述するのが主流じゃね
forだのwhileはループ条件の誤りから簡単にバグが生まれるし
使わないで済むならそれに越したことはない
CやCの派生系言語がメインの人には理解しがたいかもしれないが
174デフォルトの名無しさん
2021/08/28(土) 16:07:59.88ID:V8MBAFoh C++ だとテンプレートの組み合わせで回すのも一般的だけど
Go だと凝ったことするよりなんでも愚直にループを回したほうがいいというのは
基本的なスタンスになってるよね。
Go だと凝ったことするよりなんでも愚直にループを回したほうがいいというのは
基本的なスタンスになってるよね。
175デフォルトの名無しさん
2021/08/28(土) 16:18:39.14ID:TLYe8gOd >>172
説得力のある実例を出せば今みたいにRFCが即closeされることはないんじゃない?
状況によってはイテレータを拡張したほうがいいという判断も有り得るし
今のforやwhileループみたいにmutで定義した変数を更新するのでも十分かもしれない
説得力のある実例を出せば今みたいにRFCが即closeされることはないんじゃない?
状況によってはイテレータを拡張したほうがいいという判断も有り得るし
今のforやwhileループみたいにmutで定義した変数を更新するのでも十分かもしれない
176デフォルトの名無しさん
2021/08/28(土) 17:39:28.92ID:WeXzUgff >>173
なるほど
出来るだけイテレータで記述する質問です
コマンドライン引数の数字の和をイテレータでpanicさせずに求める場合
これよりもっと短く出来ないでしょうか?
fn main() -> Result<(), std::num::ParseIntError> {
println!("Sum: {}", std::env::args().skip(1).map(|s| s.parse::<i32>()).collect::<Result<Vec<i32>,_>>()?.iter().sum::<i32>());
Ok(())
}
以下のように正しく実行できているのですがコードが長いのが気になっています
$ cargo run 10 20 30 40 50
Sum: 150
$ cargo run 10 20 XX 40 50
Error: ParseIntError { kind: InvalidDigit }
なるほど
出来るだけイテレータで記述する質問です
コマンドライン引数の数字の和をイテレータでpanicさせずに求める場合
これよりもっと短く出来ないでしょうか?
fn main() -> Result<(), std::num::ParseIntError> {
println!("Sum: {}", std::env::args().skip(1).map(|s| s.parse::<i32>()).collect::<Result<Vec<i32>,_>>()?.iter().sum::<i32>());
Ok(())
}
以下のように正しく実行できているのですがコードが長いのが気になっています
$ cargo run 10 20 30 40 50
Sum: 150
$ cargo run 10 20 XX 40 50
Error: ParseIntError { kind: InvalidDigit }
177デフォルトの名無しさん
2021/08/28(土) 17:58:47.12ID:pl5LALbI そんなに長い?
178デフォルトの名無しさん
2021/08/28(土) 18:59:50.15ID:78cNf6mY twitterで「Rust過激派がルール違反と判断された」
「CやC++のこと書いてた人にRustの話吹っかけて迷惑かけてた怖い人たち」
という話を見たが、誰の事?
どういうことなんだ?
「CやC++のこと書いてた人にRustの話吹っかけて迷惑かけてた怖い人たち」
という話を見たが、誰の事?
どういうことなんだ?
179デフォルトの名無しさん
2021/08/28(土) 19:21:11.03ID:0ROz2KLh >>178
c++テンプレートテクニックの著者のことか?
c++テンプレートテクニックの著者のことか?
180デフォルトの名無しさん
2021/08/28(土) 19:24:41.12ID:0ROz2KLh >>61
int* p1 = malloc(sizeof(int));
int* p2 = malloc(sizeof(int));
int* p3;
if (なんかの条件) p3 = p1; else p3 = p2;
free(p1);
p1 = NULL;
if (なんかの条件) p3 = NULL;
// p2はまだまだ使う
こうすればいいだけの話だろ?ガイジか?
このコードの後 p2またはp3どちらかをfreeしても二重開放にならんよ
このぐらいも考えられないのかガイジは(笑)
int* p1 = malloc(sizeof(int));
int* p2 = malloc(sizeof(int));
int* p3;
if (なんかの条件) p3 = p1; else p3 = p2;
free(p1);
p1 = NULL;
if (なんかの条件) p3 = NULL;
// p2はまだまだ使う
こうすればいいだけの話だろ?ガイジか?
このコードの後 p2またはp3どちらかをfreeしても二重開放にならんよ
このぐらいも考えられないのかガイジは(笑)
181デフォルトの名無しさん
2021/08/28(土) 19:28:28.84ID:LR/RwLxP いちいち差別的な用語を使わないとレスもできないのか
プログラマとしては一流なのかもしれないが、人間としては最低だな
プログラマとしては一流なのかもしれないが、人間としては最低だな
182デフォルトの名無しさん
2021/08/28(土) 20:41:09.02ID:WeXzUgff >>177
このcollectしてから再びiterするところを何とか出来ないものかなと
println!("Sum: {}", std::env::args().skip(1).map(|s| s.parse::<i32>()).collect::<Result<Vec<i32>,_>>()?.iter().sum::<i32>());
イテレータだけを使う限界?
同じことをfor文を使うと短くなってわかりやすくなります
let mut total = 0;
for s in std::env::args().skip(1) {
total += s.parse::<i32>()?;
}
println!("Sum: {}", total);
このcollectしてから再びiterするところを何とか出来ないものかなと
println!("Sum: {}", std::env::args().skip(1).map(|s| s.parse::<i32>()).collect::<Result<Vec<i32>,_>>()?.iter().sum::<i32>());
イテレータだけを使う限界?
同じことをfor文を使うと短くなってわかりやすくなります
let mut total = 0;
for s in std::env::args().skip(1) {
total += s.parse::<i32>()?;
}
println!("Sum: {}", total);
183デフォルトの名無しさん
2021/08/28(土) 21:00:48.99ID:t8+wI51G std::env::args().skip(1).map(|s| s.parse::<i32>()).sum::<Result<i32, _>>()?
184デフォルトの名無しさん
2021/08/28(土) 21:02:35.90ID:TLYe8gOd ParseIntError返しても処理しないんだから
unwrap_or(0)みたいなので十分じゃないの?
fn main() {
let args = std::env::args().skip(1);
let sum: i32 = args.map(|s| s.parse().unwrap_or(0)).sum();
println!("Sum: {}", sum);
}
入力、計算、出力で分けてる
unwrap_or(0)みたいなので十分じゃないの?
fn main() {
let args = std::env::args().skip(1);
let sum: i32 = args.map(|s| s.parse().unwrap_or(0)).sum();
println!("Sum: {}", sum);
}
入力、計算、出力で分けてる
185デフォルトの名無しさん
2021/08/28(土) 21:14:51.79ID:M1lC0AeK186デフォルトの名無しさん
2021/08/28(土) 21:23:19.42ID:AMsYRDZ6 println!("{}", std::env::args().skip().try_fold(|sum, s| Ok(sum + s.parse::<i32>()?))?);
try_fold使うと?演算子の入る場所が変わらずに済むっぽいな
try_fold使うと?演算子の入る場所が変わらずに済むっぽいな
187デフォルトの名無しさん
2021/08/28(土) 21:24:03.32ID:WeXzUgff >>183
なるほど!
sum()もcollect()のように様々な形の集積方法が指定できるのですね
i32整数一覧が入力に来るのにsum::<i32>()とi32型指定をしないと怒られた理由がようやくわかりました
sumとcollect以外にもそういう仕様のメソッドはありますか?
なるほど!
sum()もcollect()のように様々な形の集積方法が指定できるのですね
i32整数一覧が入力に来るのにsum::<i32>()とi32型指定をしないと怒られた理由がようやくわかりました
sumとcollect以外にもそういう仕様のメソッドはありますか?
188デフォルトの名無しさん
2021/08/28(土) 21:34:12.61ID:iw2Y3ERl いちいち固有のiterator使うとか可読性悪くなるだけって場合も多い
189デフォルトの名無しさん
2021/08/28(土) 21:54:20.22ID:WeXzUgff190デフォルトの名無しさん
2021/08/28(土) 22:01:27.46ID:TLYe8gOd >>185
エラーだと示したいなら結果をハンドリングすればいいんじゃないの?
type Result<T> = std::result::Result<T, std::num::ParseIntError>;
fn main() {
let args = std::env::args().skip(1);
let sum: Result<i32> = args.map(|s| s.parse::<i32>()).sum();
match sum {
Ok(sum) => println!("Sum: {}", sum),
Err(e) => println!("Error: {}", e),
};
}
引数ゼロ個とかエラーは1種類じゃまかなえない
ハンドリングしたいならエラー設計がもう少し必要になるだろうね
エラーだと示したいなら結果をハンドリングすればいいんじゃないの?
type Result<T> = std::result::Result<T, std::num::ParseIntError>;
fn main() {
let args = std::env::args().skip(1);
let sum: Result<i32> = args.map(|s| s.parse::<i32>()).sum();
match sum {
Ok(sum) => println!("Sum: {}", sum),
Err(e) => println!("Error: {}", e),
};
}
引数ゼロ個とかエラーは1種類じゃまかなえない
ハンドリングしたいならエラー設計がもう少し必要になるだろうね
191デフォルトの名無しさん
2021/08/28(土) 22:12:53.29ID:M1lC0AeK192デフォルトの名無しさん
2021/08/28(土) 22:34:29.66ID:TLYe8gOd >>191
何をそんなにカリカリしてるんだ?
main()でResult返したいなら別にそれでもいいんじゃない?
fn main() -> Result<()> {
let args = std::env::args().skip(1);
let sum: Result<i32> = args.map(|s| s.parse::<i32>()).sum();
println!("{}", sum?);
Ok(())
}
何をそんなにカリカリしてるんだ?
main()でResult返したいなら別にそれでもいいんじゃない?
fn main() -> Result<()> {
let args = std::env::args().skip(1);
let sum: Result<i32> = args.map(|s| s.parse::<i32>()).sum();
println!("{}", sum?);
Ok(())
}
193デフォルトの名無しさん
2021/08/28(土) 22:53:59.26ID:M1lC0AeK194デフォルトの名無しさん
2021/08/28(土) 23:36:35.98ID:WeXzUgff 今回はargs部分も枝葉末節なので外してまとめ直すと
『数値と思われる文字列の配列が与えられた時に非数値があればエラーを返すとして』
let a = ["1", "3", "5", "7", "9"];
和の場合はmap()でResultのままsum()に渡してResultを返せる
let sum = a.iter().map(|s| s.parse::<i32>()).sum::<Result<i32, _>>()?;
和だけでなく積などもtry_fold()を使えばResultを返せる
let sum = a.iter().try_fold(0, |sum, s| Ok(sum + s.parse::<i32>()?))?;
let mul = a.iter().try_fold(1, |mul, s| Ok(mul * s.parse::<i32>()?))?;
今回はparse()で文字列→数値のResultだけど一般的にResultを返す関数なら応用可能
皆さんありがとうございました
『数値と思われる文字列の配列が与えられた時に非数値があればエラーを返すとして』
let a = ["1", "3", "5", "7", "9"];
和の場合はmap()でResultのままsum()に渡してResultを返せる
let sum = a.iter().map(|s| s.parse::<i32>()).sum::<Result<i32, _>>()?;
和だけでなく積などもtry_fold()を使えばResultを返せる
let sum = a.iter().try_fold(0, |sum, s| Ok(sum + s.parse::<i32>()?))?;
let mul = a.iter().try_fold(1, |mul, s| Ok(mul * s.parse::<i32>()?))?;
今回はparse()で文字列→数値のResultだけど一般的にResultを返す関数なら応用可能
皆さんありがとうございました
195デフォルトの名無しさん
2021/08/29(日) 09:06:24.35ID:CQyaTqyh >>179
指摘している人も、加害者もエピステーメー氏とは全く関係ない人だと思う。
指摘している人も、加害者もエピステーメー氏とは全く関係ない人だと思う。
196デフォルトの名無しさん
2021/08/29(日) 12:05:26.47ID:ehQ9raC/ >>195
えぴすめーてーじゃないほうの共著者のほうでしょ
えぴすめーてーじゃないほうの共著者のほうでしょ
197デフォルトの名無しさん
2021/08/29(日) 13:31:13.01ID:pAl4bTqC ローマ字で takaha... の人のことか。
Ukic...の人も何か言ってるんだけどどういう相関関係なのか。。
Ukic...の人も何か言ってるんだけどどういう相関関係なのか。。
198デフォルトの名無しさん
2021/08/29(日) 17:50:42.33ID:rRIESWs9 対立煽りに乗らないように
199デフォルトの名無しさん
2021/08/29(日) 20:28:38.19ID:TMfqiUgQ >>174
Goは確かにその方針だけど、イテレータというか高階関数を受ける型が総称では無いから.collectや.mapなんて
型ごとに定義しないと使えないから。Go2になってくれば違ってくると思う
一方でPythonだとfunctools.reduceなんかより、リスト内包表記が使われるのは局所性で速度が速いからだけど
ループで書かずにかなり長い表現をこれで書かれると保守しずらい。
Rustでもイテレータを何回も取り出してcollectしたり、foldしたりをドットで繋げられるのはあまり読み易いとは
言えないと思う。普通にiter()を何度も呼ぶのなら、let it = a.iter();して欲しい
Goは確かにその方針だけど、イテレータというか高階関数を受ける型が総称では無いから.collectや.mapなんて
型ごとに定義しないと使えないから。Go2になってくれば違ってくると思う
一方でPythonだとfunctools.reduceなんかより、リスト内包表記が使われるのは局所性で速度が速いからだけど
ループで書かずにかなり長い表現をこれで書かれると保守しずらい。
Rustでもイテレータを何回も取り出してcollectしたり、foldしたりをドットで繋げられるのはあまり読み易いとは
言えないと思う。普通にiter()を何度も呼ぶのなら、let it = a.iter();して欲しい
200デフォルトの名無しさん
2021/08/29(日) 21:26:36.38ID:FKMKprYN そのitは一度しか使えないのでわ
201デフォルトの名無しさん
2021/08/29(日) 21:37:15.37ID:3sJ97RgW collect()したやつに.iter()は確かにやめてほしい
終端操作するなら何か変数に入れた上でやってほしい
終端操作するなら何か変数に入れた上でやってほしい
202デフォルトの名無しさん
2021/08/29(日) 21:56:31.67ID:Y4MENvlF AdapterとConsumerは必ず分けろってこと?
もちろん分けたほうがいい場合もあるだろうけど
別に一緒でもいいと思うんだけどな
もちろん分けたほうがいい場合もあるだろうけど
別に一緒でもいいと思うんだけどな
203デフォルトの名無しさん
2021/08/29(日) 22:06:52.56ID:4xE/eKOX204デフォルトの名無しさん
2021/08/29(日) 22:08:51.10ID:Y4MENvlF 上にあるコードでcollect()した後にiter()してるやつのことか
それなら分かる
それなら分かる
205デフォルトの名無しさん
2021/08/29(日) 22:19:15.00ID:FKMKprYN あぁそういうこと
俺は別に繋がってていいかな
俺は別に繋がってていいかな
206デフォルトの名無しさん
2021/08/29(日) 22:49:50.89ID:4xE/eKOX207デフォルトの名無しさん
2021/08/29(日) 23:12:51.30ID:Y4MENvlF >>206
だからこそcollect()した後にiter()してるコードは改善したほうがいいよって話だろ?
だからこそcollect()した後にiter()してるコードは改善したほうがいいよって話だろ?
208デフォルトの名無しさん
2021/08/29(日) 23:54:47.37ID:6tO3Pyjl 和も積も求めたい時はどうすればいいかな?
文字列から数値への変換を二度するのを避けるとして
一つの方法はこのように一旦collectとして数値のVecを作ってしまう
fn main() -> Result<(), std::num::ParseIntError> {
let input_numbers: Vec<i32> = std::env::args().skip(1).map(|s| s.parse::<i32>()).collect::<Result<_,_>>()?;
println!("和: {}", input_numbers.iter().sum::<i32>());
println!("積: {}", input_numbers.iter().fold(1, |mul, n| mul * n));
Ok(())
}
それともcollectせずにイテレータのままで止めておいて使う?
文字列から数値への変換を二度するのを避けるとして
一つの方法はこのように一旦collectとして数値のVecを作ってしまう
fn main() -> Result<(), std::num::ParseIntError> {
let input_numbers: Vec<i32> = std::env::args().skip(1).map(|s| s.parse::<i32>()).collect::<Result<_,_>>()?;
println!("和: {}", input_numbers.iter().sum::<i32>());
println!("積: {}", input_numbers.iter().fold(1, |mul, n| mul * n));
Ok(())
}
それともcollectせずにイテレータのままで止めておいて使う?
209デフォルトの名無しさん
2021/08/29(日) 23:59:56.40ID:53Xl0cl7 質問者とイライラ君が同一人物のパターン?
210デフォルトの名無しさん
2021/08/30(月) 00:06:07.90ID:gpHI1J3P product()使わないの?
211デフォルトの名無しさん
2021/08/30(月) 00:06:33.11ID:kOjyqHoG >>208
foldで和と差の2要素のタプルをとりまわせば良いだけ
foldで和と差の2要素のタプルをとりまわせば良いだけ
212デフォルトの名無しさん
2021/08/30(月) 00:56:00.83ID:5WtxtfY9 こうかな
println!("和: {}", std::env::args().skip(1).map(|s| s.parse::<i32>()).sum::<Result<i32,_>>()?);
println!("積: {}", std::env::args().skip(1).map(|s| s.parse::<i32>()).product::<Result<i32,_>>()?);
println!("(和,積): {:?}", std::env::args().skip(1).try_fold((0, 1), |(sum, mul), s| { let n = s.parse::<i32>()?; Ok((sum + n, mul * n))})?);
println!("和: {}", std::env::args().skip(1).map(|s| s.parse::<i32>()).sum::<Result<i32,_>>()?);
println!("積: {}", std::env::args().skip(1).map(|s| s.parse::<i32>()).product::<Result<i32,_>>()?);
println!("(和,積): {:?}", std::env::args().skip(1).try_fold((0, 1), |(sum, mul), s| { let n = s.parse::<i32>()?; Ok((sum + n, mul * n))})?);
213デフォルトの名無しさん
2021/08/30(月) 01:17:16.84ID:XeeK64dt >>209
っぽい
っぽい
214デフォルトの名無しさん
2021/08/30(月) 01:45:40.23ID:Fg1XXjYH C++君も
215デフォルトの名無しさん
2021/08/30(月) 05:11:39.37ID:1N5t7Emb この前はNim連呼してた
216デフォルトの名無しさん
2021/08/30(月) 05:23:26.66ID:YLwuWBBL 二重解放NULL荒らしもな
217デフォルトの名無しさん
2021/08/30(月) 08:14:19.28ID:Bz8fsAkW >>209
確かにこんな特徴的な勘違いをするやつが同時に二人出現するわけないわな
確かにこんな特徴的な勘違いをするやつが同時に二人出現するわけないわな
218デフォルトの名無しさん
2021/08/30(月) 08:46:37.85ID:nNe2AEIB じゃあワイはガリガリ君で
219デフォルトの名無しさん
2021/08/30(月) 09:38:42.61ID:j0aQcfY/ >>214
C++ vs Rustスレでやれと何度言っても聞かずにここでイライラしてるよな
C++ vs Rustスレでやれと何度言っても聞かずにここでイライラしてるよな
220デフォルトの名無しさん
2021/08/30(月) 10:38:26.28ID:iy37Frot 上のイテレータ関連の質問に便乗ですが、
二次元vecの各要素をv[i][j]としたときに、
jごとの総和を計算するやつをイテレータできれいに書く方法ありますか?
例えばこういうやつです
let v = vec![vec![0; n]; m];
// (vの各要素を設定)
let mut result = vec![0; n];
for i in 0..m {
for j in 0..n {
result[j] += v[i][j];
}
}
二次元vecの各要素をv[i][j]としたときに、
jごとの総和を計算するやつをイテレータできれいに書く方法ありますか?
例えばこういうやつです
let v = vec![vec![0; n]; m];
// (vの各要素を設定)
let mut result = vec![0; n];
for i in 0..m {
for j in 0..n {
result[j] += v[i][j];
}
}
221デフォルトの名無しさん
2021/08/30(月) 10:46:23.34ID:qTeljjrO >中間変数を使うか否かだけの問題だからどうでもいい話
Rustの場合、ライフタイムとオーナーシップの関係で
中間変数を使うか否かは結構重要な問題だったりする
Rustの場合、ライフタイムとオーナーシップの関係で
中間変数を使うか否かは結構重要な問題だったりする
222デフォルトの名無しさん
2021/08/30(月) 10:56:01.57ID:b2fdtQYv223デフォルトの名無しさん
2021/08/30(月) 12:15:23.57ID:OrMFDzce224デフォルトの名無しさん
2021/08/30(月) 12:35:22.36ID:iy37Frot225デフォルトの名無しさん
2021/08/30(月) 13:18:46.38ID:cyaLRDjw (0..n).map(|j| (0..m).map(|i| v[i][j]).sum()).collect()
2重forをの親子を逆転してイテレータメソッドチェーンに変換しただけという感じ
こんなことよりもっと意味のあることに頭使ったほうがいい
イテレータでとあったから上を書いたが現実にはndarray入れてsum_axis使うのがいいだろう
https://docs.rs/ndarray/0.15.3/ndarray/struct.ArrayBase.html#method.sum_axis
2重forをの親子を逆転してイテレータメソッドチェーンに変換しただけという感じ
こんなことよりもっと意味のあることに頭使ったほうがいい
イテレータでとあったから上を書いたが現実にはndarray入れてsum_axis使うのがいいだろう
https://docs.rs/ndarray/0.15.3/ndarray/struct.ArrayBase.html#method.sum_axis
226デフォルトの名無しさん
2021/08/30(月) 13:30:16.69ID:w/2FJku9 こんなかんじかな
https://play.rust-lang.org/?version=stable&mode=debug&edition=2018&gist=e302c841c8dd709418f923ea1ad07868
https://play.rust-lang.org/?version=stable&mode=debug&edition=2018&gist=e302c841c8dd709418f923ea1ad07868
227デフォルトの名無しさん
2021/08/30(月) 13:33:43.06ID:w/2FJku9 ほぼかぶってたごめん
228デフォルトの名無しさん
2021/08/30(月) 13:38:15.69ID:iy37Frot >>225-226 インデックス自体のイテレータを作るって発想がありませんでした、ありがとうございます
競プロ用ではないしndarray使うのも考えてみます
競プロ用ではないしndarray使うのも考えてみます
229デフォルトの名無しさん
2021/08/30(月) 14:45:34.31ID:07yK3Bti 汎用的には縦横入れ替えのtransposeを作っておけば色んな操作が楽かもね
イテレータ作成はサボってとりあえず関数版
fn transpose<T>(v: &Vec<Vec<T>>) -> Vec<Vec<T>> where T: Copy {
(0..v[0].len()).map(|j| v.into_iter().map(|vv| (*vv)[j]).collect::<Vec<T>>()).collect()
}
fn main() {
let v = vec![vec![1,2,3], vec![4,5,6], vec![7,8,9], vec![10,11,12]];
let w = transpose(&v);
println!("{:?}", v); // [[1, 2, 3], [4, 5, 6], [7, 8, 9], [10, 11, 12]]
println!("{:?}", w); // [[1, 4, 7, 10], [2, 5, 8, 11], [3, 6, 9, 12]]
}
イテレータ作成はサボってとりあえず関数版
fn transpose<T>(v: &Vec<Vec<T>>) -> Vec<Vec<T>> where T: Copy {
(0..v[0].len()).map(|j| v.into_iter().map(|vv| (*vv)[j]).collect::<Vec<T>>()).collect()
}
fn main() {
let v = vec![vec![1,2,3], vec![4,5,6], vec![7,8,9], vec![10,11,12]];
let w = transpose(&v);
println!("{:?}", v); // [[1, 2, 3], [4, 5, 6], [7, 8, 9], [10, 11, 12]]
println!("{:?}", w); // [[1, 4, 7, 10], [2, 5, 8, 11], [3, 6, 9, 12]]
}
230デフォルトの名無しさん
2021/08/30(月) 20:06:03.21ID:kOjyqHoG transposeみたいな関数用意すべきかは配列の要素数次第かなあ
たかだか1度しか読まないデータのためだけに配列全体をコピーするのはもったいないケースはありそう
たかだか1度しか読まないデータのためだけに配列全体をコピーするのはもったいないケースはありそう
231デフォルトの名無しさん
2021/08/30(月) 20:10:57.31ID:kOjyqHoG 性能気にするなら Vec<Vec<_>> の形で数値格納するのではなく
Vec<_> に格納して (i, j) -> j*n+i みたいにインデックスを変換してくれるラッパーを被せた方がよさそう
Vec<_> に格納して (i, j) -> j*n+i みたいにインデックスを変換してくれるラッパーを被せた方がよさそう
■ このスレッドは過去ログ倉庫に格納されています
ニュース
- 台湾有事での集団的自衛権行使に賛成48%、「反対」が44.2% [♪♪♪★]
- 中国「国連安保理の許可なしに日本攻撃可能」 Xで旧敵国条項に言及… ★12 [BFU★]
- 中国・国連大使「日本側は反省せず、発言の撤回拒否」 書簡を国連事務総長に送る [♪♪♪★]
- 台湾有事での集団的自衛権行使に賛成48%、「反対」が44.2% ★2 [♪♪♪★]
- 首相官邸前で「戦争あおるな」 台湾有事巡る答弁に抗議 ★3 [蚤の市★]
- 中国「国連安保理の許可なしに日本攻撃可能」 Xで旧敵国条項に言及… ★13 [BFU★]
- 他サポ 2025-260
- 2025 SUPER FORMULA Lap18
- 【フジテレビ】2025 FORMULA 1【NEXT】Lap600
- 【DAZN】フォーミュラGP【F1 2 3 SF P】Lap1807
- 京都競馬4回5日目エリザベス女王杯★3
- 福島競馬3回5日目
- 日本人の73%「中国が嫌い」日本の右傾化止まらない [165981677]
- 【実況】博衣こよりのえちえちゼルダの伝説 ムジュラの仮面🧪 ★4
- 日本人の48%覚悟完了… [819729701]
- 小野田大臣「それ正式なデータですか?報道ベースですよね」(10万いいね) [237216734]
- 🏡🏡😅🏡🏡
- 放出(はなてん)、柴島(くにじま)、天満(てんま)、喜連瓜破(きれうりわり)……
