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などで繋げて記載した場合のエラーハンドリングについて













1















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










共有|この質問を改善する



























    1















    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










    共有|この質問を改善する

























      1












      1








      1








      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










      共有|この質問を改善する














      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






      共有|この質問を改善する













      共有|この質問を改善する











      共有|この質問を改善する




      共有|この質問を改善する










      質問日時: 16時間前









      tantan

      646




      646






















          1 件の回答
          1






          アクティブ

          古い順




















          2














          Arcで包んだデータは不変の参照としてしかアクセスできません。データを可変にするには、Arcで包む前に内部可変性を提供するコンテナで包んでおく必要があります。複数スレッドからのアクセスに対応しているのはRwLockMutexなどです。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.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






            アクティブ

            古い順











            アクティブ

            古い順








            アクティブ

            古い順











            2














            Arcで包んだデータは不変の参照としてしかアクセスできません。データを可変にするには、Arcで包む前に内部可変性を提供するコンテナで包んでおく必要があります。複数スレッドからのアクセスに対応しているのはRwLockMutexなどです。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






            共有|この回答を改善する




























              2














              Arcで包んだデータは不変の参照としてしかアクセスできません。データを可変にするには、Arcで包む前に内部可変性を提供するコンテナで包んでおく必要があります。複数スレッドからのアクセスに対応しているのはRwLockMutexなどです。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






              共有|この回答を改善する


























                2












                2








                2







                Arcで包んだデータは不変の参照としてしかアクセスできません。データを可変にするには、Arcで包む前に内部可変性を提供するコンテナで包んでおく必要があります。複数スレッドからのアクセスに対応しているのはRwLockMutexなどです。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で包む前に内部可変性を提供するコンテナで包んでおく必要があります。複数スレッドからのアクセスに対応しているのはRwLockMutexなどです。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







                共有|この回答を改善する












                共有|この回答を改善する



                共有|この回答を改善する










                回答日時: 15時間前









                Tatsuya KawanoTatsuya Kawano

                47625




                47625






























                    下書きが保存されました

                    下書きが破棄されました




















































                    スタック・オーバーフローを参加してくれて、ありがとうございます!


                    • 質問の回答を共有してください。回答を説明し、自分の検討結果も共有してください。

                    しかし、次の項目を 避けてください



                    • サポートの要求、更なる説明、ほかの回答への返事。

                    • 意見を述べること(意見を述べるなら、参照リソース、自分の経験で意見をサポートしてください)


                    さらにサポートが必要な場合 このヘルプを参考してください。




                    下書きが保存されました


                    下書きが破棄されました














                    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





















































                    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







                    Popular posts from this blog

                    El tren de la libertad Índice Antecedentes "Porque yo decido" Desarrollo de la...

                    Puerta de Hutt Referencias Enlaces externos Menú de navegación15°58′00″S 5°42′00″O /...

                    Castillo d'Acher Características Menú de navegación