Rustとか言うダブスタ言語 (173レス)
Rustとか言うダブスタ言語 http://medaka.5ch.net/test/read.cgi/prog/1729120072/
上
下
前
次
1-
新
通常表示
512バイト分割
レス栞
リロード規制
です。10分ほどで解除するので、
他のブラウザ
へ避難してください。
1: 仕様書無しさん [sage] 2024/10/17(木) 08:07:52.57 値型と参照型で振る舞い変えるダブスタ言語だけど使ってるやついる? http://medaka.5ch.net/test/read.cgi/prog/1729120072/1
47: 仕様書無しさん [sage] 2024/10/19(土) 12:02:44.51 struct Point { x: i32, y: i32. } 例えばこのようなPoint構造体を作ったら。それは新しい型であってデフォルトではCopy出来ない。 もしこの構造体の所に #[derive(Copy,Clone)] という指定を付けるとCopyトレイトが実装されるのでコピー出来るようになる。ただ慣習的には構造体は暗黙的にコビーされるのは良くないので、Cloneだけ実装して明示的にCloneしてねというのが推奨。 http://medaka.5ch.net/test/read.cgi/prog/1729120072/47
48: 警備員[Lv.11][芽] [sage] 2024/10/19(土) 12:05:15.32 >>47 だったらはなから変数.mcopyでいいだろ http://medaka.5ch.net/test/read.cgi/prog/1729120072/48
49: 警備員[Lv.11][芽] [sage] 2024/10/19(土) 12:06:10.07 それつけなかったらプリミティヴも移譲にするでいいじゃん そっちのほうがはるかに神言語のそれだろ http://medaka.5ch.net/test/read.cgi/prog/1729120072/49
50: 仕様書無しさん [sage] 2024/10/19(土) 12:10:59.43 let p1 = Point { x:100, y:200 }; let p2 = p1; // copy が実装されてる場合 let p3 = p1.clone(); // 明示的な clone http://medaka.5ch.net/test/read.cgi/prog/1729120072/50
51: 仕様書無しさん [sage] 2024/10/19(土) 12:20:52.07 C言語から来た人は型をメモリのサイズで捉えてる人が多いよ。関数型言語で言うところの型というのは機能や文脈や制限や寿命やら色々な情報を含むもので全部区別すべきもの。これが凄い便利機能なわけ。 暗黙的な型変換をする言語は型の力を利用出来ないのでバグる。 http://medaka.5ch.net/test/read.cgi/prog/1729120072/51
52: 仕様書無しさん [sage] 2024/10/19(土) 12:33:15.92 あと勘違いしてるかもしれないけど、プログラム上の変数のスコープの範囲と、実際の寿命の範囲は別物だよ。 Rustコンパイラは変数が使われている所を全て把握しているので用が済んだ変数はスコープ抜けなくても最適化で消されてる。 定数になるものなら変数の領域すら確保されない。 http://medaka.5ch.net/test/read.cgi/prog/1729120072/52
53: 仕様書無しさん [sage] 2024/10/19(土) 12:46:30.82 fn main() { // 整数型 let a: i32 = 42; let b = a.clone(); // 浮動小数点型 let c: f64 = 3.14; let d = c.clone(); // ブール型 let e: bool = true; let f = e.clone(); // 文字型 let g: char = 'A'; let h = g.clone(); } 明示的に書いたほうが分かり易いという人は全部 clone って書いてもいいんですよ。 http://medaka.5ch.net/test/read.cgi/prog/1729120072/53
54: 警備員[Lv.11][芽] [sage] 2024/10/19(土) 12:46:36.00 >>52 それ君らが嫌いなガベコレとなにが違うの? http://medaka.5ch.net/test/read.cgi/prog/1729120072/54
55: 仕様書無しさん [sage] 2024/10/19(土) 12:51:14.23 ガベコレは用が済んだタイミングで即解放されるんじゃなくて、GCを走らせたタイミングで解放です。 なのでメモリを倍ぐらい余分に確保しとかないと足らなくなることがある。 http://medaka.5ch.net/test/read.cgi/prog/1729120072/55
56: 仕様書無しさん [sage] 2024/10/19(土) 15:46:59.73 無職ってすぐ人に聞こうとするよな だから無職なんだろうけど http://medaka.5ch.net/test/read.cgi/prog/1729120072/56
57: 仕様書無しさん [] 2024/10/19(土) 16:17:01.01 >>54 ガベージコレクション(GC)は ・「ガベージ=ゴミ=使われなくなったメモリ」がどんどん溜まっていく ・そのため実行中のあるタイミングで溜まってきたゴミをまとめて収集(コレクション)する ・ゴミかどうかは実行中に使われなくなったかどうかを何らかの方法で追跡して判断する ・このGCを判断実行できるように冗長なメモリ管理をすることとゴミが溜まるためメモリ消費量が多い ・これらの処理を行なえるようGCランタイムと呼ばれるプログラムが必ず内蔵される このGCにメモリ管理を依存する言語がGC言語と呼ばれている C/C++/Rustは依存しないため非GC言語 http://medaka.5ch.net/test/read.cgi/prog/1729120072/57
58: 仕様書無しさん [sage] 2024/10/19(土) 16:48:14.21 【GC言語】常に安全にメモリ自動解放されるがGCのため遅くてメモリ利用量も多い 【Rust】常に安全にメモリ自動解放されて速くて省メモリ 【C/C++】安全ではなく解放済み領域をメモリ参照してしまうことも発生 http://medaka.5ch.net/test/read.cgi/prog/1729120072/58
59: 警備員[Lv.12][芽] [sage] 2024/10/19(土) 19:17:09.27 まぁどんだけ安全でもダブスタ言語なんて使いたく無いけどね http://medaka.5ch.net/test/read.cgi/prog/1729120072/59
60: 仕様書無しさん [] 2024/10/19(土) 19:23:41.39 それは単に使わなければ良いだけじゃないの? http://medaka.5ch.net/test/read.cgi/prog/1729120072/60
61: 仕様書無しさん [] 2024/10/19(土) 19:23:41.76 それは単に使わなければ良いだけじゃないの? http://medaka.5ch.net/test/read.cgi/prog/1729120072/61
62: 仕様書無しさん [sage] 2024/10/19(土) 19:39:45.66 >>45 アメリカでは政府も国防総省もRust言語なんだね http://medaka.5ch.net/test/read.cgi/prog/1729120072/62
63: 仕様書無しさん [sage] 2024/10/19(土) 21:27:12.32 メモリの仕組み理解してからRustやろうね できればCかC++やってから http://medaka.5ch.net/test/read.cgi/prog/1729120072/63
64: 警備員[Lv.13][芽] [sage] 2024/10/19(土) 21:29:03.92 >>63 いや理解してんだわ だからこそ同じ書き方で2つの振る舞いをするRustが嫌いなの http://medaka.5ch.net/test/read.cgi/prog/1729120072/64
65: 仕様書無しさん [sage] 2024/10/19(土) 21:35:54.87 JavaやC#もそういうことはある http://medaka.5ch.net/test/read.cgi/prog/1729120072/65
66: 仕様書無しさん [] 2024/10/19(土) 21:37:56.86 「本当に理解した?」 「はいっ!」←こういう新人いるよね http://medaka.5ch.net/test/read.cgi/prog/1729120072/66
67: 仕様書無しさん [sage] 2024/10/19(土) 21:44:28.27 こいつは何をダブスタって言ってるんだ? http://medaka.5ch.net/test/read.cgi/prog/1729120072/67
68: 仕様書無しさん [sage] 2024/10/19(土) 21:50:24.57 >>64 誤解してるんじゃないの? Rustにはコピー可能型とコピー不可能型の2種類しかない それを理解すれば振る舞いは常に一意に定まることがわかる http://medaka.5ch.net/test/read.cgi/prog/1729120072/68
69: 仕様書無しさん [sage] 2024/10/19(土) 22:03:38.72 無職はほっとけよ 仕事してないんだから http://medaka.5ch.net/test/read.cgi/prog/1729120072/69
70: 警備員[Lv.4][新芽] [sage] 2024/10/19(土) 22:59:12.10 このスレには、僕のスッキリしない部分を言語化して説明してくれる人が多くて助かります http://medaka.5ch.net/test/read.cgi/prog/1729120072/70
71: 警備員[Lv.14] [sage] 2024/10/19(土) 23:29:07.21 >>67 移譲とメモリコピーで振る舞い変える http://medaka.5ch.net/test/read.cgi/prog/1729120072/71
72: 警備員[Lv.14] [sage] 2024/10/19(土) 23:30:10.12 >>68 だから.cloneを明記しないと移譲になるでいいじゃん http://medaka.5ch.net/test/read.cgi/prog/1729120072/72
73: 仕様書無しさん [sage] 2024/10/19(土) 23:46:47.34 >>72 コピーとcloneは明確に異なると定められている コピーはプログラマーが実装することはなくビットパターンごとサイズ分のメモリがコピーされる cloneはプログラマーが自由に実装することができて例えばヒープ領域を持つデータならその部分も含めてコピーすることもできるしコピーせずに共有することもできてcloneは型毎に自由度がある このようにコピーとcloneは明確に異なっている http://medaka.5ch.net/test/read.cgi/prog/1729120072/73
74: 仕様書無しさん [sage] 2024/10/19(土) 23:49:27.57 コピーと同じ動作になるのはムーブ どちらもプログラマーは実装することができない ただしムーブはムーブ元の値が無効になるという点のみコピーと異なる http://medaka.5ch.net/test/read.cgi/prog/1729120072/74
75: 仕様書無しさん [sage] 2024/10/20(日) 02:08:40.13 ムーブとコピーで同じイコールを書くのが気に入らないって事かな? 所有権の移譲とか言うから分かりにくいんだと思う。「メモリ管理責任」が無いからコピー、有れば「メモリ管理責任」ごとムーブするだけ。 で、プリミティブ型はそもそも移動する意味がないしコピーの方が速い。 優先順位の考え方が逆で、イコールはコピー出来る型ならコピー、出来ない型ならムーブする。ムーブも出来ない型ならコンパイルエラー。で、エラーが出る場合は明示的にcloneを書いたりする。でcloneも出来ない型なら更に他の方法で対策する。 そうやって型で制約をはめる事で誰が書いても同じ挙動になるようにしている。 http://medaka.5ch.net/test/read.cgi/prog/1729120072/75
76: 警備員[Lv.14] [sage] 2024/10/20(日) 03:27:08.69 >>73 じゃあなおさら変数.mcopyが必要だね http://medaka.5ch.net/test/read.cgi/prog/1729120072/76
77: 警備員[Lv.14] [sage] 2024/10/20(日) 03:30:07.84 >>75 そうやって色々試して型探ってくよりはるかにプリミティヴ系も=のみの場合はメモリ解放して使えなくなるくらいのほうが楽だろ コピーは上で言ってるように.mcopyを明示的に示せばいいだけ http://medaka.5ch.net/test/read.cgi/prog/1729120072/77
78: 仕様書無しさん [sage] 2024/10/20(日) 04:25:09.91 >>77 なんか物事の捉え方がインタプリタと勘違いしてない? コンパイラなんだからコンパイル時に全部処理されるのよ? http://medaka.5ch.net/test/read.cgi/prog/1729120072/78
79: 仕様書無しさん [sage] 2024/10/20(日) 04:29:33.89 プログラム的な意味論とそれが最適化されて出力された後のコードの挙動まで解説しないと駄目なのかな? http://medaka.5ch.net/test/read.cgi/prog/1729120072/79
80: 仕様書無しさん [sage] 2024/10/20(日) 06:39:19.66 >>77 ムーブとコピーはプリミティブな相補的な動作なので .move()や.copy()といったメソッド呼び出しは不可能 トレイトCopy実装型は常にコピーされ Copy非実装型は常にムーブされる Rustは非常にシンプルでわかりやすくなっている http://medaka.5ch.net/test/read.cgi/prog/1729120072/80
81: 警備員[Lv.15] [sage] 2024/10/20(日) 09:19:34.07 >>80 だからそれを同じ let b = a; let d = c; で表現させちゃダメだろ ↑見てどっちがプリミティヴかわかるか? http://medaka.5ch.net/test/read.cgi/prog/1729120072/81
82: 警備員[Lv.15] [sage] 2024/10/20(日) 09:20:49.24 低レベル言語やってるやつって保守のこと全く考えないのかな? http://medaka.5ch.net/test/read.cgi/prog/1729120072/82
83: 仕様書無しさん [] 2024/10/20(日) 09:30:55.71 C#でいうと var a = new Foo(); var b = a; で a と b が同じオブジェクトを指す状態になるけど、これを許容しないのがRust この場合は b だけが Foo に責任を持つべきで、そのためにaは所有権を無くす (「解放する」ではなく「所有権を移す」だけ) これはメモリ使用量というよりも管理の問題で、「a の操作がbに影響を与える」ことによる複雑性を取り除くために厳しくしてる var a = 1; var b = a; C#でもそうだけど、これはスタックメモリに積まれるもので、単に値コピーされる これは関数を抜ければ解放される (GCのような機構を必要としない) し、C#でもaの書き換えがbに作用しないはず Rustでもこれでaを使えなくする理由はないので単にコピーされる Rustでもオブジェクトを共有する仕組みはあるけど、その場合は共有のための型 (Rc<T> のような型) を使うことになる これは特にマルチスレッドの場合に有用で、スレッドを跨いで共有されるオブジェクトは「ロックをかけないと内部の値にアクセスできない」型で包まないとコンパイルエラーになる仕組みがある これは個人的にすごく便利だと思う部分で、Rustだと安心してコードを書ける感じがする http://medaka.5ch.net/test/read.cgi/prog/1729120072/83
84: 仕様書無しさん [] 2024/10/20(日) 09:41:57.61 C#でも var b = a; でbがaと同じオブジェクトを参照するかコピーされるかは型に依存するでしょ http://medaka.5ch.net/test/read.cgi/prog/1729120072/84
85: 仕様書無しさん [] 2024/10/20(日) 09:46:56.69 【結婚難】金稼ぎ共働き妨害するな【孤独死】 ☆犠牲になるのは犯罪幇助SEの結婚相手☆ 実態派遣で非婚や離婚や中絶や少子化や親不孝を促進 ・キモい ・モラルない ・ファッションセンスない ・コミュニケーション苦手 ・時間外労働違反で共働き妨害 ・泥棒客先に開発報酬を奪わせる ・泥棒客先に知的財産を奪わせる ・裁判官が技術判断不正をする SEは多重派遣の料金詐欺は非婚 https://codelearn.jp/articles/about-engineer-marriage http://medaka.5ch.net/test/read.cgi/prog/1729120072/85
86: 仕様書無しさん [] 2024/10/20(日) 09:55:32.58 >>82 保守性は言語でなく開発者や組織のレベルの問題 あえて言語の特徴を書くなら、OOP言語だとクラスのフィールドに参照型の値がある場合に、それが他のクラスと共有されるものであるかを知る方法がないけど、Rustはそれが明確という利点がある struct Foo { a: T } のTがStringならこれはFooの中に閉じ込められてるし、Rc<String> なら他と共有される (ただしスレッドは跨がない) し、Rc<Mutex<String>> なら複数スレッドから共有されるかつ書き換わる可能性があることを意味する そのために面倒な部分があるのは確かで、C#やJavaは逆にそれらを簡略化してるともいえる http://medaka.5ch.net/test/read.cgi/prog/1729120072/86
87: 仕様書無しさん [sage] 2024/10/20(日) 10:41:24.68 >>82 Rustの保守性がこれまでの言語と比べて格段に保守性が高く優れているのは様々な仕組みで実現されている 例えばRustのデータ参照競合の防止機構やデータ競合の防止機構は保守においてそれらによるバグ混入を確実にコンパイルエラーとして検出する http://medaka.5ch.net/test/read.cgi/prog/1729120072/87
88: 仕様書無しさん [] 2024/10/20(日) 11:20:15.04 初学者がコードを見た時のとっつきにくさはあると思う けどこれは simple vs easy みたいもので、Rustは難しいけど仕組みを理解すればシンプルではある http://medaka.5ch.net/test/read.cgi/prog/1729120072/88
89: 警備員[Lv.16] [sage] 2024/10/20(日) 12:59:21.64 >>87 だからわざわざそれをコンパイルエラーで確認するのかって話になるだろ >>84 でもaは使えなくならないよね http://medaka.5ch.net/test/read.cgi/prog/1729120072/89
90: 仕様書無しさん [sage] 2024/10/20(日) 13:05:09.09 >>1 値型と参照型って何のこと? Rustは全ての型に対して値と参照の両方があるよ もしプログラマーがそれらを取り違えばコンパイルエラーとなるから問題は起きないよ まずは正しい現状認識をしてから批判しようね http://medaka.5ch.net/test/read.cgi/prog/1729120072/90
91: 警備員[Lv.16] [sage] 2024/10/20(日) 13:19:31.73 >>90 だからわざわざコンパイルエラー確認しましょうってことだろ? どっち使ってんのかわかんないから どっち使ってるかわかんねぇからコンパイルエラーで確認しましょうってそんなスマートか? 俺なら無理 http://medaka.5ch.net/test/read.cgi/prog/1729120072/91
92: 警備員[Lv.16] [sage] 2024/10/20(日) 13:20:41.41 普通の人間ならコンパイルエラーで確認するより書かれたプログラムの中身見て判断できるようになったほうがいいよねってなると思うよ それがいわゆる可読性というやつや http://medaka.5ch.net/test/read.cgi/prog/1729120072/92
93: 仕様書無しさん [sage] 2024/10/20(日) 13:33:04.04 >>91 >>92 型の違いなどはどの言語もコンパイル時にエラーか実行時にエラーとなる もちろんRustのようにコンパイル時にエラーとなる言語の方が優れている http://medaka.5ch.net/test/read.cgi/prog/1729120072/93
94: 仕様書無しさん [sage] 2024/10/20(日) 14:06:18.94 Rust書いた事ない人が言いそうな事だな。 vs-codeなりなんなりでコード書いてればコンパイルするまでもなく書いてるそばから rust analyzer が間違いを指摘してくれるのに。どう直せばいいかも細かく出てくるよ。 http://medaka.5ch.net/test/read.cgi/prog/1729120072/94
95: 仕様書無しさん [sage] 2024/10/20(日) 14:26:59.39 >>93 実行時エラーが出るまでわからないプログラミング言語はその仕様が静的にエラーを指摘できない言語仕様になってるからな 例えばC/C++のサニタイザーも実行させて問題が発生した時に初めてコードに問題があることがわかる 実行前に静的に様々な問題が判明できる最先端の言語はRustで間違いない http://medaka.5ch.net/test/read.cgi/prog/1729120072/95
96: 仕様書無しさん [sage] 2024/10/20(日) 16:04:59.07 プログラム板のRustスレにいる人が出張してきてるね http://medaka.5ch.net/test/read.cgi/prog/1729120072/96
97: 警備員[Lv.16] [sage] 2024/10/20(日) 16:28:14.26 >>94 それIDEが無いと無理でしょ http://medaka.5ch.net/test/read.cgi/prog/1729120072/97
98: 警備員[Lv.16] [sage] 2024/10/20(日) 16:30:01.63 ふつうにコピーして渡してるのか参照で渡してるのかくらいプログラムのコード見て分かるようになったほうが遥かにいいだろ Rust信者は盲信してるだけで普通の感性が全くない頭悪い人間ども http://medaka.5ch.net/test/read.cgi/prog/1729120072/98
99: 仕様書無しさん [sage] 2024/10/20(日) 16:45:11.52 >>98 実際にプログラミングをすればわかる ほとんどのムーブは関数呼び出しの引数や返り値に表れる そしてほとんどの関数の引数はムーブではなく参照を受け取る つまりムーブで渡してしまう関数は限られた特殊なものだけなのだ レアケースなのですぐに意識できるため困る人が出現していない http://medaka.5ch.net/test/read.cgi/prog/1729120072/99
100: 仕様書無しさん [sage] 2024/10/20(日) 16:48:55.21 >>97 普段コード書くのに何のエディタ使ってるんだよ。今時、emacsでもvimでもrust analyzer使えるぞ? もし Langurge Server Protocol に対応してないエディタ使ってたらそれがこそプログラム書いてない証拠。 http://medaka.5ch.net/test/read.cgi/prog/1729120072/100
101: 仕様書無しさん [sage] 2024/10/20(日) 16:57:37.13 rustfmtとclippyとrustcだけがあれば十分 LSPは補助輪として優秀だが必須ではない むしろLSPに依存しないとコーディングできなき人は下に見られる http://medaka.5ch.net/test/read.cgi/prog/1729120072/101
102: 仕様書無しさん [sage] 2024/10/20(日) 17:00:06.92 >>98 Rustでは必ず区別がつきますよ 参照で渡すときは「&変数名」となります まずは基本知識を身に着けましょうね http://medaka.5ch.net/test/read.cgi/prog/1729120072/102
103: 仕様書無しさん [] 2024/10/20(日) 17:42:31.87 C#でもIDEが無ければ var b = a; のコードが参照なのかコピーなのか分からないんだが int b = a; のように型を付ければ分かるのはRustも同じで、 let b: i32 = a; と書くこともできる http://medaka.5ch.net/test/read.cgi/prog/1729120072/103
104: 警備員[Lv.17] [sage] 2024/10/20(日) 19:34:34.90 >>102 いやポインタ渡してんだから移譲が参照渡しだろうが! http://medaka.5ch.net/test/read.cgi/prog/1729120072/104
105: 警備員[Lv.17] [sage] 2024/10/20(日) 19:35:31.52 >>103 参照かコピーかわからなくてもaはその後も使えるけどな http://medaka.5ch.net/test/read.cgi/prog/1729120072/105
106: 警備員[Lv.17] [sage] 2024/10/20(日) 19:37:46.89 俺が言ってるのはコピーか参照かわからんじゃなくてどっちがその後でその変数が使えるかわからんだ どっちも使えなくすればそれでいいんよ で.mcopyがあればそれはそのあとでもつかえるよって簡単にわかっていいよねって話なんだが でなんでそれをやってないかというとそういうの考えずに作った欠陥言語だからってわけ http://medaka.5ch.net/test/read.cgi/prog/1729120072/106
107: 警備員[Lv.17] [sage] 2024/10/20(日) 19:38:14.40 おれがダブスタって言ってるのは常にこのことについて言ってんだわ http://medaka.5ch.net/test/read.cgi/prog/1729120072/107
108: 警備員[Lv.17] [sage] 2024/10/20(日) 19:39:50.59 IDEでデバッガー使って>>11これをやってんのがお前ら わかる? http://medaka.5ch.net/test/read.cgi/prog/1729120072/108
109: 仕様書無しさん [sage] 2024/10/20(日) 19:42:48.88 >>104 ムーブは参照渡しではありません ムーブは値渡しです コピーも値渡しです ムーブとコピーは元が残るかどうかの違いだけで同じカテゴリに属します http://medaka.5ch.net/test/read.cgi/prog/1729120072/109
110: 警備員[Lv.17] [sage] 2024/10/20(日) 19:46:02.90 >>109 ムーブが値渡しぃ? 大量のデータわざわざコピーしてんの? http://medaka.5ch.net/test/read.cgi/prog/1729120072/110
111: 仕様書無しさん [sage] 2024/10/20(日) 19:52:41.19 >>104 移譲はポインタ渡しをしない 以下は生成コードレベルの話になるが 関数へ引数を渡す時に 移譲でもコピーでも小さい値(例えば64bitのLinux環境なら48バイト以下)ならばレジスタ(最大6個使用)で関数に渡される 移譲でもコピーでも巨大な値ならば最適化によりポインタ渡しになる つまり移譲とコピーは全く同じ http://medaka.5ch.net/test/read.cgi/prog/1729120072/111
112: 仕様書無しさん [] 2024/10/20(日) 20:04:03.69 >>108 C#から来るととっつきにくいかもしれないけの、C++をやってた人は割と入りやすいし、学んだ言語による慣れの問題だと思う &記号の意味もC++に近いし、ムーブもC++にある概念だし http://medaka.5ch.net/test/read.cgi/prog/1729120072/112
113: 仕様書無しさん [sage] 2024/10/20(日) 20:23:37.92 >>110 ムーブもコピーも値渡しなので関数へは基本的にレジスタ群に値を入れて渡されるよ 例えば以下の例 // ムーブされる構造体例 struct MovablePoint { x: i64, y: i64, } // コピーされる構造体例 #[derive(Copy, Clone)] struct CopyablePoint { x: i64, y: i64, } ムーブとコピーの渡し方に違いはなく両者とも同じで 関数へ渡す場合はどちらも2つの64bitレジスタを使って値渡しされるよ だから>>1さんが無知で『ムーブは参照渡しされる』と誤解をしているだけですね http://medaka.5ch.net/test/read.cgi/prog/1729120072/113
114: 仕様書無しさん [] 2024/10/20(日) 20:27:59.07 >>110 雑にいえばポインタだけコピーする感じ 10万文字の文字列を扱う場合でも、大抵は文字列はヒープに確保されて、スタックにはそのアドレスや文字列長などの管理用のデータだけ置かれる ムーブする際はその管理用のデータだけコピーするので、巨大な文字列のコピーは起こらない ムーブした後はヒープのデータの所有権 (解放の責務も含む) がムーブ先の変数に移すので、ムーブ前の変数はそれを使えなくなる ファイルハンドルなんかも同じで、解放などの責務を持つリソースについて気軽なコピーをさせないよう制限してる感じ http://medaka.5ch.net/test/read.cgi/prog/1729120072/114
115: 仕様書無しさん [sage] 2024/10/20(日) 20:38:40.43 1みたいなこの手の無能はほぼレジスタの知識がない バイナリレベルを学んでないから話が噛み合わない http://medaka.5ch.net/test/read.cgi/prog/1729120072/115
116: 仕様書無しさん [] 2024/10/20(日) 20:48:47.82 Rustはメモリ周りを意識させられる言語なのはその通りなので、そこは受け切れざるを得ない そこまでの効率性を求めない分野だったらRustである必要もないので、素直に他の言語を使うのも選択肢だと思う (個人的にはリソース管理だけでなく、型表現の豊かさなどRustの利点は他にもあると思ってるけど) C++やってた身からすると、C++で踏みがちな罠に繋がる道がほとんど塞がれてる感じで、それがかなり有用なのよ http://medaka.5ch.net/test/read.cgi/prog/1729120072/116
117: 仕様書無しさん [] 2024/10/20(日) 22:04:12.19 Rustは非常にシンプルでこの3つしかない ・ムーブ値渡し ・コピー値渡し ・参照渡し (値への参照が渡される) Rustはレジスタのない環境(例: Wasm)にも対応しているのでレジスタを意識する必要はない (むしろ環境指定してる場合を除いてレジスタを仮定してはいけない) 参照とアドレスはイコールではない スライスなど可変長の値への参照は値を指すアドレスと長さのペアになる トレイトオブジェクトへの参照は値を指すアドレスとvtableを指すアドレスのペアになる http://medaka.5ch.net/test/read.cgi/prog/1729120072/117
118: 仕様書無しさん [sage] 2024/10/20(日) 23:54:03.34 結局>>1が自己中に勝手な妄想で勘違いしてイチャモンつけていただけだったな http://medaka.5ch.net/test/read.cgi/prog/1729120072/118
119: 仕様書無しさん [sage] 2024/10/21(月) 00:19:35.69 なんだかプログラム学習で変数という概念に引っかかっている人を相手しているみたいな気分だな Rust書いてる人的にはひっかかる要素がなさすぎて、たぶん1が一体何にひっかかってるのかすら誰もわかってない http://medaka.5ch.net/test/read.cgi/prog/1729120072/119
120: 仕様書無しさん [sage] 2024/10/21(月) 00:31:38.32 あいつは世間知らずのC#教で何かにケチつけたいだけの人間ですから http://medaka.5ch.net/test/read.cgi/prog/1729120072/120
121: 警備員[Lv.18] [sage] 2024/10/21(月) 02:03:49.74 Rust信者ってメモリのアドレスを渡す事を参照渡しって言わないんだね メモリのアドレス渡すから参照渡しなんだろ http://medaka.5ch.net/test/read.cgi/prog/1729120072/121
122: 警備員[Lv.18] [sage] 2024/10/21(月) 02:05:34.21 >>118 いや妄想では無いよね プリミティヴ型と普通の型で振る舞い変えるのは事実だろ 俺はそれについてダブスタと言ってんの 事実を捻じ曲げて自分が勝ってるように見せるのやめてくれな? http://medaka.5ch.net/test/read.cgi/prog/1729120072/122
123: 警備員[Lv.18] [sage] 2024/10/21(月) 02:06:28.82 >>119 とかいうおまえも>>11こういうことやってんだろうなぁw デバッガーに頼らないといけない言語だもんなぁ http://medaka.5ch.net/test/read.cgi/prog/1729120072/123
124: 警備員[Lv.18] [sage] 2024/10/21(月) 02:12:00.28 引っかかる要素無いのはお前が何も考えずにRust使ってるからなんじゃないの? 普通の感性してるなら同じ宣言してるのに振る舞い変えるなよって思うが http://medaka.5ch.net/test/read.cgi/prog/1729120072/124
125: 仕様書無しさん [sage] 2024/10/21(月) 02:36:07.41 >>121 値自体のデータを渡すことが値渡し 値への参照データを渡すことが参照渡し 値が固定長ならば参照データはアドレスのみ 値が可変長ならば参照データはアドレスと長さ 値が動的型(dyn Trait)ならば参照データはアドレスとその実型用vtable(を指すアドレス) それぞれの状況に応じてそれら参照データが渡される http://medaka.5ch.net/test/read.cgi/prog/1729120072/125
126: 仕様書無しさん [sage] 2024/10/21(月) 02:50:30.84 fn main() { // copyの例 let x = 5; print_value(x); println!("After value passing: x = {}", x); // xは依然として使用可能 // 参照渡しの例 let mut y = String::from("hello"); print_reference(&y); println!("After reference passing: y = {}", y); // yは依然として使用可能 // moveの例 let z = String::from("world"); take_ownership(z); // println!("After moving: z = {}", z); // これはコンパイルエラーになる // 可変参照の例 let mut w = String::from("rust"); modify_string(&mut w); println!("After mutable reference: w = {}", w); } 参照渡しとムーブを混同してる。参照渡しの場合は関数呼んだ後でもアクセス出来る。可変参照でもね。 http://medaka.5ch.net/test/read.cgi/prog/1729120072/126
127: 仕様書無しさん [sage] 2024/10/21(月) 03:04:10.81 普通は関数呼んだあとも変数使える方が便利だしそのようにするのよ。参照で渡せる場合はそうする。 逆にムーブが発生する場合は意図的に所有権を渡している。その違いは関数見りゃ解るし、引数の型見ればわかる。 http://medaka.5ch.net/test/read.cgi/prog/1729120072/127
128: 仕様書無しさん [sage] 2024/10/21(月) 03:25:36.78 >>121 例えば文字列(str)への参照を受け渡す場合 アドレスだけ渡されても長さがわからなければ意味ないでしょ 可変長サイズのデータの参照はアドレス+長さになります 常識的に考えればわかるよね http://medaka.5ch.net/test/read.cgi/prog/1729120072/128
129: 仕様書無しさん [sage] 2024/10/21(月) 03:31:14.58 >>123 その>>11を見たらめちゃくちゃデタラメで意味不明な書き込みだぞ >これは値型だからこいつに代入しても使える~ >こいつは参照型だからもうこの変数使わないどこ~ >とかやってんだろうなw http://medaka.5ch.net/test/read.cgi/prog/1729120072/129
130: 仕様書無しさん [sage] 2024/10/21(月) 03:56:20.16 >>1さんは参照がムーブすると思い込んでる病気なのよ http://medaka.5ch.net/test/read.cgi/prog/1729120072/130
131: 仕様書無しさん [sage] 2024/10/21(月) 05:13:21.64 LSPとデバッガの区別も付いてないし。プログラミングしてないのは明らか。 http://medaka.5ch.net/test/read.cgi/prog/1729120072/131
132: 仕様書無しさん [sage] 2024/10/21(月) 05:22:40.44 >>29 例えばこの例で書かれたような拙いプログラムでも別にいいのよ。どうせコンパイラが最適化して重複削除するから変数領域すら確保されない、実際copyされるわけないし、スタックでリークする要素全くないし。 何を心配してるのか分からん。 http://medaka.5ch.net/test/read.cgi/prog/1729120072/132
133: 仕様書無しさん [sage] 2024/10/21(月) 05:53:54.01 あー変数への代入と束縛の違いもわかってなさそう。 rustのletは代入じゃなくて束縛ですよ。 ムーブしたなら同じアドレスに対する名前がつけ変わるだけですよ。 http://medaka.5ch.net/test/read.cgi/prog/1729120072/133
134: 警備員[Lv.18] [sage] 2024/10/21(月) 07:14:25.95 >>129 すまんどこがでたらめなんだ? お前らがデバッガー見てやってることだけど http://medaka.5ch.net/test/read.cgi/prog/1729120072/134
135: 警備員[Lv.18] [sage] 2024/10/21(月) 07:24:38.81 >>132 だからさぁ メモリリークしちゃうのが問題なんじゃなくてこんな拙いクソコードを書く可能性があるって話してんの わかる? http://medaka.5ch.net/test/read.cgi/prog/1729120072/135
136: 警備員[Lv.18] [sage] 2024/10/21(月) 07:27:42.57 でそれを回避しようとするにはデバッガー見て >>11をしないといけない なんならlet a = 3.402823eの場合はプリミティヴ型だからコンパイルエラーは出ない だからいちいち割り当てていかないと上のような訳のわからないコードを描いてしまうことになる http://medaka.5ch.net/test/read.cgi/prog/1729120072/136
137: 仕様書無しさん [sage] 2024/10/21(月) 08:38:19.25 >>122 >>プリミティヴ型と普通の型で振る舞い変えるのは事実だろ そんな事実はない そもそも普通の型なんていう分類はない 何を言いたいのか? http://medaka.5ch.net/test/read.cgi/prog/1729120072/137
138: 仕様書無しさん [sage] 2024/10/21(月) 08:43:11.94 他の言語とは違って Rustではデータ競合も参照競合も発生しないため 意図せずデータが書き換わってしまうことが発生しないので デバッガーのお世話になったことが一度もない >>136 デバッガーなんてRustで使わないので あなたの文章の意味がわからないです http://medaka.5ch.net/test/read.cgi/prog/1729120072/138
139: 仕様書無しさん [sage] 2024/10/21(月) 09:00:26.63 >>135 メモリリークしない事は理解できたのね。 心配はなくなったね。 仮に拙い書き方でもコンパイル出来たら出てくるコードは最適化されてて正しく動くんだから問題ないよね。むしろ優秀だよね。 http://medaka.5ch.net/test/read.cgi/prog/1729120072/139
140: 仕様書無しさん [sage] 2024/10/21(月) 09:03:58.31 Rustの前に、自分が本当に伝えたいことを整理する日本語コミュニケーション能力を学んだほうがいい 主張の正当性の前に、何言ってるかすら誰にも伝わってないのはわかるだろう http://medaka.5ch.net/test/read.cgi/prog/1729120072/140
141: 仕様書無しさん [sage] 2024/10/21(月) 12:44:30.03 そりゃ無職だからなあ http://medaka.5ch.net/test/read.cgi/prog/1729120072/141
142: 仕様書無しさん [sage] 2024/10/21(月) 15:59:11.07 >>1 >>値型と参照型で振る舞い変えるダブスタ言語だけど使ってるやついる? 参照ではない値の型をTとして その値の参照の型を&Tとすると 値Tと参照&Tで振る舞いが異なるのは当たり前じゃないかな? 値そのものとそこを指す参照(アドレスなど)に違いは必ず出るよ 何を言いたいのか主張がよくわからないね むしろRustは値Tでも参照&Tでも区別なく 同じ記法「.フィールド名」「.メソッド名()」で記述できるから C/C++よりもシンプルだね http://medaka.5ch.net/test/read.cgi/prog/1729120072/142
143: 仕様書無しさん [] 2024/10/21(月) 21:34:03.60 >>11についていえば、参照に&付けるのはC++もそうだよ // aに巨大なデータが格納されてるとする auto a = vector<uint8_t>(); auto b = a; // コピー auto& c = a; // 参照 auto d = move(a); // ムーブ, これ以降aやcは使用不可 &を付けないと巨大なコピーが行われるので、C++開発者は気を付けて書く必要がある (画像処理とかだとありがちだけど、aが数十MBのメモリを確保してるオブジェクトだとしたら?) Rustはコピーとムーブのどちらに明示が必要かが逆なだけで、参照などの概念は同じ (C++はムーブにmoveが必要、Rustはコピーにcloneが必要) GCを使う言語とは違うけど、参照かどうかの区別はC++開発者にとっては当たり前で、Rust特有ってわけでもない intなどの型でムーブを使う理由が無い点も同じ http://medaka.5ch.net/test/read.cgi/prog/1729120072/143
144: 仕様書無しさん [] 2024/10/21(月) 21:34:37.10 更に言えば、C++だとムーブ後の変数を使ってもコンパイルエラーにならず実行時に問題を引き起こすので、使うのに注意が要る デフォルトがコピーなのは安全だけど、意図せぬパフォーマンス低下を引き起こしやすい (「ムーブは可能だけどコピーは不可能なクラス」を作る方法もある) Rustはムーブ後の変数の使用をコンパイルエラーにした上でデフォルトをこちらにして、コストのかかるコピーを明示が必要にするという考え http://medaka.5ch.net/test/read.cgi/prog/1729120072/144
145: 仕様書無しさん [] 2024/10/21(月) 21:40:07.12 なので >>11 は自分の知ってる言語に無い概念を理解しようとすらしてないだけだと思う Cしか知らない人がOOP言語の入門書を読んで「クラス」の章に文句言い続けてるようなのと変わらない http://medaka.5ch.net/test/read.cgi/prog/1729120072/145
146: 仕様書無しさん [] 2024/10/21(月) 21:55:14.50 これはRustがどうとかじゃなくて、GCがある言語とそうでない言語の違い GCのある言語の方が簡単なのはその通りなので、メモリ周りの詳細を気にしたくないなら素直に他の言語を使った方が良い 世の中の多くのプロジェクトはそれで十分なはず http://medaka.5ch.net/test/read.cgi/prog/1729120072/146
147: 仕様書無しさん [sage] 2024/10/21(月) 22:03:37.71 CPUリソースもメモリリソースもGC言語はムダに消費してしまいます GC言語を使うと速いマシンが必要になったり複数のマシンが必要になったりします クラウド利用の場合も利用料金が高くなってしまいます GC言語は電気代の面でもムダでありCo2排出量も増やすことになりふさわしくありません http://medaka.5ch.net/test/read.cgi/prog/1729120072/147
148: 仕様書無しさん [] 2024/10/21(月) 22:06:47.56 C++でも「これは&を付けないと無駄なコピーが生じるな」「これはムーブ済みだから使ってはいけないな」とかを気を付けて書いてたんだよ &を付け忘れて無駄なコピーが生じても、ムーブした後の変数に誤ってアクセスしても、C++コンパイラはそれを指摘してくれない Rustのコンパイラはこれらをエラーにしてくれるし、エラー原因を示すメッセージも丁寧だから、この点はC++よりもずっと分かりやすい http://medaka.5ch.net/test/read.cgi/prog/1729120072/148
149: 警備員[Lv.7][新芽] [sage] 2024/10/22(火) 12:28:01.05 >>137 事実はあるだろ プリミティヴ型とプリミティヴ型ではない型でそれぞれ let b=a; をやった時println(a);が出来るのと出来ないのがある これを振る舞いが変わらないとはならない >>142 上のレスに例のコード書いてるからよく読めアホ http://medaka.5ch.net/test/read.cgi/prog/1729120072/149
150: 警備員[Lv.7][新芽] [sage] 2024/10/22(火) 12:29:53.80 let b = a; をすると一律でaが使えなくなるならそれでいいんだよ だけどこのダブスタ言語はaが使えなくなるときとaが使える時両方あるってのが問題 いっそのこと値型であろうとメモリ解放してやればいいんだよ なんのためにこのメモリをブロック終了まで保持してんだ? http://medaka.5ch.net/test/read.cgi/prog/1729120072/150
151: 警備員[Lv.7][新芽] [sage] 2024/10/22(火) 12:30:33.15 移譲で使えなくなるのが問題無いなら値型も使えなくなって問題ないだろ http://medaka.5ch.net/test/read.cgi/prog/1729120072/151
152: 仕様書無しさん [sage] 2024/10/22(火) 13:12:30.07 >>149 デタラメはよくないですよ Rustは大きく分けると2種類の型があります ・Copyトレイト実装型 (Copy型) ・Copyトレイト非実装型 (!Copy型) 前者はプリミティブ型であるi32やf64やcharなどだけでなく std::fs::FileTypeやstd::net::SocketAddrなどもCopy型です 後者はプリミティブ型であるarrayやsliceやstrなどが!Copy型です ちなみに参照型&TはCopy型です 可変参照型&mut Tは!Copy型です http://medaka.5ch.net/test/read.cgi/prog/1729120072/152
153: 仕様書無しさん [sage] 2024/10/22(火) 13:27:58.50 >>150 ブロック終了までメモリ確保してるってのが間違いって何度も言ってるのにまだわからないの?プリミティブ型で開放するメモリなど最初からないってのよ。 ましてや定数ならそもそも変数領域さえ作らない。 ムーブがデフォなんじゃなくて、コピーが基本でコピーが出来ない型だけムーブなの。c++みたいにムーブの時だけmoveって書く仕様なら納得するの? そうなったらそうで絶対文句言うのよ。イコールって書いたらコンパイルエラーが出たとか、moveって書いてもムーブ出来ない時があるってね。c++でムーブセマンティクスが流行らなかったのはそれだからね。 http://medaka.5ch.net/test/read.cgi/prog/1729120072/153
154: 仕様書無しさん [sage] 2024/10/22(火) 14:08:17.06 ダブスタっていうなら、それこそC++の 「ムーブするかコピーするかを決めるのはコンパイラ様だ! 人ごときがstd::moveとか書こうが無視してコピーしてやる!エラーも警告も出さねえぜ!」 ってやつのことだよな。あれがクソっていうなら同意。 http://medaka.5ch.net/test/read.cgi/prog/1729120072/154
155: 仕様書無しさん [sage] 2024/10/22(火) 17:54:16.14 >>150 Rustでは明示的に指定しない限りコストの高いヒープ領域メモリを使用しない スタック領域メモリが使われるわけだが関数やブロック内で既に使い終わっている変数があればそれが使っていた領域を安全に再利用するので最小限のサイズしかスタックを消費しない さらにレジスタがある環境ならばレジスタを使用すれば済む分はスタックを消費しない そしてスタック領域メモリの解放とは関数の呼び出し元に戻る時にスタックポインタなどを元の位置に戻すことのみしかコストはかからない http://medaka.5ch.net/test/read.cgi/prog/1729120072/155
156: 警備員[Lv.4][新芽] [sage] 2024/10/22(火) 19:31:32.76 >>153 だとしても再度使えるようにするのは意味わからんだろ 開放しろって話 >>155 だからコストかからないとかどうとかじゃなくてコードから把握できないから全て渡したら解放にしろよって話なんだわ 解放しない場合は.mcopyだの後ろにつけとけばいいだろ なんでお前ら人の話聞かないの? http://medaka.5ch.net/test/read.cgi/prog/1729120072/156
157: 仕様書無しさん [sage] 2024/10/22(火) 19:48:23.93 >>156 いやヒープも使ってない変数を解放出来るプログラム言語存在しないだろ? 解放しないんじゃなくて出来ないのよ? 何もしない空関数呼ぶの? それこそ馬鹿でしょ。 何基準に合わせろと言うのよ? ムーブの時だけmove付けろならまだ話になるが。 そうしない理由はc++からの教訓って話しもしてる。 http://medaka.5ch.net/test/read.cgi/prog/1729120072/157
158: 仕様書無しさん [sage] 2024/10/22(火) 20:10:09.50 // MCopyトレイトを定義 pub trait MCopy { fn mcopy(&self) -> Self; } // プリミティブ型に対して一括実装 macro_rules! impl_mcopy { ($($t:ty),*) => { $( impl MCopy for $t { fn mcopy(&self) -> Self { *self } } )* } } // 全てのプリミティブ型に実装 impl_mcopy!( u8, u16, u32, u64, u128, usize, i8, i16, i32, i64, i128, isize, f32, f64, bool, char ); はい、もう何がしたいのか分からないけどプリミティブ型にmcopy実装したから好きにして。 これで読みやすくなる? http://medaka.5ch.net/test/read.cgi/prog/1729120072/158
159: 仕様書無しさん [] 2024/10/22(火) 21:17:13.30 >ブロック終了までメモリ確保してる スタックとヒープの違いが本当に分からないんだな 「構文上のルール統一のために変数を使えなくする」は可不可でいえばできるけど、それで何かしらリソースが解放されたりパフォーマンス上のメリットがあるわけでもない パフォーマンスやリソース管理などの理由があるケースでのみムーブされるだけなんだし http://medaka.5ch.net/test/read.cgi/prog/1729120072/159
160: 仕様書無しさん [] 2024/10/22(火) 21:29:02.86 型によって管理が変わるって他の言語でもあるだろ C#で { var a = new Foo(); } という書き方が問題ないかは Foo の実装に依存する なんでGCに任せられない型があるの?ダブスタを解消するために「全ての型で明示的なDisposeの呼び出しが必要」にしたりしないの? とか言わないだろ http://medaka.5ch.net/test/read.cgi/prog/1729120072/160
161: 仕様書無しさん [sage] 2024/10/22(火) 21:37:15.18 >>156 何を解放しろと主張しているの? その整数値は例えばレジスタに即値ロードされるか あるいは他の関数からレジスタに入って返り値として返ってくるんだよ もし何の用途にも使われなければ最適化でそのレジスタの使用すらなくなるし もし他の関数に渡すなら別のレジスタにコピーされて引数として渡される そしてレジスタは次々と別の用途に使われていく いったい何を解放しろと主張しているの? http://medaka.5ch.net/test/read.cgi/prog/1729120072/161
162: 仕様書無しさん [sage] 2024/10/23(水) 00:10:06.06 ダブスタだ解放だとゴネてるから意味不明だけど 1が言いたいのって、Haskell見た初心者が「記号だらけで意味不明でクソ。英単語で構文を作れ」 って言うレベルの難癖なんじゃねえの? http://medaka.5ch.net/test/read.cgi/prog/1729120072/162
163: 仕様書無しさん [sage] 2024/10/23(水) 06:33:50.46 >>6 参照型&TはCopyトレイトを実装しているのでコピーされて何度でも使えるよ >>7 &strも&Stringどちらも参照型だよ strは可変長なのでそのまま扱わずに参照型&strとして用いるよ Stringもそのまま扱うのは生成する時だけで読み取りは&strとして扱うよ 書き換えの時は可変参照型&mut Stringとして扱うよ http://medaka.5ch.net/test/read.cgi/prog/1729120072/163
164: 警備員[Lv.6][新芽] [sage] 2024/10/23(水) 07:22:58.28 >>157 メモリ解放すればいいだろ http://medaka.5ch.net/test/read.cgi/prog/1729120072/164
165: 警備員[Lv.6][新芽] [sage] 2024/10/23(水) 07:24:25.49 >>162 pragmaまみれの構文書いてるやつは言うことが違うね http://medaka.5ch.net/test/read.cgi/prog/1729120072/165
166: 警備員[Lv.6][新芽] [sage] 2024/10/23(水) 07:26:57.62 >>160 Dispose()を呼ばなければならないのは例外だから プリミティヴ型は基本型のなの通り基本なんだよ? http://medaka.5ch.net/test/read.cgi/prog/1729120072/166
167: 仕様書無しさん [sage] 2024/10/23(水) 07:40:07.56 >>164 このスレでメモリの仕組み理解してないのあなた1人だけよ。ありもしない幻想に囚われてる。 rustどころか他の言語も危ういから無理せずもっと簡単なのから試したほうがいいよ。 一応望みの物は >>158 に置いてあるのでちゃんと使ってよね。 http://medaka.5ch.net/test/read.cgi/prog/1729120072/167
168: 仕様書無しさん [sage] 2024/10/23(水) 17:11:17.22 >>49 >>122 プリミティブ型とは何かを勘違いしているのではないか Rustではヒープメモリを前提とせずに使える基本パーツの型を指す この公式ページに一覧が挙げられている https://doc.rust-lang.org/std/#primitives このようにarrayやsliceやstrなども当然プリミティブ型である http://medaka.5ch.net/test/read.cgi/prog/1729120072/168
169: 仕様書無しさん [sage] 2024/10/24(木) 16:02:01.63 ムーブが基本でtrait Copyを実装しているCopy型だけ特別にコピーだね プリミティブ型の中にもCopy型と!Copy型の両方あるね http://medaka.5ch.net/test/read.cgi/prog/1729120072/169
170: 仕様書無しさん [sage] 2024/10/25(金) 12:56:54.88 結局1は俺が何言ってるか理解できない日本語すらわからんバカ共と話すことはないって 自分の中では大勝利して満足したんだろうか http://medaka.5ch.net/test/read.cgi/prog/1729120072/170
171: 仕様書無しさん [sage] 2024/10/25(金) 19:17:54.04 >>158 Rustはトレイト境界の指定によりジェネリックで簡潔&安全にこのように書けるよ trait MCopy { fn mcopy(&self) -> Self; } impl<T: Copy> MCopy for T { fn mcopy(&self) -> Self { *self } } fn main() { let x = 123.45; let y = x.mcopy(); assert_eq!(x, y); let x = "abc.de"; let y = x.mcopy(); assert_eq!(x, y); } strはCopy実装型ではないけど &TがジェネリックにCopy実装型なので &strの文字列も上記のように動作 http://medaka.5ch.net/test/read.cgi/prog/1729120072/171
172: 仕様書無しさん [sage] 2024/10/27(日) 14:31:17.99 multiple readers XOR single writerなので 可変がなければ参照はいくつでもコピーできるね 対照的に可変参照は独占的オンリーワンになる http://medaka.5ch.net/test/read.cgi/prog/1729120072/172
173: 仕様書無しさん [] 2025/01/31(金) 08:58:53.87 【結婚難】違反SEの代償【孤独死】 ☆大損害だから稼働減らして収入増やせ☆ 金稼ぎ妨害! 共働き妨害! 時間外労働違反 ↓ 偽装委託多重派遣 ↓ 低技術 ↓ 低収入 ↓ 結婚難 ↓ 孤独死 反社会な孤独死の現場 https://i.imgur.com/pALCFXJ.jpg http://medaka.5ch.net/test/read.cgi/prog/1729120072/173
メモ帳
(0/65535文字)
上
下
前
次
1-
新
書
関
写
板
覧
索
設
栞
歴
スレ情報
赤レス抽出
画像レス抽出
歴の未読スレ
AAサムネイル
Google検索
Wikipedia
ぬこの手
ぬこTOP
0.023s