ArcとVecのmutableエラー'cannot borrow as...
ArcとVecのmutableエラー'cannot borrow as mutable'について
Rustの型エラーで二次元配列が書き換えられないVec<T>のイテレータを消費するにはRust: Vec にトレイトを実装したオブジェクトを格納したいrust-ndarrayのdot()を用いるとリンクエラーが起きますRustでのエラー『type parameter `_` must be used as the type parameter for some local type』について。Rustのmapなどで繋げて記載した場合のエラーハンドリングについて
Vecをthreadで利用するコードを書いた所
cannot borrow as mutableとエラーが出ました。
エラーコード(E0596)にはmutが必要と書いてありますがmutはつけています。
どの様にすればエラーが取れますでしょうか?
use std::vec::Vec;
use std::sync::Arc;
use std::{thread,time};
fn main() {
let arc: Arc<Vec<i32>> = Arc::new(Vec::new());
let mut _arc = Arc::clone(&arc);
thread::spawn(move || {
for x in 1..=10 {
_arc.push(x);
}
});
thread::sleep(time::Duration::from_secs(3));
arc.iter().map(|n| println!("{:?}",n));
}
error[E0596]: cannot borrow data in a `&` reference as mutable
--> src/main.rs:11:13
|
11 | _arc.push(x);
| ^^^^ cannot borrow as mutable
rust
コメント追加 |
Vecをthreadで利用するコードを書いた所
cannot borrow as mutableとエラーが出ました。
エラーコード(E0596)にはmutが必要と書いてありますがmutはつけています。
どの様にすればエラーが取れますでしょうか?
use std::vec::Vec;
use std::sync::Arc;
use std::{thread,time};
fn main() {
let arc: Arc<Vec<i32>> = Arc::new(Vec::new());
let mut _arc = Arc::clone(&arc);
thread::spawn(move || {
for x in 1..=10 {
_arc.push(x);
}
});
thread::sleep(time::Duration::from_secs(3));
arc.iter().map(|n| println!("{:?}",n));
}
error[E0596]: cannot borrow data in a `&` reference as mutable
--> src/main.rs:11:13
|
11 | _arc.push(x);
| ^^^^ cannot borrow as mutable
rust
コメント追加 |
Vecをthreadで利用するコードを書いた所
cannot borrow as mutableとエラーが出ました。
エラーコード(E0596)にはmutが必要と書いてありますがmutはつけています。
どの様にすればエラーが取れますでしょうか?
use std::vec::Vec;
use std::sync::Arc;
use std::{thread,time};
fn main() {
let arc: Arc<Vec<i32>> = Arc::new(Vec::new());
let mut _arc = Arc::clone(&arc);
thread::spawn(move || {
for x in 1..=10 {
_arc.push(x);
}
});
thread::sleep(time::Duration::from_secs(3));
arc.iter().map(|n| println!("{:?}",n));
}
error[E0596]: cannot borrow data in a `&` reference as mutable
--> src/main.rs:11:13
|
11 | _arc.push(x);
| ^^^^ cannot borrow as mutable
rust
Vecをthreadで利用するコードを書いた所
cannot borrow as mutableとエラーが出ました。
エラーコード(E0596)にはmutが必要と書いてありますがmutはつけています。
どの様にすればエラーが取れますでしょうか?
use std::vec::Vec;
use std::sync::Arc;
use std::{thread,time};
fn main() {
let arc: Arc<Vec<i32>> = Arc::new(Vec::new());
let mut _arc = Arc::clone(&arc);
thread::spawn(move || {
for x in 1..=10 {
_arc.push(x);
}
});
thread::sleep(time::Duration::from_secs(3));
arc.iter().map(|n| println!("{:?}",n));
}
error[E0596]: cannot borrow data in a `&` reference as mutable
--> src/main.rs:11:13
|
11 | _arc.push(x);
| ^^^^ cannot borrow as mutable
rust
rust
質問日時: 17時間前
tantan
646
646
コメント追加 |
コメント追加 |
1 件の回答
1
アクティブ
古い順
票
Arc
で包んだデータは不変の参照としてしかアクセスできません。データを可変にするには、Arc
で包む前に内部可変性を提供するコンテナで包んでおく必要があります。複数スレッドからのアクセスに対応しているのはRwLock
やMutex
などです。RwLock
を使うと以下のようになります。
use std::sync::{Arc, RwLock};
use std::vec::Vec;
use std::{thread, time};
fn main() {
let arc = Arc::new(RwLock::new(Vec::new())); // Arc<RwLock<Vec<i32>>>型
let arc2 = Arc::clone(&arc);
thread::spawn(move || {
for x in 1..=10 {
if let Ok(mut v) = arc2.write() {
v.push(x);
}
}
});
thread::sleep(time::Duration::from_secs(3));
if let Ok(v) = arc.read() {
v.iter().for_each(|n| println!("{:?}", n));
};
}
内部可変性についてはこちらのドキュメントが参考になると思います。
https://doc.rust-jp.rs/book/second-edition/ch15-05-interior-mutability.html
また手前味噌ですが、以前このような記事も書きましたので、よかったら参考にしてください。
https://qiita.com/tatsuya6502/items/bed3702517b36afbdbca
コメント追加 |
回答
StackExchange.ifUsing("editor", function () {
StackExchange.using("externalEditor", function () {
StackExchange.using("snippets", function () {
StackExchange.snippets.init();
});
});
}, "code-snippets");
StackExchange.ready(function() {
var channelOptions = {
tags: "".split(" "),
id: "581"
};
initTagRenderer("".split(" "), "".split(" "), channelOptions);
StackExchange.using("externalEditor", function() {
// Have to fire editor after snippets, if snippets enabled
if (StackExchange.settings.snippets.snippetsEnabled) {
StackExchange.using("snippets", function() {
createEditor();
});
}
else {
createEditor();
}
});
function createEditor() {
StackExchange.prepareEditor({
heartbeatType: 'answer',
autoActivateHeartbeat: false,
convertImagesToLinks: false,
noModals: true,
showLowRepImageUploadWarning: true,
reputationToPostImages: null,
bindNavPrevention: true,
postfix: "",
imageUploader: {
brandingHtml: "提供: u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
allowUrls: true
},
onDemand: true,
discardSelector: ".discard-answer"
,immediatelyShowMarkdownHelp:true
});
}
});
登録またはログイン
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Google を使用して登録
Facebook を使用して登録
メールアドレスとパスワードで登録
ゲストとして投稿
Required, but never shown
StackExchange.ready(
function () {
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fja.stackoverflow.com%2fquestions%2f53168%2farc%25e3%2581%25a8vec%25e3%2581%25aemutable%25e3%2582%25a8%25e3%2583%25a9%25e3%2583%25bccannot-borrow-as-mutable%25e3%2581%25ab%25e3%2581%25a4%25e3%2581%2584%25e3%2581%25a6%23new-answer', 'question_page');
}
);
ゲストとして投稿
Required, but never shown
1 件の回答
1
アクティブ
古い順
票
1 件の回答
1
アクティブ
古い順
票
アクティブ
古い順
票
アクティブ
古い順
票
Arc
で包んだデータは不変の参照としてしかアクセスできません。データを可変にするには、Arc
で包む前に内部可変性を提供するコンテナで包んでおく必要があります。複数スレッドからのアクセスに対応しているのはRwLock
やMutex
などです。RwLock
を使うと以下のようになります。
use std::sync::{Arc, RwLock};
use std::vec::Vec;
use std::{thread, time};
fn main() {
let arc = Arc::new(RwLock::new(Vec::new())); // Arc<RwLock<Vec<i32>>>型
let arc2 = Arc::clone(&arc);
thread::spawn(move || {
for x in 1..=10 {
if let Ok(mut v) = arc2.write() {
v.push(x);
}
}
});
thread::sleep(time::Duration::from_secs(3));
if let Ok(v) = arc.read() {
v.iter().for_each(|n| println!("{:?}", n));
};
}
内部可変性についてはこちらのドキュメントが参考になると思います。
https://doc.rust-jp.rs/book/second-edition/ch15-05-interior-mutability.html
また手前味噌ですが、以前このような記事も書きましたので、よかったら参考にしてください。
https://qiita.com/tatsuya6502/items/bed3702517b36afbdbca
コメント追加 |
Arc
で包んだデータは不変の参照としてしかアクセスできません。データを可変にするには、Arc
で包む前に内部可変性を提供するコンテナで包んでおく必要があります。複数スレッドからのアクセスに対応しているのはRwLock
やMutex
などです。RwLock
を使うと以下のようになります。
use std::sync::{Arc, RwLock};
use std::vec::Vec;
use std::{thread, time};
fn main() {
let arc = Arc::new(RwLock::new(Vec::new())); // Arc<RwLock<Vec<i32>>>型
let arc2 = Arc::clone(&arc);
thread::spawn(move || {
for x in 1..=10 {
if let Ok(mut v) = arc2.write() {
v.push(x);
}
}
});
thread::sleep(time::Duration::from_secs(3));
if let Ok(v) = arc.read() {
v.iter().for_each(|n| println!("{:?}", n));
};
}
内部可変性についてはこちらのドキュメントが参考になると思います。
https://doc.rust-jp.rs/book/second-edition/ch15-05-interior-mutability.html
また手前味噌ですが、以前このような記事も書きましたので、よかったら参考にしてください。
https://qiita.com/tatsuya6502/items/bed3702517b36afbdbca
コメント追加 |
Arc
で包んだデータは不変の参照としてしかアクセスできません。データを可変にするには、Arc
で包む前に内部可変性を提供するコンテナで包んでおく必要があります。複数スレッドからのアクセスに対応しているのはRwLock
やMutex
などです。RwLock
を使うと以下のようになります。
use std::sync::{Arc, RwLock};
use std::vec::Vec;
use std::{thread, time};
fn main() {
let arc = Arc::new(RwLock::new(Vec::new())); // Arc<RwLock<Vec<i32>>>型
let arc2 = Arc::clone(&arc);
thread::spawn(move || {
for x in 1..=10 {
if let Ok(mut v) = arc2.write() {
v.push(x);
}
}
});
thread::sleep(time::Duration::from_secs(3));
if let Ok(v) = arc.read() {
v.iter().for_each(|n| println!("{:?}", n));
};
}
内部可変性についてはこちらのドキュメントが参考になると思います。
https://doc.rust-jp.rs/book/second-edition/ch15-05-interior-mutability.html
また手前味噌ですが、以前このような記事も書きましたので、よかったら参考にしてください。
https://qiita.com/tatsuya6502/items/bed3702517b36afbdbca
Arc
で包んだデータは不変の参照としてしかアクセスできません。データを可変にするには、Arc
で包む前に内部可変性を提供するコンテナで包んでおく必要があります。複数スレッドからのアクセスに対応しているのはRwLock
やMutex
などです。RwLock
を使うと以下のようになります。
use std::sync::{Arc, RwLock};
use std::vec::Vec;
use std::{thread, time};
fn main() {
let arc = Arc::new(RwLock::new(Vec::new())); // Arc<RwLock<Vec<i32>>>型
let arc2 = Arc::clone(&arc);
thread::spawn(move || {
for x in 1..=10 {
if let Ok(mut v) = arc2.write() {
v.push(x);
}
}
});
thread::sleep(time::Duration::from_secs(3));
if let Ok(v) = arc.read() {
v.iter().for_each(|n| println!("{:?}", n));
};
}
内部可変性についてはこちらのドキュメントが参考になると思います。
https://doc.rust-jp.rs/book/second-edition/ch15-05-interior-mutability.html
また手前味噌ですが、以前このような記事も書きましたので、よかったら参考にしてください。
https://qiita.com/tatsuya6502/items/bed3702517b36afbdbca
回答日時: 16時間前
Tatsuya KawanoTatsuya Kawano
47625
47625
コメント追加 |
コメント追加 |
スタック・オーバーフローを参加してくれて、ありがとうございます!
- 質問の回答を共有してください。回答を説明し、自分の検討結果も共有してください。
しかし、次の項目を 避けてください …
- サポートの要求、更なる説明、ほかの回答への返事。
- 意見を述べること(意見を述べるなら、参照リソース、自分の経験で意見をサポートしてください)
さらにサポートが必要な場合 このヘルプを参考してください。
登録またはログイン
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Google を使用して登録
Facebook を使用して登録
メールアドレスとパスワードで登録
ゲストとして投稿
Required, but never shown
StackExchange.ready(
function () {
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fja.stackoverflow.com%2fquestions%2f53168%2farc%25e3%2581%25a8vec%25e3%2581%25aemutable%25e3%2582%25a8%25e3%2583%25a9%25e3%2583%25bccannot-borrow-as-mutable%25e3%2581%25ab%25e3%2581%25a4%25e3%2581%2584%25e3%2581%25a6%23new-answer', 'question_page');
}
);
ゲストとして投稿
Required, but never shown
登録またはログイン
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Google を使用して登録
Facebook を使用して登録
メールアドレスとパスワードで登録
ゲストとして投稿
Required, but never shown
登録またはログイン
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Google を使用して登録
Facebook を使用して登録
メールアドレスとパスワードで登録
ゲストとして投稿
Required, but never shown
登録またはログイン
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Google を使用して登録
Facebook を使用して登録
メールアドレスとパスワードで登録
Google を使用して登録
Facebook を使用して登録
メールアドレスとパスワードで登録
ゲストとして投稿
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown