Rust part29

■ このスレッドは過去ログ倉庫に格納されています
1デフォルトの名無しさん
垢版 |
2025/05/03(土) 00:47:30.13ID:phVJ5tWC
公式
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 part28
https://mevius.5ch.net/test/read.cgi/tech/1742805420/

ワッチョイスレ
プログラミング言語 Rust 4【ワッチョイ】
https://mevius.5ch.net/test/read.cgi/tech/1514107621/
2025/05/04(日) 22:01:03.15ID:hRPtBNkv
>>69
詭弁はよろしくない
derive_builderは自分で初期化関数を書く必要がない
他の方法では初期化関数を書く必要がありヒューマンエラーが入り込む余地があるのはその通りだ
利便性も良くてその問題が生じないderive_builderが優れている
2025/05/04(日) 22:02:35.26ID:YbSG8qnS
>>71
ストローマン論法だな

こちらの主張していない内容を勝手に作り出してそれで話を続けている
2025/05/04(日) 22:08:16.17ID:YbSG8qnS
初期化関数はビルダーパターンのメソッドの適用ミスで容易に起こりうる 重複、順序ミス、記述漏れに対して有用
初期化関数自体は一回書くだけ

各所で必要になる単純なオブジェク生成の場面ではビルダーパターンはヒューマンエラーが入り込む恐れがある
それを初期化関数で行えばIDEの補助を得られるのでミスが減る
2025/05/04(日) 22:21:31.66ID:abvIudxv
>>73
先ほどから主張しているderive_builderを使わなければIDEの補助が得られるからミスが減るの意味がわからない
derive_builderを使えば初期化関数の用意はお任せなので提供側のミスはない
利用側はデフォルト値以外の値指定をしたい時にそのメソッド候補がIDEなどで補助があるのでミスが起きようがない
derive_builderを使った方が提供側も利用側もよいのではないか
2025/05/04(日) 22:24:30.81ID:V3G8dKZI
まだバグを起こす前の時期に、バグを起こしやすい習慣をやめない、まつもとなかいがいたとする
その時点で彼らをどのように処分したいのかね
2025/05/04(日) 22:33:13.89ID:YbSG8qnS
>>74
ストローマン論法をやめなされ

初期化関数を使うと指定の重複、順序ミス、記述漏れが起こりにくいのは事実だろう
まず単純な初期化関数で指定の重複が起こるのか?
func( a,b,c,d....にたいしてaを重複指定させられるのか?
これすら判らないなら話すだけ無駄
2025/05/04(日) 22:35:21.33ID:YbSG8qnS
「~しなされ」っていうのって少なくとも80歳以上じゃないかと
2025/05/04(日) 22:42:41.94ID:abvIudxv
>>76
derive_builderで提供された場合も問題は起きないよね
仮にそのaを重複指定してしまい
.a(123)
.a(123)
と書いてもバグは起きない
可読性もよいからそれ自体を起こさないね

derive_builderは提供側も利用側もデメリットがなく最も良い方法にみえる
もっと良い方がある?
2025/05/04(日) 22:44:40.17ID:YbSG8qnS
>>78
.a(123)
.a(321)

で始めの123が正しい場合問題になる
2025/05/04(日) 22:50:43.73ID:abvIudxv
>>79
aを123で初期化したいなら前者しか起きようがない
aを321で初期化したいなら後者しか起きようがない
そんなナンセンスな指摘しかデメリットらしきものを見つけることが出来なかったということは
derive_builderが最も良い方法であることを認めたと理解してよろしいか
2025/05/04(日) 22:50:51.74ID:V3G8dKZI
the bookによるとnewtypeパターンってのがあって
traitをimplすることが目的みたいだけど
どうにかすれば名前つき引数にも使えそうなんだよね
2025/05/04(日) 22:51:05.55ID:YbSG8qnS
順序ミスについて
これは前スレでも書いたのを再掲

.G(p[0]).R(p[1]).B(p[2]).build()
のところを容易に
.R(p[0]).G(p[1]).B(p[2]).build()と間違えて
さらに
.R(p[0]).R(p[1]).B(p[2]).build()と間違える

色指定でよく目にするのはRGB方式だけどコンピュータービジョンなどではBRGがよく使われる
最初にGRBとして覚えていても実際各段階になるとRGBと混同することがある

初期化関数では
func(P[0],P[1],P[2],...
等で考えなくても書き間違える可能性が低い それにIDEの補助でパラメーターについてポップアップが出るのでそれでも間違いは減る
バグに気が付いて書き直す際に2か所の書き換えをしないで
.R(p[0]).R(p[1]).B(p[2]).build() と言う間違いも入り込みやすい
2025/05/04(日) 22:53:00.11ID:YbSG8qnS
書いてるそばから間違えている
BGRが正しい
2025/05/04(日) 22:55:04.07ID:YbSG8qnS
>>80 の疑問については
>>82 で書いたようなミスで重複と記述漏れが発生する

そういうところまで考えたことないだろ?コーディングしてる?
2025/05/04(日) 22:57:59.52ID:abvIudxv
>>82
その比較はおかしい
デフォルト値以外のみを指定して初期化する話なのだから
それは✕ func(P[0], P[1], P[2],...
これが○ func(R=P[0], G=P[1], B=P[2], ...
2025/05/04(日) 23:00:32.68ID:YbSG8qnS
記述漏れについては
n個パラメーターを指定しないといけないのにn-1個しか記述していない場合
目で見てn個すべて指定したのかn-1個指定したのかなんて数が多くなると判らない

これは初期化関数では基本的に起こらない
数が多いとやはり大変だけどIDEの補助があったりコンパイル時にエラーがでる

ビルダーパターンでは実行時エラーや思った挙動にならない時点でしかミスに気が付かない
2025/05/04(日) 23:01:35.79ID:YbSG8qnS
>>85
誰もそんな縛りは指定していない
普通に初期化関数使えばよい
2025/05/04(日) 23:05:28.74ID:YbSG8qnS
これ以降ストローマン論法禁止
2025/05/04(日) 23:05:37.33ID:hRPtBNkv
オプション値の初期化の話だもんな
必須値の初期化の話ならRustでも
fn foo(red: Type, green: Type, blue: Type)
とするだけなのでderive_builderは使わない
だから>>82の指摘は間違ってる
2025/05/04(日) 23:09:07.67ID:YbSG8qnS
>>89
それはお爺さんにもわかりやすいように簡易化して書いているからだろ

ビルダーパターンは上にあげたようなヒューマンエラーを誘発する仕組みなので基本的に使わない方が良い
2025/05/04(日) 23:11:26.83ID:YbSG8qnS
生成に柔軟性があり複雑な場合にはビルダーパターンを適用するのは良い
一般的なオブジェクト生成に対してはヒューマンエラーに弱くアンチパターン
2025/05/04(日) 23:13:07.88ID:abvIudxv
>>87
プログラミングの基本的なことを理解していないのかい?
derive_builderを使うようなオプションで必要な項目だけ値を指定して初期化するケースを1つの初期化関数を単体で済ませようとすると
どんなプログラミング言語でもキーワード付きオプション引数を使うことになる
具体的にはf(1, 2, 3, option1=111, option5=222)などの指定方式になる
option5など名前を指定しないとどの項目を指定しているのか区別がつかないためだ
2025/05/04(日) 23:15:31.49ID:YbSG8qnS
>>92
その指定だとしても重複は大体の言語ではエラーになる
ビルダーパターンは重複を検知しないのでヒューマンエラーが入り込む
2025/05/04(日) 23:20:45.80ID:hRPtBNkv
>>91
オプション初期化のない一般的なオブジェクト生成でderive_builderを使う人はそりゃいないよ
それは普通にRustでも引数固定の初期化関数でおしまい

前スレを読んだけど最初から特定項目だけオプション初期化する話
だからderive_builderが最も優れているという結論になってる
2025/05/04(日) 23:21:18.11ID:YbSG8qnS
>>94
重複すら検知できないのに?
2025/05/04(日) 23:26:47.62ID:YbSG8qnS
重複を検知するには内部にフラグを持たなくてはならない
もちろんこれは実行時エラーになる
2025/05/04(日) 23:30:18.53ID:YbSG8qnS
実行時エラーを検出するにはテストで網羅しなくてはならない
2025/05/04(日) 23:40:27.55ID:YbSG8qnS
我々はコンパイル時にエラーが検出されるのを利点としてRustを使っている
それなのに実行時エラーに頼らざるを得ないビルダーパターンは劣っている
2025/05/04(日) 23:45:58.01ID:GqHoJEAc
結局、話をまとめると
ビルダーパターンで
foo()
 .item1(value1)
 .item3(value3)
 .item7(value7)
と書くか

名前付きオプション引数で
foo(
 item1=value1,
 item3=value3,
 item7=value7,
)
と書くか

これだけの違いだよな
どちらも変わらん慣れだけの問題
どちらも見た通りなので指定ミスや重複ミスなど起きようがない

あとはそれらを提供するライブラリ側だ
いずれも普通は初期化関数を自分で書かなければならない
Rustでderive_builderを使えば構造体に属性を付けるだけで済みシンプルかつミスも起きない
少なくとも現状でderive_builderに欠点は見つかっておらず最善な方法であるといえる
2025/05/04(日) 23:55:20.08ID:YbSG8qnS
>>99
結局何も見なかった利かなかったふりして自分のいいように矮小化し続けてるな
呆れるよ
80代になると何も感じなくなるのだろうか
2025/05/04(日) 23:58:47.69ID:GqHoJEAc
的外れな言いがかりでスレを荒らしてる人は
derive_builderより良い方法を具体的にコードで示せ
2025/05/04(日) 23:59:41.54ID:YbSG8qnS
精神論で間違いは発生しないと言うのは容易
間違えたら間違えた人間が悪いと言う

ビルダーパターンには結局ヒューマンエラーを防ぐように十分な対策がなされていないだろ
わかっていながら無視をする
c++精神だね
2025/05/05(月) 00:00:40.76ID:jqQPAhm/
>>101
ファクトリーパターンなどを使えばよい
メソッドの種類を充実させるだけだ
2025/05/05(月) 00:03:11.76ID:jqQPAhm/
ビルダーパターンはヒューマンエラーに弱い
毎回論理的構造を構築しなければならないがそこにバグが紛れ込む可能性がある

それよりも初期化のための関数を作るべき
2025/05/05(月) 00:03:28.63ID:+OgYhFfL
derive_builderは全自動だからミス起きなくね?
derive_builderより好いのがあるならコードを出して
2025/05/05(月) 00:05:02.99ID:jqQPAhm/
おじいちゃんは乱心して同じことを何度も書いて来る
普通の人間にはすでに書かれた内容で理解出来るのに知らないふりして実行時エラーやバグを許容している
2025/05/05(月) 00:06:42.46ID:jqQPAhm/
これも相手の疲労を狙ってくるくだらないやり口なんだろうと思うが
2025/05/05(月) 00:07:25.49ID:H9yekDq7
>>104
そんな方法は存在しないよ
>>99が挙げてる二つの方法しかない
もしあるなら同様のコード例を示そう
2025/05/05(月) 00:08:38.62ID:jqQPAhm/
他のスレでもでもおじいちゃん的書き込みを見ることがある
それに対して80代ではと書くと100%反論される

今回は反論されないところを見るとやはり80代以上なんだろうなと
2025/05/05(月) 00:09:40.80ID:jqQPAhm/
>>108
> それよりも初期化のための関数を作るべき
これが全てだろう?
いくら何でも馬鹿すぎるだろう?判らないの?
2025/05/05(月) 00:10:41.78ID:Eyx6FHs7
Builderはオプションの追加実装が破壊的な変更にならないメリットがあるな
生成関数に全部渡す方式だとパラメータが増えて破壊的になる
新しい生成関数を追加すれば破壊的にはならないけど
オプション追加する度に生成関数増やすのはあほくさい

>>103
もし暇だったら↓のRegexBuilderをFactoryで実装する場合の関数の個数を見積もってくれ
https://docs.rs/regex/latest/regex/struct.RegexBuilder.html
2025/05/05(月) 00:12:00.84ID:H9yekDq7
>>110
今回のようなケースで初期化のための関数は>>99が挙げてる二つの方法しかない
もし他に存在するなら同様のコード例を示そう
2025/05/05(月) 00:15:57.46ID:jqQPAhm/
なんで自分にレスしてんの?
2025/05/05(月) 00:19:17.48ID:jqQPAhm/
>>111
他の言語でもRegexは普通にメソッドを使って解決してるけど…
長いならregexoption構造体作って指定したらよいだろう?他ではそうしてる物もある
2025/05/05(月) 00:20:28.67ID:jqQPAhm/
Rustしか使ったことがない前提なのかな

さすがに馬鹿の相手をするのは疲れてきた…
2025/05/05(月) 00:21:44.77ID:jqQPAhm/
おじいちゃんは他の言語は使えないの?しょうもない雑魚レベルの質問しかしないのはなんで?
2025/05/05(月) 00:29:27.74ID:J617bx8A
デフォルト値に対して必要分だけオプション指定したい場合
まともな方法はどのプログラミング言語を使って>>99のどちらかの方式になる
まともではない方法としてはオプションの有無ごとの組み合わせ数の分だけ大量の関数を用意する手もあるけど論外だ
2025/05/05(月) 00:41:54.17ID:jqQPAhm/
何で間違ってることを繰り返すの?

macroで重複チェック可能なbuilderは書けるとか書いてこないのは意外なんだけど
2025/05/05(月) 00:53:11.08ID:jqQPAhm/
実行時チェックの話もchatGPTの方がまともで面白い回答や提案をしてくれる
2025/05/05(月) 00:56:27.23ID:Eyx6FHs7
>>118
設定値の重複チェックとか誰も気にしないからでは
重複設定によるバグとか生成関数に渡す引数の順番を間違えるバグと同じくらい起こりにくいし
2025/05/05(月) 01:00:46.13ID:EffckoF6
一部の必須値の設定を忘れるケースは普通にあるでしょ
2025/05/05(月) 01:09:30.63ID:v8V26/QO
>>121
必須値は様々な対応が取れるため問題は起きない
・オプションにしない
・全体の整合チェックの一貫として必須値の有無の判断を入れる
・ビルド最終メソッドで指定する (ex. std::fs::OpenOptions::open)
2025/05/05(月) 01:17:39.76ID:Eyx6FHs7
一番オーソドックスなのが抜けてるな
RegexBuilderの場合はRegexBuilder::new()にパターン文字列を渡してる
2025/05/05(月) 01:21:35.04ID:v8V26/QO
>>123
先頭の「オプションにしない」が
その最初に必須値を渡す意味
わかりにくてすまん
フォローサンクス
2025/05/05(月) 08:29:59.12ID:EffckoF6
名前付き引数であれば必須パラメータも名前付きで渡せるため順番の間違いによるミスが発生しづらく可読性も高い
derive_builderを使う以上は必須パラメータもメソッドで渡すしかなく実行時エラーの可能性が排除できないしチェックのために余計なランタイムコストを払う必要がある
文句はderive_builder作者に言ってきた方がいいぞ
2025/05/05(月) 08:39:51.80ID:jqQPAhm/
狂信者には何を言っても無駄であり論理的な考えを持ち合わせていない
こちらがいくら論拠を提示してもRustが正しいderive_builderが正しいとそんなミスは起こりえないと繰り返すのみ

正しくないのはお前の頭だろう
2025/05/05(月) 08:41:20.98ID:PDh+rYm1
ビルド方式に問題はない
既出のstd::fs::OpenOptions::open()や
regex::RegexBuilder::new()など
Rustはビルド方式でも対応しており問題になっていない

>>125
名前付き引数であろうとなかろうとバリデーションは必要でそれは実行時エラーとなる
そしてResultを返すから実行時エラーで問題ない
2025/05/05(月) 08:42:39.33ID:S3aML2VS
>>82
順序ミス対策なら
.rgb(p[0], p[1], .p[2]).build()
でいいんじゃね?
Rustてこういうのできないんだっけ?
2025/05/05(月) 08:45:40.37ID:jqQPAhm/
>>127
> 少なくとも現状でderive_builderに欠点は見つかっておらず最善な方法であるといえる

じゃなかったのか?方針変えたのか?
130デフォルトの名無しさん
垢版 |
2025/05/05(月) 08:49:55.75ID:3AfvJi9A
“イリヤ神”がまたやった 動画生成AI「FramePack」が革命的なワケ
2025年05月05日 07時00分更新
https://ascii.jp/elem/000/004/267/4267160/
 4月17日に登場した動画生成AIプログラム「FramePack(フレームパック)」が世界的に衝撃を与えています。PCローカル環境で動画AIを動かすには、少なくともビデオメモリー(VRAM)が12GBあるビデオカードを搭載していないと難しいというのが常識でした。ところが、VRAM 6GBでも安定的に動作させられるため、一気に動画AIの裾野を広げそうです。開発したのは、画像生成AI分野で「ControlNet」や、使いやすいツール「Fooocus」などを開発してきたことで知られる、スタンフォード大学に在籍中のIllyasviel(イリヤスフィール、以下イリヤ)さん。既存の方法論にまったく違ったアプローチでブレイクスルーを引き起こす、“イリヤ神”のアプローチに再び注目が集まっています。
中略
 AI動画を作ってみたいけれども、スペックが足りないために諦めていたという人が次々に自前の環境で試すようになってきました。既にワンパッケージでインストールできる環境も整えられているため、スタートも簡単です。様々なファイルをダウンロードしてくるため、初期設定は2時間くらいは見ておく必要があるものの、圧倒的にハードルが下がりました。
2025/05/05(月) 08:51:02.82ID:jqQPAhm/
>>127
名前付き引数のミスは大体言語でコンパイルエラーになるので的外れ
ビルダーパターンより安全性が高いだろ
2025/05/05(月) 08:51:16.55ID:RIr+9vrd
>>126
Rustが間違っていると主張したいなら問題点と代替策を述べればよい
本当にそれが示せるならRustはIT大手各社も用いているため世界中にインパクトを与えられるぞ
この我々の5chのやりとりすらRust製のPingoraを経由しているほどネットインフラ各所でもRustは使われている
2025/05/05(月) 08:52:25.13ID:jqQPAhm/
>>132
何言ってるんだよ
最後の一行が全てだろ
2025/05/05(月) 08:53:13.86ID:jqQPAhm/
本当に暇さえあれば関係ない話題で誤魔化そうとするよな
脳がストローマン論法で浸食されているんだろ
2025/05/05(月) 08:53:53.74ID:S3aML2VS
それよりもbuilderパターンは初期化時の情報指定漏れをコンパイルエラーにできないのがRustらしくないと思う。
2025/05/05(月) 08:54:21.19ID:RIr+9vrd
>>128
個別パラメータとして与える必要がないからその通り
Rustの言語仕様としてはそれで制限ない
そのライブラリの仕様ならタプルにすればよい
2025/05/05(月) 08:55:05.06ID:Nqd+X/r+
>>127
なるほど、実行時に他のバリデーションするからタイプセーフでなくていいと君は考えるわけね
それはそれで一理あるが、だったら君が使うべき言語は静的型付け言語ではなくRubyなどのゆるふわ言語だな
さようなら
2025/05/05(月) 08:56:18.75ID:jqQPAhm/
ビルダーパターンで疑似カリー化が行えるのが利点なのにタプル化するって
わざわざ手足を縛ることになるけど
2025/05/05(月) 08:56:40.00ID:RIr+9vrd
>>135
勘違いしていないか?
必要とはされないオプションが有る時にビルダーパターンが使われる
2025/05/05(月) 08:58:33.63ID:RIr+9vrd
>>138
それマジで言ってるならRustでプログラミングしたことがないんだな
タプルで扱うのが正解
これがわからないならfor文すら書いたことがないのだろう
2025/05/05(月) 08:59:24.57ID:Nqd+X/r+
>>139
それは一部必須パラメータが依然として存在することと矛盾しない
2025/05/05(月) 09:01:01.47ID:jqQPAhm/
>>140
もはや話がかみ合ってないな
疑似カリー化で個々のパラメータを指定してその他のパラメータをここに設定した生成物を作れるのが利点だという意味が判らないのかな
これは重複を許容する使用法
2025/05/05(月) 09:02:05.60ID:RIr+9vrd
>>141
必須パラメータの事例はさっき出てただろ

>> std::fs::OpenOptions::open()
>> regex::RegexBuilder::new()

これで対応できている
誰もが使っていて問題となったことはない
2025/05/05(月) 09:04:25.68ID:RIr+9vrd
>>142
カリー化の意味すら理解できてないのか?
Rustでカリー化ならばクロージャを使う
ちなみにビルダーパターンはビルダー構造体のまま変わらずカリー化は行わない
2025/05/05(月) 09:07:05.32ID:EffckoF6
>>143
だからそれはderive_builderの作者に言ってくれ
それに前から言ってるが必須パラメータの数が増えればミスが増えるし可読性も落ちる
2025/05/05(月) 09:07:28.43ID:jqQPAhm/
>>144
ストローマン論法
疑似カリー化と書いてるだろ?

derive_builderは正しいと繰り返していたのにすでに複おじになかったことにされている
2025/05/05(月) 09:10:38.57ID:jqQPAhm/
微妙に論点をずらしたり相手の言ってないことに対して批判したり
本当にずっとストローマン論法続けてるよなあ
複おじいさん

ストローマン論法はやめなされw
2025/05/05(月) 09:11:10.84ID:RIr+9vrd
>>137
Rustは静的型付けだから常にタイプセーフだよ
それらの例は引数の型が合ってなければ当然コンパイルエラーとなる
一方で引数の値が合っているかどうかは構造体の方針だから当然コンパイルエラーにできず実行時エラーとなる
2025/05/05(月) 09:13:10.00ID:RIr+9vrd
>>145
何を言いたいのかわからない
fsやregexの話を作者に伝える?
そんなの知ってるだろ
2025/05/05(月) 09:15:12.07ID:RIr+9vrd
>>146
カリー化は定義もメリットもはっきりしていて幅広く使われてきているが
その疑似カリー化とやらも定義もメリットもわからない
無意味なことをしようとしていないか?
2025/05/05(月) 09:17:40.24ID:jqQPAhm/
>>150
見ればわかるだろうw疑似カリー化が何を意味しているのかぐらい

そういう議論のための議論を繰り返してなんになるんだよ
2025/05/05(月) 09:24:52.62ID:RIr+9vrd
>>151
だから疑似カリー化の定義とメリットを明確にしてくれ
少なくともこの件のrgbバラバラにするのはメリットないどころかデメリットだぞ

>>128
>> 順序ミス対策なら
>> .rgb(p[0], p[1], .p[2]).build()
>> でいいんじゃね?
2025/05/05(月) 09:29:59.66ID:jqQPAhm/
>>152
こちらのID辿ってみたらいい
2025/05/05(月) 09:37:07.71ID:jqQPAhm/
>>62
>>68

複おじはderive_builderを全力で支持
初期化関数は全否定していた

ところが…
2025/05/05(月) 10:05:55.48ID:n6fK3gUl
> .R(p[0]).G(p[1]).B(p[2]).build()

これ3つとも指定が必要ならメソッドを分けるべきではないと思う
それ以前にRustのプログラミングしたことないのかメソッド大文字は置いとくにしても
この場合ならp[0]はRust的な使用方法ではないな
(r, g, b)もしくはRGB構造体で持つかその参照で持つのが普通
p[i]はなるべく避けてイテレータ時点でポインタを動かして参照で持つか小さいなら値で持つ
構造があるならその構造で持つ
そのためp[i]の形が出てきたらRustでは少し臭うため怪しみ避けられないか考える
2025/05/05(月) 10:33:19.28ID:20YqVkB+
>>75
>まつもとなかい

うby界隈のmatzとそのとりまきか?
2025/05/05(月) 10:58:23.25ID:EffckoF6
>>155
> これ3つとも指定が必要ならメソッドを分けるべきではないと思う
おっ
derive_builderって必須パラメータをランタイムチェックとはいえ個別setterの形で適切に扱えるというのが重要なコンセプトなんだけど、ここにきて全否定か
2025/05/05(月) 11:07:31.16ID:20YqVkB+
>>128
>.rgb(p[0], p[1], .p[2]).build()

重複を主張する人の場合
.rgb(p[0], p[1], .p[2]).b(3).g(4).r(5).g(6).b(7).build()
みたいな間違いが起こるんだと思うよ
2025/05/05(月) 11:07:36.46ID:aemkUy0l
ボクシングには蹴り技がない
それは重要なコンセプトだと考えていた時期が俺にもありました
2025/05/05(月) 11:10:17.68ID:jqQPAhm/
コンパイラでうまくいかないから規約で縛ると言うことだろ?ビルダーパターンを導入する意義とどんどん崩れていく

RGB各値は指定が必須とは限らない
defaltで各値が0指定されていて同じなら書く必要がないだう
初期化関数では場合によっては記述する必要があるけどそれも必須ではない

疑似カリー化で少しずつパラメーターの違う複数のオブジェクト生成を行う場合にも便利
2025/05/05(月) 11:19:55.94ID:upfK5ln+
f(
 red=red,
 green=green,
 blue=blue,
)

f()
 .red(red)
 .green(green)
 .blue(blue)

どちらの方式でも間違えようがないと思うんだが
ミスが起きると言ってる人はどういうミスを想定してるのだろう
2025/05/05(月) 11:28:12.80ID:jqQPAhm/
red=p[0]; //p[0]は実際はblue
green=p[1];
blue=p[0]; // コピペの修正漏れ
2025/05/05(月) 11:28:24.28ID:EffckoF6
>>161
今更そんなところを理解できてなかったのか?
greenの指定を忘れたら前者はコンパイルエラー、後者は実行時エラー
2025/05/05(月) 11:35:07.99ID:jqQPAhm/
>>162
これの悩ましいところは後ろのコピペ修正漏れでblueに正しいp[0]が指定されているので
原因が判断しにくいところ
2025/05/05(月) 11:41:36.57ID:upfK5ln+
>>163
前者と後者は同じ
greenの指定をしなくてもコンパイルエラーとならない
greenは指定しなかった場合にデフォルト値となるオプション引数
2025/05/05(月) 11:44:04.39ID:EffckoF6
>>165
知らんがな
俺は必須パラメータの問題を指摘している
2025/05/05(月) 11:44:39.10ID:upfK5ln+
>>162
p[0]やp[1]など
可読性の悪いコードを書くやつは失格
p.red p.green p.blueにしろ
2025/05/05(月) 11:45:55.35ID:jqQPAhm/
>>167
dataと言うバイト列の中の一部だとしたら?
2025/05/05(月) 11:47:59.01ID:upfK5ln+
>>166
おっちょこちょいだな
直前のこれを見ろ
必須ではなくオプションパラメーターだ

>>160
> RGB各値は指定が必須とは限らない
> defaltで各値が0指定されていて同じなら書く必要がない
2025/05/05(月) 11:50:23.87ID:upfK5ln+
>>168
バイト列?
各8bitなのか各16bitなのかそれ以上なのかそれでは構造がわからん
ちゃんと構造体の列にするべきだ
■ このスレッドは過去ログ倉庫に格納されています
5ちゃんねるの広告が気に入らない場合は、こちらをクリックしてください。

ニューススポーツなんでも実況