Rust part8

■ このスレッドは過去ログ倉庫に格納されています
2020/01/24(金) 11:47:52.41ID:9oO1hUHl
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/
2020/03/03(火) 22:09:48.50ID:lzYVFoFM
charにする場合は’staticは無理なんじゃないかな
&strをsliceして1文字分にしたほうが素直だと思う

let x: &'static str = "test";
let y: &'static str = &x[x.len()-1..];
let z: &char = &x.chars().next_back().unwrap();
2020/03/03(火) 22:48:24.81ID:EQ8N775K
そこまでメモリ節約したいって組込系か何かか
2020/03/03(火) 23:11:15.82ID:VHyE3ijH
charでなくu8を使うシーンに思える
2020/03/03(火) 23:13:54.10ID:EQ8N775K
asciiと分かってるなら u8 だよね
どっかで u8 ベースの文字列操作ライブラリ見かけた気がする
2020/03/03(火) 23:14:25.42ID:YHPxp8LF
>>120
それだと最後の1文字が2バイト以上の時に死ぬから
結局全体をcharsするしかないような。
2020/03/03(火) 23:30:49.39ID:EQ8N775K
これだ
https://crates.io/crates/bstr
作者が有名人なので前にチェックしてた
126デフォルトの名無しさん
垢版 |
2020/03/04(水) 00:03:26.33ID:g8GJiSIM
おお、いっぱい回答くれた ありがとう
レス止まってたけど見てる人はいるんだね。

素直にsliceしようと思ったけど、
str.chars.last()
このlastって消費されないけどなんで?
型的には
fn last(self) -> Option<char>
だけどなんで消費されないか分かんない
&strみたいな元々消費不可能ならコンパイルエラーでると思ってたんだけど。
https://doc.rust-lang.org/std/iter/trait.Iterator.html#method.last
2020/03/04(水) 00:12:13.85ID:/mNi51EN
消費されるのは&strじゃなくてそのイテレータだからね。
"abcd".chars()で得られるのは、{ String : source, index : 0 }みたいな形のChars型で、これがindexをインクリメントしながら文字を取得してくれる。
128デフォルトの名無しさん
垢版 |
2020/03/05(木) 00:35:43.70ID:cMoNZaaE
use std::fmt::{self, Display, Write};
このselfってどういう意味?
2020/03/05(木) 00:38:13.00ID:S5c20Dqb
>>128
use std::fmt;と同じ。
130デフォルトの名無しさん
垢版 |
2020/03/06(金) 00:28:35.73ID:s+8hbWLf
まさにこの質問と同じ状況でコンパイル出来ないんですけど、分かる人いますか?
https://stackoverflow.com/questions/46393890/mutable-borrow-in-loop
2020/03/06(金) 01:12:13.19ID:n2xpzai7
>>130
回答に書いてあるじゃん・・・
dostuff()やfixme()が受け取るselfに’aでlifetimeアノテーションをつける理由ないよね
132デフォルトの名無しさん
垢版 |
2020/03/06(金) 19:38:23.62ID:s+8hbWLf
>>131
ライブラリ側が同じデータ構造しててループで回したいけど同じエラーで出来ません
これって並列にループ回す可能性があるからシングルスレッドでも禁止されるんですか?
すみません、初心者で
2020/03/06(金) 21:38:26.09ID:n2xpzai7
>>132
ある値に対するmutable referenceは同時には1つしか存在できない
ってのはRustの基本ルールの1つ
この場合は並列に回す可能性があるかどうかは関係ない

Test構造体自体のライフタイムが’aで
dostuff()が&’a mut selfを取るなら
1回目のdostuff()呼び出し時にselfをmutableに借りてくるけど
Test構造体のライフタイムと同じだけ借りることになるから
2回目のdostuff()呼び出し時には1個目を借りたまま2個目を借りようとしてることになる
だからエラー
134デフォルトの名無しさん
垢版 |
2020/03/07(土) 13:13:11.28ID:e127m1PH
>>133
なるほど。
ライブラリ側なので修正できないんですが、AcとRefCell使って解決できる問題ですか?
2020/03/08(日) 08:35:20.95ID:MryPyRvf
>>134
どのライブラリのどのメソッド?
2020/03/08(日) 11:34:51.20ID:gavt1hh0
その構造体の意図が分からんので、あんまりアドバイスできない
単にライブラリ作者がrustに慣れていないだけなら、適切な形に直してもらうのがシンプルで合理的だし、
>>130のTest::fixme相当のメソッドは誰にも呼び出して欲しくないのかもしれないなら、使うべきじゃない
Test::dostuffを繰り返し呼び出したいだけならRefCellで何とかなる
2020/03/08(日) 11:38:51.13ID:gavt1hh0
Rustで型パズルみたいな状況になるのは、見落としている前提があったり、設計レベルで何か考慮が足りないことが原因な事が多いと個人的には思ってる
姑息な解決をしてたら余計にドツボにはまる
138デフォルトの名無しさん
垢版 |
2020/03/09(月) 04:03:43.73ID:FXqsuorv
>>135
>>136
このライブラリです。
https://github.com/fulmicoton/kuromoji-rs
https://github.com/fulmicoton/kuromoji-rs/blob/master/src/lib.rs#L246-L256

こういう風に使おうとしていて、Testと同じ状況です。
let mut tokenizer = kuromoji::Tokenizer::normal();
for s in ["Example", "Example2"].iter() {
tokenizer.tokenize_str(s);
}
2020/03/09(月) 06:35:47.93ID:wpD0c2Sy
>>138
Tokenizer自体は'aで定義されてないからTestとは状況違うんじゃない?
2020/03/09(月) 10:07:04.49ID:KfBbpF5w
コンパイラをだましても本質的な解決にはならん。
そろそろrustマンセーしてる輩も気づくころだろうね。
2020/03/09(月) 12:37:33.41ID:DOrcZre+
なんかトレイトの命名でなるべく名詞ではなく動詞を使う(WriterではなくWrite、ReaderではなくRead)みたいなのがオフィシャルの文書で有ったような気がするんだけど見つからない
そんな指針って無かったっけ?
2020/03/09(月) 12:52:18.51ID:lyteAeVl
>>141
オフィシャルにはapi-guidelinesだと思うけど特になさそう。
このissueで議論されてるけど特に結論はでてないし。
https://github.com/rust-lang/api-guidelines/issues/28
2020/03/09(月) 13:05:24.07ID:CscrLobz
>>141
話し合いしている様子は見つけた。
https://github.com/rust-lang/api-guidelines/issues/28
どちらを優先するという話ではなく、使い分けがあるっぽい。
2020/03/09(月) 21:11:10.09ID:tRF5zhFi
一年くらい前に挫折して最近また勉強し始めたんだけど参照周りの仕様変わった?
https://doc.rust-jp.rs/rust-by-example-ja/scope/borrow/freeze.html
これとかエラーにならないし
2020/03/09(月) 21:47:20.13ID:oO+VEyrl
>>144
昔は一度借用するとスコープアウトするまで借りっぱなしだったけど、今は使われなくなった時点で返すようになってる。
non lexical lifetimeというやつ。
英語版だとちゃんとエラーになるように修正されてるね。
https://doc.rust-lang.org/rust-by-example/scope/borrow/freeze.html
2020/03/09(月) 22:32:56.28ID:Wg77JZ2S
>>138
試しに触ってみた感じだけど、戻り値をVecに格納しようとすると怒られるよね。
で、よく見ると引数のtextはtokenizer自身と全く関係の無い寿命であって良いのに、tokenizerとtextの寿命が同じであるってシグネチャで言ってるから何かマズそう
多分もっと理解できる人も居るだろうけど、selfとtextの寿命を無関係にしたら動くってなんとなく分かる
pub fn tokenize_str<'s, 'a>(&'s mut self, mut text: &'a str) -> Vec<&'a str> {
ってやったら動くよ。省略ルールで
pub fn tokenize_str<'a>(&mut self, mut text: &'a str) -> Vec<&'a str> {
と同義。

俺の頭の中の理解じゃプルリク送れるほど明快に説明できないが、適当にローカルに落とすかgithubでforkして使っても良い
2020/03/09(月) 22:35:30.43ID:tRF5zhFi
>>145
non lexical lifetimeっていうのね。Rust日本語情報が少ないので助かるわ。thx
2020/03/09(月) 23:22:38.75ID:hlMkZByK
>>147
しかしそもそも借用によるフリーズって意味なくなってるから
そのページ全体書き直した方がいい感じ。
フリーズするならシャドーイングによるmut外しかな。
2020/03/10(火) 15:02:44.20ID:eonxFH18
>>138
Linderaってのがkuromoji-rsの後継らしいからそっち使えば?
https://qiita.com/mosuka/items/0fdaaf91f5530d427dc7
https://github.com/lindera-morphology/lindera

該当箇所のライフタイムは修正されてるのでtokenizerのインスタンスをループで使っても問題ない
https://docs.rs/lindera/0.3.4/src/lindera/tokenizer.rs.html#163-173

ただドキュメントは整備されてないし
ライブラリ自身のテストも通らない状態になってるから
本格的に使うなら自分でメンテするくらいの覚悟が必要かもしれん
150デフォルトの名無しさん
垢版 |
2020/03/10(火) 19:42:21.39ID:jwXWuMzy
>>149
ありがとうございます、後継なんてあったんですね。
最近出来たみたいですがそれほどメンテされてないみたいですしこの先不安なので素直にPython使うことにします。
日本関係依存のライブラリはRustユーザー少ないので確立されたものがないのが辛いですね...
2020/03/10(火) 19:58:15.03ID:uPXabSQ0
rustも字句解析も相当知ってなきゃそれ使うの無理だろ。。
2020/03/11(水) 18:46:16.77ID:TDIek7NK
vecのinto_iter呼んだらconsumeするって
fn into_iter(self) -> イテレータ {self}
こういうふうになってるってこと?
よく分かってない質問ですみません。
2020/03/11(水) 18:56:11.75ID:TDIek7NK
あ、consumeじゃないわこの場合
moveって言いたかった
2020/03/11(水) 19:43:34.97ID:TDIek7NK
自己解決?

https://doc.rust-lang.org/std/vec/struct.Vec.html#impl-IntoIterator
impl<T> IntoIterator for Vec<T>

こうなってるからそのまま self を返してるに違いない
よーわからんけどなんとなく納得
155デフォルトの名無しさん
垢版 |
2020/03/11(水) 19:46:02.45ID:vu1i9ieU
よく分からないのに納得してしまうのはよくない
2020/03/11(水) 20:15:44.69ID:aaR0sYBN
>>154
ソースで理解したいんならここ。

https://doc.rust-lang.org/src/alloc/vec.rs.html#1934-1952

Vecのポインタを使ってIntoIterを構築して、元のVecはforgetでメモリ管理対象から外してる。
157デフォルトの名無しさん
垢版 |
2020/03/11(水) 20:40:35.00ID:TDIek7NK
>>155 おっしゃるとおり
>>156 おおおお!!!
想像とは違ってunsafeの中であれこれしてた!
impl<T> IntoIterator for Vec<T> {
type Item = T;
type IntoIter = IntoIter<T>;
fn into_iter(mut self) -> IntoIter<T> {
unsafe {
let begin = self.as_mut_ptr();
let end = if mem::size_of::<T>() == 0 {
arith_offset(begin as *const i8, self.len() as isize) as *const T
} else {
begin.add(self.len()) as *const T
};
let cap = self.buf.capacity();
mem::forget(self);
IntoIter {
buf: NonNull::new_unchecked(begin),
phantom: PhantomData,
cap,
ptr: begin,
end,
}
}
}
}
いやあ勉強になります
2020/03/11(水) 22:03:42.73ID:JP1MFGqI
fn into_iter(mut self) -> IntoIter<T>

このmut selfのmutの使い方について
意味は理解してるんだけど公式で解説してる箇所ある?
159デフォルトの名無しさん
垢版 |
2020/03/11(水) 22:44:26.55ID:PgaAGaoo
なんでextern crate crate_name;ってuse crate_name;に統合されたの?
2020/03/11(水) 23:04:39.68ID:JP1MFGqI
>>159
RFCに書いてある理由はこの辺り
https://github.com/withoutboats/rfcs/blob/modules/0000-modules/motivation.md#underlying-problems
2020/03/12(木) 06:53:02.39ID:/EHADneN
serde, reqwestとかを使ってるだけの小さいツールなのに
targetディレクトリ以下がいつの間にか2GB以上喰ってて驚いた
無駄遣いしすぎだろ
162デフォルトの名無しさん
垢版 |
2020/03/12(木) 09:00:30.33ID:TSUJe0Rk
ぜろこすとおーばーへっど(笑)
2020/03/12(木) 09:20:01.92ID:mBaP1v85
>>158
公式系のやつを一通り検索したけどなさそうだね。
確かに頻出パターンではないし、mut selfが必要になる頃には
それくらい分かるだろってことなんだろうか。
2020/03/13(金) 01:08:14.21ID:Guh/z+Wu
容量くうのってインクリメンタルコンパイルのせいかしら?
165デフォルトの名無しさん
垢版 |
2020/03/13(金) 16:12:49.45ID:uMGbn/tA
cargo run --bin bin_a で bin_a から a にバイナリ名をrenameできる方法ない?
オプションとかで
2020/03/13(金) 17:20:18.20ID:1gFsIjGl
>>165
標準ではないと思うから以下の三択
1. コマンドを自作する
2. プラグインを探す
3. Cargo.tomlの編集で我慢する
167デフォルトの名無しさん
垢版 |
2020/03/13(金) 17:48:43.18ID:uMGbn/tA
>>164
インクリメンタルコンパイルの内部構造知らないけど、仕組み的に一個前の状態しかもたないから関係なさそう
2020/03/13(金) 20:50:49.12ID:WvGu/USG
お前らのtargetディレクトリは何GBあるんだ?
2020/03/13(金) 21:21:22.50ID:1gFsIjGl
duとかdustでどのcrateが容量食ってるのか
きちんと確認したほうがいい
2020/03/13(金) 22:52:16.46ID:xYdxtME8
dustで一番ディスク喰ってるプロジェクトを調べてみたよ

target/debug/depsの下に
lib(serde|derive_more|syn|reqwest|chrono_tz)-xxxxxxx.(so|rlib)
が各ライブラリごとに3つずつぐらいあって、それぞれ21〜38MBぐらいあった
その他、依存ライブラリの依存ライブラリと思われる *.rlib ファイルが260個
これだけで 1.4GB

target/debug/build の下が400MBぐらい
target/debug/incremental の下は100MBもない

同様のファイルがtarget/releaseにもあって合わせると 2.3GB
2020/03/14(土) 01:08:40.11ID:7CRfyKLY
エコシステムが充実してるのはいいが、
ぞろぞろと依存を引き連れて落ちてくるのはしんどいな。
2020/03/14(土) 09:57:16.83ID:C6o8FCtt
う、うん…
2020/03/14(土) 13:30:22.96ID:Bfptd6Kx
Rustに限らず誰が書いたかも知らないまま誰がチェックしたかも知らないまま何がダウンロードされるかも知らないままインストールするのが当たり前になっちゃってるよな
ソースが公開されてるとは言えこれじゃいかんよなぁとは思いつつ楽だからまぁいっかな…って感じだわ(´・ω・`)
2020/03/14(土) 13:52:26.42ID:C6o8FCtt
わからないまま終わる。そんなのは嫌だ(´・ω・`)
2020/03/14(土) 13:58:57.65ID:fsLvYgsF
実際なんかの言語で問題起こしていたような
176デフォルトの名無しさん
垢版 |
2020/03/14(土) 14:53:10.70ID:XTUayws2
node.js
177デフォルトの名無しさん
垢版 |
2020/03/14(土) 15:14:32.21ID:kPfIlYV/
誰が書いたかも知らないまま誰がチェックしたかも知らないまま何がインストールされるかも知らないままOSをインストールするのが当たり前になっちゃってるよな
2020/03/15(日) 11:00:03.22ID:OT/9HDtv
公式アプリストアしか使えないとか真逆の動きだろ
何指してるんだ?
2020/03/15(日) 12:03:48.31ID:WbKVgqmu
実際のところ、そんなのいちいち精査してられんだろう。
180デフォルトの名無しさん
垢版 |
2020/03/16(月) 23:59:03.20ID:krhm4ltp
arrayvecとsmallvecってどっち使えばいいの?
2020/03/17(火) 04:52:34.09ID:fexMQ7hH
好きな方。
182デフォルトの名無しさん
垢版 |
2020/03/17(火) 10:23:26.40ID:6zUWJLLj
arrayvecとsmallvecよく見てないけど同じぐらい人気だからどっちでもよさそう
それよりもロガー周りが何選んだらいいか分からん(env_logger抜きで)
ファイル保存したいからlog4rsかfernかslogで迷ってる
ライブラリ選びはホントにRustの欠点だよな
2020/03/17(火) 11:06:35.06ID:fexMQ7hH
まあねぇ。 部品は連携してこそのものだから、
どっちでもいいものでもどちらかには決まってた方がありがたいってのはあるわな。
自由の強さと統率の強さは両立できないのでしゃーない。
2020/03/17(火) 11:30:02.19ID:0EWfgnGX
確かに選びにくいんだけど、型が強いのとコンパイルエラーが見やすいから、移行コストが結構低い気はしている。
なので最近はあまり気にせず適当に選ぶことにしてるな。
2020/03/17(火) 13:15:29.64ID:4299LfVU
スタック上に確保するStringライブラリってあるの?
2020/03/17(火) 17:38:45.49ID:7aqG0pP2
rust-avって今どういう状況なん?
だいぶ前にlibavの人たちがMozillaから数万ドル支援を受けて始めたとかニュースになってたけどgithub見ても実質的にはほぼ何も進んでないようなコミットばっかだしlibavすらほぼ放置みたいな感じだし
非公開の場所で着々と進んでてそのうち公開されるんやろか
187デフォルトの名無しさん
垢版 |
2020/03/18(水) 05:43:30.43ID:1FpZgrTM
C++の負の仕様引きずってるなってRustの特徴とかある?
2020/03/18(水) 09:41:00.53ID:0NsruLdQ
C++の負の仕様って何?
2020/03/18(水) 21:47:04.33ID:ygvPU+jd
winapi 0.3.8 の環境にて、CoCreateInstanceを行いたいのですが、
REFIIDの指定部分をどのように書けばよいか教えてくださいませ
190デフォルトの名無しさん
垢版 |
2020/03/19(木) 00:16:54.84ID:i16Q86hT
なんでassert_neはあるけどassert_notはないの?
2020/03/19(木) 01:43:10.57ID:2ajU8oVE
notと!が続いて少し紛らわしい
なくてもそんな困らない
必要なら作ればいい
とかかな

macro_rules! assert_not {
($cond:expr) => { assert!(!$cond) };
($cond:expr,) => { assert!(!$cond) };
($cond:expr, $($arg:tt)+) => { assert!(!$cond, $($arg)*) };
}
192デフォルトの名無しさん
垢版 |
2020/03/19(木) 15:19:47.59ID:dnKvjYNt
assert!(!false);
の方が紛らわしくないか?
assert_not!は関数名の方に!あるから見間違えないしスッキリするし直感的な気がする
それにneが内部的に反転してるだけならnotあったほうがいいな
2020/03/20(金) 07:03:37.86ID:6UN4nNu/
usize同士の差の絶対値を求めるのがすごくだるいんですけどなんかいい方法ないすか
2020/03/20(金) 07:38:59.81ID:4VHKiEg+
if x > y { x - y } else { y - x }
じゃ駄目かい
2020/03/20(金) 08:14:22.57ID:6UN4nNu/
やっぱそうするしか?
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]);
こうしたいんですけど、どうすればいいですか?
2020/03/21(土) 19:19:05.58ID:HIaSqchS
Vec::swap使え->
Vec::swapは中でunsafe使ってるじゃないですか結局unsafe使わなきゃろくなこと出来ないんですねRustってクソですね

ってやりたい荒らしだろ?
氏ねばいいと思うよ
2020/03/21(土) 19:32:13.45ID:g81eKbe5
標準ライブラリ内でunsafe使うのと
自前でunsafe使わされるのとは雲泥の差があると思うんだがw
200デフォルトの名無しさん
垢版 |
2020/03/21(土) 20:27:19.94ID:d5Yv109I
ヤクザかな?
2020/03/21(土) 20:38:04.64ID:HIaSqchS
ほら、万が一の荒らしじゃないケース用に答えも同時に提示してあげたのにそっちには見向きもしないでしょ
そりゃそうだよね、実際はやりたいことの質問じゃなくてRustをディスるための質問なんだもんね

つかそもそも本当に質問のことがやりたいなら提示したコードをコンパイルしようとしてるはずだよね
そしたら親切なコンパイラが&mutで借用しろって教えてくれてるよね
そしたらそれに従ったら今度は親切なコンパイラが同時に2つmutな借用は作れないって教えてくれてるよね
じゃあどうしたら良いですか?ってなるのが普通だよね

それがないってことは質問を装っていながらコンパイルすらしてないってことだからね
荒らすんなら荒らすでもうちょっと頭使おうね☆
2020/03/22(日) 13:10:01.70ID:HvrypJyW
Rustにも、次のような「言語定義された smart pointer」があり、
~ : 一回だけ(unique) 参照する smart pointer。
@ : 複数回参照できる smart pointerで、GC を使っている。
drop なるものが、C/C++ の free()やdeleteの機能を持つ。
という認識で正しいのでしょうか。
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>
があるようです。
凄く複雑です。
2020/03/22(日) 14:28:20.92ID:HvrypJyW
参照型の変数 r への代入は、普段は、
r = 1;
などでよいようですが、なぜか、*r と書かなければなら無い事があるようです。
また、&i32の変数rとi32の変数aを比較する場合比較する場合、
前者には *r を付けないといけないようです。
難しいです。
2020/03/22(日) 15:43:22.86ID:thEQOCMJ
6年以上前に削除された仕様の良し悪しを語りたいのか?
206デフォルトの名無しさん
垢版 |
2020/03/22(日) 15:57:03.70ID:DNfY/SCe
rustの未来教えて
2020/03/22(日) 16:08:02.82ID:HvrypJyW
>>205
詳しくお願いします。
2020/03/22(日) 16:50:19.83ID:thEQOCMJ
>>207 いやbook読んでよ。もし@とか~についての記述があったら逆に教えて欲しいくらいだ
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();
としてもコンパイルが通るかもしれません。
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
が初心者には分かり易いようです。
この本のことでしょうか?
2020/03/22(日) 17:52:06.65ID:qATPJDe3
7年も前の情報を無条件に信じられるピュアさが俺にも欲しいよ
2020/03/22(日) 17:52:35.28ID:ufFd2vaY
>>210
Rustの1.0リリースは2015年なので
それより古い資料は「昔そういう検討がなされたことがある」程度の意味しかない。
この5年の間に変わった仕様も結構あるし。
213デフォルトの名無しさん
垢版 |
2020/03/22(日) 18:32:23.24ID:DNfY/SCe
初心者なんだけど
もし1つの変数(所有権)にマルチスレッドで書き込みをしようと思ったら、
Rustの借用のルールだと不可能ですか?
複数のイミュータブルな参照を作る事になりますが、できないんですよね?
214デフォルトの名無しさん
垢版 |
2020/03/22(日) 18:40:28.26ID:DNfY/SCe
あまちがえました
訂正:
複数のミュータブルな参照を作る事になります
2020/03/22(日) 18:53:15.15ID:I5Su+SV6
>>213
同時じゃなければ可能なので
他のマルチスレッドプログラミングと同じく排他制御をすればいい
216デフォルトの名無しさん
垢版 |
2020/03/22(日) 19:02:35.81ID:DNfY/SCe
実行時にデータ競合系の問題が生じない代わりに
コーディング時に借用チェッカーとの戦いをするという感じになるんですかね
2020/03/22(日) 19:17:35.15ID:thEQOCMJ
>>210 そのbookだよ。オフィシャルのドキュメントを読まずにどうして深入りできようか
1点だけ。rustではobj.method()とするとメソッドの引数の型(&とか&mutとか)に合うようにobjに*とか&とか付ける仕様になってる
メソッド呼ぶ時のobjに対してこっちが*とか&とか付ける必要は特に無い
2020/03/23(月) 01:35:58.42ID:bf1cRh+B
>>217
bookの話、了解しました。
後半、「メソッドの引数の型」とは、た第一引数 thisのことでしょうか。
219デフォルトの名無しさん
垢版 |
2020/03/23(月) 01:39:22.78ID:h1jHr6GN
所有権、借用、ライフタイムについて勉強してみた。
でも他の言語でも排他制御とか非同期処理用クラスで非同期処理に対応できるわけで、
結局どれくらい御利益があるのか分からなかった。
2020/03/23(月) 02:29:29.77ID:bf1cRh+B
Rustの変数束縛、所有権、借用などで自動化されるのは、
「スタック変数」のポインタが、ブロックの外や関数の外に不用意に出ない
事だけで、Heapから確保されたオブジェクトの自動解放は、
参照カウンタや Garbage Collection を用いずに静的解析のみで行うことは出来ない、
という認識で正しいのでしょうか??
■ このスレッドは過去ログ倉庫に格納されています
5ちゃんねるの広告が気に入らない場合は、こちらをクリックしてください。

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