公式
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/
※次スレは原則>>980が立てること
前スレ
Rust part12
https://mevius.5ch.net/test/read.cgi/tech/1629813327/
探検
Rust part13
■ このスレッドは過去ログ倉庫に格納されています
2021/11/07(日) 10:04:59.35ID:pJhT3MIE
252デフォルトの名無しさん
2021/12/06(月) 17:09:45.91ID:Fu08U5Ef >>248
型パラメータは Option のパラメータなので順当に考えれば Option::<i32>::None と書くべきだし実際にそれで通るんだけども、
歴史的経緯でバリアントにも付けられるようになってる。
短く書けるから習慣的にはバリアントに型を付けるほうが多いかな……?
型パラメータは Option のパラメータなので順当に考えれば Option::<i32>::None と書くべきだし実際にそれで通るんだけども、
歴史的経緯でバリアントにも付けられるようになってる。
短く書けるから習慣的にはバリアントに型を付けるほうが多いかな……?
253デフォルトの名無しさん
2021/12/06(月) 17:31:38.25ID:BduPW1Ae >>250
なるほど直積集合かぁ
同じくyのイテレータとxはCloneを要求してますね
fn cartesian_product<J>(self, other: J) -> Producfgt<Self, J::IntoIter>
where
Self: Sized,
Self::Item: Clone,
J: IntoIterator,
J::IntoIter: Clone,
なるほど直積集合かぁ
同じくyのイテレータとxはCloneを要求してますね
fn cartesian_product<J>(self, other: J) -> Producfgt<Self, J::IntoIter>
where
Self: Sized,
Self::Item: Clone,
J: IntoIterator,
J::IntoIter: Clone,
254デフォルトの名無しさん
2021/12/06(月) 20:06:32.13ID:NQsvo9rr255デフォルトの名無しさん
2021/12/06(月) 21:47:08.33ID:BduPW1Ae >>254
例えばlet x = spawn(async { ... });して裏で何か処理をやらせといた結果を
後でもしエラーが出ていたら進めちゃいけないタイミングでx.await?;で確認するわけだけど
spawnが返す型をxに律儀に記述するのは面倒なのでそこは略すとして
asyncブロック内で?とOk(())だけ書くとコンパイラが文句を言うので仕方なく記載
例えばlet x = spawn(async { ... });して裏で何か処理をやらせといた結果を
後でもしエラーが出ていたら進めちゃいけないタイミングでx.await?;で確認するわけだけど
spawnが返す型をxに律儀に記述するのは面倒なのでそこは略すとして
asyncブロック内で?とOk(())だけ書くとコンパイラが文句を言うので仕方なく記載
256デフォルトの名無しさん
2021/12/06(月) 22:11:44.75ID:NQsvo9rr なるほど勉強になりました
257デフォルトの名無しさん
2021/12/07(火) 21:26:04.18ID:pFZAiCY5 12次元までならiproduct!が使える
use itertools::iproduct;
let r = iproduct!(1..100, 1..100).find(|(x, y)| x * y > 1234);
let r = (|| {
for (x, y) in iproduct!(1..100, 1..100) {
if x * y > 1234 {
return Some((x, y));
}
}
return None;
})();
use itertools::iproduct;
let r = iproduct!(1..100, 1..100).find(|(x, y)| x * y > 1234);
let r = (|| {
for (x, y) in iproduct!(1..100, 1..100) {
if x * y > 1234 {
return Some((x, y));
}
}
return None;
})();
258デフォルトの名無しさん
2021/12/08(水) 14:18:48.01ID:6NuoEm2L ARM版のWindowsでRustのコードを書くのってめんどくさいな
生のWindowsで使用する場合、VisualStudioに付属するx86用のリンカーが非推奨警告を無視すれば使えたものの、次期バージョンからx64専用になってしまうっぽい
一方、仮想環境等+VSCodeでは、RustAnalyzer等が機能せず苦労する・・・・
持ち運び用にケチってMacを買わなかったのが大問題だった、なんかいい方法ないのかな?そもそもARM Windowsで動くリンカーってVisualStudio付属のものしかないのかな?
ケチったって言ってもよくよく考えてみると大して金が浮いてもないし、変なもん買っちまった
生のWindowsで使用する場合、VisualStudioに付属するx86用のリンカーが非推奨警告を無視すれば使えたものの、次期バージョンからx64専用になってしまうっぽい
一方、仮想環境等+VSCodeでは、RustAnalyzer等が機能せず苦労する・・・・
持ち運び用にケチってMacを買わなかったのが大問題だった、なんかいい方法ないのかな?そもそもARM Windowsで動くリンカーってVisualStudio付属のものしかないのかな?
ケチったって言ってもよくよく考えてみると大して金が浮いてもないし、変なもん買っちまった
259デフォルトの名無しさん
2021/12/08(水) 14:36:22.94ID:W5vI+s6z260デフォルトの名無しさん
2021/12/08(水) 20:15:10.58ID:pzF9gjPk バイナリバイナリルルルルルー。
261デフォルトの名無しさん
2021/12/08(水) 21:25:01.32ID:t4Pzut9P rustはどんどん新しい機能が追加されていくのはいいけど、
後方互換性を気にして過去に追加された「間違った」機能を削除するという
思い切ったこともやって欲しいな
これまでの言語は後方互換性にとらわれて滅茶苦茶になってるから
後方互換性を気にして過去に追加された「間違った」機能を削除するという
思い切ったこともやって欲しいな
これまでの言語は後方互換性にとらわれて滅茶苦茶になってるから
262デフォルトの名無しさん
2021/12/08(水) 21:29:04.83ID:ff6DaDGr >>261
C++かな?
C++かな?
263デフォルトの名無しさん
2021/12/08(水) 21:44:15.05ID:tBq4QMAR >>261
editionでは物足りない?
editionでは物足りない?
264デフォルトの名無しさん
2021/12/08(水) 21:50:49.56ID:t8qOOWvR 実際2021editionではレンジパターンの ... が削除されて ..= に一本化された
265デフォルトの名無しさん
2021/12/09(木) 08:53:14.94ID:sqaPNXyj >>258
今どきDocker使うのはデフォだから何の問題もない、因みにRustAnalyzerも使える
使えないのは、復数のプロジェクトが見える状態にしてるから
今どき復数ウィンドウ立ち上げても何の問題もない、ルートフォルダを固有にしたら解決
つまり、調査不足が原因
今どきDocker使うのはデフォだから何の問題もない、因みにRustAnalyzerも使える
使えないのは、復数のプロジェクトが見える状態にしてるから
今どき復数ウィンドウ立ち上げても何の問題もない、ルートフォルダを固有にしたら解決
つまり、調査不足が原因
266デフォルトの名無しさん
2021/12/09(木) 10:59:17.60ID:4q0mFQ+L ARM は安物のイメージがある。
WSL2, Linux, Docker, VSCode とか使えるのかな?
Mac も、M1 に変わったから
WSL2, Linux, Docker, VSCode とか使えるのかな?
Mac も、M1 に変わったから
267デフォルトの名無しさん
2021/12/09(木) 11:10:00.09ID:XwSSuf4e 原理的には ARM のほうがインテル系 (もはや AMD 系と呼ぶべきか) よりも高速化できる可能性があるとは言われている。
今以上に回路を細かくするのは無理というところまできてしまっているのでアーキテクチャのほうで見直しが必要なんだが
インテル系は互換性が足かせになってしまっていてあまり思い切ったことが出来ない。
現時点はインテル系向けにチューニングされたソフトウェア資産が多いから上手くいっているけど将来もそうとは限らない。
今以上に回路を細かくするのは無理というところまできてしまっているのでアーキテクチャのほうで見直しが必要なんだが
インテル系は互換性が足かせになってしまっていてあまり思い切ったことが出来ない。
現時点はインテル系向けにチューニングされたソフトウェア資産が多いから上手くいっているけど将来もそうとは限らない。
268デフォルトの名無しさん
2021/12/09(木) 11:45:18.26ID:t4DQqTrM >>267
スレチだけどその話の出展あったら教えてほしい
スレチだけどその話の出展あったら教えてほしい
269デフォルトの名無しさん
2021/12/09(木) 14:22:31.39ID:RSXecyhf CISCRISCの話じゃなくてメモリモデルの話ならそうかなって思う
今のx64って実質中身RISCって聞いたことあるし
Rustで言うとx64では全部SeqCstとして扱われるみたいな話
今のx64って実質中身RISCって聞いたことあるし
Rustで言うとx64では全部SeqCstとして扱われるみたいな話
270デフォルトの名無しさん
2021/12/09(木) 17:42:03.96ID:VJ9QB09P リソースの話だけなら命令デコーダーとか?
x86_64は拡張や互換性とか可変長命令だったりで無駄にトランジスタ消費するのが電力性能比的に足かせみたいな
x86_64は拡張や互換性とか可変長命令だったりで無駄にトランジスタ消費するのが電力性能比的に足かせみたいな
271デフォルトの名無しさん
2021/12/09(木) 20:39:08.00ID:0MvTGuxY 今どきのプロセッサだと分岐予測器やキャッシュが支配的でデコーダなんて誤差だと思う
あと可変長は命令側の帯域やキャッシュ効率が良くなるという面もあってRISC系でも採用してることが多い
結局両者とも長年の改善で似たようなとこに落ち着いてるわけで、ISAが違うからどうこうみたいな話は結構眉唾
あと可変長は命令側の帯域やキャッシュ効率が良くなるという面もあってRISC系でも採用してることが多い
結局両者とも長年の改善で似たようなとこに落ち着いてるわけで、ISAが違うからどうこうみたいな話は結構眉唾
272デフォルトの名無しさん
2021/12/11(土) 19:08:58.23ID:oic9EtmK こういうことをしたいのですがコンパイルエラーとなってしまいます
const DEFAULT_NAME: &str = "namae";
let arg1: Option<String> = std::env::args().nth(1);
let name: &str = arg1.map_or(DEFAULT_NAME, |s| s.as_str());
どう直せばよいでしょうか?
const DEFAULT_NAME: &str = "namae";
let arg1: Option<String> = std::env::args().nth(1);
let name: &str = arg1.map_or(DEFAULT_NAME, |s| s.as_str());
どう直せばよいでしょうか?
273デフォルトの名無しさん
2021/12/11(土) 19:10:55.89ID:ZSpAs+oG namaeじゃなくてnameな
aが余計
この程度の英語のスペル書けないとかプログラミング向いていないしやめた方がいいよ
aが余計
この程度の英語のスペル書けないとかプログラミング向いていないしやめた方がいいよ
274デフォルトの名無しさん
2021/12/11(土) 19:21:25.94ID:UNEoSQah 自演ボケか?
275デフォルトの名無しさん
2021/12/11(土) 19:35:01.57ID:K+rsGRUk >>272
そのままだとarg1が消費されてなくなるのに参照だけ残ることになるからエラー
Stringで受ければいいよ
let name: String = arg1.unwrap_or(DEFAULT_NAME.to_string());
そのままだとarg1が消費されてなくなるのに参照だけ残ることになるからエラー
Stringで受ければいいよ
let name: String = arg1.unwrap_or(DEFAULT_NAME.to_string());
276デフォルトの名無しさん
2021/12/11(土) 20:19:05.99ID:XRkKLs6o277デフォルトの名無しさん
2021/12/11(土) 20:24:40.06ID:Z1L5tslT いやネタでしょ
278デフォルトの名無しさん
2021/12/11(土) 20:29:51.18ID:/anFx7me >>275
これだとarg1がSomeの時もto_string()が呼び出されて無駄なヒープアロケーションが走るのでunwrap_or_elseにすべき
これだとarg1がSomeの時もto_string()が呼び出されて無駄なヒープアロケーションが走るのでunwrap_or_elseにすべき
279デフォルトの名無しさん
2021/12/11(土) 22:35:07.46ID:oic9EtmK みなさんありがとうございます
Stringにする方法は無事にこれで動きました
let name: String = arg1.unwrap_or_else(|| DEFAULT_NAME.to_string());
元の質問>>272のように&strにする方法は無いのでしょうか?
もし可能ならばto_string()のヒープアロケーションを減らせるかなという質問です
Stringにする方法は無事にこれで動きました
let name: String = arg1.unwrap_or_else(|| DEFAULT_NAME.to_string());
元の質問>>272のように&strにする方法は無いのでしょうか?
もし可能ならばto_string()のヒープアロケーションを減らせるかなという質問です
280デフォルトの名無しさん
2021/12/11(土) 22:59:59.99ID:yVS9OnV5281デフォルトの名無しさん
2021/12/11(土) 23:20:49.43ID:yVS9OnV5 場合によってはこれでもいいのかな?
let name: &str = &arg1.as_ref().map_or(DEFAULT_NAME, |s| s.as_str());
let name: &str = &arg1.as_ref().map_or(DEFAULT_NAME, |s| s.as_str());
282デフォルトの名無しさん
2021/12/11(土) 23:54:40.62ID:tYxQqCnY >>281
それでもよいけど正解はシンプルなこれ
let name: &str = if let Some(ref arg1) = arg1 { arg1 } else { DEFAULT_NAME };
まずarg1を消費しないようにrefで受ける
2代目のarg1は&Stringなので自動的に&strへderefされる
それでもよいけど正解はシンプルなこれ
let name: &str = if let Some(ref arg1) = arg1 { arg1 } else { DEFAULT_NAME };
まずarg1を消費しないようにrefで受ける
2代目のarg1は&Stringなので自動的に&strへderefされる
283デフォルトの名無しさん
2021/12/12(日) 02:10:02.51ID:h/Sb7JBW 1.40からas_derefっつうのがあるんだってさ
let name = arg1.as_deref().unwrap_or(DEFAULT_NAME);
でもコマンドライン引数の場合は消費しないメリットがほぼ無いのでCowのほうがいいかな
let name = arg1.as_deref().unwrap_or(DEFAULT_NAME);
でもコマンドライン引数の場合は消費しないメリットがほぼ無いのでCowのほうがいいかな
284デフォルトの名無しさん
2021/12/12(日) 04:28:54.46ID:8d+idsXS どの型で統一すべきかは
(1) その後に加工伸長などするならString (arg1をここで&strに統一するのは無駄)
(2) 参照するのみなら&str (DEFAULT_NAMEをここでto_stringするのは無駄)
(3) その後に判明する条件次第で両ケースありうるならCow (ただし常にCow利用はCowコストが無駄)
って感じ?
(1) その後に加工伸長などするならString (arg1をここで&strに統一するのは無駄)
(2) 参照するのみなら&str (DEFAULT_NAMEをここでto_stringするのは無駄)
(3) その後に判明する条件次第で両ケースありうるならCow (ただし常にCow利用はCowコストが無駄)
って感じ?
285デフォルトの名無しさん
2021/12/12(日) 10:07:32.08ID:svMJrknn おそらくその通りだけど、CLIツールの初回一回だけのアロケーションにそこまでこだわるのがそもそも無駄って気もする
ループ内とかでもなければ雑にString作っちゃっていいかもね
ループ内とかでもなければ雑にString作っちゃっていいかもね
286デフォルトの名無しさん
2021/12/12(日) 10:31:14.68ID:eE6Pv/WZ んだ
287デフォルトの名無しさん
2021/12/12(日) 10:46:59.45ID:8d+idsXS >>285
今回のケースはそうだね
ただしヒープ割り当てをなるべく避ける様々な手法を把握しているか否かは色んな局面で効いてくるから
今回6通りも動くコード例が示されたことは多様に対応可能な柔軟性の良さかな
気にしなくても書けるし気にすれば効率を上げることができる点で
今回のケースはそうだね
ただしヒープ割り当てをなるべく避ける様々な手法を把握しているか否かは色んな局面で効いてくるから
今回6通りも動くコード例が示されたことは多様に対応可能な柔軟性の良さかな
気にしなくても書けるし気にすれば効率を上げることができる点で
288デフォルトの名無しさん
2021/12/12(日) 18:38:25.33ID:h/Sb7JBW >>284
Cowと&strに揃える場合の一番の違いはライフタイム管理
Stringを&strにするとライフタイム管理がつきまとうから
すぐ使いきる場合以外はCowに比べてメンテナンスしにくいコードになる
Cowと&strに揃える場合の一番の違いはライフタイム管理
Stringを&strにするとライフタイム管理がつきまとうから
すぐ使いきる場合以外はCowに比べてメンテナンスしにくいコードになる
289デフォルトの名無しさん
2021/12/12(日) 18:59:43.58ID:3rjDzGgS 文字列についてはStringにするかCow<str>にするか迷うくらいならinternしちゃうのも手かと
どのライブラリが定番なのかよく知らないけど
どのライブラリが定番なのかよく知らないけど
290デフォルトの名無しさん
2021/12/12(日) 19:49:57.76ID:be4Z/veb >>281
> let name: &str = &arg1.as_ref().map_or(DEFAULT_NAME, |s| s.as_str());
それarg1の前の&は不要でこれで動く
let name: &str = arg1.as_ref().map_or(DEFAULT_NAME, |s| s.as_str());
さらにas_str()使うより短く書けて&**sで&strになる
let name: &str = arg1.as_ref().map_or(DEFAULT_NAME, |s| &**s);
さらに&Stringのsのままでもderefされるため大丈夫
let name: &str = arg1.as_ref().map_or(DEFAULT_NAME, |s| s);
クロージャが何もしてないからといって無くしてしまうとderefが効かず型不一致コンパイルエラー
× let name: &str = arg1.as_ref().unwrap_or(DEFAULT_NAME);
そこで明示的にderefしてやればよい
let name: &str = arg1.as_deref().unwrap_or(DEFAULT_NAME);
> let name: &str = &arg1.as_ref().map_or(DEFAULT_NAME, |s| s.as_str());
それarg1の前の&は不要でこれで動く
let name: &str = arg1.as_ref().map_or(DEFAULT_NAME, |s| s.as_str());
さらにas_str()使うより短く書けて&**sで&strになる
let name: &str = arg1.as_ref().map_or(DEFAULT_NAME, |s| &**s);
さらに&Stringのsのままでもderefされるため大丈夫
let name: &str = arg1.as_ref().map_or(DEFAULT_NAME, |s| s);
クロージャが何もしてないからといって無くしてしまうとderefが効かず型不一致コンパイルエラー
× let name: &str = arg1.as_ref().unwrap_or(DEFAULT_NAME);
そこで明示的にderefしてやればよい
let name: &str = arg1.as_deref().unwrap_or(DEFAULT_NAME);
291デフォルトの名無しさん
2021/12/13(月) 21:23:25.03ID:zBnuOauJ ken okabeのqiitaの記事がまた炎上してるよ
mod_poppoにボコボコにされてる
mod_poppoにボコボコにされてる
292デフォルトの名無しさん
2021/12/13(月) 22:30:34.09ID:i33Tname あれ、Qiitaには垢バンされて投稿できないんじゃなかった?
293デフォルトの名無しさん
2021/12/13(月) 23:00:30.90ID:Yx06Lw1d ググってもよくわからないのですが、どういった方なんですか?
294デフォルトの名無しさん
2021/12/13(月) 23:30:17.26ID:IeJGNs4K 盛大な時間の無駄になるだけなので調べてはいけない
295デフォルトの名無しさん
2021/12/13(月) 23:59:51.20ID:mqpFvLOG >>291
poppoとかいうやつも多様な定義や多様な解釈が存在している中で不要なイチャモンばかりだな
さらに冒頭のこれも
> JavaScriptで演算子オーバーロードを実現しようとするのは筋が悪い
たまたま例としてJavaScriptを用いているだけなのにそれすら理解できていない
okabeは使用言語と無関係に成り立つ話をしてるだろ
> reduceは二項演算ではなく三項演算として捉えるべき
これも些細なことであって例えばRustなら
fold()は『入力列・初期値・演算関数』の三項演算だけど
reduce()は『入力列・(初期値は入力列の先頭なので無指定)・演算関数』の二項演算
とはいえokabeの方もイテレータすら扱っていないからイマイチ
poppoとかいうやつも多様な定義や多様な解釈が存在している中で不要なイチャモンばかりだな
さらに冒頭のこれも
> JavaScriptで演算子オーバーロードを実現しようとするのは筋が悪い
たまたま例としてJavaScriptを用いているだけなのにそれすら理解できていない
okabeは使用言語と無関係に成り立つ話をしてるだろ
> reduceは二項演算ではなく三項演算として捉えるべき
これも些細なことであって例えばRustなら
fold()は『入力列・初期値・演算関数』の三項演算だけど
reduce()は『入力列・(初期値は入力列の先頭なので無指定)・演算関数』の二項演算
とはいえokabeの方もイテレータすら扱っていないからイマイチ
296デフォルトの名無しさん
2021/12/14(火) 00:07:08.47ID:LYbWtya0 Rust関係ねーだろ
二度とその名前を口に出すな
二度とその名前を口に出すな
297デフォルトの名無しさん
2021/12/14(火) 10:41:11.49ID:QBQJlKEt P2P方式の2D対戦ゲームを作りたいと考えています。
おすすめのゲームエンジンやライブラリはございますか?
おすすめのゲームエンジンやライブラリはございますか?
298デフォルトの名無しさん
2021/12/14(火) 11:46:02.04ID:mpAOsF0a299デフォルトの名無しさん
2021/12/14(火) 12:45:44.37ID:QBQJlKEt >>298
個人的にRustが好きなので技術向上のためにもRustで作りたいと考えています。
現在はAmethystとlibp2pを用いて開発しようと考えているのですが、如何せん知識が浅くこれで目的のものが作れるのか分かりません。
是非先人の知恵をお貸しください。
Rustでの開発にロミオとジュリエットの恋ほどの壁があるという場合は、大人しくC++かUnityで作成します・・・
個人的にRustが好きなので技術向上のためにもRustで作りたいと考えています。
現在はAmethystとlibp2pを用いて開発しようと考えているのですが、如何せん知識が浅くこれで目的のものが作れるのか分かりません。
是非先人の知恵をお貸しください。
Rustでの開発にロミオとジュリエットの恋ほどの壁があるという場合は、大人しくC++かUnityで作成します・・・
300デフォルトの名無しさん
2021/12/14(火) 13:10:49.68ID:+JRF3Q+g そんだけの情報ではなんともいえん。
見通しが立たないものを試行錯誤で作る場合には
モジュールではなくレイヤで分割したほうがいいという考え方がある。
要するに機能不足でもバグだらけでもコードが整理されてなくてもいいからとにかく「動くもの」を作って
その上に足りないものをどんどん足していくという方法論だ。
よくわかってないなら小さいもので色々やってみて知識を積み重ねるべきで、
よくわからんまま目的に向かって邁進してもあんまり技術向上にはならんよ。
見通しが立たないものを試行錯誤で作る場合には
モジュールではなくレイヤで分割したほうがいいという考え方がある。
要するに機能不足でもバグだらけでもコードが整理されてなくてもいいからとにかく「動くもの」を作って
その上に足りないものをどんどん足していくという方法論だ。
よくわかってないなら小さいもので色々やってみて知識を積み重ねるべきで、
よくわからんまま目的に向かって邁進してもあんまり技術向上にはならんよ。
301デフォルトの名無しさん
2021/12/14(火) 13:22:32.10ID:QBQJlKEt302デフォルトの名無しさん
2021/12/14(火) 13:53:41.90ID:ZTFSAiNI >>299
Amethystは開発中止になったから今からやるのは微妙かも
gamedev.rsに今アクティブなエンジンやゲームがスクショ付きで載ってるから
そこからイメージにあうものを探すといいかもしれない
Amethystは開発中止になったから今からやるのは微妙かも
gamedev.rsに今アクティブなエンジンやゲームがスクショ付きで載ってるから
そこからイメージにあうものを探すといいかもしれない
303デフォルトの名無しさん
2021/12/14(火) 15:30:19.02ID:QBQJlKEt304デフォルトの名無しさん
2021/12/15(水) 07:48:40.06ID:inpCEPk8 技術を高める目的なら windows-rs や wgpu-rs みたいな一段下から積み上げるのも楽しいよ。
ゲーム作る道のりは遠くなるけど、画面に三角形出したり、キーの入力受け付けたりするだけで達成感が出てくる。
ゲーム作る道のりは遠くなるけど、画面に三角形出したり、キーの入力受け付けたりするだけで達成感が出てくる。
305デフォルトの名無しさん
2021/12/17(金) 12:43:03.76ID:jilrKB7M https://forest-watch-impress-co-jp.cdn.ampproject.org/c/s/forest.watch.impress.co.jp/docs/serial/yajiuma/1374/986/amp.index.html
エディタ自体はvscodeに勝つの難しそうだがGPUIとやらが定番GUIフレームワークにならないか期待
エディタ自体はvscodeに勝つの難しそうだがGPUIとやらが定番GUIフレームワークにならないか期待
306デフォルトの名無しさん
2021/12/17(金) 16:39:33.05ID:6JlgT7vi 既出だったらすいません
前から疑問だったのですが、出力におけるprint!マクロのような入力用マクロが標準ライブラリに用意されていない理由ってなんですか?
前から疑問だったのですが、出力におけるprint!マクロのような入力用マクロが標準ライブラリに用意されていない理由ってなんですか?
307デフォルトの名無しさん
2021/12/17(金) 18:11:01.90ID:tWB5K5S1 >>297
1対多で、broadcast するチャットルームのバックエンドなら、
Ruby on Rails 6 のAction Cable(WebSocket)が基本
JavaScript は、React, Phaser とか
【Rails】(送信時のリロード無し!)Action CableでSlack風チャットアプリを作成、2019/12
https://www.youtube.com/watch?v=o6PuxDr8Meg
1対多で、broadcast するチャットルームのバックエンドなら、
Ruby on Rails 6 のAction Cable(WebSocket)が基本
JavaScript は、React, Phaser とか
【Rails】(送信時のリロード無し!)Action CableでSlack風チャットアプリを作成、2019/12
https://www.youtube.com/watch?v=o6PuxDr8Meg
308デフォルトの名無しさん
2021/12/17(金) 18:36:09.20ID:ePonqmC1309デフォルトの名無しさん
2021/12/17(金) 23:52:56.58ID:6JlgT7vi >>308
熟読させていただきました。
私としてはたった数十行のコードであること且つ他のほとんどの言語に存在しているものなのであっても良いのかなと思ったのですが、Rustの基本理念を考えると慎重になる理由も理解出来ました。
Rustの経験が浅い私目線ではあまり腑に落ちませんでしたが、皆さんはどう考えていますか?
熟読させていただきました。
私としてはたった数十行のコードであること且つ他のほとんどの言語に存在しているものなのであっても良いのかなと思ったのですが、Rustの基本理念を考えると慎重になる理由も理解出来ました。
Rustの経験が浅い私目線ではあまり腑に落ちませんでしたが、皆さんはどう考えていますか?
310デフォルトの名無しさん
2021/12/18(土) 15:05:52.37ID:JzdvFl4u 熟読はしてないけど、外部ライブラリで簡単に実現可能であるなら
直感的には、本体メンテナの苦労を増やすほど価値があると思えないし別にいらんかな
こういうIOとかCLIプロンプトらへんの機能ってどうしても好みが分かれるというか、
ユースケースによって必要な機能がかなり違ってきちゃうと思うし
直感的には、本体メンテナの苦労を増やすほど価値があると思えないし別にいらんかな
こういうIOとかCLIプロンプトらへんの機能ってどうしても好みが分かれるというか、
ユースケースによって必要な機能がかなり違ってきちゃうと思うし
311デフォルトの名無しさん
2021/12/18(土) 20:46:47.80ID:w6oxugk6 C++のiostreamが失敗作だから慎重になるのもわかる笑
312デフォルトの名無しさん
2021/12/18(土) 23:17:58.09ID:SfwydFh9 >>306
C言語でのprintf相当はあるのにscanf相当がstdにないのはなぜか?ですね
逆になぜprintf相当がRustの標準ライブラリにあるのか?を考えてみると
(1) 読み書きの非対称性
人間が読むためにプログラムが書くことはエラー表示を含めて利用必須かつ頻出
一方で人間が書いたものをプログラムが読むことはレア
ファイルや通信相手への読み書きは各プロトコル/各API/シリアライズ等で対象外
(2) コンパイラサポート
print!やformat!等は頻出するので効率面からコンパイラサポートが効率的
実際にそれらが利用しているformat_args!はコンパイラ内蔵マクロ
(3) 標準ライブラリ採用
外部ライブラリで実現可能なものは採用しないが基本
今回はコンパイラ内蔵マクロだから採用
つまり出力は頻度と効率化で採用がクリアされたけど
入力は外部ライブラリで十分かなと
C言語でのprintf相当はあるのにscanf相当がstdにないのはなぜか?ですね
逆になぜprintf相当がRustの標準ライブラリにあるのか?を考えてみると
(1) 読み書きの非対称性
人間が読むためにプログラムが書くことはエラー表示を含めて利用必須かつ頻出
一方で人間が書いたものをプログラムが読むことはレア
ファイルや通信相手への読み書きは各プロトコル/各API/シリアライズ等で対象外
(2) コンパイラサポート
print!やformat!等は頻出するので効率面からコンパイラサポートが効率的
実際にそれらが利用しているformat_args!はコンパイラ内蔵マクロ
(3) 標準ライブラリ採用
外部ライブラリで実現可能なものは採用しないが基本
今回はコンパイラ内蔵マクロだから採用
つまり出力は頻度と効率化で採用がクリアされたけど
入力は外部ライブラリで十分かなと
313デフォルトの名無しさん
2021/12/19(日) 02:25:28.05ID:KXG/wmTu しかし競プロでみんなproconioとかいう謎の専用ライブラリ使ってるの見た目悪すぎて笑える
314デフォルトの名無しさん
2021/12/19(日) 04:21:35.56ID:1R2jF/rb 競プロ全然知らないけどstdinに入力数値がくるからか
| 入力は以下の形式で標準入力から数値が与えられる。
| a b c d e
| 積が奇数なら Odd と、 偶数なら Even と出力せよ。
標準ライブラリだけ使うと毎回こんなの書くのは面倒だもんな
| use std::io::{stdin, BufRead, BufReader};
| println!("{}", if BufReader::new(stdin()).lines().next().unwrap().unwrap().split(' ').any(|s| s.parse::<isize>().unwrap() & 1 == 0) { "Even" } else { "Odd" });
>>313
そのproconioを使うとこうなるようだ
| proconio::input! { v: [isize; 5] }
| println!("{}", if v.into_iter().any(|n| n & 1 == 0) { "Even" } else { "Odd" });
| 入力は以下の形式で標準入力から数値が与えられる。
| a b c d e
| 積が奇数なら Odd と、 偶数なら Even と出力せよ。
標準ライブラリだけ使うと毎回こんなの書くのは面倒だもんな
| use std::io::{stdin, BufRead, BufReader};
| println!("{}", if BufReader::new(stdin()).lines().next().unwrap().unwrap().split(' ').any(|s| s.parse::<isize>().unwrap() & 1 == 0) { "Even" } else { "Odd" });
>>313
そのproconioを使うとこうなるようだ
| proconio::input! { v: [isize; 5] }
| println!("{}", if v.into_iter().any(|n| n & 1 == 0) { "Even" } else { "Odd" });
315デフォルトの名無しさん
2021/12/19(日) 06:54:36.03ID:KXG/wmTu >>314
ワンライナー大好きかよ
ワンライナー大好きかよ
316デフォルトの名無しさん
2021/12/19(日) 07:00:31.55ID:1R2jF/rb >>315
マルチラインだと標準ライブラリだけでもわかりやすくなる?
マルチラインだと標準ライブラリだけでもわかりやすくなる?
317デフォルトの名無しさん
2021/12/19(日) 08:28:47.39ID:KXG/wmTu >>316
あいやごめん。proconioのところはどうあがいてもプロコン専用のproconioが一番見やすいよ。それ用に特化されたライブラリだし
俺が大好きかよって言ったのは
println!("{}", if v.into_iter().any(|n| n & 1 == 0) { "Even" } else { "Odd" });
の部分
あいやごめん。proconioのところはどうあがいてもプロコン専用のproconioが一番見やすいよ。それ用に特化されたライブラリだし
俺が大好きかよって言ったのは
println!("{}", if v.into_iter().any(|n| n & 1 == 0) { "Even" } else { "Odd" });
の部分
318デフォルトの名無しさん
2021/12/19(日) 09:08:15.26ID:1R2jF/rb どの言語でも三項演算子(相当)はワンライナーで書くんじゃね?
319デフォルトの名無しさん
2021/12/19(日) 09:36:51.21ID:Tv9xxy1h 見た目汚いなw
320デフォルトの名無しさん
2021/12/19(日) 09:42:08.31ID:1R2jF/rb これでいいかね?
println!("{}", if v.into_iter().any(|n| n & 1 == 0) {
"Even"
} else {
"Odd"
});
println!("{}", if v.into_iter().any(|n| n & 1 == 0) {
"Even"
} else {
"Odd"
});
321デフォルトの名無しさん
2021/12/19(日) 09:57:56.98ID:KXG/wmTu 俺ならこんな感じかなあ
俺は頭悪いから、途中結果に一つ一つ名前つけないとわかんなくなっちゃうわ
まあワンライナー見た時に「グエー」って思っただけだからごめん。「大好きかよ」とかいっておいてなんだけどあんま気にしないで
use proconio::input;
fn main() {
input!(v: [usize; 5]);
let is_even = v.iter().any(|x| x % 2 == 0);
let result = if is_even {
"Even"
} else {
"Odd"
};
println!("{}", result);
}
俺は頭悪いから、途中結果に一つ一つ名前つけないとわかんなくなっちゃうわ
まあワンライナー見た時に「グエー」って思っただけだからごめん。「大好きかよ」とかいっておいてなんだけどあんま気にしないで
use proconio::input;
fn main() {
input!(v: [usize; 5]);
let is_even = v.iter().any(|x| x % 2 == 0);
let result = if is_even {
"Even"
} else {
"Odd"
};
println!("{}", result);
}
322デフォルトの名無しさん
2021/12/19(日) 10:13:36.41ID:1R2jF/rb >>321
なるほど
じゃあ最初の標準ライブラリのみはどのように分けるのかな
println!("{}", if BufReader::new(stdin()).lines().next().unwrap().unwrap().split(' ').any(|s| s.parse::<isize>().unwrap() & 1 == 0) { "Even" } else { "Odd" });
なるほど
じゃあ最初の標準ライブラリのみはどのように分けるのかな
println!("{}", if BufReader::new(stdin()).lines().next().unwrap().unwrap().split(' ').any(|s| s.parse::<isize>().unwrap() & 1 == 0) { "Even" } else { "Odd" });
323デフォルトの名無しさん
2021/12/19(日) 10:17:01.07ID:KXG/wmTu324デフォルトの名無しさん
2021/12/19(日) 12:54:53.29ID:XhCh7cuL325デフォルトの名無しさん
2021/12/19(日) 13:44:27.43ID:JD8Mu2Jr わけわからんくてビビってたらよく見るとPythonスレじゃなかった
326デフォルトの名無しさん
2021/12/19(日) 15:04:40.83ID:9UFbsF2U rustfmt使うでしょ普通
327デフォルトの名無しさん
2021/12/19(日) 21:36:12.89ID:1R2jF/rb >>326
println全体が改行されてしまった
println!(
"{}",
if BufReader::new(stdin())
.lines()
.next()
.unwrap()
.unwrap()
.split(' ')
.any(|s| s.parse::<isize>().unwrap() & 1 == 0)
{
"Even"
} else {
"Odd"
}
);
一方で分割するとこうなった
let cond = BufReader::new(stdin())
.lines()
.next()
.unwrap()
.unwrap()
.split(' ')
.any(|s| s.parse::<isize>().unwrap() & 1 == 0);
println!("{}", if cond { "Even" } else { "Odd" });
if式自体はワンライナーーで正解とrustfmtはおっしゃってる
println全体が改行されてしまった
println!(
"{}",
if BufReader::new(stdin())
.lines()
.next()
.unwrap()
.unwrap()
.split(' ')
.any(|s| s.parse::<isize>().unwrap() & 1 == 0)
{
"Even"
} else {
"Odd"
}
);
一方で分割するとこうなった
let cond = BufReader::new(stdin())
.lines()
.next()
.unwrap()
.unwrap()
.split(' ')
.any(|s| s.parse::<isize>().unwrap() & 1 == 0);
println!("{}", if cond { "Even" } else { "Odd" });
if式自体はワンライナーーで正解とrustfmtはおっしゃってる
328デフォルトの名無しさん
2021/12/19(日) 21:50:26.03ID:gPlFWszB ワンライナー云々はフォーマットの話ではないやろ
329デフォルトの名無しさん
2021/12/19(日) 22:05:50.34ID:1R2jF/rb330デフォルトの名無しさん
2021/12/19(日) 22:37:44.04ID:D79ys1jH 構造と書式を区別できんのはヤバイで
331デフォルトの名無しさん
2021/12/19(日) 23:10:30.41ID:ZhiL7Huf 心底どうでもいい。
保守性に貢献するどころかマイナスになるようなクソプライドコードの導入すんなよ。
保守性に貢献するどころかマイナスになるようなクソプライドコードの導入すんなよ。
332デフォルトの名無しさん
2021/12/19(日) 23:14:48.39ID:4jRnwXL4 また性懲りもなくコードべたべた書いてんのか
333デフォルトの名無しさん
2021/12/19(日) 23:21:45.51ID:cDs+Q4pL rustfmtだから書式の話やで
334デフォルトの名無しさん
2021/12/19(日) 23:25:17.24ID:/BRS7QS/ 区別できなかったからrustfmtを持ち出したんやろ
どこに改行入れるべきかって話だと思ったんだろなww
どこに改行入れるべきかって話だと思ったんだろなww
335デフォルトの名無しさん
2021/12/19(日) 23:41:46.15ID:1R2jF/rb rustfmtを持ち出したのは俺じゃないぜ
あと今回のケースならここは分割するよな
let reader = BufReader::new(stdin());
let line = reader.lines().next().unwrap().unwrap();
let is_even = line.split(' ').any(|s| s.parse::<isize>().unwrap() & 1 == 0);
あと今回のケースならここは分割するよな
let reader = BufReader::new(stdin());
let line = reader.lines().next().unwrap().unwrap();
let is_even = line.split(' ').any(|s| s.parse::<isize>().unwrap() & 1 == 0);
336デフォルトの名無しさん
2021/12/19(日) 23:48:52.91ID:m2ZvKw+8 汚コード
337デフォルトの名無しさん
2021/12/19(日) 23:59:56.43ID:cDs+Q4pL 問題文が>>314でこうなってるから
>> | 入力は以下の形式で標準入力から数値が与えられる。
>> | a b c d e
if let [a, b, c, d, e] = line
.splitn(5, ' ')
.map(|s| s.parse::<isize>().unwrap())
.collect::<ArrayVec<_, 5>>()[..] {
あとこれでいい
let is_even = a & b & c & d & e & 1 == 0;
>> | 入力は以下の形式で標準入力から数値が与えられる。
>> | a b c d e
if let [a, b, c, d, e] = line
.splitn(5, ' ')
.map(|s| s.parse::<isize>().unwrap())
.collect::<ArrayVec<_, 5>>()[..] {
あとこれでいい
let is_even = a & b & c & d & e & 1 == 0;
338デフォルトの名無しさん
2021/12/20(月) 05:23:59.31ID:XPDM+Al+ そういえばいつの間にか
let variable = 3;
println!("{variable}");
みたいな書き方が出来るんだけどこれ前からだっけ?
let variable = 3;
println!("{variable}");
みたいな書き方が出来るんだけどこれ前からだっけ?
339デフォルトの名無しさん
2021/12/20(月) 05:50:08.07ID:MpI5dMic340デフォルトの名無しさん
2021/12/20(月) 11:31:40.46ID:vxPhPqzv >>335
構造化の基本を学びましょう
構造化の基本を学びましょう
341デフォルトの名無しさん
2021/12/20(月) 18:38:24.90ID:+mZvzmRI どちらのコードも正解
342デフォルトの名無しさん
2021/12/20(月) 18:57:17.41ID:rubGoZ9q コードに「間違い」はあっても「正解」はない
343デフォルトの名無しさん
2021/12/20(月) 19:04:29.92ID:MpI5dMic 間違っているコードは出ていないような
問題視してる人は具体的に何を問題にしているの?
問題視してる人は具体的に何を問題にしているの?
344デフォルトの名無しさん
2021/12/20(月) 20:55:59.37ID:lwZpjeWf アスぺ思考はこれだから
345デフォルトの名無しさん
2021/12/21(火) 11:25:19.41ID:TTfv6HaA https://doc.rust-jp.rs/book-ja/ch18-03-pattern-syntax.html#%E3%83%9E%E3%83%83%E3%83%81%E3%82%AC%E3%83%BC%E3%83%89%E3%81%A7%E8%BF%BD%E5%8A%A0%E3%81%AE%E6%9D%A1%E4%BB%B6%E5%BC%8F
ここの最後のところに
パターンと関わるマッチガードの優先度は、以下のように振る舞います:
(4 | 5 | 6) if y => ...
以下のようにではありません:
4 | 5 | (6 if y) => ...
とあるんですが、後者のようになってほしい場合は4|5と6 if yを別々に書くしか無いですか?
ここの最後のところに
パターンと関わるマッチガードの優先度は、以下のように振る舞います:
(4 | 5 | 6) if y => ...
以下のようにではありません:
4 | 5 | (6 if y) => ...
とあるんですが、後者のようになってほしい場合は4|5と6 if yを別々に書くしか無いですか?
346デフォルトの名無しさん
2021/12/21(火) 11:56:47.99ID:BV9oeByN >>345
ガード構文がこう「『Pattern』 if 『Expression』」なのでそうなりますね
ガード構文がこう「『Pattern』 if 『Expression』」なのでそうなりますね
347デフォルトの名無しさん
2021/12/22(水) 20:44:35.79ID:7pEHjDF/ sixtyfpsってどう?
348デフォルトの名無しさん
2021/12/22(水) 22:58:00.27ID:mfli1g17 > しかし競プロでみんなproconioとかいう謎の専用ライブラリ使ってるの見た目悪すぎて笑える
いや、ほぼ公認のクレートなんだが・・・
謎の専用ライブラリとかいってる時点で、お察しか?
あと、見た目悪いってどういうことなんかね
includeしたら見た目悪すぎなわけ?
いや、ほぼ公認のクレートなんだが・・・
謎の専用ライブラリとかいってる時点で、お察しか?
あと、見た目悪いってどういうことなんかね
includeしたら見た目悪すぎなわけ?
349デフォルトの名無しさん
2021/12/22(水) 23:53:48.10ID:Wk3NOZd2 Rust bookの以下の記述について質問です
https://doc.rust-jp.rs/book-ja/ch19-05-advanced-functions-and-closures.html#クロージャを返却する
> 以下のコードは、クロージャを直接返そうとしていますが、コンパイルできません:
>
> fn returns_closure() -> Fn(i32) -> i32 {
> |x| x + 1
> }
> コンパイラには、クロージャを格納するのに必要なスペースがどれくらいかわからないのです。
> この問題の解決策は先ほど見かけました。
>
> fn returns_closure() -> Box<Fn(i32) -> i32> {
> Box::new(|x| x + 1)
> }
とBox化しなさいと書かれているのですが
以下のようにimplを付けるとBoxを使わなくてもコンパイルが通り動きました
fn make_closure_add1() -> impl Fn(i32) -> i32 {
|x| x + 1
}
このimpl付加は暗に自動的にBox化されているということなのでしょうか?
https://doc.rust-jp.rs/book-ja/ch19-05-advanced-functions-and-closures.html#クロージャを返却する
> 以下のコードは、クロージャを直接返そうとしていますが、コンパイルできません:
>
> fn returns_closure() -> Fn(i32) -> i32 {
> |x| x + 1
> }
> コンパイラには、クロージャを格納するのに必要なスペースがどれくらいかわからないのです。
> この問題の解決策は先ほど見かけました。
>
> fn returns_closure() -> Box<Fn(i32) -> i32> {
> Box::new(|x| x + 1)
> }
とBox化しなさいと書かれているのですが
以下のようにimplを付けるとBoxを使わなくてもコンパイルが通り動きました
fn make_closure_add1() -> impl Fn(i32) -> i32 {
|x| x + 1
}
このimpl付加は暗に自動的にBox化されているということなのでしょうか?
350デフォルトの名無しさん
2021/12/23(木) 00:23:38.98ID:p+r9sE2/351デフォルトの名無しさん
2021/12/23(木) 07:21:11.33ID:esNMmzKz >>348
そりゃあcratesio に上がったものは空っぽでもゴミでも全部公認だわなw
そりゃあcratesio に上がったものは空っぽでもゴミでも全部公認だわなw
352デフォルトの名無しさん
2021/12/23(木) 15:17:54.33ID:BEeWZFks >>342
逆だ、コードは常に「正解」で動いていて「間違い」ない。
あんたの書いたバグもコンピューターにとっては一部の隙もなく正解であり、書かれたその通りに動き、無慈悲である。
同じ目的で、多数、あるいは二人の人が書いたコードで違いが出るのは「表現の違い」であり「間違い」と決めつける
のは人間の主観や嗜好でしかなく、仮にコードへ正誤を求めるなら明確に表現できていなればならず、矛盾が生じる
逆だ、コードは常に「正解」で動いていて「間違い」ない。
あんたの書いたバグもコンピューターにとっては一部の隙もなく正解であり、書かれたその通りに動き、無慈悲である。
同じ目的で、多数、あるいは二人の人が書いたコードで違いが出るのは「表現の違い」であり「間違い」と決めつける
のは人間の主観や嗜好でしかなく、仮にコードへ正誤を求めるなら明確に表現できていなればならず、矛盾が生じる
■ このスレッドは過去ログ倉庫に格納されています
ニュース
- 台湾有事での集団的自衛権行使に「賛成」が48.8%、「反対」が44.2% ★4 [♪♪♪★]
- 高市早苗首相、独自貫いた1カ月 会食ゼロ、議員宿舎で勉強漬け「飲んでる暇があれば、政策を練り、資料を読みたい」 [Hitzeschleier★]
- 【MLB】大谷翔平、山本由伸、佐々木朗希WBC出場辞退が確実に! トランプ大統領「ロス五輪最優先」指令 どうなる侍ジャパン [牛丼★]
- 岐阜発激安スーパー「バロー」横浜にオープン! [おっさん友の会★]
- 【英FT】国土の大部分を日本の残忍な占領下におかれたという苦しみの記憶を今なお抱え続けている中国 [1ゲットロボ★]
- 中国の渡航自粛、影響は限定的 日本人客が来店しやすく [♪♪♪★]
- 有識者「中国からのレアアースは止められても問題ない。高市さんがアメリカから買えばいい」 [834922174]
- 高市早苗「G20サミット、なめられない服を選びました。外交交渉でマウント取れる服買わないとなぁ」大炎上★3 [165981677]
- 【んな専🏡】ルーナイトとたこ焼きパーティするのらぁ(・o・🍬)【ホロライブ▶】
- 【急募】高市を総理大臣から引きずり下ろす方法 [402859164]
- 【悲報】高市早苗内閣自民党支持率、30.7%にwwwwwwwwwwwww [339712612]
- 世界の美しい市役所と県庁舎を紹介&解説していく!!!!!!!
