公式
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
603デフォルトの名無しさん
2024/07/06(土) 22:35:00.58ID:KApGuCzH Rust触ってないから分らんけど、QtのRustラッパーライブラリは無いのん?
一応Android/iOS含めたソースコードレベルでのマルチプラットフォームライブラリに進化しているらしいが、Haskellにすらラッパーライブラリあるんなら、Rustにも探せばあるんじゃ?
一応Android/iOS含めたソースコードレベルでのマルチプラットフォームライブラリに進化しているらしいが、Haskellにすらラッパーライブラリあるんなら、Rustにも探せばあるんじゃ?
604デフォルトの名無しさん
2024/07/07(日) 00:52:56.61ID:goRFIXq7 >>602
ネタにマジレスかもしれないけどRustはオブジェクト指向的なものも使えるよ
構造体にメソッドを持たせたり、インターフェースのようなものも扱える
継承はないけど、これはむしろ「その方が良い」というもので、同じくモダンな言語であるGOでも継承は無くしてる
ネタにマジレスかもしれないけどRustはオブジェクト指向的なものも使えるよ
構造体にメソッドを持たせたり、インターフェースのようなものも扱える
継承はないけど、これはむしろ「その方が良い」というもので、同じくモダンな言語であるGOでも継承は無くしてる
605デフォルトの名無しさん
2024/07/07(日) 01:50:01.52ID:NnH56+1c オブジェクト指向プログラミングには
クラス継承という悪いやり方を用いるダメな方法と
クラス継承を用いない正しい方法があって
RustやGoなどのモダンな言語は後者の方法をサポートしている
クラス継承という悪いやり方を用いるダメな方法と
クラス継承を用いない正しい方法があって
RustやGoなどのモダンな言語は後者の方法をサポートしている
606デフォルトの名無しさん
2024/07/07(日) 08:48:31.04ID:5sr/rOi5607デフォルトの名無しさん
2024/07/07(日) 09:17:14.13ID:7aG8TPof >>604-605
ありがとうございました。
「継承」って良いからオブジェクト指向言語の機能になっていたのではないんですか?
なんか時代とともに、昔は良いとされていたものが今ではダメになったりするんですか?
なぜそんなに揺らぐのでしょうか?
言語の設計の学者はぼんくらばかりなんですか?
ありがとうございました。
「継承」って良いからオブジェクト指向言語の機能になっていたのではないんですか?
なんか時代とともに、昔は良いとされていたものが今ではダメになったりするんですか?
なぜそんなに揺らぐのでしょうか?
言語の設計の学者はぼんくらばかりなんですか?
608デフォルトの名無しさん
2024/07/07(日) 09:17:45.74ID:LJE8DJUz 継承がないほうが「正しい」というのは行きすぎた思想だよ。
正しく使えないカスばっかりだという現実に敗北しただけ。
正しく使えないカスばっかりだという現実に敗北しただけ。
609デフォルトの名無しさん
2024/07/07(日) 09:49:42.70ID:Qx35uTG5 何がダメかというと「ある型(クラス)が別の型(クラス)の実装を継承してしまうこと」でこれが依存関係となり負の連鎖をもたらす
クラスの継承はこれに該当するから使ってはいけない
Rustにも継承とみなせる機能はあるけれど上記に該当しないため大丈夫
そこが決定的な違い
クラスの継承はこれに該当するから使ってはいけない
Rustにも継承とみなせる機能はあるけれど上記に該当しないため大丈夫
そこが決定的な違い
610デフォルトの名無しさん
2024/07/07(日) 10:06:45.11ID:rz+I+TB4 >実装を継承してしまうこと」でこれが依存関係となり負の連鎖をもたらす
実装継承を使えないレベルの人はだいたいこういうふわっとした認識だよね
実装継承を使えないレベルの人はだいたいこういうふわっとした認識だよね
611デフォルトの名無しさん
2024/07/07(日) 10:11:15.42ID:Eha1J0DV 暗殺術を正しく使える賢者がいる国なんてあったら嫌だなあ
正しく使える者など絶対存在しないという思想は行き過ぎではなくむしろ穏健派
正しく使える者など絶対存在しないという思想は行き過ぎではなくむしろ穏健派
612デフォルトの名無しさん
2024/07/07(日) 10:27:32.62ID:nRN7u0+P 全部が悪いと言う話じゃないけど
既存部分をただ継承させるだけならいいけど一部を上書きしたりして
それが全ての箇所で矛盾のない正しい挙動になるか判定が難しいか不可能な場合がある
結果実装コスト以上に考えざるを得ない…残念なことに本当に楽をしたのかどうか不明な場合がある
継承がないとそれは避けられるから使うな!と言う人が出てくる
既存部分をただ継承させるだけならいいけど一部を上書きしたりして
それが全ての箇所で矛盾のない正しい挙動になるか判定が難しいか不可能な場合がある
結果実装コスト以上に考えざるを得ない…残念なことに本当に楽をしたのかどうか不明な場合がある
継承がないとそれは避けられるから使うな!と言う人が出てくる
613デフォルトの名無しさん
2024/07/07(日) 10:29:57.11ID:nRN7u0+P 変数などに細かいアクセス制限のない言語は特に陥りやすい
制限があったところで制作者がそれを適切に選ばなければならない
どうしても経験や思考時間を必要とする
ガチ勢にはそれが無駄に思えるんだろう
制限があったところで制作者がそれを適切に選ばなければならない
どうしても経験や思考時間を必要とする
ガチ勢にはそれが無駄に思えるんだろう
614デフォルトの名無しさん
2024/07/07(日) 10:32:06.74ID:syATK/7U 実装継承は問題を引き起こすだけでなく
代わりの継承機能を提供することで
実装継承は全く不要になったことが大きい
そのためRust、Zig、Nim、Goなどモダンな言語はいずれも言語仕様からクラスを追放している
代わりの継承機能を提供することで
実装継承は全く不要になったことが大きい
そのためRust、Zig、Nim、Goなどモダンな言語はいずれも言語仕様からクラスを追放している
615デフォルトの名無しさん
2024/07/07(日) 10:33:57.16ID:nRN7u0+P それをやっても実質オーバーライド問題は解決されていないけどな
616デフォルトの名無しさん
2024/07/07(日) 10:45:17.84ID:4XBGKwNL >>607
実装継承はすごく便利だからオブジェクト指向言語では誰でも使いやすい機能としてサポートされてた
でも便利すぎて乱用されたからその経験と反省から不便でも乱用されにくいようにした方が得策という考えに至った言語開発者が増えたというのが2010年代
だから今は実装継承は上級者向けの機能という扱い
GoでもRustでも一般的なオブジェクト指向言語よりもわざと使いにくくすることで利便性と問題点を理解して実装方法を選択できる上級者向けの技術になっている
実装継承はすごく便利だからオブジェクト指向言語では誰でも使いやすい機能としてサポートされてた
でも便利すぎて乱用されたからその経験と反省から不便でも乱用されにくいようにした方が得策という考えに至った言語開発者が増えたというのが2010年代
だから今は実装継承は上級者向けの機能という扱い
GoでもRustでも一般的なオブジェクト指向言語よりもわざと使いにくくすることで利便性と問題点を理解して実装方法を選択できる上級者向けの技術になっている
617デフォルトの名無しさん
2024/07/07(日) 10:46:54.77ID:RLTFRTn6 >>615
それは(実装継承となる)クラスでのみ問題となるよな
それは(実装継承となる)クラスでのみ問題となるよな
618デフォルトの名無しさん
2024/07/07(日) 10:53:40.16ID:suA6qkkI >>616
デタラメを書くなよ
問題となる機能の代わりに便利で問題を起こさない機能を導入したのがRustだ
頭の固いクラス原理主義の人だけが使いにくいと主張してるが
クラスの洗脳から解き放たれた普通の人たちはRustが便利で使いやすいとの理解に至っている
デタラメを書くなよ
問題となる機能の代わりに便利で問題を起こさない機能を導入したのがRustだ
頭の固いクラス原理主義の人だけが使いにくいと主張してるが
クラスの洗脳から解き放たれた普通の人たちはRustが便利で使いやすいとの理解に至っている
619デフォルトの名無しさん
2024/07/07(日) 11:05:57.49ID:nRN7u0+P >>618
それは違うかなw
Rustで具体的に他と何が違ってて便利になってるか明言できるか?
Rustでも本質は変わってないのでなんも考えないでコピペ(継承)は避けましょうね
ぐらいのレベルでしかない
それは違うかなw
Rustで具体的に他と何が違ってて便利になってるか明言できるか?
Rustでも本質は変わってないのでなんも考えないでコピペ(継承)は避けましょうね
ぐらいのレベルでしかない
620デフォルトの名無しさん
2024/07/07(日) 11:21:22.62ID:goRFIXq7 >>607
当時は良いと考えられてたものが後から振り返って「あれは良くなかった」と分かる例はプログラミングに限らず多くあるだろ
Cの時代にRustを設計しろというのは無理で、その間にC++やJavaを経験し、そこで生まれた課題意識がないとGoやRustは生まれなかった
ニュートンの時代に古典力学を超えた量子力学を発見しろみたいなもの
当時は良いと考えられてたものが後から振り返って「あれは良くなかった」と分かる例はプログラミングに限らず多くあるだろ
Cの時代にRustを設計しろというのは無理で、その間にC++やJavaを経験し、そこで生まれた課題意識がないとGoやRustは生まれなかった
ニュートンの時代に古典力学を超えた量子力学を発見しろみたいなもの
621デフォルトの名無しさん
2024/07/07(日) 11:23:38.24ID:E46Yge5y622デフォルトの名無しさん
2024/07/07(日) 11:31:52.81ID:Eha1J0DV 当初から、算数の四則演算の型を継承で説明できないことを
知りながら無理を通したぼんくらが流行らせたのだ
難しい算数よりも布教しやすい教義を優先するほうが儲かるという判断
その判断が合理的と思うかどうかは人それぞれ
知りながら無理を通したぼんくらが流行らせたのだ
難しい算数よりも布教しやすい教義を優先するほうが儲かるという判断
その判断が合理的と思うかどうかは人それぞれ
623デフォルトの名無しさん
2024/07/07(日) 11:55:49.26ID:nRN7u0+P 根本的に継承だけの問題じゃない
結局可視であろうがなかろうが関数自体の挙動が理解しないといけない
addがあってもリストの一番前に追加するか後ろに追加するかと言う機能の違いが合って
コーディングする側がそれを統一的に扱って思った場所に追加されずにバグになる
そういう話だからトレイトだからとか継承亡くしたからとかどうとか関係ない
結局可視であろうがなかろうが関数自体の挙動が理解しないといけない
addがあってもリストの一番前に追加するか後ろに追加するかと言う機能の違いが合って
コーディングする側がそれを統一的に扱って思った場所に追加されずにバグになる
そういう話だからトレイトだからとか継承亡くしたからとかどうとか関係ない
624デフォルトの名無しさん
2024/07/07(日) 11:59:33.31ID:kX4AKaVh 継承はなくても良いがあると便利 vs 継承はあってはならない
C++は知らなくてもいいが先に知っておくと理解が速い vs C++の理解はいらない
こういう境界線のビミョーな議論だと「まだ結論は出てない」と嘯きやすく続けやすいんだろうか
C++は知らなくてもいいが先に知っておくと理解が速い vs C++の理解はいらない
こういう境界線のビミョーな議論だと「まだ結論は出てない」と嘯きやすく続けやすいんだろうか
625デフォルトの名無しさん
2024/07/07(日) 13:43:23.71ID:7CPxEWjC interfaceはおっけー、abstractは隠蔽されるからだめってことだよ
継承全てが悪というわけではない
継承全てが悪というわけではない
626デフォルトの名無しさん
2024/07/07(日) 13:46:30.77ID:7CPxEWjC kotlinでもabstractクラスはコード自動生成するときしか書かないもん
rustはtraitで十分だし
rustはtraitで十分だし
627デフォルトの名無しさん
2024/07/07(日) 14:05:34.19ID:nRN7u0+P rustにも派生はあるじゃん
628デフォルトの名無しさん
2024/07/07(日) 16:52:52.64ID:7aG8TPof 大きなプログラムを実際に書かずに、本を読むだけで、この言語のこの仕様は悪いとか良いとか判断できるようになりますか?
629デフォルトの名無しさん
2024/07/07(日) 17:13:03.91ID:KUDE2scl 継承はいらん。
理想(のひとつ)はダックタイプで、継承は実装上の都合でそうなっている妥協の産物でしかない。
理想(のひとつ)はダックタイプで、継承は実装上の都合でそうなっている妥協の産物でしかない。
630デフォルトの名無しさん
2024/07/07(日) 17:36:36.74ID:h+XkpNj2 今まで築いてきた価値観を繰り返し短い言葉で否定して徹底的に壊すというのが洗脳の基本
「継承は悪」「モダンな言語に継承はない」「Rustでは継承による問題は発生しない」(※全部嘘ですよ)
最初に洗脳をはじめた人と違って
洗脳者に洗脳された人は本質を理解していない
そればかりか真実かどうかなんてもはやどうでもよく
自分が信じてることだけが真実だと思っている
だから議論しようという気もなく一方的に同じことを繰り返し書くだけ
掲示板界隈では身近によくあることなので気をつけようね
「継承は悪」「モダンな言語に継承はない」「Rustでは継承による問題は発生しない」(※全部嘘ですよ)
最初に洗脳をはじめた人と違って
洗脳者に洗脳された人は本質を理解していない
そればかりか真実かどうかなんてもはやどうでもよく
自分が信じてることだけが真実だと思っている
だから議論しようという気もなく一方的に同じことを繰り返し書くだけ
掲示板界隈では身近によくあることなので気をつけようね
631デフォルトの名無しさん
2024/07/07(日) 18:10:28.88ID:rdCPsToy 継承はプログラミングで絶対に必要な重要な機能で重複コードを避けることができる
ただし継承といっても複数の方法があって実装継承だけは害を招いてしまう
実装継承とは別の型の具体的な実装をそのまま継承してしまうことを指す
つまり実装継承をすると二つの型の間に不必要に強力な依存関係が生じてしまう
クラス継承でプログラムを書くと自然にこの害悪な実装継承となってしまう
そのため様々な異なる方針のモダンな言語が同じ結論に達してクラスを言語仕様から無くした
Rustではトレイトを使うことで健全な継承機能のみを使うことができる
特にトレイトのデフォルト実装はどの型にも依存しないため実装継承にならずに健全な継承のメリットを最大限に享受することができる
ただし継承といっても複数の方法があって実装継承だけは害を招いてしまう
実装継承とは別の型の具体的な実装をそのまま継承してしまうことを指す
つまり実装継承をすると二つの型の間に不必要に強力な依存関係が生じてしまう
クラス継承でプログラムを書くと自然にこの害悪な実装継承となってしまう
そのため様々な異なる方針のモダンな言語が同じ結論に達してクラスを言語仕様から無くした
Rustではトレイトを使うことで健全な継承機能のみを使うことができる
特にトレイトのデフォルト実装はどの型にも依存しないため実装継承にならずに健全な継承のメリットを最大限に享受することができる
632デフォルトの名無しさん
2024/07/07(日) 18:53:59.08ID:0Udg54Yk >>628
たくさん本を読み自分の頭で考える努力をすればある程度まではなれる
ただし実地の経験がなければ最終的には他人の受け売りを判断基準にするしかなく
経験のある人間に比べると妥当な判断ができない状況が多くなる
言語の仕様は一面的に良いとか悪いとかという判断を下せるものはほとんどない
長所短所を把握した上でどういう状況であれば他の仕様に比べて優れていて
逆にどういう状況であれば他の仕様に比べて劣るのかという
状況に合わせた判断が必要
つまり妥当な判断を下せる確率を上げるためには
言語の仕様を把握する力よりもそれが使われる状況を幅広く奥深く想定する力を身につけることが重要
これを本を読むだけで身につけようとしてもすぐに頭打ちになる
たくさん本を読み自分の頭で考える努力をすればある程度まではなれる
ただし実地の経験がなければ最終的には他人の受け売りを判断基準にするしかなく
経験のある人間に比べると妥当な判断ができない状況が多くなる
言語の仕様は一面的に良いとか悪いとかという判断を下せるものはほとんどない
長所短所を把握した上でどういう状況であれば他の仕様に比べて優れていて
逆にどういう状況であれば他の仕様に比べて劣るのかという
状況に合わせた判断が必要
つまり妥当な判断を下せる確率を上げるためには
言語の仕様を把握する力よりもそれが使われる状況を幅広く奥深く想定する力を身につけることが重要
これを本を読むだけで身につけようとしてもすぐに頭打ちになる
633デフォルトの名無しさん
2024/07/07(日) 19:04:36.65ID:tn8SIXEe634デフォルトの名無しさん
2024/07/07(日) 19:34:52.42ID:goRFIXq7 >>628
他の言語での開発経験がある人が仕様を見て「この言語のこの仕様は好き/嫌い」と言うことはあると思う
どの言語も初心者という人だと無理
それに言語の良し悪しなんて点数で評価できるようなものでないし、好みの問題だったり、ライブラリなどの周辺環境だったり、作りたいもの次第だったりする
他の言語での開発経験がある人が仕様を見て「この言語のこの仕様は好き/嫌い」と言うことはあると思う
どの言語も初心者という人だと無理
それに言語の良し悪しなんて点数で評価できるようなものでないし、好みの問題だったり、ライブラリなどの周辺環境だったり、作りたいもの次第だったりする
635デフォルトの名無しさん
2024/07/07(日) 21:58:17.95ID:rdCPsToy 好き嫌いと良い悪いはしっかり区別つけなければならない
他の型との間で不必要に強力な依存関係が生じてしまう実装継承は悪い
この実装継承となってしまうクラス継承は悪い
Rustに実装継承はなくトレイトを用いることで健全な継承を活用してプログラミングできる
他の型との間で不必要に強力な依存関係が生じてしまう実装継承は悪い
この実装継承となってしまうクラス継承は悪い
Rustに実装継承はなくトレイトを用いることで健全な継承を活用してプログラミングできる
636デフォルトの名無しさん
2024/07/07(日) 22:26:34.08ID:rVoIwJvq 受け売り知識しか持たないとこういう感じで論拠薄弱で空疎な意見しか書けなくなる
いい反面教師だね
いい反面教師だね
637デフォルトの名無しさん
2024/07/07(日) 22:51:49.25ID:goRFIXq7 Rustが継承の問題を防げるのってトレイトだけじゃなくてenumの存在も大きいよね
静的ポリモーフィズムを自然に実装できるから、多態のために無理やりインタフェースに当て嵌めようとしたり、ダウンキャストが必要になったりといったものを防げる
本質的に違うものを抽象化しようとして失敗してる例を見たことのある人はそれなりにいるはず
静的ポリモーフィズムを自然に実装できるから、多態のために無理やりインタフェースに当て嵌めようとしたり、ダウンキャストが必要になったりといったものを防げる
本質的に違うものを抽象化しようとして失敗してる例を見たことのある人はそれなりにいるはず
638デフォルトの名無しさん
2024/07/07(日) 23:03:31.83ID:Eha1J0DV >>633
整数クラスは分数クラスを継承したいが、分母を表す変数は継承したくない
それと文字列 + 文字列が定義されている言語では
分数 + 整数の定義に必要な関数も継承したくない
その関数は文字列と無関係だから
整数クラスは分数クラスを継承したいが、分母を表す変数は継承したくない
それと文字列 + 文字列が定義されている言語では
分数 + 整数の定義に必要な関数も継承したくない
その関数は文字列と無関係だから
639デフォルトの名無しさん
2024/07/07(日) 23:46:19.40ID:QlaAOMK5 >>638
>整数クラスは分数クラスを継承したいが、分母を表す変数は継承したくない
普通、C++だと、整数クラスを作っておき、
分数クラスはそれを継承せずに、
整数クラスを2つメンバに持つクラス
として定義しますよね。
その場合、整数クラスと分数クラスは継承関係を持ってない。
>整数クラスは分数クラスを継承したいが、分母を表す変数は継承したくない
普通、C++だと、整数クラスを作っておき、
分数クラスはそれを継承せずに、
整数クラスを2つメンバに持つクラス
として定義しますよね。
その場合、整数クラスと分数クラスは継承関係を持ってない。
640デフォルトの名無しさん
2024/07/07(日) 23:51:53.41ID:gwkq/Sum >>635
クラス継承の問題はある程度の規模でプログラミングしてきた人の多くが体験してきて、
その根本的原因は実装継承にあることが多くのサイトで解説されている通りだけど、
従来の言語ではクラス継承に代わる手段が弱かったり不便であるため、
仕方なく欠陥のあるクラス継承を使い続けてきた不幸な歴史があるんだよ。
クラス継承を使わずにすむRustは恵まれてる。
クラス継承の問題はある程度の規模でプログラミングしてきた人の多くが体験してきて、
その根本的原因は実装継承にあることが多くのサイトで解説されている通りだけど、
従来の言語ではクラス継承に代わる手段が弱かったり不便であるため、
仕方なく欠陥のあるクラス継承を使い続けてきた不幸な歴史があるんだよ。
クラス継承を使わずにすむRustは恵まれてる。
641デフォルトの名無しさん
2024/07/08(月) 00:13:34.95ID:dSFAEVvP >>638
分数クラスを継承して整数クラスを作りたいという要求と
分母を表す変数は継承したくないという要求が矛盾してる
分数クラスを継承して整数クラスを作りたいということは
分数を特化したものが整数であるというモデルを
分数クラスと整数クラスの実装でも作りたいということ
そのためには整数クラスにも分母を表す変数が当然必要
矛盾した要求が実現できないのは実装技術の問題ではなく要求の不備
分数クラスを継承して整数クラスを作りたいという要求と
分母を表す変数は継承したくないという要求が矛盾してる
分数クラスを継承して整数クラスを作りたいということは
分数を特化したものが整数であるというモデルを
分数クラスと整数クラスの実装でも作りたいということ
そのためには整数クラスにも分母を表す変数が当然必要
矛盾した要求が実現できないのは実装技術の問題ではなく要求の不備
642デフォルトの名無しさん
2024/07/08(月) 00:24:32.58ID:aZihrzFg >>607
コード メトリック - 継承の深さ (DIT)
https://learn.microsoft.com/ja-jp/visualstudio/code-quality/code-metrics-depth-of-inheritance?view=vs-2022
継承もやりすぎると毒になるってだけで、全くダメってわけじゃない。
コード メトリック - 継承の深さ (DIT)
https://learn.microsoft.com/ja-jp/visualstudio/code-quality/code-metrics-depth-of-inheritance?view=vs-2022
継承もやりすぎると毒になるってだけで、全くダメってわけじゃない。
643デフォルトの名無しさん
2024/07/08(月) 00:26:00.53ID:wE6spjgC >>638
不適切な継承の典型例だな
不適切な継承の典型例だな
644デフォルトの名無しさん
2024/07/08(月) 00:36:15.98ID:aZihrzFg >>638
数学では整数の組から分数作るけど、整数クラスが親クラスじゃないのは変じゃない?
(そもそも、継承より整数クラスのインスタンスを分子用と分母用の2個使う委譲スタイルの方が適切だと思うけど)
(n,m)とn/mは同型
数学では整数の組から分数作るけど、整数クラスが親クラスじゃないのは変じゃない?
(そもそも、継承より整数クラスのインスタンスを分子用と分母用の2個使う委譲スタイルの方が適切だと思うけど)
(n,m)とn/mは同型
645デフォルトの名無しさん
2024/07/08(月) 01:24:33.08ID:QXtalhpf どういう用途のためにクラスを作ろうとしているのか不明瞭な段階で
特定の実装方法が適切だと思い込むのは感心しない
特定の実装方法が適切だと思い込むのは感心しない
646デフォルトの名無しさん
2024/07/08(月) 05:17:42.23ID:9vKk3LiW >>630
継承自体は悪くない
重複コードを回避できて保守性も向上する
つまり継承自体は良いもの
ただし実装継承だけは悪
異なる型同士に過度な依存をもたらし保守性を悪くする
クラス継承は実装継承となるため悪
モダンな各言語がクラスを排除した理由はそのため
Rustに実装継承はなく継承でそのような問題を起こさない
継承自体は悪くない
重複コードを回避できて保守性も向上する
つまり継承自体は良いもの
ただし実装継承だけは悪
異なる型同士に過度な依存をもたらし保守性を悪くする
クラス継承は実装継承となるため悪
モダンな各言語がクラスを排除した理由はそのため
Rustに実装継承はなく継承でそのような問題を起こさない
647デフォルトの名無しさん
2024/07/08(月) 09:13:52.72ID:1Z2Y8mSg 継承で重複コードを回避できるのは実装も共有する継承だけ
つまり実装継承だけ
Rustスレでこんな初歩的なことを説明しなきゃいけないのはすごく悲しい
つまり実装継承だけ
Rustスレでこんな初歩的なことを説明しなきゃいけないのはすごく悲しい
648デフォルトの名無しさん
2024/07/08(月) 09:32:49.17ID:QAb8fFud 今回はいつまでやるの?
649デフォルトの名無しさん
2024/07/08(月) 09:42:44.60ID:jJBNmhlI >>647
実装継承の意味を理解したほうがいいんじゃね?
ある型Aの実装を別の型Bが継承することが実装継承と呼ばれているんだよ
これは不必要に依存関係が強すぎて片方を機能拡張しようとしたときなど破綻を招きがち
だから実装継承となるのは避けるべきと言われているね
実装継承の意味を理解したほうがいいんじゃね?
ある型Aの実装を別の型Bが継承することが実装継承と呼ばれているんだよ
これは不必要に依存関係が強すぎて片方を機能拡張しようとしたときなど破綻を招きがち
だから実装継承となるのは避けるべきと言われているね
650デフォルトの名無しさん
2024/07/08(月) 10:06:04.28ID:eiH/KN8v ワイの思う継承はenum_dispatch crate でやれるから困ったことないなぁ
お前らの心の中の継承は知らんがw
お前らの心の中の継承は知らんがw
651デフォルトの名無しさん
2024/07/08(月) 10:42:22.99ID:UCsocQnW 分数はバカっぽい
有理数と言え
有理数と言え
652デフォルトの名無しさん
2024/07/08(月) 10:42:53.94ID:29FzOd3r653デフォルトの名無しさん
2024/07/08(月) 10:43:30.84ID:29FzOd3r 例えばどんな型でどんな内部構造でも
その型にトレイトのnext関数を実装するだけでイテーレータとして機能するが
その時に他のメソッド(nthとかmapとかfoldなど)のコードを自分で書かなくても自動的に継承されて機能する
その型にトレイトのnext関数を実装するだけでイテーレータとして機能するが
その時に他のメソッド(nthとかmapとかfoldなど)のコードを自分で書かなくても自動的に継承されて機能する
654デフォルトの名無しさん
2024/07/08(月) 10:44:27.48ID:29FzOd3r これをデフォルト実装と言い特定の型の構造に全く依存しないコードのみを書くことができる
つまり問題を起こす実装継承とならず
Rustでは健全な継承が実現されている
つまり問題を起こす実装継承とならず
Rustでは健全な継承が実現されている
655デフォルトの名無しさん
2024/07/08(月) 10:55:22.37ID:6tgHXwg2 複オジの耳に念仏
まさに>>630
まさに>>630
656デフォルトの名無しさん
2024/07/08(月) 11:03:01.23ID:aq0ZJn08 デフォルト実装の制限のかけ方が成功の肝かな
トレイトなので各型のメンバーフィールドには一切アクセスできないため実装継承が上手く回避されてる
トレイトなので各型のメンバーフィールドには一切アクセスできないため実装継承が上手く回避されてる
657デフォルトの名無しさん
2024/07/08(月) 11:27:47.73ID:Qb4+6aEo 「実装は継承しているけど実装継承ではない」w
658デフォルトの名無しさん
2024/07/08(月) 11:38:02.68ID:0gbetOzk 複オジ論法は無敵だな
659デフォルトの名無しさん
2024/07/08(月) 11:49:10.64ID:aq0ZJn08 >>657
他の型の実装に実装が依存することが実装継承と呼ばれてる
他の型の実装に実装が依存することが実装継承と呼ばれてる
660デフォルトの名無しさん
2024/07/08(月) 13:25:29.85ID:QAb8fFud 継承の本当の問題は、LSPを満たさない部分型関係を作ってしまいがちということ
他の型の実装に依存するのが良くないというのはDIの話で、直接は関係ない
他の型の実装に依存するのが良くないというのはDIの話で、直接は関係ない
661デフォルトの名無しさん
2024/07/08(月) 13:56:53.31ID:0on8bWSc うそん
crate製作者サイドでCargo.toml内の
他のcrateへの依存関係の描き方がいい加減だと
割りと頻繁に詰む
人間が追跡して治して行けば使えなくもないが
cratesは破綻する可能性がある
crate製作者サイドでCargo.toml内の
他のcrateへの依存関係の描き方がいい加減だと
割りと頻繁に詰む
人間が追跡して治して行けば使えなくもないが
cratesは破綻する可能性がある
662デフォルトの名無しさん
2024/07/08(月) 15:03:24.53ID:HJF+848e クレートdownloadでか過ぎ
どうみてもどんぐりです
ばいばいおさるさん
ころころす
どうみてもどんぐりです
ばいばいおさるさん
ころころす
663デフォルトの名無しさん
2024/07/08(月) 17:42:30.38ID:NWN6grys >>660
クラスを用いる言語では必ず満たすべきLSP(リスコフの置換原則)が頻繁に守られていない現実から
GoやRustなどモダンな言語はクラスそのものを廃止して改善したわけだ
他の型の実装に依存するのが良くないのも当たり前の話でそこは各型へ移譲しなければならない
クラスを用いる言語では必ず満たすべきLSP(リスコフの置換原則)が頻繁に守られていない現実から
GoやRustなどモダンな言語はクラスそのものを廃止して改善したわけだ
他の型の実装に依存するのが良くないのも当たり前の話でそこは各型へ移譲しなければならない
664デフォルトの名無しさん
2024/07/08(月) 18:36:24.36ID:jkhWqaDw665デフォルトの名無しさん
2024/07/08(月) 18:41:05.12ID:BP+Tby1x >>657
ジワジワくる
ジワジワくる
666デフォルトの名無しさん
2024/07/08(月) 19:00:42.33ID:lBXxnkJT >>657が実装継承とは何かすら理解できていなくて草
667デフォルトの名無しさん
2024/07/08(月) 23:32:15.60ID:HOKpNi7I 所有権といい継承といいLSPといい
某オジは抽象概念を捻じ曲げるスキルが高すぎだろ
某オジは抽象概念を捻じ曲げるスキルが高すぎだろ
668デフォルトの名無しさん
2024/07/09(火) 00:42:48.79ID:m6Akkl5N >>660
LSPは派生型がその基底型を継承する時その振る舞いは同じで代替できるという当たり前な話なんだが
クラスはこの件でも欠陥があるため意識してプログラムを書かないとLSPに反してしまう
Rustはクラスがなくトレイトは枠組みだけで基底型ではないためLSPは全く関係ないぞ
LSPは派生型がその基底型を継承する時その振る舞いは同じで代替できるという当たり前な話なんだが
クラスはこの件でも欠陥があるため意識してプログラムを書かないとLSPに反してしまう
Rustはクラスがなくトレイトは枠組みだけで基底型ではないためLSPは全く関係ないぞ
669デフォルトの名無しさん
2024/07/09(火) 02:24:36.95ID:ZNKPIxXk >LSPは派生型がその基底型を継承する時その振る舞いは同じで代替できるという当たり前な話なんだが
0点
0点
670デフォルトの名無しさん
2024/07/09(火) 11:02:57.90ID:Gz8hLZg7 書けば書くほど無知をさらしてしまう複製オジさん草る
671デフォルトの名無しさん
2024/07/09(火) 12:31:29.17ID:B8U2Xwe0 >>664
対象となるものはクラスしかないよね
対象となるものはクラスしかないよね
672デフォルトの名無しさん
2024/07/09(火) 12:39:43.65ID:YflJELWV >>668
φ(x) を型 T のオブジェクト x に関して証明可能な性質とする。このとき、φ(y) は型 T のサブタイプ S のオブジェクト y について真でなければならない。
φは主に事前条件・事後条件・不変条件で、言語によっては例外条件も入ってくる。
この観点からはRustのTraitは力不足。なんでLSPを引き合いに出せるのかわからん。
φ(x) を型 T のオブジェクト x に関して証明可能な性質とする。このとき、φ(y) は型 T のサブタイプ S のオブジェクト y について真でなければならない。
φは主に事前条件・事後条件・不変条件で、言語によっては例外条件も入ってくる。
この観点からはRustのTraitは力不足。なんでLSPを引き合いに出せるのかわからん。
673デフォルトの名無しさん
2024/07/09(火) 12:57:46.02ID:aoAam1/W >>672
自分でそれを書いておいて理解できていないのかよ
そこに明記されてるようにTもSもオブジェクトを持つ具体型についての話だ
Rustのtraitは具体型ではないため関係ないぞ
そしてtraitを実装する各型の間にはサブタイプの関係はないためそこも対象とならない
そこを理解できずに「RustのTraitは力不足」とデタラメを吹聴するのは恥ずかしい
自分でそれを書いておいて理解できていないのかよ
そこに明記されてるようにTもSもオブジェクトを持つ具体型についての話だ
Rustのtraitは具体型ではないため関係ないぞ
そしてtraitを実装する各型の間にはサブタイプの関係はないためそこも対象とならない
そこを理解できずに「RustのTraitは力不足」とデタラメを吹聴するのは恥ずかしい
674デフォルトの名無しさん
2024/07/09(火) 13:01:26.64ID:YflJELWV >>673
事前条件とかはどこ行ったの?
事前条件とかはどこ行ったの?
675デフォルトの名無しさん
2024/07/09(火) 13:20:56.23ID:aoAam1/W >>674
φ(x) のxはオブジェクトと明記されてるのが見えないのかね
さらにSはTのサブタイプと明記されている
Rustのtrait自体はオブジェクトを持たない
さらにtraitを実装する二つの型同士にサブタイプの関係は生じない
つまり対象外でφが存在しないため事前条件も何もない
φ(x) のxはオブジェクトと明記されてるのが見えないのかね
さらにSはTのサブタイプと明記されている
Rustのtrait自体はオブジェクトを持たない
さらにtraitを実装する二つの型同士にサブタイプの関係は生じない
つまり対象外でφが存在しないため事前条件も何もない
676デフォルトの名無しさん
2024/07/09(火) 13:35:41.29ID:YflJELWV >>675
>明記されてるのが見えないのかね
>Rustのtrait自体はオブジェクトを持たない
それは「RustのTraitはLSPと関係ない」と言いたいの?
>φが存在しないため事前条件も何もない
事前条件も何も表明できないのは「力不足」そのものですな。
>明記されてるのが見えないのかね
>Rustのtrait自体はオブジェクトを持たない
それは「RustのTraitはLSPと関係ない」と言いたいの?
>φが存在しないため事前条件も何もない
事前条件も何も表明できないのは「力不足」そのものですな。
677デフォルトの名無しさん
2024/07/09(火) 14:43:14.46ID:Tc+iYmTn リファクタリングするとき
プログラム(CPU)の動作の副作用は起きないけど
コーディングの変更に対して副作用が大き過ぎるというか広過ぎる
プログラム(CPU)の動作の副作用は起きないけど
コーディングの変更に対して副作用が大き過ぎるというか広過ぎる
678デフォルトの名無しさん
2024/07/09(火) 15:17:32.29ID:l7dFkPpL679デフォルトの名無しさん
2024/07/09(火) 15:20:15.91ID:aoAam1/W >>676
LSPに明記されている前提すら満たさない異なるものであるため
「RustのTraitはLSPと関係ない」で合っている
LSPが対象としている遺物における諸問題に悩まされずに済むように
新たな視点で整理されたより良いものとしてRustのTraitが提供されている
LSPに明記されている前提すら満たさない異なるものであるため
「RustのTraitはLSPと関係ない」で合っている
LSPが対象としている遺物における諸問題に悩まされずに済むように
新たな視点で整理されたより良いものとしてRustのTraitが提供されている
680デフォルトの名無しさん
2024/07/09(火) 15:28:08.29ID:aoAam1/W681デフォルトの名無しさん
2024/07/09(火) 17:53:13.80ID:uNqr/AfO682デフォルトの名無しさん
2024/07/09(火) 20:23:57.43ID:YflJELWV >>679
RustとLSPが関係ないのなら、LSPを引き合いに出すのは大嘘か。
知ってて言っているなら詐欺師だな。
そもそもTraitでpanic禁止にできない時点で「LSPが対象としている遺物における諸問題に悩まされずに済む」というのも大嘘だしな。
RustとLSPが関係ないのなら、LSPを引き合いに出すのは大嘘か。
知ってて言っているなら詐欺師だな。
そもそもTraitでpanic禁止にできない時点で「LSPが対象としている遺物における諸問題に悩まされずに済む」というのも大嘘だしな。
683デフォルトの名無しさん
2024/07/09(火) 20:49:10.75ID:sTXYSGuF 簡単な話だよな
オブジェクト指向プログラミングで
例えばクラスを使うと
LSPに違反する二つの型のコード例を容易に作れてしまう
つまりクラスは本質的に欠陥品なんだよ
Rustのトレイトを使うと
LSPに違反する二つの型のコード例を作ることができない
つまりRustのトレイトは優れた方式なんだよ
オブジェクト指向プログラミングで
例えばクラスを使うと
LSPに違反する二つの型のコード例を容易に作れてしまう
つまりクラスは本質的に欠陥品なんだよ
Rustのトレイトを使うと
LSPに違反する二つの型のコード例を作ることができない
つまりRustのトレイトは優れた方式なんだよ
684デフォルトの名無しさん
2024/07/09(火) 21:07:20.42ID:YflJELWV >>683
あるトレイトでpanic2を禁止しようとしました。事前条件(あるいは例外条件)でnopanicとしたかったけど、そんなのは無いのでとりあえずデフォルト実装でpanic禁止にしました。
しかしトレイトユーザーはそんなのお構い無しにunsafe rustでpanicを使います。ついにpanicが発生してシステムダウンしました。
LSPでケアしている問題はRustのTraitを使っている限り発生しないんじゃないんだっけ?
あるトレイトでpanic2を禁止しようとしました。事前条件(あるいは例外条件)でnopanicとしたかったけど、そんなのは無いのでとりあえずデフォルト実装でpanic禁止にしました。
しかしトレイトユーザーはそんなのお構い無しにunsafe rustでpanicを使います。ついにpanicが発生してシステムダウンしました。
LSPでケアしている問題はRustのTraitを使っている限り発生しないんじゃないんだっけ?
685デフォルトの名無しさん
2024/07/09(火) 21:56:05.19ID:sTXYSGuF Rustのトレイトは優れているため
LSPに違反するコード例を作ることができないんだよ
もしRustに文句をつけたかったら
LSPに違反する二つの型のコード例を作って示してごらん
Rustで違反例を作るのは不可能だよ
LSPに違反するコード例を作ることができないんだよ
もしRustに文句をつけたかったら
LSPに違反する二つの型のコード例を作って示してごらん
Rustで違反例を作るのは不可能だよ
686デフォルトの名無しさん
2024/07/09(火) 22:08:43.14ID:ZNKPIxXk687デフォルトの名無しさん
2024/07/09(火) 22:36:56.01ID:YflJELWV688デフォルトの名無しさん
2024/07/09(火) 22:44:26.63ID:loMF79su LSPはそんなことを要求していないよ
LSPをちゃんと読んで理解しようね
LSPをちゃんと読んで理解しようね
689デフォルトの名無しさん
2024/07/09(火) 22:50:55.17ID:aoAam1/W >>686
クラスは様々な問題点を抱えている
クラスでは実装継承となるため異なる型同士に不必要に過度な依存関係をもたらす硬直性も問題点の一つ
クラスはLSP(リスコフの置換原則)を満たさないプログラムが量産されてしまう問題点も別の一つ
どちらの問題点もRustならtraitを使うため問題が起きない
クラスは様々な問題点を抱えている
クラスでは実装継承となるため異なる型同士に不必要に過度な依存関係をもたらす硬直性も問題点の一つ
クラスはLSP(リスコフの置換原則)を満たさないプログラムが量産されてしまう問題点も別の一つ
どちらの問題点もRustならtraitを使うため問題が起きない
690デフォルトの名無しさん
2024/07/09(火) 22:52:12.26ID:j8eVmrRh 猿ども落ち着いてください!
ここで論破合戦したところでなんの得にもなりません
ここで論破合戦したところでなんの得にもなりません
691デフォルトの名無しさん
2024/07/09(火) 22:57:23.83ID:/lHavWP5 >>685
リスコフの置換原則は設計的な原則だから言語仕様で違反を防ぐことはできないぞ
悪名高い長方形・正方形の問題はトレイトがあっても起こり得る
trait Rectangle {
fn set_width(&mut self, width: i32);
fn set_height(&mut self, height: i32);
fn width(&self) -> i32;
fn height(&self) -> i32;
fn area(&self) -> i32 { self.width() * self.height() }
}
struct Square { len: i32 }
impl Rectangle for Square {
fn set_width(&mut self, width: i32) { self.len = width; }
fn set_height(&mut self, height: i32) { self.len = width; }
fn width(&self) -> i32 { self.len }
fn height(&self) -> i32 { self.len }
}
fn func(x: &mut impl Rectangle) {
x.set_width(3);
x.set_height(4);
// xが長方形であれば以下が成り立つはずだが、Square型を渡された場合に失敗する
assert!(x.area() == 12);
}
リスコフの置換原則は設計的な原則だから言語仕様で違反を防ぐことはできないぞ
悪名高い長方形・正方形の問題はトレイトがあっても起こり得る
trait Rectangle {
fn set_width(&mut self, width: i32);
fn set_height(&mut self, height: i32);
fn width(&self) -> i32;
fn height(&self) -> i32;
fn area(&self) -> i32 { self.width() * self.height() }
}
struct Square { len: i32 }
impl Rectangle for Square {
fn set_width(&mut self, width: i32) { self.len = width; }
fn set_height(&mut self, height: i32) { self.len = width; }
fn width(&self) -> i32 { self.len }
fn height(&self) -> i32 { self.len }
}
fn func(x: &mut impl Rectangle) {
x.set_width(3);
x.set_height(4);
// xが長方形であれば以下が成り立つはずだが、Square型を渡された場合に失敗する
assert!(x.area() == 12);
}
692デフォルトの名無しさん
2024/07/09(火) 23:17:09.97ID:dptasXVA693デフォルトの名無しさん
2024/07/09(火) 23:22:06.46ID:J+Fyw0mO694デフォルトの名無しさん
2024/07/09(火) 23:24:11.46ID:KAvgjhF7 >>692
IRectanble トレイトとかに読み替えてくれ
これは設計的に問題のある例を恣意的に示しているので不自然な点はあるけど、意図は伝わると思う
分かる人は分かると思うけど、問題は「そもそも正方形はwidthとheightという2つの値を扱うインタエースを持つべきでない」というところなので、Rectangleトレイトを作った時点で破綻している
けどそれは設計の問題なので、トレイトという仕組みによってコンパイラが防げるものではないということ
IRectanble トレイトとかに読み替えてくれ
これは設計的に問題のある例を恣意的に示しているので不自然な点はあるけど、意図は伝わると思う
分かる人は分かると思うけど、問題は「そもそも正方形はwidthとheightという2つの値を扱うインタエースを持つべきでない」というところなので、Rectangleトレイトを作った時点で破綻している
けどそれは設計の問題なので、トレイトという仕組みによってコンパイラが防げるものではないということ
695デフォルトの名無しさん
2024/07/09(火) 23:30:16.52ID:KAvgjhF7 >2つの異なる長さを持つ(受け取る)機能を定義しているのならば
>正方形はその実装型にはなりえません
論理的にはそう
でも実際にそういうコードを書けばビルドは通る
>>685 で
>LSPに違反する二つの型のコード例を作って示してごらん
>Rustで違反例を作るのは不可能だよ
とあったので、これはその反例として示した
このような問題は設計の問題であり、まずい設計をする人が使えばRustでも問題は起こり得るということを言いたい
>正方形はその実装型にはなりえません
論理的にはそう
でも実際にそういうコードを書けばビルドは通る
>>685 で
>LSPに違反する二つの型のコード例を作って示してごらん
>Rustで違反例を作るのは不可能だよ
とあったので、これはその反例として示した
このような問題は設計の問題であり、まずい設計をする人が使えばRustでも問題は起こり得るということを言いたい
696デフォルトの名無しさん
2024/07/09(火) 23:35:35.51ID:h2DmPYHm >>691
君はLSPを理解できていない
LSPはis-aの関係を持つ二つの型に対して遵守すべきルールだ
Rustのtraitとその実装型はis-aの関係ではなくhas-aの関係を持つ
したがってtraitとその実装型は明らかにLSPの対象外となる
君はLSPを理解できていない
LSPはis-aの関係を持つ二つの型に対して遵守すべきルールだ
Rustのtraitとその実装型はis-aの関係ではなくhas-aの関係を持つ
したがってtraitとその実装型は明らかにLSPの対象外となる
697デフォルトの名無しさん
2024/07/09(火) 23:40:48.87ID:h2DmPYHm698デフォルトの名無しさん
2024/07/09(火) 23:56:35.46ID:ZNKPIxXk >Rustのtraitとその実装型はis-aの関係ではなくhas-aの関係を持つ
すげーのが出てきたなこりゃw
すげーのが出てきたなこりゃw
699デフォルトの名無しさん
2024/07/09(火) 23:59:12.82ID:loMF79su700デフォルトの名無しさん
2024/07/10(水) 00:09:07.13ID:H4rrLaXL メンバ関数名をそのままtraitの名前にしちまえば
そのメンバを持つ者とtraitの関係はhas-a
そのメンバを持つ者とtraitの関係はhas-a
701デフォルトの名無しさん
2024/07/10(水) 00:10:24.05ID:HryWiaEt 過去に見た (rust以外の) プロジェクトの失敗例だと
・もともとFooというクラスがあった
・新しく作るBooクラスについて、Fooクラスと同じように扱えれば既存コードをあまり変更しなくても済むぞ!と誰かが気づいた
・その人物は Foo クラスのメソッドを元に IFoo インタフェースを定義し、それを Foo と Boo に実装させた
ことから混沌としたコードが生まれた例がある
この失敗をやらかした人は、Rustでも同じように「既存の Rectangle クラスを元に IRectangle トレイトを作り、それを Rectangle と Square に実装させる」ことをやりかねない
Rustではそれが不自然なパターンになりやすいし、起こりにくくはあるけど、本質的には設計の問題
・もともとFooというクラスがあった
・新しく作るBooクラスについて、Fooクラスと同じように扱えれば既存コードをあまり変更しなくても済むぞ!と誰かが気づいた
・その人物は Foo クラスのメソッドを元に IFoo インタフェースを定義し、それを Foo と Boo に実装させた
ことから混沌としたコードが生まれた例がある
この失敗をやらかした人は、Rustでも同じように「既存の Rectangle クラスを元に IRectangle トレイトを作り、それを Rectangle と Square に実装させる」ことをやりかねない
Rustではそれが不自然なパターンになりやすいし、起こりにくくはあるけど、本質的には設計の問題
702デフォルトの名無しさん
2024/07/10(水) 00:29:11.77ID:HryWiaEt 「Rustを書く人はみんな賢いからそのような問題は起こさないはずだ」というなら話は別たけど
実装者の設計能力は言語仕様によって担保できるものではない
実装者の設計能力は言語仕様によって担保できるものではない
■ このスレッドは過去ログ倉庫に格納されています
ニュース
- NY円、一時1ユーロ=180円台まで下落…1999年のユーロ導入以来初 [蚤の市★]
- 国内ホテル、既にキャンセルも 訪日客関連業界、事態見守る ★3 [蚤の市★]
- 「どうしようもない」 ため息つくアジアの玄関口 中国の訪日自粛で−福岡市 [蚤の市★]
- NHK、受信料の未払い世帯に督促強化へ 民事手続きの新組織を設置 差し押さえなどの強制執行も ★2 [1ゲットロボ★]
- 【外交】日中関係悪化、長期化の様相 2012年には自動車輸出80%減も ロイター★3 [1ゲットロボ★]
- 橋下徹氏 外務省幹部の訪中受け「口だけ番長」へ痛烈指摘 「喧嘩は日本の完敗…なんとかっこ悪い日本か」★2 [冬月記者★]
- 日本人、歴史も経済も分からず貧乏に耐えかねて第二次日中戦争を求めてしまう…ヤバイよ [819729701]
- お前らは今年の冬何回くらいカニバスツアー行くんだ? この国の冬の味覚と言えばカニだろ [452836546]
- んなっても良いお🏡
- 【悲報】高市早苗を妄信している今の日本人見ると80年前も市民は進んで戦争協力してたんだって理解出来るよね🥺 [616817505]
- 【超悲報】中国への武力行使、世論調査で「賛成」「どちらかといえば賛成」48.8% 「反対」「どちらかといえば反対」の44.2%を上回る [314039747]
- 中国「高市が頭を下げて謝罪しない限り、絶対に許さない」 [329329848]
