Mozilla発のRust言語のスレ
公式
https://www.rust-lang.org/
https://blog.rust-lang.org/
https://github.com/rust-lang/rust
Web上の実行環境
https://play.rust-lang.org
前スレ
Rust Part7
http://mevius.5ch.net/test/read.cgi/tech/1563114707/
探検
Rust part8
■ このスレッドは過去ログ倉庫に格納されています
2020/01/24(金) 11:47:52.41ID:9oO1hUHl
192デフォルトの名無しさん
2020/03/19(木) 15:19:47.59ID:dnKvjYNt assert!(!false);
の方が紛らわしくないか?
assert_not!は関数名の方に!あるから見間違えないしスッキリするし直感的な気がする
それにneが内部的に反転してるだけならnotあったほうがいいな
の方が紛らわしくないか?
assert_not!は関数名の方に!あるから見間違えないしスッキリするし直感的な気がする
それにneが内部的に反転してるだけならnotあったほうがいいな
193デフォルトの名無しさん
2020/03/20(金) 07:03:37.86ID:6UN4nNu/ usize同士の差の絶対値を求めるのがすごくだるいんですけどなんかいい方法ないすか
194デフォルトの名無しさん
2020/03/20(金) 07:38:59.81ID:4VHKiEg+ if x > y { x - y } else { y - x }
じゃ駄目かい
じゃ駄目かい
195デフォルトの名無しさん
2020/03/20(金) 08:14:22.57ID:6UN4nNu/ やっぱそうするしか?
196デフォルトの名無しさん
2020/03/20(金) 16:54:06.07ID:ShTr86MM そういう関数を作っておけばええやん。
197デフォルトの名無しさん
2020/03/21(土) 19:08:12.84ID:d5Yv109I let mut v = vec![1,2];
std::mem::swap(v[1], v[0]);
assert!(v == vec![2,1]);
こうしたいんですけど、どうすればいいですか?
std::mem::swap(v[1], v[0]);
assert!(v == vec![2,1]);
こうしたいんですけど、どうすればいいですか?
198デフォルトの名無しさん
2020/03/21(土) 19:19:05.58ID:HIaSqchS Vec::swap使え->
Vec::swapは中でunsafe使ってるじゃないですか結局unsafe使わなきゃろくなこと出来ないんですねRustってクソですね
ってやりたい荒らしだろ?
氏ねばいいと思うよ
Vec::swapは中でunsafe使ってるじゃないですか結局unsafe使わなきゃろくなこと出来ないんですねRustってクソですね
ってやりたい荒らしだろ?
氏ねばいいと思うよ
199デフォルトの名無しさん
2020/03/21(土) 19:32:13.45ID:g81eKbe5 標準ライブラリ内でunsafe使うのと
自前でunsafe使わされるのとは雲泥の差があると思うんだがw
自前でunsafe使わされるのとは雲泥の差があると思うんだがw
200デフォルトの名無しさん
2020/03/21(土) 20:27:19.94ID:d5Yv109I ヤクザかな?
201デフォルトの名無しさん
2020/03/21(土) 20:38:04.64ID:HIaSqchS ほら、万が一の荒らしじゃないケース用に答えも同時に提示してあげたのにそっちには見向きもしないでしょ
そりゃそうだよね、実際はやりたいことの質問じゃなくてRustをディスるための質問なんだもんね
つかそもそも本当に質問のことがやりたいなら提示したコードをコンパイルしようとしてるはずだよね
そしたら親切なコンパイラが&mutで借用しろって教えてくれてるよね
そしたらそれに従ったら今度は親切なコンパイラが同時に2つmutな借用は作れないって教えてくれてるよね
じゃあどうしたら良いですか?ってなるのが普通だよね
それがないってことは質問を装っていながらコンパイルすらしてないってことだからね
荒らすんなら荒らすでもうちょっと頭使おうね☆
そりゃそうだよね、実際はやりたいことの質問じゃなくてRustをディスるための質問なんだもんね
つかそもそも本当に質問のことがやりたいなら提示したコードをコンパイルしようとしてるはずだよね
そしたら親切なコンパイラが&mutで借用しろって教えてくれてるよね
そしたらそれに従ったら今度は親切なコンパイラが同時に2つmutな借用は作れないって教えてくれてるよね
じゃあどうしたら良いですか?ってなるのが普通だよね
それがないってことは質問を装っていながらコンパイルすらしてないってことだからね
荒らすんなら荒らすでもうちょっと頭使おうね☆
202デフォルトの名無しさん
2020/03/22(日) 13:10:01.70ID:HvrypJyW Rustにも、次のような「言語定義された smart pointer」があり、
~ : 一回だけ(unique) 参照する smart pointer。
@ : 複数回参照できる smart pointerで、GC を使っている。
drop なるものが、C/C++ の free()やdeleteの機能を持つ。
という認識で正しいのでしょうか。
~ : 一回だけ(unique) 参照する smart pointer。
@ : 複数回参照できる smart pointerで、GC を使っている。
drop なるものが、C/C++ の free()やdeleteの機能を持つ。
という認識で正しいのでしょうか。
203デフォルトの名無しさん
2020/03/22(日) 14:01:25.52ID:HvrypJyW >>202
参照カウンタを1引くようなDeref や、C/C++の単項演算子の方の「*」と
全く同様な「参照はずし演算子」の「*」もあるようですね。
また、~ や @ よりは少し高レベルになった smart pointer として、
Box<T> が、参照カウンタ方式の smart pointer として Rc<T> が、
さらに、動的(?)になった smart pointer としてRef<T>やRefMut<T>
があるようです。
凄く複雑です。
参照カウンタを1引くようなDeref や、C/C++の単項演算子の方の「*」と
全く同様な「参照はずし演算子」の「*」もあるようですね。
また、~ や @ よりは少し高レベルになった smart pointer として、
Box<T> が、参照カウンタ方式の smart pointer として Rc<T> が、
さらに、動的(?)になった smart pointer としてRef<T>やRefMut<T>
があるようです。
凄く複雑です。
204デフォルトの名無しさん
2020/03/22(日) 14:28:20.92ID:HvrypJyW 参照型の変数 r への代入は、普段は、
r = 1;
などでよいようですが、なぜか、*r と書かなければなら無い事があるようです。
また、&i32の変数rとi32の変数aを比較する場合比較する場合、
前者には *r を付けないといけないようです。
難しいです。
r = 1;
などでよいようですが、なぜか、*r と書かなければなら無い事があるようです。
また、&i32の変数rとi32の変数aを比較する場合比較する場合、
前者には *r を付けないといけないようです。
難しいです。
205デフォルトの名無しさん
2020/03/22(日) 15:43:22.86ID:thEQOCMJ 6年以上前に削除された仕様の良し悪しを語りたいのか?
206デフォルトの名無しさん
2020/03/22(日) 15:57:03.70ID:DNfY/SCe rustの未来教えて
207デフォルトの名無しさん
2020/03/22(日) 16:08:02.82ID:HvrypJyW >>205
詳しくお願いします。
詳しくお願いします。
208デフォルトの名無しさん
2020/03/22(日) 16:50:19.83ID:thEQOCMJ >>207 いやbook読んでよ。もし@とか~についての記述があったら逆に教えて欲しいくらいだ
209デフォルトの名無しさん
2020/03/22(日) 17:28:44.77ID:HvrypJyW >>204
&と*は常に逆の関係にあるようです。
The opposite of referencing by using & is dereferencing, which is accomplished with the dereference operator, *.
vがvecへの参照型の場合でも
v.push(5);
と書けてしまうのは、実体vとポインタ pV に対して
v.push(5);
pV->push(5);
と区別していたC++と違っているために個人的に混乱していただけのようです。
もう一つは、参照ではなく、
let a = 5;
let a = a + 1;
のように shadowing を行う例が個人的に混乱の原因になっていたようです。
参照型 &T の場合には、
let r : &mut TYPE = &a;
のようにした後は、
*r = xxx;
のように、原則的に * を付けて参照を一段階戻す必要があるようです。
*をつけなくていいのは、メンバ関数呼び出しの、
r.func();
のような例の場合だけで、もしかすると、
(*r).func();
としてもコンパイルが通るかもしれません。
&と*は常に逆の関係にあるようです。
The opposite of referencing by using & is dereferencing, which is accomplished with the dereference operator, *.
vがvecへの参照型の場合でも
v.push(5);
と書けてしまうのは、実体vとポインタ pV に対して
v.push(5);
pV->push(5);
と区別していたC++と違っているために個人的に混乱していただけのようです。
もう一つは、参照ではなく、
let a = 5;
let a = a + 1;
のように shadowing を行う例が個人的に混乱の原因になっていたようです。
参照型 &T の場合には、
let r : &mut TYPE = &a;
のようにした後は、
*r = xxx;
のように、原則的に * を付けて参照を一段階戻す必要があるようです。
*をつけなくていいのは、メンバ関数呼び出しの、
r.func();
のような例の場合だけで、もしかすると、
(*r).func();
としてもコンパイルが通るかもしれません。
210デフォルトの名無しさん
2020/03/22(日) 17:30:53.65ID:HvrypJyW >>208
https://pcwalton.github.io/2013/03/18/an-overview-of-memory-management-in-rust.html
Rust の 2種のスマートポインター、^ と @ に詳しいです。
「book」と言えば、詳しく学ぶには、まさに
https://doc.rust-lang.org/book/index.html
が初心者には分かり易いようです。
この本のことでしょうか?
https://pcwalton.github.io/2013/03/18/an-overview-of-memory-management-in-rust.html
Rust の 2種のスマートポインター、^ と @ に詳しいです。
「book」と言えば、詳しく学ぶには、まさに
https://doc.rust-lang.org/book/index.html
が初心者には分かり易いようです。
この本のことでしょうか?
211デフォルトの名無しさん
2020/03/22(日) 17:52:06.65ID:qATPJDe3 7年も前の情報を無条件に信じられるピュアさが俺にも欲しいよ
212デフォルトの名無しさん
2020/03/22(日) 17:52:35.28ID:ufFd2vaY213デフォルトの名無しさん
2020/03/22(日) 18:32:23.24ID:DNfY/SCe 初心者なんだけど
もし1つの変数(所有権)にマルチスレッドで書き込みをしようと思ったら、
Rustの借用のルールだと不可能ですか?
複数のイミュータブルな参照を作る事になりますが、できないんですよね?
もし1つの変数(所有権)にマルチスレッドで書き込みをしようと思ったら、
Rustの借用のルールだと不可能ですか?
複数のイミュータブルな参照を作る事になりますが、できないんですよね?
214デフォルトの名無しさん
2020/03/22(日) 18:40:28.26ID:DNfY/SCe あまちがえました
訂正:
複数のミュータブルな参照を作る事になります
訂正:
複数のミュータブルな参照を作る事になります
215デフォルトの名無しさん
2020/03/22(日) 18:53:15.15ID:I5Su+SV6216デフォルトの名無しさん
2020/03/22(日) 19:02:35.81ID:DNfY/SCe 実行時にデータ競合系の問題が生じない代わりに
コーディング時に借用チェッカーとの戦いをするという感じになるんですかね
コーディング時に借用チェッカーとの戦いをするという感じになるんですかね
217デフォルトの名無しさん
2020/03/22(日) 19:17:35.15ID:thEQOCMJ >>210 そのbookだよ。オフィシャルのドキュメントを読まずにどうして深入りできようか
1点だけ。rustではobj.method()とするとメソッドの引数の型(&とか&mutとか)に合うようにobjに*とか&とか付ける仕様になってる
メソッド呼ぶ時のobjに対してこっちが*とか&とか付ける必要は特に無い
1点だけ。rustではobj.method()とするとメソッドの引数の型(&とか&mutとか)に合うようにobjに*とか&とか付ける仕様になってる
メソッド呼ぶ時のobjに対してこっちが*とか&とか付ける必要は特に無い
218デフォルトの名無しさん
2020/03/23(月) 01:35:58.42ID:bf1cRh+B219デフォルトの名無しさん
2020/03/23(月) 01:39:22.78ID:h1jHr6GN 所有権、借用、ライフタイムについて勉強してみた。
でも他の言語でも排他制御とか非同期処理用クラスで非同期処理に対応できるわけで、
結局どれくらい御利益があるのか分からなかった。
でも他の言語でも排他制御とか非同期処理用クラスで非同期処理に対応できるわけで、
結局どれくらい御利益があるのか分からなかった。
220デフォルトの名無しさん
2020/03/23(月) 02:29:29.77ID:bf1cRh+B Rustの変数束縛、所有権、借用などで自動化されるのは、
「スタック変数」のポインタが、ブロックの外や関数の外に不用意に出ない
事だけで、Heapから確保されたオブジェクトの自動解放は、
参照カウンタや Garbage Collection を用いずに静的解析のみで行うことは出来ない、
という認識で正しいのでしょうか??
「スタック変数」のポインタが、ブロックの外や関数の外に不用意に出ない
事だけで、Heapから確保されたオブジェクトの自動解放は、
参照カウンタや Garbage Collection を用いずに静的解析のみで行うことは出来ない、
という認識で正しいのでしょうか??
221デフォルトの名無しさん
2020/03/23(月) 02:39:09.37ID:bf1cRh+B >>220
例えば、Cだと、
int *func()
{
int a;
return &a;
}
としても警告は出る可能性はあってもコンパイルエラーにはなりませんが、
Rustでは同等のことはできないようになっていますね。
でも、Heapから確保したオブジェクトは、それを参照している変数の個数は
動的に変わります。というのは、Heapとは解放のタイミングを後に遅らせる
ための仕組みな分けですから。
オブジェクトを参照している変数の個数は静的に決まらないと言うことは、
参照カウンタやGarbageCollectionのような動的な検査の仕組みが全く無ければ
解放できないはずですね。
もし静的に解放タイミングを決められる可能性があるとすれば、参照の個数に上限を
設けることによってです。簡単な例ではそのオブジェクトを参照する変数が1つしか
ないなら、その変数にnullや別の値が代入されたり、その変数が削除されるタイミング
だけを静的に調べれば自動解放できるはずです。
しかし、2つ以上になった場合、参照カウンタ無しで静的に削除タイミングを決定するのは
かなり難しくなります。
例えば、Cだと、
int *func()
{
int a;
return &a;
}
としても警告は出る可能性はあってもコンパイルエラーにはなりませんが、
Rustでは同等のことはできないようになっていますね。
でも、Heapから確保したオブジェクトは、それを参照している変数の個数は
動的に変わります。というのは、Heapとは解放のタイミングを後に遅らせる
ための仕組みな分けですから。
オブジェクトを参照している変数の個数は静的に決まらないと言うことは、
参照カウンタやGarbageCollectionのような動的な検査の仕組みが全く無ければ
解放できないはずですね。
もし静的に解放タイミングを決められる可能性があるとすれば、参照の個数に上限を
設けることによってです。簡単な例ではそのオブジェクトを参照する変数が1つしか
ないなら、その変数にnullや別の値が代入されたり、その変数が削除されるタイミング
だけを静的に調べれば自動解放できるはずです。
しかし、2つ以上になった場合、参照カウンタ無しで静的に削除タイミングを決定するのは
かなり難しくなります。
222デフォルトの名無しさん
2020/03/23(月) 03:10:34.91ID:h1jHr6GN 私が読んだ説明記事では所有権やライフタイムはローカル変数かつシングルスレッドの例しかなかったんですが、
それだとRustがどう非同期処理に強いのかイメージできませんでした。
グローバル変数やマルチスレッドでライフタイム等の概念が活用されている例ないですか?
それだとRustがどう非同期処理に強いのかイメージできませんでした。
グローバル変数やマルチスレッドでライフタイム等の概念が活用されている例ないですか?
223デフォルトの名無しさん
2020/03/23(月) 06:41:08.54ID:jGS2rL5b Rust では所有権が移るから、資源を共有しないからだろ
資源を共有すると、アクセスするタイミングで、バグってしまう。
A を更新 → B を更新 → Aを読み取り
間に、Bが入ったことで、AはBの値を読み取ってしまったけど、
その場ではエラーにならず、かなり後になって、データが何かおかしいと誰かが気づくかも知れない。
気づかないかも知れない
だから、あちこちで排他制御をせざるを得ない。
そうすると、デッドロック・タイムアウトも考えないといけない
資源を共有すると、アクセスするタイミングで、バグってしまう。
A を更新 → B を更新 → Aを読み取り
間に、Bが入ったことで、AはBの値を読み取ってしまったけど、
その場ではエラーにならず、かなり後になって、データが何かおかしいと誰かが気づくかも知れない。
気づかないかも知れない
だから、あちこちで排他制御をせざるを得ない。
そうすると、デッドロック・タイムアウトも考えないといけない
224デフォルトの名無しさん
2020/03/23(月) 09:52:06.45ID:9RbShf99 資源を共有しないんじゃなくて、共有していい資源かどうかを型(SendとSync)で区別している。
なので排他制御が必要な箇所に入ってなかったらコンパイルエラーにできる。
だからデッドロックなんかは起きるけど、レーシングは起きないって感じ。
ライフタイムはそれほど関係ない。
なので排他制御が必要な箇所に入ってなかったらコンパイルエラーにできる。
だからデッドロックなんかは起きるけど、レーシングは起きないって感じ。
ライフタイムはそれほど関係ない。
225デフォルトの名無しさん
2020/03/23(月) 12:20:19.11ID:bf1cRh+B マルチスレッドの話は置いておいて、そもそも Rustでは、Heapから確保したオブジェクトの解放は自動化されてますか?
226223
2020/03/23(月) 12:54:01.89ID:jGS2rL5b227デフォルトの名無しさん
2020/03/23(月) 13:43:29.57ID:xOZDOjnM 基本的なことが理解出来てない人はまずThe Bookを読もう
次からテンプレに書いといたほうが良さそう
次からテンプレに書いといたほうが良さそう
228デフォルトの名無しさん
2020/03/23(月) 15:20:59.29ID:bf1cRh+B 読んでそこまでたどりつくのは大変過ぎますので、どなたか分かる方が >>225 に答えていただければ幸いです。
229デフォルトの名無しさん
2020/03/23(月) 15:33:10.24ID:iGWxNb08 >>225
自動で解放される。なぜされるのかが気になるならいろいろ想像してないでthe bookを読んだ方がいいと思う。
自動で解放される。なぜされるのかが気になるならいろいろ想像してないでthe bookを読んだ方がいいと思う。
230デフォルトの名無しさん
2020/03/23(月) 15:33:45.55ID:3KZHweI3 贅沢は敵です。
231デフォルトの名無しさん
2020/03/23(月) 15:38:31.12ID:bf1cRh+B Rc<T> は参照カウンタ方式で自動解放されますが、循環参照があった場合には自動解放されず、メモリーリークするそうです。
つまり、RustはHeapのメモリーを完全自動では解放できないのです。
C#やJavaは遅いですが、循環参照がある場合でも、GarbageCollectionにより完全自動で解放されます。
つまり、RustはHeapのメモリーを完全自動では解放できないのです。
C#やJavaは遅いですが、循環参照がある場合でも、GarbageCollectionにより完全自動で解放されます。
232デフォルトの名無しさん
2020/03/23(月) 15:39:33.51ID:bf1cRh+B つまり、「Rustは、GarbageCollectionがなくてもメモリ解放が自動化されている」
というのは嘘です。
というのは嘘です。
233デフォルトの名無しさん
2020/03/23(月) 15:40:41.93ID:FLdc410A234デフォルトの名無しさん
2020/03/23(月) 15:41:06.82ID:bf1cRh+B >>231
https://stackoverflow.com/questions/55553048/is-it-possible-to-cause-a-memory-leak-in-rust
[Q] Is it possible to cause a memory leak in Rust?
Is there any way of causing a memory leak in Rust? I know that even in garbage-collected
languages like JavaScript there are edge-cases where memory will be leaked, are
there any such cases in Rust?
[A1]
Yes, leaking memory in Rust is as easy as calling the std::mem::forget function.
You can also leak memory if you create a cycle of shared references:
A cycle between Rc pointers will never be deallocated. For this reason, Weak is used to break cycles.
For example, a tree could have strong Rc pointers from parent nodes to children, and Weak pointers
from children back to their parents.
https://stackoverflow.com/questions/55553048/is-it-possible-to-cause-a-memory-leak-in-rust
[Q] Is it possible to cause a memory leak in Rust?
Is there any way of causing a memory leak in Rust? I know that even in garbage-collected
languages like JavaScript there are edge-cases where memory will be leaked, are
there any such cases in Rust?
[A1]
Yes, leaking memory in Rust is as easy as calling the std::mem::forget function.
You can also leak memory if you create a cycle of shared references:
A cycle between Rc pointers will never be deallocated. For this reason, Weak is used to break cycles.
For example, a tree could have strong Rc pointers from parent nodes to children, and Weak pointers
from children back to their parents.
235デフォルトの名無しさん
2020/03/23(月) 15:45:50.08ID:bf1cRh+B >>233
結論的に言えば、Heapから確保されたオブジェクトのメモリの解放は自動化されてません。
結論的に言えば、Heapから確保されたオブジェクトのメモリの解放は自動化されてません。
236デフォルトの名無しさん
2020/03/23(月) 15:49:21.93ID:iGWxNb08 なんだ。真面目に聞いてるのかと思ったのに。
まぁご自由にどうぞ。
まぁご自由にどうぞ。
237デフォルトの名無しさん
2020/03/23(月) 16:15:56.91ID:bf1cRh+B >>236
実際に自動化されていませんよね。
実際に自動化されていませんよね。
238デフォルトの名無しさん
2020/03/23(月) 16:28:50.38ID:rbTK8rb1 真面目に回答した相手が荒らしだった時って「何だよ荒らしかよ」みたいな反応より「クッソ抜けるwww」からの「すいません誤爆しました」みたいなレスで「真面目に回答したわけじゃないぞ、シコりながら適当に回答したんだぞ」的な雰囲気を出してったほうが良さそうじゃない?
239デフォルトの名無しさん
2020/03/23(月) 16:58:35.58ID:bf1cRh+B Rc<T> だけを使って循環リストを作った場合、循環参照が生じます。
その場合、その循環リスト全体が誰からも参照されなくなって、つまり、不要に
なっても「循環参照問題」が起きるために自動解放できないのです。
C#やJavaでは、この循環参照問題を解決することを主目的として、
遅さを犠牲に Garbage Collection を使っています。
これは「動的解析」に分類されます。
一方、Rustの場合は静的解析だけで済まそうとしていますが、結局、循環参照問題のために
完全自動化は出来ず、解放べきメモリが解放されずに残ってしまうという現象がおきえます。
これを防ぐには、人間側が 循環リストの最後と最初を結ぶためには、weak pointer を使う
などの注意深いプログラミングをすることで防ぐしかありません。
つまり、人間の注意深さでメモリーリークを防いでいるだけです。
その場合、その循環リスト全体が誰からも参照されなくなって、つまり、不要に
なっても「循環参照問題」が起きるために自動解放できないのです。
C#やJavaでは、この循環参照問題を解決することを主目的として、
遅さを犠牲に Garbage Collection を使っています。
これは「動的解析」に分類されます。
一方、Rustの場合は静的解析だけで済まそうとしていますが、結局、循環参照問題のために
完全自動化は出来ず、解放べきメモリが解放されずに残ってしまうという現象がおきえます。
これを防ぐには、人間側が 循環リストの最後と最初を結ぶためには、weak pointer を使う
などの注意深いプログラミングをすることで防ぐしかありません。
つまり、人間の注意深さでメモリーリークを防いでいるだけです。
240デフォルトの名無しさん
2020/03/23(月) 17:09:05.71ID:IXWRbkqI 都合の悪いことには誰も答えません。
241デフォルトの名無しさん
2020/03/23(月) 17:35:19.10ID:FLdc410A >>239
リークしない保証が欲しいならそういう言語 (処理系) を使えばいいじゃん。
Rust はリークを確実に排除することを保証しないし、
Rust の定義するメモリ安全にはリークの排除が含まれないことは明言されている。
https://doc.rust-lang.org/book/ch15-06-reference-cycles.html
GC を使えばメモリリークが起きないってわけでもないし、
「どのような保証を与えるか?」の線引きが違うだけで
きちんと学んできちんと使いこなさなきゃなんだって駄目だよ。
リークしない保証が欲しいならそういう言語 (処理系) を使えばいいじゃん。
Rust はリークを確実に排除することを保証しないし、
Rust の定義するメモリ安全にはリークの排除が含まれないことは明言されている。
https://doc.rust-lang.org/book/ch15-06-reference-cycles.html
GC を使えばメモリリークが起きないってわけでもないし、
「どのような保証を与えるか?」の線引きが違うだけで
きちんと学んできちんと使いこなさなきゃなんだって駄目だよ。
242デフォルトの名無しさん
2020/03/23(月) 18:36:24.14ID:bf1cRh+B243デフォルトの名無しさん
2020/03/23(月) 18:54:37.87ID:+m59DBar そりゃ循環参照とかウンコード書けばの話だろ、何か問題有るのか?
244デフォルトの名無しさん
2020/03/23(月) 18:56:19.36ID:y/3c+R5y Heap=Rcだと勘違いしてんのかな?
245デフォルトの名無しさん
2020/03/23(月) 19:00:04.36ID:iyDg9ARV 荒らしにかまうやつも荒らし
暇なおじいさんが各言語に難癖つけて回ってる
Kotlinの次はRust
暇なおじいさんが各言語に難癖つけて回ってる
Kotlinの次はRust
246デフォルトの名無しさん
2020/03/23(月) 19:15:41.65ID:cjB95B7K おかしな奴に絡まれるからRustはダメ言語
247デフォルトの名無しさん
2020/03/23(月) 19:16:56.45ID:FLdc410A >>242
結局のところライフタイムは人間が書くし、それを元にいくらかのチェックと推論をするだけ。
今まで自動化できてなかった分 (の一部) を新しいやり方で自動化したってだけのことで、
何もかも自動でやってくれるような最強解析能力を持ってるなんて誰も言ってないよ。
ストローマン論法はやめろよな。
もう一度書くけど、 Rust のシステムはメモリリークの排除を目的にしていない。
結局のところライフタイムは人間が書くし、それを元にいくらかのチェックと推論をするだけ。
今まで自動化できてなかった分 (の一部) を新しいやり方で自動化したってだけのことで、
何もかも自動でやってくれるような最強解析能力を持ってるなんて誰も言ってないよ。
ストローマン論法はやめろよな。
もう一度書くけど、 Rust のシステムはメモリリークの排除を目的にしていない。
248デフォルトの名無しさん
2020/03/23(月) 20:19:04.31ID:kJWIzarl 藁人形クッソ抜ける?
249デフォルトの名無しさん
2020/03/23(月) 21:49:49.89ID:urYmb4Ir リソースの開放をプログラム内で完璧にやろうとせずに
プロセスの再起動とかの水準で考えてしまえばいいこともあるかもね
プロセスの再起動とかの水準で考えてしまえばいいこともあるかもね
250デフォルトの名無しさん
2020/03/23(月) 22:15:27.45ID:0TZC4jF8 メモリ以外のリソース回収に関してはGCよりRust(あるいはC++のスマポ)がはるかに優秀なんだよな。
Rustに慣れると他言語でusingとかするのが面倒になってくるし、ついつい付け忘れて困る。
Rustに慣れると他言語でusingとかするのが面倒になってくるし、ついつい付け忘れて困る。
251デフォルトの名無しさん
2020/03/24(火) 00:09:09.52ID:PY48eDSf Kotlinスレでnullポインタの方が良いと
荒らしてたのと同一人物だったのか
荒らしてたのと同一人物だったのか
252デフォルトの名無しさん
2020/03/24(火) 02:50:53.94ID:T0vrM+QL 体制側と違う意見は大事。
自分の頭で考えない人は、効能書きや権威やネットで書かれたことを鵜呑みにしてしまう。
自分の頭で考えない人は、効能書きや権威やネットで書かれたことを鵜呑みにしてしまう。
253デフォルトの名無しさん
2020/03/24(火) 10:04:19.30ID:cgACDOV9 メモリ以外のリソース回収なんてむしろなくね
254デフォルトの名無しさん
2020/03/24(火) 10:37:53.99ID:1n+V7cka いやファイルポインタ、コネクション、スレッドなどいくらでもあるだろ。
255デフォルトの名無しさん
2020/03/24(火) 12:20:20.31ID:T0vrM+QL >>250
こんな出てきたばかりの言語に慣れてる人なんているかい。
こんな出てきたばかりの言語に慣れてる人なんているかい。
256デフォルトの名無しさん
2020/03/24(火) 12:43:11.53ID:I6AqzmeH ファイルハンドルくらいならusingでもいいけど、デバイスコンテキストみたいな微妙に寿命が長いのが困る。
Disposeとか呼び忘れても大抵GCが回収してくれてぱっと見動くけど、
時々回収してくれなくて再現性の低いバグになるとか。
Disposeとか呼び忘れても大抵GCが回収してくれてぱっと見動くけど、
時々回収してくれなくて再現性の低いバグになるとか。
257デフォルトの名無しさん
2020/03/24(火) 14:22:30.48ID:T0vrM+QL Box<T>のソースを見ていたら、Box::new が次のような1行だけのソースで、
box キーワードを調べてみたら、組み込みの Box::new の実装とだけしか
情報がない。つまり、ソースがあるようで実質的には無い:
impl<T> Box<T> {
pub fn new(x: T) -> Box<T> {
box x
}
}
同様に Vec<T> のソースを見ていたら、RawVec なるものが出ていて、
RawVecのソースもあったがそこで、core::ptr なるものが使ってあり、
そのソースはないようだ。
Cにとってかわるシステム言語と言いながら、本質的には組み込み関数ばかりで
ソースを追っていくことができない。
Cは最初から理解できて、このような闇が存在しないので、高級アセンブラであり、
システム言語であった。
Rustにはその代わりは務まらないのではないか。
box キーワードを調べてみたら、組み込みの Box::new の実装とだけしか
情報がない。つまり、ソースがあるようで実質的には無い:
impl<T> Box<T> {
pub fn new(x: T) -> Box<T> {
box x
}
}
同様に Vec<T> のソースを見ていたら、RawVec なるものが出ていて、
RawVecのソースもあったがそこで、core::ptr なるものが使ってあり、
そのソースはないようだ。
Cにとってかわるシステム言語と言いながら、本質的には組み込み関数ばかりで
ソースを追っていくことができない。
Cは最初から理解できて、このような闇が存在しないので、高級アセンブラであり、
システム言語であった。
Rustにはその代わりは務まらないのではないか。
258デフォルトの名無しさん
2020/03/24(火) 14:31:46.69ID:e2obE13Z ツッコミどころ満載だけど
荒らしの相手したら負け
荒らしの相手したら負け
259デフォルトの名無しさん
2020/03/24(火) 14:40:33.66ID:JQ7YmFwi 正しく
怖がる
怖がる
260デフォルトの名無しさん
2020/03/24(火) 14:43:56.87ID:oKMcqgHf 巨大学術掲示板群 - アルファ・ラボ
ttp://x0000.net
物理学 化学 生物学 数学 天文学 地理地学
IT 電子 工学 言語学 方言 国語 など
ttp://x0000.net
物理学 化学 生物学 数学 天文学 地理地学
IT 電子 工学 言語学 方言 国語 など
261デフォルトの名無しさん
2020/03/24(火) 14:44:12.30ID:T0vrM+QL Rustは概念が整理されてない。
Cは、ポインタという概念さえ理解すれば(そしてそれは、プログラミングに適性が有る人にはそんなに難しいわけではない)、それだけを頼りにあらゆるものが構築できた。
ところが、Rustはいくら学んでも終わりが無いくらい基礎の部分が難しい。
Box<T>が何をやっているかは、自然言語で説明されるばかりで肝心の
コードも擬似コードもなかなか見つからない。
Cは、ポインタという概念さえ理解すれば(そしてそれは、プログラミングに適性が有る人にはそんなに難しいわけではない)、それだけを頼りにあらゆるものが構築できた。
ところが、Rustはいくら学んでも終わりが無いくらい基礎の部分が難しい。
Box<T>が何をやっているかは、自然言語で説明されるばかりで肝心の
コードも擬似コードもなかなか見つからない。
262デフォルトの名無しさん
2020/03/24(火) 15:04:27.63ID:T0vrM+QL Box<T>のデストラクタである所の Drop trait の drop 関数を調べてみると、
次のようになっており、compilerの埋め込み処理というコメントになっている。
恐らく、Box<T>が削除される際にコンパイラが何らかの処理を入れているが、
ソース中には書いてない。
こんな状態で Cの後釜を名乗ってほしくない。
unsafe impl<#[may_dangle] T: ?Sized> Drop for Box<T> {
fn drop(&mut self) {
// FIXME: Do nothing, drop is currently performed by compiler.
}
}
次のようになっており、compilerの埋め込み処理というコメントになっている。
恐らく、Box<T>が削除される際にコンパイラが何らかの処理を入れているが、
ソース中には書いてない。
こんな状態で Cの後釜を名乗ってほしくない。
unsafe impl<#[may_dangle] T: ?Sized> Drop for Box<T> {
fn drop(&mut self) {
// FIXME: Do nothing, drop is currently performed by compiler.
}
}
263デフォルトの名無しさん
2020/03/24(火) 15:45:47.44ID:noFaRAc6264デフォルトの名無しさん
2020/03/24(火) 16:11:12.01ID:T0vrM+QL Option<Box<T>> で、Some(Box::new<xxx>)
とした場合に、どういう状況の時に このメモリが解放されるのか、
その仕組みも分かりにくい。
とした場合に、どういう状況の時に このメモリが解放されるのか、
その仕組みも分かりにくい。
265デフォルトの名無しさん
2020/03/24(火) 16:46:57.83ID:T0vrM+QL266デフォルトの名無しさん
2020/03/24(火) 17:02:53.60ID:SD2kTFQw なんぼ間違えんねん落ち着けや
267デフォルトの名無しさん
2020/03/24(火) 17:20:04.56ID:T0vrM+QL Rustでの代入記号は、i32/f32/bool/str などのprimitive型以外は原則的に copy動作
ではなく、move 動作のようなもので、所有権の移動が発生する。
例外は、Copy traitsが実装されている型の場合で、その場合も copy動作になる。
Option<XXX>は、Copy traitsが実装されているらしく、Optionが他動詞で代入記号
を使うと、copy動作になるらしい。
ただし、これは文書で明確には述べられてないのでよくわからない。
根拠は、Optionのソースは以下のようになっていて、#[derive(Copy, ...)]の部分が、
Copy traitsを自動実装する、という意味になるらしいからだ:
#[derive(Copy, PartialEq, PartialOrd, Eq, Ord, Debug, Hash)]
#[rustc_diagnostic_item = "option_type"]
#[stable(feature = "rust1", since = "1.0.0")]
pub enum Option<T> {
/// No value
#[stable(feature = "rust1", since = "1.0.0")]
None,
/// Some value `T`
#[stable(feature = "rust1", since = "1.0.0")]
Some(#[stable(feature = "rust1", since = "1.0.0")] T),
}
ではなく、move 動作のようなもので、所有権の移動が発生する。
例外は、Copy traitsが実装されている型の場合で、その場合も copy動作になる。
Option<XXX>は、Copy traitsが実装されているらしく、Optionが他動詞で代入記号
を使うと、copy動作になるらしい。
ただし、これは文書で明確には述べられてないのでよくわからない。
根拠は、Optionのソースは以下のようになっていて、#[derive(Copy, ...)]の部分が、
Copy traitsを自動実装する、という意味になるらしいからだ:
#[derive(Copy, PartialEq, PartialOrd, Eq, Ord, Debug, Hash)]
#[rustc_diagnostic_item = "option_type"]
#[stable(feature = "rust1", since = "1.0.0")]
pub enum Option<T> {
/// No value
#[stable(feature = "rust1", since = "1.0.0")]
None,
/// Some value `T`
#[stable(feature = "rust1", since = "1.0.0")]
Some(#[stable(feature = "rust1", since = "1.0.0")] T),
}
268デフォルトの名無しさん
2020/03/24(火) 17:21:21.85ID:T0vrM+QL269デフォルトの名無しさん
2020/03/24(火) 17:31:35.81ID:UBy3gEYu270デフォルトの名無しさん
2020/03/24(火) 18:30:07.73ID:le7GgsxJ271デフォルトの名無しさん
2020/03/24(火) 18:46:17.48ID:8wuqSfIx 汽車 汽車 チンポ チンポ
シコシコ チンポッポ
チンポを出して シコシコ チンポッポ
シコシコ チンポッポ
チンポを出して シコシコ チンポッポ
272デフォルトの名無しさん
2020/03/24(火) 19:01:03.96ID:SD2kTFQw >>278
期待してるぞ
期待してるぞ
273デフォルトの名無しさん
2020/03/24(火) 23:11:28.78ID:UBy3gEYu >>278
それコンパイラのソースじゃないよ
それコンパイラのソースじゃないよ
274デフォルトの名無しさん
2020/03/25(水) 01:18:57.46ID:COJzGufp Rustは、コンパイラ時エラーに悩まされる反面、実行時エラーに悩まされるのを減らす
などと言われる。
しかし、コンパイル時エラーが出ると言うことは、裏を返せば、書けないアルゴリズムが存在するということだ。
直感的ではない回りくどい書き方が必要となり記述量が多くなる。
他の言語では好きな書き方が出来て、それはどれも正解だが、Rustでは正解が非常に狭くなる。
正解が狭いことがエラーを減らすなどという人がいるが、実際には、Rustは
書けるアルゴリズムが狭い、と言うことなのである。
これは言語設計の問題である。
なお、ここで言っているアルゴリズムは、全体的なものではなく、細かいミクロ的なものである。
通常の言語では、1つの仕事を細かい変数の使い方まで含めれば数万通り以上に書けるだろう。
そして、そのどれもが正解であり、結果が正しくバグも無いのだから、内のどれかが悪い書き方という
ことは特にない。
ところが、Rustでは、その大部分の書き方が出来ないのである。
駄目だから敢えてできなくしているのではなく、Rustが設計上、書けないアルゴリズムがあるということに他ならない。
つまり、Rustは書けるアルゴリズムが、本来コンピュータが書けるアルゴリズムの内の、非常に狭いサブセットに限られてしまうということである。
これは、Rustの大きな欠陥である。
などと言われる。
しかし、コンパイル時エラーが出ると言うことは、裏を返せば、書けないアルゴリズムが存在するということだ。
直感的ではない回りくどい書き方が必要となり記述量が多くなる。
他の言語では好きな書き方が出来て、それはどれも正解だが、Rustでは正解が非常に狭くなる。
正解が狭いことがエラーを減らすなどという人がいるが、実際には、Rustは
書けるアルゴリズムが狭い、と言うことなのである。
これは言語設計の問題である。
なお、ここで言っているアルゴリズムは、全体的なものではなく、細かいミクロ的なものである。
通常の言語では、1つの仕事を細かい変数の使い方まで含めれば数万通り以上に書けるだろう。
そして、そのどれもが正解であり、結果が正しくバグも無いのだから、内のどれかが悪い書き方という
ことは特にない。
ところが、Rustでは、その大部分の書き方が出来ないのである。
駄目だから敢えてできなくしているのではなく、Rustが設計上、書けないアルゴリズムがあるということに他ならない。
つまり、Rustは書けるアルゴリズムが、本来コンピュータが書けるアルゴリズムの内の、非常に狭いサブセットに限られてしまうということである。
これは、Rustの大きな欠陥である。
275デフォルトの名無しさん
2020/03/25(水) 01:25:39.41ID:COJzGufp >>274
「駄目な書き方だからエラーにしている」
と言うのは間違いで、正しくは、
「Rustコンパイラの静的解析能力では、書き方を非常に限定しないと
正しいことを保障できなかったり、自動化できなかったりするため、
しょうがなく狭い書き方しか出来なくしている」
と言うことに他ならない。
人間には脳内の静的解析で明らかに正しいことが分かる書き方でも、
Rustコンパイラではでは同じことができないため、敢えて
変数束縛、借用、単一参照など、コンパイラでも解析できる程度の
範囲に書き方を限定して無理やり人間のプログラミングの可能性を
狭めているに過ぎない。
「駄目な書き方だからエラーにしている」
と言うのは間違いで、正しくは、
「Rustコンパイラの静的解析能力では、書き方を非常に限定しないと
正しいことを保障できなかったり、自動化できなかったりするため、
しょうがなく狭い書き方しか出来なくしている」
と言うことに他ならない。
人間には脳内の静的解析で明らかに正しいことが分かる書き方でも、
Rustコンパイラではでは同じことができないため、敢えて
変数束縛、借用、単一参照など、コンパイラでも解析できる程度の
範囲に書き方を限定して無理やり人間のプログラミングの可能性を
狭めているに過ぎない。
276デフォルトの名無しさん
2020/03/25(水) 01:26:44.15ID:atIoOIeM コピペじゃなかったのか…ウケるw
277デフォルトの名無しさん
2020/03/25(水) 07:56:19.45ID:B3ciLpqT みんなドキュメントコメントで日本語も一緒に書くときってどうしてる?
こんな連ねた感じでいいのかな?
/// Returns a Person object
/// Personオブジェクトを返す
こんな連ねた感じでいいのかな?
/// Returns a Person object
/// Personオブジェクトを返す
278デフォルトの名無しさん
2020/03/25(水) 08:01:15.06ID:ukHBAVn8 例が悪いわ。
そんな糞コメント書くな、になってしまう。
そんな糞コメント書くな、になってしまう。
279デフォルトの名無しさん
2020/03/25(水) 08:57:55.31ID:3gLrCiKq >>278
期待を裏切りよって
期待を裏切りよって
280デフォルトの名無しさん
2020/03/25(水) 09:06:21.89ID:99YP/w74 言いたいことも言えないこんな世の中じゃポイズン
281デフォルトの名無しさん
2020/03/25(水) 11:14:11.00ID:mufeRxy0 Cからprintln使ってるRustの関数呼ぶとメモリリークしよる(´・ω・`)
282デフォルトの名無しさん
2020/03/25(水) 12:42:04.62ID:gIHmoeQz >>277
それコメントの意味なくね?
それコメントの意味なくね?
283デフォルトの名無しさん
2020/03/25(水) 14:08:14.89ID:rak19Gqk284デフォルトの名無しさん
2020/03/25(水) 16:36:38.82ID:6bd+J6i5 今だにCopyトレイトの命名は失敗だと再確認する
285デフォルトの名無しさん
2020/03/26(木) 02:55:12.87ID:q1LILc/b Box<T> は copy ではなく move なんだとさ。
286デフォルトの名無しさん
2020/03/26(木) 02:58:28.01ID:q1LILc/b287デフォルトの名無しさん
2020/03/26(木) 03:37:08.94ID:lC9OKNgA 中身がCopyのときだけOptionもCopyになるんじゃないの??
288デフォルトの名無しさん
2020/03/26(木) 03:46:23.72ID:2WcXgaRB >>287
分からない。
分からない。
289デフォルトの名無しさん
2020/03/26(木) 03:48:11.78ID:2WcXgaRB >>285
ソースを示しておくと、以下の公式(?)サイトに、
「because Box isn't Copy」という言葉が書かれている:
https://doc.rust-lang.org/nomicon/checked-uninit.html
ソースを示しておくと、以下の公式(?)サイトに、
「because Box isn't Copy」という言葉が書かれている:
https://doc.rust-lang.org/nomicon/checked-uninit.html
290デフォルトの名無しさん
2020/03/26(木) 04:59:35.60ID:2WcXgaRB struct のメンバに local 変数を代入した場合、エラーになる?
291デフォルトの名無しさん
2020/03/26(木) 12:36:34.09ID:Rq1Q9bYl https://doc.rust-lang.org/std/option/enum.Option.html#impl-Copy
impl<T> Copy for Option<T> where T: Copy {}
impl<T> Copy for Option<T> where T: Copy {}
292デフォルトの名無しさん
2020/03/26(木) 14:56:26.41ID:RidRralQ■ このスレッドは過去ログ倉庫に格納されています
ニュース
- 「厚かましい挑発的発言だ」中国国連大使が高市首相発言に強く反発 日本の常任理事国入りに明確に反対 [ぐれ★]
- 中国側が首相答弁の撤回要求、日本側拒否★6 [夜のけいちゃん★]
- 解体ごみ約2.3トンを山に不法投棄か トルコ国籍解体工を逮捕 埼玉 [どどん★]
- 債券・円・株「トリプル安」に…長期金利1.755%まで上昇、円は対ユーロで史上最安値 ★3 [蚤の市★]
- 自民、経済対策で子ども1人に2万円給付へ 児童手当に上乗せ 所要額は約4000億円 [ぐれ★]
- 【漫画】『週刊少年サンデー』連載中の漫画家、前編集者に怒り! 入稿遅れ、無断のセリフ変更など暴露 「心の糸が切れて」 [冬月記者★]
- 愛国者「高市総理が威勢よく吠えてなければこんな事態にはなってないって話に変わってるけど、元はといえばこいつがきっかけだからね?」 [856698234]
- 【悲報】高市早苗さん、たった一人で日本を崩壊へ導く [714769305]
- 【悲報】「やったー!こだわりまくった洋館仕立ての家を建てたぞ!」➡「「離婚したんで住まずに売ります……」 [158478931]
- 安倍祖父(東大)安倍父(東大)、安倍晋三(成蹊大)→なぜなのか? [832215575]
- 精神する時の🏡
- 【悲報】数年後ジャップ「足らぬ足らぬは工夫が足らぬ😤」 [616817505]
