公式
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 part26
https://mevius.5ch.net/test/read.cgi/tech/1726838318/
ワッチョイスレ
プログラミング言語 Rust 4【ワッチョイ】
https://mevius.5ch.net/test/read.cgi/tech/1514107621/
Rust part27
■ このスレッドは過去ログ倉庫に格納されています
1デフォルトの名無しさん
2024/12/02(月) 22:32:50.31ID:D+1pIyvG291デフォルトの名無しさん
2025/02/25(火) 18:17:51.25ID:AwfAD5GP かつてカーネルを正しく修正した結果として (保証してない挙動に依存した) 間違ったアプリケーションのいくつかがまともに動かなくなったことがある。
そのときに Linux の理念としては技術的合理性でユーザー体験を損なってはならないということで間違っているアプリケーションに合わせて互換性が維持された。
ユーザは一方的な利用者に過ぎずカーネルに口出ししないなんてことはない。
絶対に、絶対に、絶対に、カーネルに口出しするよ。
まあそれが良いか悪いかは知らんけどな。
そのときに Linux の理念としては技術的合理性でユーザー体験を損なってはならないということで間違っているアプリケーションに合わせて互換性が維持された。
ユーザは一方的な利用者に過ぎずカーネルに口出ししないなんてことはない。
絶対に、絶対に、絶対に、カーネルに口出しするよ。
まあそれが良いか悪いかは知らんけどな。
292デフォルトの名無しさん
2025/02/25(火) 18:41:48.14ID:XvTpfGzl293デフォルトの名無しさん
2025/02/26(水) 04:07:17.14ID:m7ecN2qb >>290
そういうデマを言うやつがいるとコミュニティー全体が嫌われるから止めるべき。
Linusが言っているのはせいぜい「Rustコードのメンテナじゃないだろ」ぐらいの話で、Linuxメンテナ失格とは全く言っていない。むしろメンテナが自分のメンテナンス範囲をCコードだけにするのを肯定している。
今回の件も、C APIユーザーとしてのRustコードがCコードとは独立した形で別のメンテナにメンテナンスされるんじゃないんかね。
そういうデマを言うやつがいるとコミュニティー全体が嫌われるから止めるべき。
Linusが言っているのはせいぜい「Rustコードのメンテナじゃないだろ」ぐらいの話で、Linuxメンテナ失格とは全く言っていない。むしろメンテナが自分のメンテナンス範囲をCコードだけにするのを肯定している。
今回の件も、C APIユーザーとしてのRustコードがCコードとは独立した形で別のメンテナにメンテナンスされるんじゃないんかね。
294デフォルトの名無しさん
2025/02/26(水) 19:09:22.06ID:ixFc3NBv 着実にRust APIを増やしていこう
脱libc
脱libc
295デフォルトの名無しさん
2025/02/27(木) 14:26:32.38ID:VQNvJTxh Rustは清書用
296デフォルトの名無しさん
2025/02/27(木) 21:14:53.56ID:z3E1gBHI じゃあRoughって言語も要るな
297デフォルトの名無しさん
2025/02/27(木) 23:34:31.56ID:8PL54Hpa Rustはリファクタリングでの安定度も他より極めて高くて開発効率が良いので
まずは雑に書いて後から可読性を上げたり拡張性を上げたり実行効率性を上げたり普通に行われているね
まずは雑に書いて後から可読性を上げたり拡張性を上げたり実行効率性を上げたり普通に行われているね
298デフォルトの名無しさん
2025/02/28(金) 08:15:36.47ID:rekq6zs6 >>296
クレート境界をダックタイピング化した言語が欲しいわ。
クレート境界をダックタイピング化した言語が欲しいわ。
299デフォルトの名無しさん
2025/02/28(金) 12:17:20.44ID:ydxSDGT7300デフォルトの名無しさん
2025/02/28(金) 12:19:57.96ID:3/BLzMLJ >>298
それがC++かもしれませんね
それがC++かもしれませんね
301デフォルトの名無しさん
2025/02/28(金) 22:27:33.84ID:wOIfhSFi >>298
ダックタイピングは各異なる型を統一的に安全に呼び出せる保証が人任せだから使うべきでない
トレイト境界を指定すれば安全が保証されるがそれはトレイトすなわち他言語で言うところのインターフェースに近い存在を仮定していてダックタイピングとは言い難い
ダックタイピングは各異なる型を統一的に安全に呼び出せる保証が人任せだから使うべきでない
トレイト境界を指定すれば安全が保証されるがそれはトレイトすなわち他言語で言うところのインターフェースに近い存在を仮定していてダックタイピングとは言い難い
302デフォルトの名無しさん
2025/02/28(金) 22:51:15.56ID:OmeBN0rd303デフォルトの名無しさん
2025/02/28(金) 23:05:54.93ID:aDguz5rE >>298
Go だと型があるインターフェイスを満たす (満たすつもり) かどうかは明示的な宣言がない。
インターフェイスで定義されたのと同じメソッドを持っていればそのインターフェイスを実装したものと見做される。
Go だと型があるインターフェイスを満たす (満たすつもり) かどうかは明示的な宣言がない。
インターフェイスで定義されたのと同じメソッドを持っていればそのインターフェイスを実装したものと見做される。
304デフォルトの名無しさん
2025/02/28(金) 23:49:44.86ID:wOIfhSFi >>302
まずその共通部分が存在する保証がない
次に共通部分があったとしてもその部分への任意のアクセスメソッドが完全に同一である保証がない
さらにダックタイピングで用意されるメソッドがその共通部分のみにアクセスされる保証がない
共通部分型方式には問題が山積み
一方でトレイト境界を用いると
共通部分を持たなくても安全に共通メソッドを増やすことができる
まずその共通部分が存在する保証がない
次に共通部分があったとしてもその部分への任意のアクセスメソッドが完全に同一である保証がない
さらにダックタイピングで用意されるメソッドがその共通部分のみにアクセスされる保証がない
共通部分型方式には問題が山積み
一方でトレイト境界を用いると
共通部分を持たなくても安全に共通メソッドを増やすことができる
305デフォルトの名無しさん
2025/03/01(土) 00:09:58.46ID:k1Z2LiOl 相変わらず日本語不自由だな
306デフォルトの名無しさん
2025/03/01(土) 08:37:01.16ID:IXdCHP3R 言語によるとしか言えない
その言語にある道具なら、それが便利なら使って問題ないと思う
C++だと標準ライブラリでもダックタイピングをごく普通に使うけど、それに文句を言う人もいないでしょ
その言語にある道具なら、それが便利なら使って問題ないと思う
C++だと標準ライブラリでもダックタイピングをごく普通に使うけど、それに文句を言う人もいないでしょ
307デフォルトの名無しさん
2025/03/01(土) 08:57:54.01ID:fWE8MQKS C++のような古くてダサい言語は比較する意味ないだろ
ダサくて自己責任となるダッチタイピングはお似合いだが
ダサくて自己責任となるダッチタイピングはお似合いだが
308デフォルトの名無しさん
2025/03/01(土) 09:10:51.88ID:J1DdG5rG Rust書きやすいって言ってるのは大体c++から移った人間でそういう人がここに集ってる
GC付きの言語から来たらそこまでは思わない
GC付きの言語から来たらそこまでは思わない
309デフォルトの名無しさん
2025/03/01(土) 09:47:12.55ID:+k5QM36w310デフォルトの名無しさん
2025/03/01(土) 11:24:22.93ID:dZ2eBKvG >>304 に賛成
311デフォルトの名無しさん
2025/03/01(土) 11:25:33.81ID:dZ2eBKvG >>306
便利さと安全性は独立してるからな
便利さと安全性は独立してるからな
312デフォルトの名無しさん
2025/03/01(土) 11:39:32.69ID:LIMOz2LM313デフォルトの名無しさん
2025/03/01(土) 13:10:29.22ID:UmJa16uz A:「〇〇な言語があったらいいのに」
B:「言語によるとしか言えない」
A:「・・・」
B:「言語によるとしか言えない」
A:「・・・」
314デフォルトの名無しさん
2025/03/01(土) 18:25:43.33ID:iHXAtSJa Structural Typingでバイナリ境界を超えて新しいメソッドを追加できるようにしてしまうと衝突時のデメリットがメリットを上回る
Rustにcoherenceがあるのと同じ
Rustにcoherenceがあるのと同じ
315デフォルトの名無しさん
2025/03/01(土) 22:44:41.75ID:qVuk4Ae3 >>308
GCの有無は関係ない
異なる型に対するコードの共通化つまりジェネリクスの話
例えばクラスを使えば同じ基底を継承する派生同士は異なる型でも共通のメソッドやプロパティを使える
しかし同じクラス継承の関係しか扱えないのは制約がキツく各機能毎に継承で多重クラス継承など問題が多い
一方でダッチタイピングや構造的サブタイピングは無関係な型同士でも同じメソッドやプロパティがあるだけで暗黙に使える
しかし互換性がなく偶然同じメソッドやプロパティを持つ同士の利用をエラーにできない問題や暗黙であるため複雑化してくると分かりにくくなるなど問題が多い
そこで機能毎にインターフェース宣言と各型でのインターフェース利用宣言することで諸問題を解決し安全で保守しやすいコードにすることができる
そしてインターフェース名(機能名)が付くことで複数の機能の列挙や関係も宣言できるようになる
Rustではトレイトと称する
GCの有無は関係ない
異なる型に対するコードの共通化つまりジェネリクスの話
例えばクラスを使えば同じ基底を継承する派生同士は異なる型でも共通のメソッドやプロパティを使える
しかし同じクラス継承の関係しか扱えないのは制約がキツく各機能毎に継承で多重クラス継承など問題が多い
一方でダッチタイピングや構造的サブタイピングは無関係な型同士でも同じメソッドやプロパティがあるだけで暗黙に使える
しかし互換性がなく偶然同じメソッドやプロパティを持つ同士の利用をエラーにできない問題や暗黙であるため複雑化してくると分かりにくくなるなど問題が多い
そこで機能毎にインターフェース宣言と各型でのインターフェース利用宣言することで諸問題を解決し安全で保守しやすいコードにすることができる
そしてインターフェース名(機能名)が付くことで複数の機能の列挙や関係も宣言できるようになる
Rustではトレイトと称する
316デフォルトの名無しさん
2025/03/01(土) 22:55:40.18ID:J1DdG5rG llmの3B当たりが吐き出す文章みたいで何を言ってるのか意味不明だな
317デフォルトの名無しさん
2025/03/02(日) 00:27:51.62ID:yD3mmOcG 丸一日調べてこれとか泣けてくるな
ついでにRustのトレイト問題も調べとけよ
ついでにRustのトレイト問題も調べとけよ
318デフォルトの名無しさん
2025/03/02(日) 08:35:08.13ID:Na6YXFfW319デフォルトの名無しさん
2025/03/02(日) 15:32:34.86ID:gL5X58/w >>312
少なくとも君は馬鹿だよ
少なくとも君は馬鹿だよ
320デフォルトの名無しさん
2025/03/02(日) 17:14:53.44ID:ZyJLqNmz わからんけどtypescriptやれば
321デフォルトの名無しさん
2025/03/02(日) 18:00:38.37ID:4Ag5PO4h ま人生一度は型厨になるのは仕方ない
322デフォルトの名無しさん
2025/03/02(日) 18:29:41.49ID:JmtuUveA ダックタイピングは動的か静的かに関わらずデメリットが多すぎて使うべきではないよ
唯一のメリットはinterface宣言が不要だけどこれが害悪を招いちゃう
interface名がないから可読性が悪く保守性も低いのはもちろん利用方法に制限も
唯一のメリットはinterface宣言が不要だけどこれが害悪を招いちゃう
interface名がないから可読性が悪く保守性も低いのはもちろん利用方法に制限も
323デフォルトの名無しさん
2025/03/02(日) 19:02:58.00ID:Q0x8LaN0 静的なダックタイピングにはinterface宣言もinterface名もあるやろ
324デフォルトの名無しさん
2025/03/02(日) 19:17:03.00ID:JmtuUveA325デフォルトの名無しさん
2025/03/02(日) 21:10:41.61ID:JAzjPHpU ubyの罪は重い
326デフォルトの名無しさん
2025/03/02(日) 21:55:50.48ID:4ZT2iFI9 Rustってまだオワコンになってなかったんだな
327デフォルトの名無しさん
2025/03/02(日) 22:12:16.30ID:vq+w9eu/ 構造に頼るよりも、ジェネリック関数でトレイト境界で制約かけた方がRustっぽい気がする。
なんとなく。
なんとなく。
328デフォルトの名無しさん
2025/03/02(日) 22:50:29.46ID:RayeYp/T >>324
上に出てきてるように構造的部分型(Strructural Subtyping)を含めた話
まあ俺もStrructural Subtypingを静的ダックタイピングと呼ぶのは
誤解を招きやすいからあまり賛同しないがそこは問題じゃないでしょ
上に出てきてるように構造的部分型(Strructural Subtyping)を含めた話
まあ俺もStrructural Subtypingを静的ダックタイピングと呼ぶのは
誤解を招きやすいからあまり賛同しないがそこは問題じゃないでしょ
329デフォルトの名無しさん
2025/03/02(日) 23:00:19.17ID:RayeYp/T330デフォルトの名無しさん
2025/03/02(日) 23:17:39.99ID:g7i6E9Hi 共通する構造&機能がある時に
・interface名(Rustではtrait名)を付けて宣言するか
・名付けずにダックタイピングするか
の違いが最も大きい
後者は様々な点で劣る
両者の中間的な位置付けにいるのがGo
Goでは各型に対するinterface実装宣言を省略できてしまうため
省略すると可読性や保守性で劣ることになる
・interface名(Rustではtrait名)を付けて宣言するか
・名付けずにダックタイピングするか
の違いが最も大きい
後者は様々な点で劣る
両者の中間的な位置付けにいるのがGo
Goでは各型に対するinterface実装宣言を省略できてしまうため
省略すると可読性や保守性で劣ることになる
331デフォルトの名無しさん
2025/03/02(日) 23:37:21.79ID:WP5yHTvc その「保守性が劣る」というGoは世間的には保守しやすい言語と言われてるんだが
型で守るという意味ではなく、多くの人に分かりやすい簡易な構文だからという理由でだけど
型で守るという意味ではなく、多くの人に分かりやすい簡易な構文だからという理由でだけど
332デフォルトの名無しさん
2025/03/02(日) 23:44:33.72ID:g7i6E9Hi 各型に対するinterface実装宣言を省略すると可読性や保守性で劣る
その事実以外の話には言及していない
その事実以外の話には言及していない
333デフォルトの名無しさん
2025/03/02(日) 23:54:11.22ID:Na6YXFfW その可読性や保守性の劣化というのは現実にどの程度問題と言われてるの?
「自分は嫌い」というお気持ちじゃなくて?
あるいは「Rustが採用してないから正しい」とか?
「自分は嫌い」というお気持ちじゃなくて?
あるいは「Rustが採用してないから正しい」とか?
334デフォルトの名無しさん
2025/03/02(日) 23:57:06.79ID:JmtuUveA 一般的に必要な情報は暗黙ではなく明記されている方が保守性も高いんだよ
そして多くの人に分かりやすい
省略できるようにしたことはGoの仕様の失策だね
そして多くの人に分かりやすい
省略できるようにしたことはGoの仕様の失策だね
335デフォルトの名無しさん
2025/03/03(月) 00:08:35.40ID:BZGxSOwK Goの場合は「省略できる」というよりも「書かない」というのが正しい
選択できるものではなく、常に書かないものだから
正直自分も好きではないし、だいぶクセのある言語だけど、世間的には受け入れられてる
世の中の人は案外そこまで型にこだわりはなくて、それよりも分かりやすさの方が好まれたりする
それは単に「考えが違う」というだけで、劣るとか優れてるとかいうものではない
(それなら何でGoは人気なの?ってなるし)
選択できるものではなく、常に書かないものだから
正直自分も好きではないし、だいぶクセのある言語だけど、世間的には受け入れられてる
世の中の人は案外そこまで型にこだわりはなくて、それよりも分かりやすさの方が好まれたりする
それは単に「考えが違う」というだけで、劣るとか優れてるとかいうものではない
(それなら何でGoは人気なの?ってなるし)
336デフォルトの名無しさん
2025/03/03(月) 00:11:38.35ID:BZGxSOwK あとRust開発者はC++から来た人が多いと思うけど、C++のテンプレートは思いきり静的ダックタイプでしょ
あれで実際「可読性ガー」ってなるより、便利だと思う場面もあるよね?
あれで実際「可読性ガー」ってなるより、便利だと思う場面もあるよね?
337デフォルトの名無しさん
2025/03/03(月) 00:12:13.08ID:3d6F6ZIn338デフォルトの名無しさん
2025/03/03(月) 00:19:18.53ID:lMbQDSSk structural vs nominalならが安全性はnominalのほうが高いが
保守性や可読性はどちらか一方が常に優れてるわけではないな
Rustはよりメタルに近いOSやライブラリでの利用を重視してるから
安全性の面からより保守的な選択をしてる
coherenceとかもアプリケーション開発者観点だと不必要に厳しい
保守性や可読性はどちらか一方が常に優れてるわけではないな
Rustはよりメタルに近いOSやライブラリでの利用を重視してるから
安全性の面からより保守的な選択をしてる
coherenceとかもアプリケーション開発者観点だと不必要に厳しい
339デフォルトの名無しさん
2025/03/03(月) 00:25:34.97ID:xahbKnOP Goでは省略しちゃうことが多くて、
ある型についてどんなinterface群を満たしているのか、を把握するために、
対象となりそうな全てのinterface群の各々のメソッド群と見比べて、
そのメソッド群すべてを実装していることを確認することで、
ようやくそのinterfaceを満たしていることを把握できる。
たった1行を省略できる利便性(?)のために、大きく可読性が落ちているのは否めない。
ある型についてどんなinterface群を満たしているのか、を把握するために、
対象となりそうな全てのinterface群の各々のメソッド群と見比べて、
そのメソッド群すべてを実装していることを確認することで、
ようやくそのinterfaceを満たしていることを把握できる。
たった1行を省略できる利便性(?)のために、大きく可読性が落ちているのは否めない。
340デフォルトの名無しさん
2025/03/03(月) 01:43:43.47ID:lMbQDSSk gopls implementationとかで確認すればいいよ
341デフォルトの名無しさん
2025/03/03(月) 03:55:57.34ID:US4xw5vs 今どき珍しい真面目なスレッドだな
342デフォルトの名無しさん
2025/03/03(月) 04:54:41.57ID:CkLabMrP >>330
静的ダックタイピングは明示的インターフェイスでも成り立つよ。>336で言うならテンプレートとコンセプトみたいにテンプレート引数の要件を明示するやり方。
>330の言い方なら、
共通する構造&機能がある時に
・共通することを型としてあらかじめ宣言するか
・共通部分を使う時に判別するか
の違いですな。
後者は共通する構造&機能の決定を実際に使用する時まで遅らせることができるので、型の設計時点で決めなくてはならない前者よりも設計の自由度が増す。
Adapterパターンのサポートが充実していれば問題を緩和できるけど、Rustて充実してたっけ?
静的ダックタイピングは明示的インターフェイスでも成り立つよ。>336で言うならテンプレートとコンセプトみたいにテンプレート引数の要件を明示するやり方。
>330の言い方なら、
共通する構造&機能がある時に
・共通することを型としてあらかじめ宣言するか
・共通部分を使う時に判別するか
の違いですな。
後者は共通する構造&機能の決定を実際に使用する時まで遅らせることができるので、型の設計時点で決めなくてはならない前者よりも設計の自由度が増す。
Adapterパターンのサポートが充実していれば問題を緩和できるけど、Rustて充実してたっけ?
343デフォルトの名無しさん
2025/03/03(月) 06:07:05.65ID:YJglMSFw Rustは各型で共通事項をあらかじめ宣言する必要がなく
共通する構造&機能の決定を実際に使用する時まで遅らせて
それらが決まってから後から実装すればよいため
設計の自由度が高いね
共通する構造&機能の決定を実際に使用する時まで遅らせて
それらが決まってから後から実装すればよいため
設計の自由度が高いね
344デフォルトの名無しさん
2025/03/03(月) 07:42:47.63ID:FotMwNUg >>343
あれ?どうやるんだっけ?
あれ?どうやるんだっけ?
345デフォルトの名無しさん
2025/03/03(月) 10:32:52.62ID:CIgoBgkV 他人の書いたコードをインタフェースで抽象化したいときにGoのinterfaceは便利だけど
全て自分で管理する場合は明示的に宣伝した方がいいから選べるようにしてほしい
Javaの普通のinterfaceに加えてGoのinterface同時に使える言語が欲しい
全て自分で管理する場合は明示的に宣伝した方がいいから選べるようにしてほしい
Javaの普通のinterfaceに加えてGoのinterface同時に使える言語が欲しい
346デフォルトの名無しさん
2025/03/03(月) 10:43:32.37ID:wkIAEgPa >>341
少し考えれば理由はわかるはず
少し考えれば理由はわかるはず
347デフォルトの名無しさん
2025/03/03(月) 10:47:29.58ID:US4xw5vs >>346
お?上から来たな
お?上から来たな
348デフォルトの名無しさん
2025/03/03(月) 19:22:07.10ID:niTL8qrF349デフォルトの名無しさん
2025/03/03(月) 19:49:07.58ID:SsAcHPN0 >>343
Rustで共通事項をあらかじめ宣言しないで、共通する構造&機能を統一的に使うのってどうすればいいの?
Rustの型システムを考えると、(既存のコードを変更することなく) 共通する構造&機能を新たに宣言して統一的に扱える、ということだよね?
Rustで共通事項をあらかじめ宣言しないで、共通する構造&機能を統一的に使うのってどうすればいいの?
Rustの型システムを考えると、(既存のコードを変更することなく) 共通する構造&機能を新たに宣言して統一的に扱える、ということだよね?
350デフォルトの名無しさん
2025/03/03(月) 19:56:00.40ID:niTL8qrF リファクタリングをするのに既存のコードを変えないとか矛盾していて意味がわからん
後から共通メソッドをトレイト化すればいいだけだろ
それで困る人はいない
後から共通メソッドをトレイト化すればいいだけだろ
それで困る人はいない
351デフォルトの名無しさん
2025/03/03(月) 21:42:58.25ID:CkLabMrP >>350
例えば標準ライブラリの型との共通部分を統一的に扱いたい場合、標準コードをリファクタリングして新しい共通Traitを切り出すのかしらん?
例えば標準ライブラリの型との共通部分を統一的に扱いたい場合、標準コードをリファクタリングして新しい共通Traitを切り出すのかしらん?
352デフォルトの名無しさん
2025/03/03(月) 22:28:07.80ID:T1gSmlwj Rustでコーディングしたことないお客さんが来てるのか?
標準ライブラリのコード自体を書き換えなんてせずとも普通に行われていることだぞ
標準ライブラリのコード自体を書き換えなんてせずとも普通に行われていることだぞ
353デフォルトの名無しさん
2025/03/03(月) 22:56:04.92ID:trSew6xi354デフォルトの名無しさん
2025/03/03(月) 23:07:24.80ID:trSew6xi 既に存在する共通する構造&機能をポリモーフィックに扱いたい時にGoなら必要なのはインターフェース宣言だけ
既存のインターフェースに合致するものなら新しく宣言する必要もなくそのまま扱える
一方Rustの場合は新しいインターフェースを宣言して既存の構造体に対する新しいインターフェース用の実装をそれぞれ追加で書かない限りは使えない
それで済めばまだいい方で既存のインターフェースに適合させなければいけない場合は既存の構造体をラップする新しい構造体とその実装を逐一全部書いた上にインターフェースに対する実装も別途追加で書かないダメ
特に後者の手間は雪だるま式に膨れ上がるからライブラリのように他人に使わせるコードを書く場合は型の設計時点というより外部APIの設計時点で何を共通の構造&機能として使えるようにするか決めておく必要がある
既存のインターフェースに合致するものなら新しく宣言する必要もなくそのまま扱える
一方Rustの場合は新しいインターフェースを宣言して既存の構造体に対する新しいインターフェース用の実装をそれぞれ追加で書かない限りは使えない
それで済めばまだいい方で既存のインターフェースに適合させなければいけない場合は既存の構造体をラップする新しい構造体とその実装を逐一全部書いた上にインターフェースに対する実装も別途追加で書かないダメ
特に後者の手間は雪だるま式に膨れ上がるからライブラリのように他人に使わせるコードを書く場合は型の設計時点というより外部APIの設計時点で何を共通の構造&機能として使えるようにするか決めておく必要がある
355デフォルトの名無しさん
2025/03/03(月) 23:24:45.25ID:uMOb2Eig > 既存のインターフェースに合致するものなら新しく宣言する必要もなくそのまま扱える
無茶苦茶だな
そんな意図しない全ての型に自動適用される危険な言語は使いたくないわ
Rustは明示的にimplしたものだけに適用されるから安全で使い勝手が良い
無茶苦茶だな
そんな意図しない全ての型に自動適用される危険な言語は使いたくないわ
Rustは明示的にimplしたものだけに適用されるから安全で使い勝手が良い
356デフォルトの名無しさん
2025/03/03(月) 23:29:41.09ID:uMOb2Eig > 一方Rustの場合は新しいインターフェースを宣言して既存の構造体に対する新しいインターフェース用の実装をそれぞれ追加で書かない限りは使えない
そんなことはない
既にimpl Tにあるのだからimpl Trait for Tへ移動させるだけだぞ
> それで済めばまだいい方で既存のインターフェースに適合させなければいけない場合は既存の構造体をラップする新しい構造体とその実装を逐一全部書いた上にインターフェースに対する実装も別途追加で書かないダメ
そんなことはない
既存の構造体にそのままtraitメソッドを増やせる
そんなことはない
既にimpl Tにあるのだからimpl Trait for Tへ移動させるだけだぞ
> それで済めばまだいい方で既存のインターフェースに適合させなければいけない場合は既存の構造体をラップする新しい構造体とその実装を逐一全部書いた上にインターフェースに対する実装も別途追加で書かないダメ
そんなことはない
既存の構造体にそのままtraitメソッドを増やせる
357デフォルトの名無しさん
2025/03/03(月) 23:46:24.87ID:T1gSmlwj Rustでコーディングしたことないお客さんがこのRustスレでRust叩きとは完全に荒らしだ
358デフォルトの名無しさん
2025/03/03(月) 23:56:56.53ID:BZGxSOwK 外部クレートで定義されたトレイトを別の外部クレートの型に対して実装するときはラップが必要じゃない?
要素1つのタプル構造体 (いわゆる new type) で済むような話だけど
インターフェースといってるあたり微妙にズレてる感はあるけど、「ラップする必要がある」という点自体は間違ってない
要素1つのタプル構造体 (いわゆる new type) で済むような話だけど
インターフェースといってるあたり微妙にズレてる感はあるけど、「ラップする必要がある」という点自体は間違ってない
359デフォルトの名無しさん
2025/03/04(火) 00:10:16.92ID:PYBK8h/l >>358
そんな話は誰もしていないよ
今話されているのはこれ
>既に存在する共通する構造&機能を
>新しいインターフェース宣言
複数の型に共通事項が出てきたから
新たなトレイトを作って宣言する話が行われてる
ラップは不要
そんな話は誰もしていないよ
今話されているのはこれ
>既に存在する共通する構造&機能を
>新しいインターフェース宣言
複数の型に共通事項が出てきたから
新たなトレイトを作って宣言する話が行われてる
ラップは不要
360デフォルトの名無しさん
2025/03/04(火) 00:26:54.32ID:ZIAXnU+S 自分の管轄外の型に対して、自分の管轄外のトレイトを実装することだけは、安全のため禁止されているので、自分の型にするためのラップが必要
そんな特殊な例外的ケースを除けばラップはもちろん不要
そんな特殊な例外的ケースを除けばラップはもちろん不要
361デフォルトの名無しさん
2025/03/04(火) 01:25:48.23ID:JpOggS8o 最初からクレート境界を前提とした文脈だろ >>298
文脈読めよ
文脈読めよ
362デフォルトの名無しさん
2025/03/04(火) 01:53:29.12ID:s9xD5Zkr インターフェイス vs. ダックタイピング
ダックタイピングはインターフェイス名がないため可読性が著しく低い
インターフェイス名を使った制約も指定できない
必ずインターフェイス機能を使うべし
ダックタイピングはインターフェイス名がないため可読性が著しく低い
インターフェイス名を使った制約も指定できない
必ずインターフェイス機能を使うべし
363デフォルトの名無しさん
2025/03/04(火) 02:35:55.33ID:VOLcqrY4 >>362
こういう簡潔なまとめ助かる
こういう簡潔なまとめ助かる
364デフォルトの名無しさん
2025/03/04(火) 06:51:13.78ID:r27xQ0ge ダックタイピングは、意味が異なっていても、見かけの構造さえ同じなら、同一視してしまう問題もある
つまりうっかり間違えて用いても、エラーを検出できないため、安全性で劣る。
その見かけの構造さえも、複数の構造を含む場合など、
この型はどのダックタイピングで用いられているのか、読み手が認識するのに時間がかかってしまう。
これらの問題は、各型において、どのダックタイピングに用いられているのかの宣言がないことに起因している。
一方で、interfaceは「各型でどのinterfaceを用いているのか」の宣言があるため、どちらの問題も生じない。
つまりうっかり間違えて用いても、エラーを検出できないため、安全性で劣る。
その見かけの構造さえも、複数の構造を含む場合など、
この型はどのダックタイピングで用いられているのか、読み手が認識するのに時間がかかってしまう。
これらの問題は、各型において、どのダックタイピングに用いられているのかの宣言がないことに起因している。
一方で、interfaceは「各型でどのinterfaceを用いているのか」の宣言があるため、どちらの問題も生じない。
365デフォルトの名無しさん
2025/03/04(火) 09:45:00.92ID:murVybZ/ >>327 奇遇ですね私もです
366デフォルトの名無しさん
2025/03/04(火) 09:47:17.60ID:murVybZ/367デフォルトの名無しさん
2025/03/04(火) 09:50:16.00ID:murVybZ/ >>339
ほんそれ
ほんそれ
368デフォルトの名無しさん
2025/03/04(火) 09:52:06.99ID:murVybZ/ >>342
だからRustは清書用って言われるんだよ
だからRustは清書用って言われるんだよ
369デフォルトの名無しさん
2025/03/04(火) 09:55:52.32ID:murVybZ/370デフォルトの名無しさん
2025/03/04(火) 09:57:24.96ID:murVybZ/ >>353
君こそコーディングしたことないだろ
君こそコーディングしたことないだろ
371デフォルトの名無しさん
2025/03/04(火) 10:00:12.78ID:murVybZ/ ああ 353 は引用なのか?
354 と 353 が同一人物ならきもいが
354 の言ってることが実情
354 と 353 が同一人物ならきもいが
354 の言ってることが実情
372デフォルトの名無しさん
2025/03/04(火) 10:02:37.01ID:murVybZ/ >>356
↑こういうのが混乱を招くからやめれ
↑こういうのが混乱を招くからやめれ
373デフォルトの名無しさん
2025/03/04(火) 10:09:07.10ID:murVybZ/ >>359-360
struct に限ってはそうだね
struct に限ってはそうだね
374デフォルトの名無しさん
2025/03/04(火) 11:30:33.83ID:CoDTmeUS375デフォルトの名無しさん
2025/03/04(火) 11:34:47.54ID:CoDTmeUS >>354
Rustならばラップは必要なく、トレイト宣言をしてトレイト側へメソッドを移動するだけで簡単に済む
impl Foo {
fn method(&self, ...
}
impl Bar {
fn method(&self, ...
}
と複数の型に共通メソッドがあり、それをトレイトで共通に扱えるようにしたければ
// トレイト宣言
trait TraitName {
fn method(&self, ...
}
// トレイト実装
impl TraitName for Foo {
fn method(&self, ...
}
impl TraitName for Bar {
fn method(&self, ...
}
つまり「impl Foo」から
「impl TraitName for Foo」へ移すだけで済む
今回の例なら差分タイプ量は「TraitName for」のみ
Rustならばラップは必要なく、トレイト宣言をしてトレイト側へメソッドを移動するだけで簡単に済む
impl Foo {
fn method(&self, ...
}
impl Bar {
fn method(&self, ...
}
と複数の型に共通メソッドがあり、それをトレイトで共通に扱えるようにしたければ
// トレイト宣言
trait TraitName {
fn method(&self, ...
}
// トレイト実装
impl TraitName for Foo {
fn method(&self, ...
}
impl TraitName for Bar {
fn method(&self, ...
}
つまり「impl Foo」から
「impl TraitName for Foo」へ移すだけで済む
今回の例なら差分タイプ量は「TraitName for」のみ
376デフォルトの名無しさん
2025/03/04(火) 12:03:00.52ID:murVybZ/ struct のときだけね
377デフォルトの名無しさん
2025/03/04(火) 12:04:58.27ID:CoDTmeUS >>376
enumでも他でも同じ
enumでも他でも同じ
378デフォルトの名無しさん
2025/03/04(火) 12:18:25.90ID:murVybZ/ フーン(ニヤニヤ)
379デフォルトの名無しさん
2025/03/04(火) 12:40:56.52ID:uaFJKO3n 伸びてると思ったら複オジの類友が増えただけだったorz
380デフォルトの名無しさん
2025/03/04(火) 12:45:41.91ID:DDDjLfi5 >>376
structに限らず全ての型に対してトレイト実装によりメソッドを増やせるよ
structに限らず全ての型に対してトレイト実装によりメソッドを増やせるよ
381デフォルトの名無しさん
2025/03/04(火) 12:58:42.56ID:WqCDnV/I &str(実質&[u8]でもVec<u8>でも)の末尾に
ゴミで良いから毎回必ず'\0'付ける仕様にしといて欲しかった
ゴミで良いから毎回必ず'\0'付ける仕様にしといて欲しかった
382デフォルトの名無しさん
2025/03/04(火) 13:19:59.57ID:813wXAHn >>381
'\0'に限らず任意の値を終端として型を定義できるZigの勝利だね
'\0'に限らず任意の値を終端として型を定義できるZigの勝利だね
383デフォルトの名無しさん
2025/03/04(火) 13:44:40.50ID:QtwoMD6j やっぱ崩れたかw
346みたいな偉そうな奴がいるとなw
346みたいな偉そうな奴がいるとなw
384デフォルトの名無しさん
2025/03/04(火) 13:53:15.88ID:aSLD1MTT 死んだスレが生き返ることなどない
385デフォルトの名無しさん
2025/03/04(火) 15:55:00.59ID:UUqFoJ1U386デフォルトの名無しさん
2025/03/04(火) 16:14:05.76ID:Xo2DP/vf 異なる方式を混ぜ合わせると両方を協調するのにミスが入りやすい。
ゼロ終端方式とファットポインタ方式に常に矛盾が生じないように維持するくらいなら必要なときに変換するほうがマシ。
ゼロ終端方式とファットポインタ方式に常に矛盾が生じないように維持するくらいなら必要なときに変換するほうがマシ。
387デフォルトの名無しさん
2025/03/04(火) 16:16:40.93ID:HZGad4Nn >>375
>つまり「impl Foo」から
>「impl TraitName for Foo」へ移すだけで済む
>今回の例なら差分タイプ量は「TraitName for」のみ
フィボナッチみたいなトイコードしか書いたことがないと
こんな意味のない破壊的な変更を無自覚に書いてしまうんだな
>つまり「impl Foo」から
>「impl TraitName for Foo」へ移すだけで済む
>今回の例なら差分タイプ量は「TraitName for」のみ
フィボナッチみたいなトイコードしか書いたことがないと
こんな意味のない破壊的な変更を無自覚に書いてしまうんだな
388デフォルトの名無しさん
2025/03/04(火) 16:28:38.12ID:c62Mny0R >>381
"abc"の部分文字列"ab"を参照する時に元の文字列が"ab\0"になるけどいい?
"abc"の部分文字列"ab"を参照する時に元の文字列が"ab\0"になるけどいい?
389デフォルトの名無しさん
2025/03/04(火) 17:42:39.60ID:uxSCDJ2e >>381
&strはStringや(別の)strの任意の部分文字列を参照する型
もし末尾に'\0'を付加すると次の文字を'\0'で上書きするため原理的に不可能
Rustで'\0'終端文字列はCStr/CStringを使う
リテラルならc"ABCDE"
ちなみにC/C++で部分文字列を扱うと
同じ問題が起きるため別領域へコピーして末尾'\0'を付加する
さらに途中に'\0'を置くと千切れる問題や
長さを知るために'\0'まで要走査の問題があるので
Rustのstr/Stringでは'\0'終端文字列としていない
&strはStringや(別の)strの任意の部分文字列を参照する型
もし末尾に'\0'を付加すると次の文字を'\0'で上書きするため原理的に不可能
Rustで'\0'終端文字列はCStr/CStringを使う
リテラルならc"ABCDE"
ちなみにC/C++で部分文字列を扱うと
同じ問題が起きるため別領域へコピーして末尾'\0'を付加する
さらに途中に'\0'を置くと千切れる問題や
長さを知るために'\0'まで要走査の問題があるので
Rustのstr/Stringでは'\0'終端文字列としていない
390デフォルトの名無しさん
2025/03/04(火) 17:44:45.66ID:uxSCDJ2e■ このスレッドは過去ログ倉庫に格納されています
ニュース
- 【中国外務省】日中関係悪化は高市氏に責任と名指しで非難… [BFU★]
- 【中国外務省】日中関係悪化は高市氏に責任と名指しで非難… ★2 [BFU★]
- 外務省局長は無言で厳しい表情…日中の高官協議終了か 高市首相“台湾”発言で中国が強硬対応 発言撤回求めたか…★2 [BFU★]
- 小野田紀美・経済安保担当相「何か気に入らないことがあればすぐに経済的威圧をする国への依存はリスク」 [Hitzeschleier★]
- 政府、株式の配当など金融所得を高齢者の医療保険料や窓口負担に反映する方針を固めた [バイト歴50年★]
- 【維新】吉村知事「中国人観光客だけに頼るビジネスモデル変えていかないといけない」「高市総理の発言は撤回する必要はない」 [Hitzeschleier★]
- 中国高官と話す外務省局長の表情、やばい [175344491]
- 【悲報】安倍晋三と高市早苗、どっちがヤベーの🤔 [616817505]
- 中国外務省「日中関係の悪化は高市早苗首相が原因」と名指しで強く非難。キタ━(゚∀゚)━! [153490809]
- 日本政府「高市総理の発言は問題ないと伝え、中国総領事のSNS投稿は問題があると中国に伝えました😊」 [931948549]
- 【速報】中国が日中関係悪化は高市氏に責任と名指しで非難 [931948549]
- ネトウヨ論調決まる「寧ろ迷惑中国人観光客が減ることで日本人の旅行が活性化され経済的には影響ない」 <mark>[ひまわり学級]</mark> [511393199]
