Rust part24

■ このスレッドは過去ログ倉庫に格納されています
2024/05/27(月) 06:41:26.82ID:T4AFD1f4
公式
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/
2024/07/09(火) 22:50:55.17ID:aoAam1/W
>>686
クラスは様々な問題点を抱えている
クラスでは実装継承となるため異なる型同士に不必要に過度な依存関係をもたらす硬直性も問題点の一つ
クラスはLSP(リスコフの置換原則)を満たさないプログラムが量産されてしまう問題点も別の一つ
どちらの問題点もRustならtraitを使うため問題が起きない
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);
}
2024/07/09(火) 23:17:09.97ID:dptasXVA
>>691
長方形がトレイトで正方形が構造体とか意味不明なんだが他の形はどっちにするんだ?
おかしいだろ
2024/07/09(火) 23:22:06.46ID:J+Fyw0mO
>>691
トレイトは機能を表します
2つの異なる長さを持つ(受け取る)機能を定義しているのならば
正方形はその実装型にはなりえません
694デフォルトの名無しさん
垢版 |
2024/07/09(火) 23:24:11.46ID:KAvgjhF7
>>692
IRectanble トレイトとかに読み替えてくれ
これは設計的に問題のある例を恣意的に示しているので不自然な点はあるけど、意図は伝わると思う

分かる人は分かると思うけど、問題は「そもそも正方形はwidthとheightという2つの値を扱うインタエースを持つべきでない」というところなので、Rectangleトレイトを作った時点で破綻している
けどそれは設計の問題なので、トレイトという仕組みによってコンパイラが防げるものではないということ
695デフォルトの名無しさん
垢版 |
2024/07/09(火) 23:30:16.52ID:KAvgjhF7
>2つの異なる長さを持つ(受け取る)機能を定義しているのならば
>正方形はその実装型にはなりえません
論理的にはそう
でも実際にそういうコードを書けばビルドは通る

>>685
>LSPに違反する二つの型のコード例を作って示してごらん
>Rustで違反例を作るのは不可能だよ
とあったので、これはその反例として示した
このような問題は設計の問題であり、まずい設計をする人が使えばRustでも問題は起こり得るということを言いたい
2024/07/09(火) 23:35:35.51ID:h2DmPYHm
>>691
君はLSPを理解できていない
LSPはis-aの関係を持つ二つの型に対して遵守すべきルールだ
Rustのtraitとその実装型はis-aの関係ではなくhas-aの関係を持つ
したがってtraitとその実装型は明らかにLSPの対象外となる
2024/07/09(火) 23:40:48.87ID:h2DmPYHm
>>695
LSPに違反する二つの型はis-aの関係を持つsupertypeとsubtypeでなければならない
>>691はhas-aの関係なのでLSPに違反する二つの型のコード例とはなっていない
2024/07/09(火) 23:56:35.46ID:ZNKPIxXk
>Rustのtraitとその実装型はis-aの関係ではなくhas-aの関係を持つ

すげーのが出てきたなこりゃw
2024/07/09(火) 23:59:12.82ID:loMF79su
LSPはis-a関係に対して守るべき原則
has-a関係に対してLSPの適用は論外
コード>>691はLSPの違反例となっていない
2024/07/10(水) 00:09:07.13ID:H4rrLaXL
メンバ関数名をそのままtraitの名前にしちまえば
そのメンバを持つ者と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ではそれが不自然なパターンになりやすいし、起こりにくくはあるけど、本質的には設計の問題
702デフォルトの名無しさん
垢版 |
2024/07/10(水) 00:29:11.77ID:HryWiaEt
「Rustを書く人はみんな賢いからそのような問題は起こさないはずだ」というなら話は別たけど
実装者の設計能力は言語仕様によって担保できるものではない
2024/07/10(水) 00:33:23.92ID:L/ekmjSC
>>701
それらインタフェースやトレイトを用いている時点でLSPの対象外となっている
LSPを満たす必要がないどころかそんな制限があったら支障が出る
>>691のコードをLSP違反例として出してきたのは明確に間違い
おバカな設計例としてならば理解する
2024/07/10(水) 00:35:49.38ID:L/ekmjSC
>>702
おバカな設計を言語仕様で防げるなんて主張は誰もしていない
あなたが勘違い思い込みで暴走している
2024/07/10(水) 00:36:32.00ID:NGyo+F/O
LSPを全く理解してないばかりか
サブタイピングも理解しとらんのやな
よう継承継承言うたなぁw
2024/07/10(水) 00:53:28.80ID:ur6BKR72
クラスが問題だらけの欠陥品なことが災いを招いてるよね
モダンなプログラミング言語の多くがクラスを捨て去ってくれて感謝
2024/07/10(水) 01:13:16.99ID:1XduDtMr
>>688
>>679の言う「LSPが対象としている遺物における諸問題に悩まされずに済むように」するためには必要なんだよ。
LISKOVのA behavioral notion of subtyping でも「include exception」と言っているだろ。

まぁ、panicが例外にもなれないそびえ立つクソだからRustから排除すべき、と言うなら同意するが。
2024/07/10(水) 01:26:45.94ID:UJdk5M3g
>>707
LSPはsuperclassとsubclassといったような関係を持つ型同士について満たすべき話が書かれてるんよ
その前提を無視してpanicがどうこう言い出してるからズレとるんよ
2024/07/10(水) 01:45:22.45ID:1XduDtMr
>>708
それを言うなら>>682で言っている通り、RustのTraitでLSPに言及するのが大嘘なんだよ。

RustのTraitは同じTraitでも簡単に異なる振る舞いを実装できる(panicみたいな致命的な振る舞い含め)のに、「LSPが対象としている遺物における諸問題に悩まされずに済む」とかの大嘘が出てくるのは何ともアホらしい話。
2024/07/10(水) 02:13:28.47ID:1XduDtMr
>>698
RustのTraitとImplの関係はまさしくsubtypeだしis-aの関係なのにな。「継承しなければsubtypeじゃないしis-aにもならない」と間違って覚えているんかね。
2024/07/10(水) 02:30:31.13ID:GS4KrVsy
どこかで聞きかじっただけの「継承は悪」に辻褄を合わせようとしてどんどん変な理屈を積み重ねているだけでしょ
2024/07/10(水) 02:33:48.76ID:H5PXuDT2
>>707
LSPでは例外を返すなら基底型で返す例外とそのサブタイプのみに限られるとしか言及していない
例外で値をキャッチできなくなることや値を返す抜け道になることを防ぐためだ

ちなみにRustのpanic!では値を返すことはできなくてpanicメッセージのみ
そして普通のプログラムでpanicをキャッチすることはない点など前提が全く異なる
Rustで従来の例外を扱うケースはpanic!を使わずにResultの返り値で返す
したがってpanic!はLSPで出てくる例外の話に該当しないだろう
2024/07/10(水) 03:06:35.71ID:mzDH1NTP
>それらインタフェースやトレイトを用いている時点でLSPの対象外となっている
間違ってるよ
インターフェースだろうがトレイトだろうがサブタイピングは成立するよ
サブタイピングが成立すれば当然LSPの対象範囲だよ

>>691の例もLSPの違反例としては合ってるよ
間違った継承の使い方の例としてよく使われてるよね
2024/07/10(水) 04:10:08.62ID:xXJVwGE7
>>684
>panic禁止にしました。

たとえno_std環境であろうとpanicは禁止にできない

>unsafe rustでpanicを使います。

panicを引き起こすのも扱うのもunsafeを必要としない

>panicが発生してシステムダウンしました。

panic発生がそのままシステムダウンではない
何ら特別な設定をしない標準状態でもスレッド内で起きたpanicはエラーとして返るだけで他のスレッドは動き続ける
2024/07/10(水) 07:01:39.33ID:H4rrLaXL
>>710
型クラスのinstanceであると宣言すればsubtypeじゃないのは自明だぜ
じゃあtraitをimplすると宣言したら
自明だった問題が突如として最先端の未解決問題に変化するのか?
しないでしょ
同じでしょ
716デフォルトの名無しさん
垢版 |
2024/07/10(水) 07:02:08.59ID:HryWiaEt
>>704
ずっと「オブジェクト指向言語のクラスが抱えている問題はRustでは起こらない」と主張してる人がいるでしょ
それに対して、そんなことはないよと言ってるだけ
2024/07/10(水) 07:35:50.92ID:1hn7S5X0
>>716
あらゆる問題が解決されたという話は出てないでしょ
クラスが抱えてる問題でRustによって解決されてる様々な例が出ているだけで
2024/07/10(水) 08:46:54.18ID:1XduDtMr
>>714
だからLSPが対象としている諸問題はRustじゃ解決しないと主張しているんだよ。

>>715
implの実装次第なのに、
「LSPが対象としている遺物における諸問題に悩まされずに済む」と言っているアホが居るのよ。
そんな機能はRustのTrailには無いわな。

>>717
「遺物における諸問題に悩まされずに済む」と言っているアホが居るのよ。しまいにはRustとLSPは関係無いとか言うし。
そんなわけ無いだろと主張している。
2024/07/10(水) 12:00:16.62ID:GhKm8r1f
>>718
そのアンカ先は全部複オジだろ
LSPも知らない、サブタイピングも知らない、継承で起こりうる簡単な問題も知らない
にもかかわらず知ったかぶりして嘘を並び立てる
こんなやつがそうそういるわけがない
720デフォルトの名無しさん
垢版 |
2024/07/10(水) 12:37:44.86ID:1YSFCzN+
キチガイは1人見かけたら10人はいると思え
721デフォルトの名無しさん
垢版 |
2024/07/10(水) 13:29:52.02ID:kPG9kWdt
>>701
そのやり方がなぜ悪いのか理解できませんので、教えてください。
例えば、C++だと、以下の様にするのも別に悪いやり方ではないような
気がするのですが。
class Number {・・・};
Number add(Number &a, Number &b);
Number mul(Number &a, Number &b);
class Integer : public Number {・・・};
class Rational : public Number {・・・};
2024/07/10(水) 13:32:41.05ID:2GPD5dJ4
ChatGPTってモノシリなんですね?
723デフォルトの名無しさん
垢版 |
2024/07/10(水) 13:34:42.29ID:kPG9kWdt
>>721
改めて見てみると、add()やmul()の戻り値にNumberの実態を返しているのがおかしい気もしますが。
IntegerやRationalにadd()やmul()を仮想関数として定義するのが良いのかもしれません。
そのような点で改良の余地が沢山ありそうです。
2024/07/10(水) 13:47:33.33ID:2GPD5dJ4
>>720
色んな板の色んなスレをみて来ているが
どこにでもいるのは事実
2024/07/10(水) 14:42:18.00ID:H4rrLaXL
10人いると思ってる人自身が11人目になりやすいから気をつけなよ
数値の計測が抱えている問題は、そもそも計測していない人には起こらない
2024/07/10(水) 15:49:38.80ID:WriLZMcZ
>>721
add(integer, rational)できる?
2024/07/10(水) 16:24:23.57ID:2GPD5dJ4
ミイラとりがミイラになるのは昔から
2024/07/10(水) 16:42:16.40ID:aw6hROvm
>>712
>例外で値をキャッチできなくなることや値を返す抜け道になることを防ぐためだ
違うよ
勝手な想像でLSPを誤解釈しないで

substituteされる型Tに対して定義された仕様上(契約上)の振る舞いを
substituteする型Sが満たしてなければLSP違反
つまり仕様上panicを禁止したトレイトの関数を
panicする関数でimplしたらLSP違反

LSPではあくまで”仕様上定義された振る舞い”が問題
2024/07/10(水) 18:28:13.04ID:/bwWoePd
>>728
panicを禁止という概念も方法もなく不可能だよ
何をしたいの?
2024/07/10(水) 21:04:08.95ID:H4rrLaXL
catchするという対案がない
対案との比較が抱えている問題はそもそも対案がない言語では起こらない
2024/07/10(水) 21:42:13.36ID:DHf/HCo5
>>729
そいつはRust叩きで連投していた>>684
panicを禁止できると思い込み
unsafeを使うとpanicできると思い込んでいる
732デフォルトの名無しさん
垢版 |
2024/07/10(水) 22:01:49.20ID:HryWiaEt
>>721
「インタフェースを定義し、それに基づいて実装する」という設計なら問題ないのだけど、
これは「あるクラスに依存していたコード群が新しいクラスでも動くようにするため」という発想になっており、大規模な開発だとこのやり方はだいたい失敗するよという話

例を書きづらいけど、例えば「A社製の装置を制御するアプリ」があったとして、
新しく「B社製の装置も制御できるようにする」という追加の開発案件があったとする。
この時点ではまだADeviceControllerは抽象化されておらず、A社装置の仕様に強く依存したクラスであるとする。
これを「ADeviceController が持つメソッドを IDeviceController として取り出し、それを BDeviceControllerにも実装させる」とすると確実に事故る。
「B社装置にだけある機能Xを呼びたい」「A社装置にあった機能YがB社装置にはない」といった違いを吸収しきえれず、インタフェースがぐちゃぐちゃになったり、「呼んでも何もしない」とかの形で誤魔化したり、呼び出し元でサブクラスの判定が必要になったりする

こうならないようにするには
a. 具体的な機器に依存しない、機器の振る舞いを適切に抽象化したインタフェースを定義する
b. 代数的データ型を使う
という方法があり、 Rust では b. の方法も使いやすいので、個人的にはそこが良いなと思う
733デフォルトの名無しさん
垢版 |
2024/07/10(水) 22:15:46.44ID:b9m+kH0p
設計が悪いといえばその通りなんだけど、そのせいでインタフェースが崩壊しているプロジェクトは実際にあるし、RustやGoが継承を廃止した理由の一つでもあると思う
クラス継承だとこの問題はもっと簡単に起こりやすい
前述の例は (あくまでも見かけ上は) インタフェースを定義しており、クラスを継承してるわけではないので、Rustのトレイトでもやろうと思えば起こるけどね
2024/07/10(水) 22:19:25.73ID:FlmWdBd4
言語を選ぶにあたって継承の有無は選択肢に入らんし正直言ってどうでもいいわ
代替手段があるのにいつまで言ってんだ
2024/07/10(水) 22:32:22.87ID:dGMDZq55
>>729
仕様を定義するという簡単なお話がほんとにわからないのかな?

panicを例にすると頭がパニクるみたいなので
リスコフの論文にあるFIFO/LIFOの例で言い換えると
仕様としてLIFOの振る舞いを要求するトレイトの関数を
FIFOの振る舞いで実装したらLSP違反ってこと

簡単なお話でしょ?
2024/07/10(水) 22:40:16.17ID:H4rrLaXL
既に言語を選んだのにまだ、is-aとhas-aどっちにするか選べとか
catchするかしないか選べとか
言語の内部でいつまでも選択が繰り返されるシステムが謎なんよ

いつまで言われるかといえば謎が解けるまでだよ
2024/07/10(水) 23:21:18.85ID:visgGGe9
>>732
それは共通インターフェースと特定装置にしかないインターフェースをそれぞれ別で用意すべきだと思う
拡張メソッドや拡張トレイトも活用する

ただA社装置もB社装置も1つの共通したコードで扱うなら
サブクラス判定ではないにしても呼び出し元での分岐は何かしら必要
2024/07/10(水) 23:44:27.81ID:6pwTfhEs
>>733
RustやGoは違う方法で継承を行っているというだけで継承を廃止したというのは誤解
わざと誤解させてるという面もあるにはある
2024/07/11(木) 00:29:09.09ID:dTTJ6k+i
クイズ
JavaScriptのプロトタイプチェーンはis-a?
それともhas-a?
2024/07/11(木) 00:30:41.75ID:sJ7PGs8/
>>732
一般的に何らかの上位層と下位層があるときに
Rustではその界面にtraitを置いて
上位層はそのtraitを利用する側
下位層はそのtraitを実装する側
とSILIDのDIP (Dependency Inversion Principle)にするのがそのa.だね
もしクラスでやるときは抽象化を徹底した上で色んな注意が必要になるところ
Rustは自然にコーディングできてありがたいね
2024/07/11(木) 01:01:01.84ID:sJ7PGs8/
スマソ
SILIDはSOLIDのタイポ
2024/07/11(木) 01:26:06.15ID:sLOW5r2m
>>740
インターフェース知らないの?
2024/07/11(木) 01:37:36.53ID:sJ7PGs8/
>>742
インタフェースは各言語で付加仕様がバラバラ多種多様だから慎重に言うと
それ自体はフィールド変数など持たず完全に抽象化できつつ
実装必須メソッドとデフォルト実装提供メソッドがサポートされて
その中で利用可能な他のインタフェース(またはtrait)群による制約ができて
となるとどの言語が残るかな
2024/07/11(木) 03:34:06.04ID:huEwUyFV
それはたぶんDじゃなくてIかな……
745デフォルトの名無しさん
垢版 |
2024/07/11(木) 09:53:46.09ID:TzM2Jqw+
https://doc.rust-jp.rs/ 終了の件
2024/07/11(木) 11:33:08.04ID:gcQpVY2c
>>744
DもIも両方関係あるよ
2024/07/11(木) 11:36:08.08ID:gcQpVY2c
>>743
インターフェースが使えるメジャーな言語は全部残る
C#, Java, Kotlin, Swift, TypeScript, Dart
2024/07/11(木) 11:46:30.35ID:ITTQebkb
ʕ◔ϖ◔ʔ
2024/07/11(木) 12:31:18.41ID:QtPgEU0q
>>747
ウソはあかん
2024/07/11(木) 13:53:08.83ID:gabJiib7
>>747
サーバー用途で強いJavaは残るね
Kotlin/Swiftもモバイルアプリのネイティブ言語として残る
TSはJSで十分っていう風潮が漂いつつあるけどまあ残るだろう
死ぬのはC#とDartかな
2024/07/11(木) 14:12:48.49ID:0oGtZVd6
LSPで嘘ばっかりついてたのがバレたから
またしょうもない話をはじめてごまかそうとしてるのか
いい加減にしろよ
2024/07/11(木) 16:22:35.45ID:o6wwWo1Z
LSPに書かれていることすら読まずに
RustのトレイトがLSPの対象だと言い張ってたもんな
2024/07/11(木) 16:57:46.28ID:acwFdQNv
PartialOrdとPartialEqの一貫性とかLSPっぽいけど
Substitution(置換)とはちょっと違うんだよな
無理矢理Sに当てるならSurrogation(代用)あたりか
これをLSPに含めるかは定義重視vs意味重視で意見が分かれそう
2024/07/11(木) 17:15:40.81ID:HnhcW2rv
LSPはsupertypeのインスタンス(オブジェクト)とsubtypeのインスタンスの振る舞いを比較してそこで満たすべき原則を挙げていますから
Rustのtraitをsupertypeとしてみてもそのインスタンスが存在しないため振る舞いの比較ができないですね
traitはLSPとは関係ない立ち位置にいます
755デフォルトの名無しさん
垢版 |
2024/07/11(木) 20:33:40.77ID:eOImp5ti
ごちゃごちゃ難しいこと考えてるうちにエンバグしたりなんかして。
2024/07/11(木) 21:02:05.21ID:qBSAH7HU
>>750
サーバー用途こそJavaはRustとGoに蹴散らされて終わるだろ
2024/07/11(木) 21:30:58.09ID:wPVHCKh0
実際のところRustはサーバーサイドで使われてるの?
2024/07/11(木) 22:25:27.54ID:A0mL7vqg
実際は派生クラスの方が支持されていたとしても基底クラスを蹴散らしてはならない
とLSPは言っている
2024/07/11(木) 22:35:40.65ID:Z3SFRt47
>>757
使われてないよ
2024/07/11(木) 22:47:57.53ID:Wdw77EAw
>>757
Rust利用のトップがウェブのサーバー側
この件は過去スレでも何度も出ているので興味あるなら見るといいよ
その理由も明白でリソースコスト削減が最も効くため
2024/07/11(木) 22:50:39.98ID:wG+w8SXo
サーバーは常時稼働させるものだからねえ
2024/07/11(木) 23:16:00.08ID:liPsU6bJ
>>757
GAFAMとかCloudflareとかトラフィックの多いとこに入ってるから誰もが必ずお世話になってる程度には使われてる
日本でサーバーサイドの仕事が沢山あるか、という意味ならそんなことはない
2024/07/11(木) 23:24:11.59ID:b01V4j67
世界中で着実にRustへ置き換わっていってるね
特にクラウドを利用しているとランニングコストに直結するので
2024/07/12(金) 00:13:00.93ID:0qGKBZrU
>>753, 754
トレイトの場合はLSPで言うsupertypeやsubtypeになるのは
トレイトを利用して作られるimpl Traitやtrait objectの型だよ

PartialOrd/PartialEqやFn/FnMut/FnOnceのように
supertrait/subtraitの関係にあるやつも便宜的にトレイトで互換性が語られるけど
実際はそれらを利用して作られる型についての話なのと同じなんだよ
2024/07/12(金) 00:16:45.77ID:U8/iJiIO
>>764
真面目に相手してあげるの偉いな
2024/07/12(金) 00:19:01.43ID:iZsWh24v
>>764
いいえ
traitが実装される具体的な型は全てsubtypeに相当する兄弟同士であるため
親となるsupertypeの具体的な型はありませんはありません
2024/07/12(金) 00:19:49.06ID:iZsWh24v
>>764
いいえ
traitが実装される具体的な型は全てsubtypeに相当する兄弟同士であるため
親となるsupertypeに相当する具体的な型はありません
2024/07/12(金) 00:47:16.73ID:KyXC0KGT
トレイトにはフィールド変数が一つもなくてメソッドも各個別型で実装されるものだから事前条件・事後条件など比較もできなくてLSP適用は無理でしょ

>>764
supertrait/subtraitの場合に例えばある構造体についてそのインスタンスはどちらも同一になるからLSPの前提である二つのインスタンス間での差は論じられないでしょ
2024/07/12(金) 09:52:35.34ID:bw8b12Bg
>>757
Rustは殆どどこにも使われてないよ
770デフォルトの名無しさん
垢版 |
2024/07/12(金) 10:23:09.62ID:LuKbokrL
「C言語は分かる。機械語も分かる、回路もわかる。30万払うからRustのメモリ安全のからくりをサクッとレクチャーしてくれ」
みたいなニーズがあっさり無料で満たされているべきだと思うんだ
2024/07/12(金) 10:57:31.20ID:KyXC0KGT
誤解は色々あるけど「努力すれば必ずゼロコストになるカラクリ」が
あると思ってるならそれが誤解だね
クイックソートやハッシュテーブルと同じく、最悪の場合のコストは低くない
2024/07/12(金) 11:16:56.09ID:LuKbokrL
間違ってたら指摘してくれ

メモリは唯一の所有者を持つ
所有者たる変数がスコープを抜けた時、もしくは所有者たる変数に他の値が代入された時、メモリは自動的に解放される
Rustの、メモリに関する様々な文法はひとえにレキシカルライフタイムのためである
レキシカルライフタイムすなわち字句的寿命は、プログラムを走らせなくともコンパイル時に変数の寿命が把握できる仕掛けである
メモリの使途に矛盾が発生しているとき、Rustコンパイラはエラーを吐く
2024/07/12(金) 11:28:19.38ID:LuKbokrL
そもそも動的メモリ確保一般を知っていますかって話で、
この質問にイエスと答えられる人は横着ができるべき
2024/07/12(金) 13:01:13.97ID:KyXC0KGT
>>771
Rustのゼロコスト抽象化はそういう意味ではなくてRustの様々な抽象化仕様を実行時の追加コストゼロで実現していることでしょ

>>772
値がムーブされないままスコープが尽きたらデストラクタが自動で呼ばれるだけでしょ
だからRcのように参照カウンタを用いて共有ownershipを提供する仕組みもあるよ
2024/07/12(金) 13:21:18.68ID:KyXC0KGT
唯一の所有者が存在することと所有者の情報を誰でも取得できることを
区別するのは少し難しい
大谷の家が実在することと住所を公表できることを区別できない人もいるかもしれない
776デフォルトの名無しさん
垢版 |
2024/07/12(金) 14:02:34.71ID:HU5SDXKx
「A が Bの継承クラスであること。即ち、C++で
class A : public B {・・・};
と書くのは『A is B』である時が良い事が多いですよ」
という説が有りますけれど、
「多い」というだけだと理解してたんですが、このスレの人には、このルール
を徹底徹尾適用できる言語を夢見ておられるようですね。
2024/07/12(金) 14:20:30.92ID:KyXC0KGT
ここでID何度か被ってきたけどポエムの人とID被ったのは初めて

>>776
クラス継承はメリットが少なくデメリットが多いと長年の共通体験で判明してそれが共通認識となっているから
様々な異なる方針のモダンな言語たちがクラス廃止の点では共通方針となっただけでしょ
2024/07/12(金) 15:35:12.29ID:4qvv2DeJ
何気なく cargo update すると後悔する orz
2024/07/12(金) 15:44:29.48ID:4qvv2DeJ
GAFAM は存在しない
今は GAMAM
2024/07/12(金) 15:46:16.40ID:4qvv2DeJ
>>772
drop(hoge)
2024/07/12(金) 15:49:17.77ID:4qvv2DeJ
>>773
Box
Rc
Arc
Cell
RefCell
OnceCell
Pin
2024/07/12(金) 17:11:30.65ID:LuKbokrL
>>780
サンキュー

>>781
そのあたり全然勉強してない
「相互に参照し合うあうメモリは持てません。それを制限してあまりあるメリットを提供します。どうしてもやりたい人のために別口を用意しました」
という事実が重要
783デフォルトの名無しさん
垢版 |
2024/07/12(金) 20:20:08.14ID:0tYdINiS
Rust製コードエディター「Zed」がLinuxにようやく対応
Windowsサポートにも期待

ttps://forest.watch.impress.co.jp/docs/news/1607906.html
784デフォルトの名無しさん
垢版 |
2024/07/12(金) 20:23:46.34ID:0tYdINiS
個人利用は無償 ~JetBrainsがRust向けIDE「RustRover」を一般公開
メモリ安全性を保障したプログラミング言語「Rust」の開発に特化した統合開発環境

ttps://forest.watch.impress.co.jp/docs/news/1607747.html
2024/07/12(金) 20:46:42.78ID:KyXC0KGT
別口を用意するとは?
RustらしくないRustを用意することかな

もし日本語らしくない日本語が何か成果を出したら
日本語らしさを学習したAIに都合が悪い
2024/07/12(金) 21:35:52.40ID:VV8L6PZC
>>784
慣れの問題なんだろうけど
vscodeがいい…
2024/07/12(金) 22:05:28.85ID:LuKbokrL
>>785
参照カウンタ等がその別口
逆に聞くけど全てを参照カウンタで書かないのはなぜ?
788デフォルトの名無しさん
垢版 |
2024/07/12(金) 22:12:50.70ID:VeLgD+zy
>>781
RcやBoxは分かりやすいけどStringやVecも動的確保だよね、ということに気付いてない人もいるかも?

Rustが良いのはムーブが基本なおかげで意図せぬメモリコピーが起きないこと
所有権を他に渡す (ある構造体から別の構造体にか、あるコンテナから別のコンテナにとか移動する) 際にコストが発生しない
C++は逆で明示的に move しないと意図せぬコピーが起こる
■ このスレッドは過去ログ倉庫に格納されています
5ちゃんねるの広告が気に入らない場合は、こちらをクリックしてください。

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