公式
https://www.rust-lang.org/
https://blog.rust-lang.org/
https://github.com/rust-lang/rust
公式ドキュメント
https://www.rust-lang.org/learn
Web上の実行環境
https://play.rust-lang.org
※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/
※次スレは原則>>980が立てること
前スレ
Rust part23
https://mevius.5ch.net/test/read.cgi/tech/1708677472/
探検
Rust part24
■ このスレッドは過去ログ倉庫に格納されています
2024/05/27(月) 06:41:26.82ID:T4AFD1f4
401デフォルトの名無しさん
2024/06/27(木) 12:00:05.74ID:TDzAch9x >>399
関数が値を返す場合にサイズが小さければレジスタで返す
サイズが大きい場合は呼び出し元のスタックフレームに領域を確保してそこへ直接書き込んでいる
つまり暗に可変参照を渡す最適化が行われている
それはサイズの大きい値を返す関数呼び出しが多段でも同じなので一番最初の関数のスタックフレームに直接書き込まれる
関数が値を返す場合にサイズが小さければレジスタで返す
サイズが大きい場合は呼び出し元のスタックフレームに領域を確保してそこへ直接書き込んでいる
つまり暗に可変参照を渡す最適化が行われている
それはサイズの大きい値を返す関数呼び出しが多段でも同じなので一番最初の関数のスタックフレームに直接書き込まれる
402デフォルトの名無しさん
2024/06/27(木) 12:27:57.71ID:OTNDZ+yC403デフォルトの名無しさん
2024/06/27(木) 12:45:47.11ID:VTKaeii9404デフォルトの名無しさん
2024/06/27(木) 12:53:21.92ID:TDzAch9x405デフォルトの名無しさん
2024/06/27(木) 13:06:53.73ID:VTKaeii9 それをスタックが縮むと表現してるのか
意味は分かった
意味は分かった
406デフォルトの名無しさん
2024/06/27(木) 13:24:58.99ID:veLj9zg3 スタックてのは関数が何段か終了して縮んだあと、また伸び直して前の伸びを上書きしちゃうでしょって話
とにかく「移動」というのが新しくて、代入の移動はわかったけど
関数呼び出しの引数も移動です、返り値も移動ですってのがどういう実装に落とされるのかまだわかってない
とにかく「移動」というのが新しくて、代入の移動はわかったけど
関数呼び出しの引数も移動です、返り値も移動ですってのがどういう実装に落とされるのかまだわかってない
407デフォルトの名無しさん
2024/06/27(木) 13:49:01.55ID:AKJ8/1zo 低レイヤで起こってることは C と変わらん。
寿命の矛盾がないか静的な検査がクソ強いってだけだ。
寿命の矛盾がないか静的な検査がクソ強いってだけだ。
408デフォルトの名無しさん
2024/06/27(木) 15:56:45.17ID:AKJ8/1zo スタックを伸ばすだの縮めるだのいうのはメモリのとある番地に実際のメモリを割り当てたり切り離したりすること。
スタックが足りなくなってきたら連続するアドレスのところに実メモリを割り当てるのがスタックを伸ばすってこと。
普通の使い方をしていたらスタック領域を縮めることはあんまりない。
スタックがあるところまで伸びたということはもう一度そこまで伸びる可能性が高いので回収してまた割り当ててをするよりは割り当てっぱなしにしたほうが良いという設計思想になってるので全体のメモリが足りている限りスタックが浅いところまで戻ってきても実メモリを回収しないという のが現代的な OS。
逆に言えば全体のメモリが足りなくなってきたら回収することもあるんだけど。
素人感覚だとメモリをなるべく空くようにするのが「メモリの無駄を防ぐ」という意識の人がいるんだけど、存在するメモリが使われないままになってるほうがもったいないんだ。
それとたとえば Linux だとスタックの大きさは 8MB が上限というのがデフォ。
これは OS 側の設定なのでアプリケーション側では (OS の設定をいじる権限がない限りは) どうにもできない。
8MB ってめちゃくちゃ少ないように感じるかもしれないけどだいたいこんなもんで足りちゃうんだよ。
スタックが足りなくなってきたら連続するアドレスのところに実メモリを割り当てるのがスタックを伸ばすってこと。
普通の使い方をしていたらスタック領域を縮めることはあんまりない。
スタックがあるところまで伸びたということはもう一度そこまで伸びる可能性が高いので回収してまた割り当ててをするよりは割り当てっぱなしにしたほうが良いという設計思想になってるので全体のメモリが足りている限りスタックが浅いところまで戻ってきても実メモリを回収しないという のが現代的な OS。
逆に言えば全体のメモリが足りなくなってきたら回収することもあるんだけど。
素人感覚だとメモリをなるべく空くようにするのが「メモリの無駄を防ぐ」という意識の人がいるんだけど、存在するメモリが使われないままになってるほうがもったいないんだ。
それとたとえば Linux だとスタックの大きさは 8MB が上限というのがデフォ。
これは OS 側の設定なのでアプリケーション側では (OS の設定をいじる権限がない限りは) どうにもできない。
8MB ってめちゃくちゃ少ないように感じるかもしれないけどだいたいこんなもんで足りちゃうんだよ。
409デフォルトの名無しさん
2024/06/27(木) 16:39:29.50ID:EaS5WQGi >>406の書いてる「縮む」はVecで言うところのcapacityじゃなくてlenっぽくない?
ムーブとの関連がよくわからんけど
ムーブとの関連がよくわからんけど
410デフォルトの名無しさん
2024/06/27(木) 17:46:10.67ID:6+Lg0PcZ >>407
ですな
ですな
411デフォルトの名無しさん
2024/06/27(木) 17:59:42.80ID:AKJ8/1zo 低レイヤのメモリの取り扱いモデルが確立している高級言語が C/C++ くらいしかなくて、 LLVM も汎用的なフレームワークのふりして思ったほど自由ではないので Rust の言語仕様が LLVM の都合に、 C/C++ の都合に引っ張られているところはまあまあある。
412デフォルトの名無しさん
2024/06/27(木) 18:20:02.76ID:veLj9zg3 つまりC++同様、ポインタの糖衣構文としての参照?
413デフォルトの名無しさん
2024/06/27(木) 18:50:13.20ID:veLj9zg3 あ、なるほど
&mutみたいに*mutって書けば実体を扱えるわけか
&mutみたいに*mutって書けば実体を扱えるわけか
414デフォルトの名無しさん
2024/06/27(木) 18:56:27.59ID:RLHdjniL いつものことながら妙なこと書く人はだいたいThe Book(本物)を読んでないよな
415デフォルトの名無しさん
2024/06/27(木) 19:07:01.79ID:inDwmtnT そんなの読むような真面目な人間は5chに来ない
416デフォルトの名無しさん
2024/06/27(木) 20:08:52.27ID:AKJ8/1zo >>412
まあ機械語レベルの低レイヤまでいけば参照もポインタも同じっちゃおなじだけど、構文糖だという認識は明確に誤りだ。
参照がポインタの構文糖なんて書いてあるデタラメ本で C++ を学んだのなら C++ の理解も全然できてないと思う。
または書いてないことを脳内で作り出すタイプのやつは誤った方向に邁進してどうにもならなくなったところで質問したりするから言ってることが意味不明になりやすい。
仮に(あくまでも仮にだが!)言ってる理屈自体が正しかったとしてもちゃんとした用語でいってくれないと伝わらないし、ちゃんとした用語は(一次資料に基づいた)ちゃんとした資料で学ばないと身に付かん。
まあ機械語レベルの低レイヤまでいけば参照もポインタも同じっちゃおなじだけど、構文糖だという認識は明確に誤りだ。
参照がポインタの構文糖なんて書いてあるデタラメ本で C++ を学んだのなら C++ の理解も全然できてないと思う。
または書いてないことを脳内で作り出すタイプのやつは誤った方向に邁進してどうにもならなくなったところで質問したりするから言ってることが意味不明になりやすい。
仮に(あくまでも仮にだが!)言ってる理屈自体が正しかったとしてもちゃんとした用語でいってくれないと伝わらないし、ちゃんとした用語は(一次資料に基づいた)ちゃんとした資料で学ばないと身に付かん。
417デフォルトの名無しさん
2024/06/27(木) 22:40:30.91ID:TDzAch9x >>406
そのmoveについてもmoveというRust上の概念の理解のみがRustを学習&利用していく上で必要となるよ
moveによる生成コードがどのようになるかは最適化の方法の変更や進化で変わり得る話だから確定することはできず、学ぶこともできない
こんな場合に現在はたまたまこんな生成コードになっていることだけは実験などでわかるけど今後の保証はない、としか言えない
だからmoveはmoveとして理解することが唯一の正解でしょう
そのmoveについてもmoveというRust上の概念の理解のみがRustを学習&利用していく上で必要となるよ
moveによる生成コードがどのようになるかは最適化の方法の変更や進化で変わり得る話だから確定することはできず、学ぶこともできない
こんな場合に現在はたまたまこんな生成コードになっていることだけは実験などでわかるけど今後の保証はない、としか言えない
だからmoveはmoveとして理解することが唯一の正解でしょう
418デフォルトの名無しさん
2024/06/27(木) 22:43:00.49ID:QXPbo1LF どうせChatGPTの回答を使い回してるだけだろ
419デフォルトの名無しさん
2024/06/27(木) 22:45:03.57ID:QXPbo1LF420デフォルトの名無しさん
2024/06/27(木) 23:03:07.98ID:TDzAch9x Rustの各概念を無理矢理なC/C++と結びつけようとしたり生成コードと対応させようとしてる人々がRustを難しいと言ってるようにみえる
そんなことをせずに各概念の理解だけに集中すればRustはシンプルに出来ていてわかりやすい言語だと理解できるよ
そんなことをせずに各概念の理解だけに集中すればRustはシンプルに出来ていてわかりやすい言語だと理解できるよ
421デフォルトの名無しさん
2024/06/27(木) 23:34:16.52ID:AKJ8/1zo C/C++ だと抽象機械という概念を挟む形で仕様化されてる。
言語の挙動を抽象的な (架空の) 機械の動作として記述していて、それを実際の機械とどう対応させるかは知らんけど見かけ上の動作が仕様通りなら良しとする規定。
だから最適化を豪快にやっても結果が同じなら言語仕様に反しない。
で、抽象機械っていうのはある程度は現実のコンピュータを想定はしているけど細かいところは意図的にうやむやにして選択の余地を残してる。
C/C++ には言語仕様としてはスタックもヒープも存在せず書いてあるのは寿命についてのルールだけで、それをどういう形で実現するかは自由……
なんだけど現実にはスタックとヒープを使い分けるとちょうどいいような仕組みになってる。
C/C++ の言語仕様に低レイヤのメモリアクセスのことも確かに書いてあるんだ。
でもそれは抽象的な機械のことであって本物の機械のことじゃない。
でもある程度は対応しているという絶妙なバランスで成り立ってる。
Rust では言語の高レイヤの話と低レイヤの話の間を取り持つ理屈がまだ十分に整理されてないと思う。
言語の性質上、やっぱり低レイヤを全く意識しないで上手く使えるようなものでもないし、低レイヤのことを考えるのもそれなりには必要だと思う。
必要なんだけど意識的にレイヤを分けて考えられないなら混乱するのも確かなので、 (少なくとも最初は) 低レイヤのことは忘れろというのは理に適った助言だと思う。
言語の挙動を抽象的な (架空の) 機械の動作として記述していて、それを実際の機械とどう対応させるかは知らんけど見かけ上の動作が仕様通りなら良しとする規定。
だから最適化を豪快にやっても結果が同じなら言語仕様に反しない。
で、抽象機械っていうのはある程度は現実のコンピュータを想定はしているけど細かいところは意図的にうやむやにして選択の余地を残してる。
C/C++ には言語仕様としてはスタックもヒープも存在せず書いてあるのは寿命についてのルールだけで、それをどういう形で実現するかは自由……
なんだけど現実にはスタックとヒープを使い分けるとちょうどいいような仕組みになってる。
C/C++ の言語仕様に低レイヤのメモリアクセスのことも確かに書いてあるんだ。
でもそれは抽象的な機械のことであって本物の機械のことじゃない。
でもある程度は対応しているという絶妙なバランスで成り立ってる。
Rust では言語の高レイヤの話と低レイヤの話の間を取り持つ理屈がまだ十分に整理されてないと思う。
言語の性質上、やっぱり低レイヤを全く意識しないで上手く使えるようなものでもないし、低レイヤのことを考えるのもそれなりには必要だと思う。
必要なんだけど意識的にレイヤを分けて考えられないなら混乱するのも確かなので、 (少なくとも最初は) 低レイヤのことは忘れろというのは理に適った助言だと思う。
422デフォルトの名無しさん
2024/06/27(木) 23:40:56.83ID:ZCM59EGi C/C++の方こそ誤魔化しているぜ
そのため未定義動作だらけだ
Rustはわかりやすく抽象的に明確だ
そして未定義動作もない
そのため未定義動作だらけだ
Rustはわかりやすく抽象的に明確だ
そして未定義動作もない
423デフォルトの名無しさん
2024/06/27(木) 23:46:01.41ID:AKJ8/1zo 未定義動作の話をしてはいないよ。
低レイヤとの間をどう取り持つかの話をしてる。
低レイヤとの間をどう取り持つかの話をしてる。
424デフォルトの名無しさん
2024/06/27(木) 23:53:14.85ID:iyfRmZdF Rustは低レイヤにも対応している
高い抽象度によるプログラミングもできる
高い抽象度のプログラミングにおいて低レイヤとの対応付けは不要であってやるべきではない
高い抽象度によるプログラミングもできる
高い抽象度のプログラミングにおいて低レイヤとの対応付けは不要であってやるべきではない
425デフォルトの名無しさん
2024/06/27(木) 23:56:31.92ID:lXX+GpEL オジーw
426デフォルトの名無しさん
2024/06/28(金) 00:09:40.45ID:uAgz1Jdl >>424
その論を許すなら Rust は OS やデバイスドライバを書くのには使えない言語であってよいという立場になるが、そうじゃないよね?
その論を許すなら Rust は OS やデバイスドライバを書くのには使えない言語であってよいという立場になるが、そうじゃないよね?
427デフォルトの名無しさん
2024/06/28(金) 00:16:19.92ID:hS2q8k+h428デフォルトの名無しさん
2024/06/28(金) 00:20:27.61ID:uAgz1Jdl >>427
低レイヤを書くための仕様が確立していなくて今はなんとなく書けているという状態を「できる」と称していいならそうだね。
低レイヤを書くための仕様が確立していなくて今はなんとなく書けているという状態を「できる」と称していいならそうだね。
429デフォルトの名無しさん
2024/06/28(金) 00:28:00.38ID:UvqDoogo430デフォルトの名無しさん
2024/06/28(金) 00:48:52.30ID:uAgz1Jdl >>429
実用的に問題があって、機能できていない。
Rust の仕様に明るくて低レイヤのメカニズムに明るくても Rust で OS は書けないから。
現状では Rust の実装に明るいという要素が求められていて、ある程度はそういうものかもしれないけど仕様 (というか文書化というべきかな) の明確化が十分とは言えない。
実用的に問題があって、機能できていない。
Rust の仕様に明るくて低レイヤのメカニズムに明るくても Rust で OS は書けないから。
現状では Rust の実装に明るいという要素が求められていて、ある程度はそういうものかもしれないけど仕様 (というか文書化というべきかな) の明確化が十分とは言えない。
431デフォルトの名無しさん
2024/06/28(金) 00:57:19.20ID:UvqDoogo432デフォルトの名無しさん
2024/06/28(金) 01:04:07.98ID:0ko0Zb9B そういえばRedoxの開発は今どうなってるんだろ
433デフォルトの名無しさん
2024/06/28(金) 01:21:44.32ID:uAgz1Jdl434デフォルトの名無しさん
2024/06/28(金) 01:57:43.66ID:/H5n5ha9 流れを切って申し訳ないんだけど
Rustってディープラーニングのプログラムを作るのに実用的な段階に来てる?
まだ一部の物好きが書いてるだけ?
Rustってディープラーニングのプログラムを作るのに実用的な段階に来てる?
まだ一部の物好きが書いてるだけ?
435デフォルトの名無しさん
2024/06/28(金) 02:39:42.33ID:OzTZZFgl 自分
Rustってディープラーニングのプログラムを作るのに実用的な段階に来てる?
まだ一部の物好きが書いてるだけ?
Copilot
Rustでディープラーニングのプログラムを作ることは可能ですが、まだ一部のエンジニアが実験的に取り組んでいる段階と言えます。具体的には、『ゼロから作るDeep Learning』の内容をRustで実装する試みや、Deep LearningのフレームワークDeZeroをRustで実装する試みなどがあります。
これらの試みは、Pythonで書かれたディープラーニングのコードをRustに翻訳し、Rustの学習やディープラーニングの理解を深めるためのものです。しかし、これらの実装はあくまで個々のエンジニアの学習目的で行われており、一般的なディープラーニングの実装にRustが広く使われているわけではありません。
Rustはパフォーマンスが高く、メモリ安全な言語であるため、ディープラーニングの実装にも適していると言えます。しかし、Pythonのように豊富なディープラーニングライブラリが存在しないため、現状ではディープラーニングの実装にはPythonが主に使われています。
Rustでのディープラーニングの実装が一般的になるかどうかは、今後のRustコミュニティの活動やディープラーニングの研究動向によるところが大きいでしょう。
Rustってディープラーニングのプログラムを作るのに実用的な段階に来てる?
まだ一部の物好きが書いてるだけ?
Copilot
Rustでディープラーニングのプログラムを作ることは可能ですが、まだ一部のエンジニアが実験的に取り組んでいる段階と言えます。具体的には、『ゼロから作るDeep Learning』の内容をRustで実装する試みや、Deep LearningのフレームワークDeZeroをRustで実装する試みなどがあります。
これらの試みは、Pythonで書かれたディープラーニングのコードをRustに翻訳し、Rustの学習やディープラーニングの理解を深めるためのものです。しかし、これらの実装はあくまで個々のエンジニアの学習目的で行われており、一般的なディープラーニングの実装にRustが広く使われているわけではありません。
Rustはパフォーマンスが高く、メモリ安全な言語であるため、ディープラーニングの実装にも適していると言えます。しかし、Pythonのように豊富なディープラーニングライブラリが存在しないため、現状ではディープラーニングの実装にはPythonが主に使われています。
Rustでのディープラーニングの実装が一般的になるかどうかは、今後のRustコミュニティの活動やディープラーニングの研究動向によるところが大きいでしょう。
436デフォルトの名無しさん
2024/06/28(金) 02:47:01.21ID:/H5n5ha9 >>435
さっそくの返信ありがとうございます
> 今後のRustコミュニティの活動やディープラーニングの研究動向
がどうなってるかを聞きたかったんですがどんな感じですか?
libtorchバインディングのtorch-rsや
ほぼ純Rust製のcandleが出てきたのはわかったんですが
まだ周辺ライブラリが足りない感じです?
さっそくの返信ありがとうございます
> 今後のRustコミュニティの活動やディープラーニングの研究動向
がどうなってるかを聞きたかったんですがどんな感じですか?
libtorchバインディングのtorch-rsや
ほぼ純Rust製のcandleが出てきたのはわかったんですが
まだ周辺ライブラリが足りない感じです?
437デフォルトの名無しさん
2024/06/28(金) 03:31:36.21ID:OzTZZFgl 少なくとも俺よりはAIの方が物知りだから自分でAIに聞いた方がいいと思う
論文の検証を論文と異なる言語ではしないでしょぅ
NCNNやDarkNetを超えるエンジンがあるわけではなし
NCNNやDarkNetを超えるエンジンがあるわけではなし
439デフォルトの名無しさん
2024/06/28(金) 05:55:26.25ID:OzTZZFgl >>417
関数の引数にオブジェクト(Copy型でない型)を渡す際は参照渡しが基本で、
うっかり所有物を引数として渡すと所有権ごと関数の向こうへ移動してしまって二度と戻って来ない
これは逆に、関数が何らかの実体を返り値として返す際には便利
とまあネチネチ考えてればわかってくるもんだよ
関数の引数にオブジェクト(Copy型でない型)を渡す際は参照渡しが基本で、
うっかり所有物を引数として渡すと所有権ごと関数の向こうへ移動してしまって二度と戻って来ない
これは逆に、関数が何らかの実体を返り値として返す際には便利
とまあネチネチ考えてればわかってくるもんだよ
440デフォルトの名無しさん
2024/06/28(金) 07:54:27.71ID:diDidYCE >>422
unsafeを無視しちゃいかんよ。
unsafeを無視しちゃいかんよ。
441デフォルトの名無しさん
2024/06/28(金) 09:41:44.10ID:RD8xbJnt 型がガチガチの言語でdeepnetの実装するのは面倒な割に生産性薄いわ
442デフォルトの名無しさん
2024/06/28(金) 09:45:48.57ID:uAgz1Jdl 仕組みがまだ確立してなくて試行錯誤があるなら型で制約しまくるのは面倒なだけだけどもうそういう段階じゃないのなら型で固めたほうが (使い方の間違いが検出されやすいので) 生産性高いよ。
443デフォルトの名無しさん
2024/06/28(金) 12:27:02.70ID:4Cbqp0xY >>441
C++/C#/Javaとの比較はともかく、LLとの比較は目指すところが違うでしょ。
Rustは組み込みやOSまでカバーする言語。
医療用機器とか、自動車とか、命に関わるような分野でバグを入れないための言語なんだから。
金融も同じようなものだけど、そっちはOCamlの実績(みずほ)があるのでRustである必要は必ずしもは無い。
C++/C#/Javaとの比較はともかく、LLとの比較は目指すところが違うでしょ。
Rustは組み込みやOSまでカバーする言語。
医療用機器とか、自動車とか、命に関わるような分野でバグを入れないための言語なんだから。
金融も同じようなものだけど、そっちはOCamlの実績(みずほ)があるのでRustである必要は必ずしもは無い。
444デフォルトの名無しさん
2024/06/28(金) 13:07:10.53ID:gx/r5usH LLとかいう死語を使ってるのは複オジだけだぞ
445デフォルトの名無しさん
2024/06/28(金) 13:32:56.61ID:3PtwFBGo >>441
ささっと数行書くスクリプトでなければ静的型付け言語が生産性高いよ
ささっと数行書くスクリプトでなければ静的型付け言語が生産性高いよ
446デフォルトの名無しさん
2024/06/28(金) 17:07:56.21ID:v8X9ZSBd うい。40のおっさんよん(^_-)
まあ、プロトタイプは動的型言語で作って、本番のコードは静的型言語で作るなんて常識なんだから、若い人じゃなければ
> 型がガチガチの言語でdeepnetの実装するのは面倒な割に生産性薄いわ
何てこと書かないわな…。
まあ、プロトタイプは動的型言語で作って、本番のコードは静的型言語で作るなんて常識なんだから、若い人じゃなければ
> 型がガチガチの言語でdeepnetの実装するのは面倒な割に生産性薄いわ
何てこと書かないわな…。
447デフォルトの名無しさん
2024/06/28(金) 18:51:50.94ID:y+eGYcxn 今のご時世にプロトタイプは動的言語とか言ってるのは頭の硬いジジイか、ジジイの本でしか勉強出来ない馬鹿がほとんどなんだよなあ
448デフォルトの名無しさん
2024/06/28(金) 19:09:29.56ID:v8X9ZSBd 出来る人ならそれで良いし、それで>>441の言うように生産性が低いと感じないなら全然かまわない。
馬鹿馬鹿言うけど、そういう馬鹿にも作らせないといけないし、それでも作れない救えない奴はリストラするしか道が無い。
馬鹿馬鹿言うけど、そういう馬鹿にも作らせないといけないし、それでも作れない救えない奴はリストラするしか道が無い。
449デフォルトの名無しさん
2024/06/28(金) 19:58:03.61ID:pImSoiYg 動的型でプロトは結局本番で書き直す時間など取れないから机上の空論ってのが最近の認識では
最初から静的型にするか、どうしようもなくなるまで動的型で耐えるかの2択じゃないかな
まぁたいていのスタートアップは耐えられなくなる前に潰れるからそれを見越して動的型というのはありだと思うが
最初から静的型にするか、どうしようもなくなるまで動的型で耐えるかの2択じゃないかな
まぁたいていのスタートアップは耐えられなくなる前に潰れるからそれを見越して動的型というのはありだと思うが
450デフォルトの名無しさん
2024/06/28(金) 20:05:28.17ID:3PtwFBGo スタートアップ企業であろうと
動的型付け言語を使うのは開発効率が悪い
動的型付け言語を使うのは開発効率が悪い
451デフォルトの名無しさん
2024/06/28(金) 20:36:15.04ID:v8X9ZSBd んー…。
おっさん的には関数単位でテスト出来るかどうかが問題であって、プロトタイプは動的か静的かの問題じゃない気がするな。
最近は静的型言語でもインタラクティブシェル(略語忘れた)のインタプリタで関数単位でプロトタイプ作ってテストして、上手くいけばビルドって流れだし。
そういうのが無い言語は今でもプロトタイプは動的言語で作って…ないわw
場合によるな。
すでに作り方を知ってたらいきなり静的型言語で書くし、何か思いついたけど確信が持てない。みたいな時(試行錯誤が予想される)は動的型言語でプロトタイプ書いてるかな。
(静的型言語にインタラクティブシェルが無い時)
おっさん的には関数単位でテスト出来るかどうかが問題であって、プロトタイプは動的か静的かの問題じゃない気がするな。
最近は静的型言語でもインタラクティブシェル(略語忘れた)のインタプリタで関数単位でプロトタイプ作ってテストして、上手くいけばビルドって流れだし。
そういうのが無い言語は今でもプロトタイプは動的言語で作って…ないわw
場合によるな。
すでに作り方を知ってたらいきなり静的型言語で書くし、何か思いついたけど確信が持てない。みたいな時(試行錯誤が予想される)は動的型言語でプロトタイプ書いてるかな。
(静的型言語にインタラクティブシェルが無い時)
452デフォルトの名無しさん
2024/06/29(土) 03:44:24.89ID:pz5Aaald453デフォルトの名無しさん
2024/06/29(土) 09:52:45.11ID:H9n2Ca7a 少人数で超大規模なシステムを作るのには Common Lisp が向いてるみたいな話もある (実際に使われてる) けど、それはプログラマが超人なだけじゃないのみたいな話もあってあまり一般化した話には出来んな。
454デフォルトの名無しさん
2024/06/29(土) 10:24:54.66ID:PsPEDCdZ 権利あるいは義務が移動することを物理メモリで説明するのは難しいが
実行時型情報みたいにいちいちメモリを消費して情報を管理すれば
物理で説明できないこともない
そのためには動的言語の知識も役に立つ
実行時型情報みたいにいちいちメモリを消費して情報を管理すれば
物理で説明できないこともない
そのためには動的言語の知識も役に立つ
455デフォルトの名無しさん
2024/06/29(土) 11:40:57.14ID:VzEkAlY7 実際機械学習でc++でもjavaでもほとんど使われてないってのに、やっぱ静的解析バカが多いんだなここ
456デフォルトの名無しさん
2024/06/29(土) 12:11:39.54ID:hrAqOO+e Pythonでも”静的解析”は普通に使ってるだろw
自分が書いてる用語くらいは学んどけよww
自分が書いてる用語くらいは学んどけよww
457デフォルトの名無しさん
2024/06/29(土) 12:15:59.49ID:bAOaGwrv ダックタイプあれば動的でも静的でもあんまり変わらん。ビルド時間の違いくらいか。
実装初期は設計の柔軟性を確保できればいい。まぁ、アダプタでなんとかするのが妥当なところかもしれんが。
実装初期は設計の柔軟性を確保できればいい。まぁ、アダプタでなんとかするのが妥当なところかもしれんが。
458デフォルトの名無しさん
2024/06/29(土) 12:40:22.21ID:tytG9AfV オーナーシップとライフタイムの関係でGC言語なら簡単なリファクタリングがRustでは大手術が必要になることがよくある
大手術すぎて根本的なリファクタリングに着手できてない例もよく見かける
ここでいってるプロトタイプとは少し意味が違うがPython等でプロトタイプ作ってRust化する人がある一定程度いるのはプロトタイピング時にボローチェッカーで時間を浪費するよりも言語変えた方が効率がいいと考えられてるから
この辺はRustのメリットとデメリットを考えた使い分け
大手術すぎて根本的なリファクタリングに着手できてない例もよく見かける
ここでいってるプロトタイプとは少し意味が違うがPython等でプロトタイプ作ってRust化する人がある一定程度いるのはプロトタイピング時にボローチェッカーで時間を浪費するよりも言語変えた方が効率がいいと考えられてるから
この辺はRustのメリットとデメリットを考えた使い分け
459デフォルトの名無しさん
2024/06/29(土) 12:42:41.17ID:OVmXtfXA ダックタイピングがあれば良いが、Pythonのダックタイピングはライブラリの型が壊れているからダメ
あと、ダックタイピングの不満を消していくとTraitになるから出来ればTraitの方が良い
あと、ダックタイピングの不満を消していくとTraitになるから出来ればTraitの方が良い
460デフォルトの名無しさん
2024/06/29(土) 13:28:37.21ID:7275QU0+ >>458
そういうRustでのリファクタリングならば大手術にならない
メモリ保有を適切な位置に移したり分解したりするなどの単純なリファクタリングで済んでいる
それにより保守性もデバッグ効率も上がるためリファクタリングコストは誤差に等しい
仮にGC言語で書いている時でも同様でその状態は各データが複雑に絡み合っている状態なのでリファクタリングしたほうが望ましい
そういうRustでのリファクタリングならば大手術にならない
メモリ保有を適切な位置に移したり分解したりするなどの単純なリファクタリングで済んでいる
それにより保守性もデバッグ効率も上がるためリファクタリングコストは誤差に等しい
仮にGC言語で書いている時でも同様でその状態は各データが複雑に絡み合っている状態なのでリファクタリングしたほうが望ましい
461デフォルトの名無しさん
2024/06/29(土) 13:38:30.46ID:xx5BdVU7 ダックタイピングがあるってどういう状態のことだろう
462デフォルトの名無しさん
2024/06/29(土) 14:06:46.53ID:H9n2Ca7a リファクタリングの原則のひとつとして外側から見たときに変わらないというのがある。
内と外を分ける境界線がどこなのかというのは場合によるので UI レベルで同じなら良しとすることもあるけど、普通は適当なモジュール単位でやるだろう。
「変わらない」ことの保証のひとつとして型やライフタイムアノテーションは頼りになるよ。
型システムがあてにならないほどの大改革ならどうせ全部書き直しなので足を引っ張られることもない。
内と外を分ける境界線がどこなのかというのは場合によるので UI レベルで同じなら良しとすることもあるけど、普通は適当なモジュール単位でやるだろう。
「変わらない」ことの保証のひとつとして型やライフタイムアノテーションは頼りになるよ。
型システムがあてにならないほどの大改革ならどうせ全部書き直しなので足を引っ張られることもない。
463デフォルトの名無しさん
2024/06/29(土) 14:24:33.15ID:lbQtaoAJ Rustはリファクタリングには全く向いていない
464デフォルトの名無しさん
2024/06/29(土) 14:31:05.74ID:dyJ1RvLM いつも汚いコードを貼り付けてた複オジがリファクタリングは簡単などと言い張ったところで全く説得力がない
465デフォルトの名無しさん
2024/06/29(土) 14:38:55.22ID:pz5Aaald 数のイテレータで遊んで満足してる人に機械学習の文脈が理解できるわけないやん?
466デフォルトの名無しさん
2024/06/29(土) 14:41:30.81ID:Kxp5xIIU 掲示板に貼れる程度の内容なら
リファクタリングしても知れてるでしょ
リファクタリングしても知れてるでしょ
467デフォルトの名無しさん
2024/06/29(土) 15:08:40.24ID:BT1eNZRh >>463
Rustはリファクタリングに向いている言語だよ
リファクタリングで最も重要なことはその前後で同じ機能動作が保証されることだけど
そこで静的型付け言語が有利なことは当たり前としてRustのアクセス競合排他原則がさらに大きく効いてるよ
データ書き換え中の読み取りによるバクがリファクタリングによって入り込むことも防いでくれているね
Rustはリファクタリングに向いている言語だよ
リファクタリングで最も重要なことはその前後で同じ機能動作が保証されることだけど
そこで静的型付け言語が有利なことは当たり前としてRustのアクセス競合排他原則がさらに大きく効いてるよ
データ書き換え中の読み取りによるバクがリファクタリングによって入り込むことも防いでくれているね
468デフォルトの名無しさん
2024/06/29(土) 15:23:13.20ID:PsPEDCdZ デジタル小作人やめるレベルの大手術ではなく
地主との関係が変わらないことを保証したいんだな
地主との関係が変わらないことを保証したいんだな
469デフォルトの名無しさん
2024/06/29(土) 15:34:20.66ID:KH8yb7Br それまで参照を持たなかった構造体にメンバとして参照を持たせると、型にジェネリックライフタイムが付いて、その型の使用箇所全部でライフタイムを書く必要がある
さらに悪いことに、実際のところこれは必要ではなく、ライフタイムを書かなくても省略されていると見なされてコンパイルが通ることもある
しかしこれでは意図通りのライフタイムになっていないことが多く、その型の使用箇所を増やしたときに初めてそのことに気づくことになる
Rust特有のリファクタリングしづらさは、あるよ
さらに悪いことに、実際のところこれは必要ではなく、ライフタイムを書かなくても省略されていると見なされてコンパイルが通ることもある
しかしこれでは意図通りのライフタイムになっていないことが多く、その型の使用箇所を増やしたときに初めてそのことに気づくことになる
Rust特有のリファクタリングしづらさは、あるよ
470デフォルトの名無しさん
2024/06/29(土) 15:52:41.67ID:jlQztVvs ライフタイム関連に限らずRustのリファクタリングは
他言語に比べて波及する範囲が大きくなりやすいんだよね
それで作業量が多いからしんどい
しんどさと難しさは必ずしもイコールではないんだけど
サクサク変更できる言語を経験してると
Rustのリファクタリング時には精神的なエネルギーが相当必要
他言語に比べて波及する範囲が大きくなりやすいんだよね
それで作業量が多いからしんどい
しんどさと難しさは必ずしもイコールではないんだけど
サクサク変更できる言語を経験してると
Rustのリファクタリング時には精神的なエネルギーが相当必要
471デフォルトの名無しさん
2024/06/29(土) 16:01:57.62ID:obFhbebh >>469
リファクタリングの作業の大きさに対して、必要なライフタイム注釈を付けるだけの些細なことが障害になったことはないな。
ライフタイム注釈が'aになるか'_になるか省略できるかは、その必要性と省略ルールに基づくだけなので、そこで問題が発生することはないだろう。
リファクタリングの作業の大きさに対して、必要なライフタイム注釈を付けるだけの些細なことが障害になったことはないな。
ライフタイム注釈が'aになるか'_になるか省略できるかは、その必要性と省略ルールに基づくだけなので、そこで問題が発生することはないだろう。
472デフォルトの名無しさん
2024/06/29(土) 16:03:28.89ID:obFhbebh >>470
Rustでは様々なことをコンパイラチェックに任せられるため、リファクタリングで最も崩れにくく、人間の負担は他より小さい。
Rustでは様々なことをコンパイラチェックに任せられるため、リファクタリングで最も崩れにくく、人間の負担は他より小さい。
473デフォルトの名無しさん
2024/06/29(土) 16:10:10.85ID:FxtNCeeF 糠に釘
暖簾に腕押し
複オジにRust
暖簾に腕押し
複オジにRust
474デフォルトの名無しさん
2024/06/29(土) 16:52:22.95ID:KH8yb7Br >>471
「ライフタイム注釈が'aになるか'_になるか省略できるか」は、すべての使用箇所ごとに以下を検討したうえで決まる
* 追加するライフタイムは既存のライフタイムと同じであるべきか
* 既存と同じであるべきでないなら、そのライフタイムはどこで宣言すべきか(impl? fn? トレイトや構造体?)
それで1つの型がリファクタリングできたところで、
* トレイトや構造体にジェネリックライフタイムパラメータを追加した場合、そいつにも同じ作業がいる。最初から繰り返し
ここまでのすべての作業に尋常でない集中力が必要になる
繰り返しの中でライフタイムの宣言箇所の選択が誤っていたことに後で気づいたりすると悲惨だ
「エラーのあるコードをgit commitしない方が良い」という思い込みを捨て、選択を必要とするタイミングでgitに記録するようにして、
作業効率は安定はするようになったが、それでも作業を捨てるというのは気が滅入る
「あ、この関数の引数にライフタイム追加することになるけど、後で戻り値にもライフタイム追加することになるな」なんて思っても一挙に作業してはいけない
少なくとも自分の頭では作業の段取りを崩すだけだった
そしてここまでを全集中して完了してコンパイルを通すところまで持って行けても、クレート外の使用箇所でおかしなことにならないことは保証できない
ボローチェッカーは書かれている使用法が妥当であるかどうかしか検証しないからだ
こっちは体験談として言っているんだから、机上の空論を弄するのはもうやめなさい
「ライフタイム注釈が'aになるか'_になるか省略できるか」は、すべての使用箇所ごとに以下を検討したうえで決まる
* 追加するライフタイムは既存のライフタイムと同じであるべきか
* 既存と同じであるべきでないなら、そのライフタイムはどこで宣言すべきか(impl? fn? トレイトや構造体?)
それで1つの型がリファクタリングできたところで、
* トレイトや構造体にジェネリックライフタイムパラメータを追加した場合、そいつにも同じ作業がいる。最初から繰り返し
ここまでのすべての作業に尋常でない集中力が必要になる
繰り返しの中でライフタイムの宣言箇所の選択が誤っていたことに後で気づいたりすると悲惨だ
「エラーのあるコードをgit commitしない方が良い」という思い込みを捨て、選択を必要とするタイミングでgitに記録するようにして、
作業効率は安定はするようになったが、それでも作業を捨てるというのは気が滅入る
「あ、この関数の引数にライフタイム追加することになるけど、後で戻り値にもライフタイム追加することになるな」なんて思っても一挙に作業してはいけない
少なくとも自分の頭では作業の段取りを崩すだけだった
そしてここまでを全集中して完了してコンパイルを通すところまで持って行けても、クレート外の使用箇所でおかしなことにならないことは保証できない
ボローチェッカーは書かれている使用法が妥当であるかどうかしか検証しないからだ
こっちは体験談として言っているんだから、机上の空論を弄するのはもうやめなさい
475デフォルトの名無しさん
2024/06/29(土) 16:58:20.78ID:KH8yb7Br Rustはライフタイムさえ正しく書けていれば本当に有用な助けを与えてくれる
しかしライフタイムを正しく書くための助けはほとんど与えてくれないので、自分で書く必要があるときには上と同じような期待をしてはいけない
しかしライフタイムを正しく書くための助けはほとんど与えてくれないので、自分で書く必要があるときには上と同じような期待をしてはいけない
476デフォルトの名無しさん
2024/06/29(土) 16:59:51.95ID:TiydCxUm 知ったかぶりして間違ったこと書く
やんわり間違いを指摘される
反省せずに開き直る!
またこの流れ
ググればすぐわかるような間違いなのになんなんだろうな
やんわり間違いを指摘される
反省せずに開き直る!
またこの流れ
ググればすぐわかるような間違いなのになんなんだろうな
477デフォルトの名無しさん
2024/06/29(土) 17:06:14.07ID:HTwQ17U9478デフォルトの名無しさん
2024/06/29(土) 17:17:23.37ID:KH8yb7Br >>477
いいからこれでも読んでろ
https://github.com/pretzelhammer/rust-blog/blob/master/posts/translations/jp/common-rust-lifetime-misconceptions.md
> Rustのトレイトオブジェクトへのライフタイム省略ルールはどんな状況でも正しいというわけではない
> Rustはプログラムの意味についてプログラマよりも知っているわけではない
> Rustのコンパイラが吐くエラーメッセージでおすすめされる修正はコンパイルが通るようにするが、コンパイルが通り、 かつ プログラムへの要求をちゃんと満たしたものするわけではない
いいからこれでも読んでろ
https://github.com/pretzelhammer/rust-blog/blob/master/posts/translations/jp/common-rust-lifetime-misconceptions.md
> Rustのトレイトオブジェクトへのライフタイム省略ルールはどんな状況でも正しいというわけではない
> Rustはプログラムの意味についてプログラマよりも知っているわけではない
> Rustのコンパイラが吐くエラーメッセージでおすすめされる修正はコンパイルが通るようにするが、コンパイルが通り、 かつ プログラムへの要求をちゃんと満たしたものするわけではない
479デフォルトの名無しさん
2024/06/29(土) 17:26:08.00ID:3fxfEuZj それは省略ルールの結果が望むものと一致するかどうかは限らないという意味だぜ
間違っていると部分的にはコンパイルが通ったとしてもプログラム全体ではコンパイルエラーとなる
そのミスをコンパイラが見逃すことはない
間違っていると部分的にはコンパイルが通ったとしてもプログラム全体ではコンパイルエラーとなる
そのミスをコンパイラが見逃すことはない
480デフォルトの名無しさん
2024/06/29(土) 18:07:09.50ID:PsPEDCdZ 言語を比較しなくても
&Tに比べてRc<T>はリファクタリングしやすいとかいう認識でいいよな
ただ進化論じゃないんだから&Tが淘汰されてRc<T>が生き残るということはない
言語を比較すれば淘汰される言語もありうる
&Tに比べてRc<T>はリファクタリングしやすいとかいう認識でいいよな
ただ進化論じゃないんだから&Tが淘汰されてRc<T>が生き残るということはない
言語を比較すれば淘汰される言語もありうる
481デフォルトの名無しさん
2024/06/29(土) 18:13:00.59ID:E9RFAyQx >>469
その逆のリファクタリングを影響範囲が大き過ぎて無理って話をcargoのissueで見たことある
cargoはそれ以外でも技術的負債が溜まってるけど影響範囲が大きくなるから簡単に手を入れられないってことを中の人がよくボヤいてるね
その逆のリファクタリングを影響範囲が大き過ぎて無理って話をcargoのissueで見たことある
cargoはそれ以外でも技術的負債が溜まってるけど影響範囲が大きくなるから簡単に手を入れられないってことを中の人がよくボヤいてるね
482デフォルトの名無しさん
2024/06/29(土) 18:24:11.81ID:bsok8bJg C/C++をメモリ安全にするプロジェクト
https://www.itmedia.co.jp/enterprise/articles/2406/28/news084.html
Rustイラネになりそう
https://www.itmedia.co.jp/enterprise/articles/2406/28/news084.html
Rustイラネになりそう
483デフォルトの名無しさん
2024/06/29(土) 18:44:47.93ID:4ikwzvl0484デフォルトの名無しさん
2024/06/29(土) 20:21:20.41ID:U1RWDnMp >>480
Rc<T>の比較対象はTやBox<T>
・Tの参照は&T
・Box<T>の参照は&T
・Rc<T>の参照は&T
どれも同じになり&Tは不要とならない
違いはスコープから外れたとき
裸のTはTがスタック上ですぐ消える
Box<T>はTがヒープ上ですぐ消える
Rc<T>はTがヒープ上でカウンタが最後のときだけ消える
Rc<T>の比較対象はTやBox<T>
・Tの参照は&T
・Box<T>の参照は&T
・Rc<T>の参照は&T
どれも同じになり&Tは不要とならない
違いはスコープから外れたとき
裸のTはTがスタック上ですぐ消える
Box<T>はTがヒープ上ですぐ消える
Rc<T>はTがヒープ上でカウンタが最後のときだけ消える
485デフォルトの名無しさん
2024/06/29(土) 20:23:11.41ID:KH8yb7Br >>469
これか……
https://github.com/rust-lang/cargo/issues/7342
> I think the answer here is "Alex thought it was fun to avoid RefCell and Mutex", there's no real technical motivation.
「cloneを避ける/ロックを避ける/参照カウンタのコストを避ける」みたいなゼロコスト主義も節度を持ってやれってことね
とりあえず「型のジェネリックライフタイム引数を変更するのは多大なコストがかかる」という理解は合っていると思っておくことにするか
これか……
https://github.com/rust-lang/cargo/issues/7342
> I think the answer here is "Alex thought it was fun to avoid RefCell and Mutex", there's no real technical motivation.
「cloneを避ける/ロックを避ける/参照カウンタのコストを避ける」みたいなゼロコスト主義も節度を持ってやれってことね
とりあえず「型のジェネリックライフタイム引数を変更するのは多大なコストがかかる」という理解は合っていると思っておくことにするか
486デフォルトの名無しさん
2024/06/29(土) 20:23:40.20ID:KH8yb7Br >>481だった
487デフォルトの名無しさん
2024/06/29(土) 21:57:07.55ID:PsPEDCdZ 問題は節度というより抽象化軽視
ゼロコストという損得勘定に強く依存するよりは高コスト抽象化の方がマシ
と判断できなくなる
ゼロコストという損得勘定に強く依存するよりは高コスト抽象化の方がマシ
と判断できなくなる
488デフォルトの名無しさん
2024/06/29(土) 22:55:28.22ID:xDrSJDK+ >>469
それは単にライフタイムに不慣れなだけじゃないかなと思った
構造体に参照を含むのはよくあることでライフタイムパラメタを付けるだけ
あとは関数で参照を含むデータを返す時にどの引数に由来するかを指定することなどしかすべきことはない
慣れてしまうと大したことはしていないよね
そこでもし間違えて指定してしまっても違反があればコンパイラが必ずエラーとするので安心して大丈夫
では何故コンパイラが自動で指定(解釈)してくれないのか?というと、複数の参照に対して別扱いするかどうかや複数の関係指定など各自に方針の余地があるため
それは単にライフタイムに不慣れなだけじゃないかなと思った
構造体に参照を含むのはよくあることでライフタイムパラメタを付けるだけ
あとは関数で参照を含むデータを返す時にどの引数に由来するかを指定することなどしかすべきことはない
慣れてしまうと大したことはしていないよね
そこでもし間違えて指定してしまっても違反があればコンパイラが必ずエラーとするので安心して大丈夫
では何故コンパイラが自動で指定(解釈)してくれないのか?というと、複数の参照に対して別扱いするかどうかや複数の関係指定など各自に方針の余地があるため
489デフォルトの名無しさん
2024/06/29(土) 23:12:35.54ID:/LX7F2Md C/C++だとそのへんを脳内の方針で逸脱しないように人間が監視しないといけない
Rustは楽
Rustは楽
490デフォルトの名無しさん
2024/06/29(土) 23:26:59.72ID:PsPEDCdZ 固定長配列をスライスに、BoxをRcに変換すると抽象度は上がる
失敗するかもしれないパターンマッチは抽象度を下げる
コンパイル時または実行時エラーかもしれないborrowも抽象度を下げる
失敗するかもしれないパターンマッチは抽象度を下げる
コンパイル時または実行時エラーかもしれないborrowも抽象度を下げる
491デフォルトの名無しさん
2024/06/30(日) 02:58:29.53ID:CdZYHoVj492デフォルトの名無しさん
2024/06/30(日) 03:44:32.65ID:K2J9qaLk493デフォルトの名無しさん
2024/06/30(日) 05:54:25.07ID:WATrci3L >>309
横からすみません。
C#を関数型っぽく書いたら、ここまではなったのでRustだったらどうなるのか聞いても良いでしょうか?
public static void Main(string[] args) { args.ToList().ForEach(f); }
static void f(string fileName)
{
Console.WriteLine(fileName);
File.ReadAllLines(fileName).Select(g).ToList().ForEach(Console.WriteLine);
}
static Func<string,int,string> g = (line,i) => $"{i + 1,2}:{line}";
横からすみません。
C#を関数型っぽく書いたら、ここまではなったのでRustだったらどうなるのか聞いても良いでしょうか?
public static void Main(string[] args) { args.ToList().ForEach(f); }
static void f(string fileName)
{
Console.WriteLine(fileName);
File.ReadAllLines(fileName).Select(g).ToList().ForEach(Console.WriteLine);
}
static Func<string,int,string> g = (line,i) => $"{i + 1,2}:{line}";
494デフォルトの名無しさん
2024/06/30(日) 09:33:23.06ID:L3wyoKVN どうもならんよ
495デフォルトの名無しさん
2024/06/30(日) 10:12:23.11ID:BLjMhwlM リファクタリングのすごさは、外側から見たら何も変化しないことだからね
496デフォルトの名無しさん
2024/06/30(日) 10:30:41.18ID:8eFU1ITU497デフォルトの名無しさん
2024/06/30(日) 10:53:06.05ID:DQMdIUg4 あえて >>493 で頑張ると
https://paiza.io/projects/sk40IXUgPm0k_VgI1wsHBg
fn main() {
let cwln = |s| { println!("{}", s) };
let g = |(i, line): (usize, &str)| { format!("{:>2}:{}", i + 1, line) };
let f = |file_name: String| {
cwln(file_name.clone());
std::fs::read_to_string(file_name).map(|u8b| {
u8b.lines().enumerate().map(g).for_each(cwln)
}).unwrap()
};
std::env::args().skip(1).for_each(f)
}
https://paiza.io/projects/sk40IXUgPm0k_VgI1wsHBg
fn main() {
let cwln = |s| { println!("{}", s) };
let g = |(i, line): (usize, &str)| { format!("{:>2}:{}", i + 1, line) };
let f = |file_name: String| {
cwln(file_name.clone());
std::fs::read_to_string(file_name).map(|u8b| {
u8b.lines().enumerate().map(g).for_each(cwln)
}).unwrap()
};
std::env::args().skip(1).for_each(f)
}
498デフォルトの名無しさん
2024/06/30(日) 10:54:12.53ID:BLjMhwlM do記法のたぐいはラムダで実装しても命令型で実装してもどっちでもいい
外側から見れば同じだからだ
外側から見れば同じだからだ
499デフォルトの名無しさん
2024/06/30(日) 11:17:03.52ID:msuugTQH >>496
.net標準にはList型にしかForEachが導入されてないからやな。
C#ではチェインメソッドにしないほうがいいとされてる。
https://learn.microsoft.com/en-us/archive/blogs/ericlippert/foreach-vs-foreach
.net標準にはList型にしかForEachが導入されてないからやな。
C#ではチェインメソッドにしないほうがいいとされてる。
https://learn.microsoft.com/en-us/archive/blogs/ericlippert/foreach-vs-foreach
500デフォルトの名無しさん
2024/06/30(日) 12:31:43.09ID:NR+aRvdr >>499
「.ForEachしたいけど標準にないからToListする」という考え方が間違い
enumerable.ToList().ForEach()のパターンは最悪
それとそのEric Rippertの意見がMSやC#コミュニティのコンセンサスというわけではないよ
IEnumerable以外ではForEach等の副作用適用メソッドが標準で用意されてるものが多々あるしIEnumerableに拡張メソッド追加して使ってるところもごまんとある
「.ForEachしたいけど標準にないからToListする」という考え方が間違い
enumerable.ToList().ForEach()のパターンは最悪
それとそのEric Rippertの意見がMSやC#コミュニティのコンセンサスというわけではないよ
IEnumerable以外ではForEach等の副作用適用メソッドが標準で用意されてるものが多々あるしIEnumerableに拡張メソッド追加して使ってるところもごまんとある
501デフォルトの名無しさん
2024/06/30(日) 13:08:54.78ID:7wkc/L2e >>497
キツイ
キツイ
■ このスレッドは過去ログ倉庫に格納されています
ニュース
- 中国側が首相答弁の撤回要求、日本側拒否 [夜のけいちゃん★]
- 中国の局長は「両手をポケット」で対峙 宣伝戦で国民に示す ★3 [蚤の市★]
- 日本行き空路49万件キャンセル 中国自粛呼びかけ 日本行きチケット予約の約32%に相当 ★4 [ぐれ★]
- 映画「鬼滅の刃」の興行収入急減、日本行き航空券大量キャンセル…中国メディア報道 [蚤の市★]
- 【音楽】Perfume・あ~ちゃんの結婚相手「一般男性」は吉田カバンの社長・吉田幸裕氏(41) 高身長で山本耕史似 [Ailuropoda melanoleuca★]
- 「タワマン天国」に飛びつく若者…SNSに転がる「成功体験」に続けるのか 湾岸エリアの業者が語った現実 [蚤の市★]
- 【悲報】日本人錯乱「集団的自衛権行使に賛成。けど自衛隊を戦わせるのは反対」 [237216734]
- 【悲報】高市効果で「1ドル=160円」が相場へwwwwwwwwwwwwwwwwwwwwwwwwwwwww 止まらぬ高市円安💥💥 [871926377]
- 小川彩佳アナ「高市総理はここまで影響が出ることを想像して発言したんでしょうか」高市ソルジャー「!!!!(シュババババ)」 [931948549]
- 今来た遊戯王やってる奴スレ
- FGOで好きなサーヴァントがアビゲイル、北斎、楊貴妃なんだが
- 自閉症が「んなっしょい」と連呼するお🏡
