質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
87.20%
DI (Dependence Injection)

DI (Dependence Injection)は、「依存性の注入」という概念を指します。オブジェクト間で依存性のあるコードを外部の設定ファイルから注入するソフトウェアパターン設計思想です。

Rust

Rustは、MoFoが支援するプログラミング言語。高速性を維持しつつも、メモリ管理を安全に行うことが可能な言語です。同じコンパイル言語であるC言語やC++では困難だったマルチスレッドを実装しやすく、並行性という点においても優れています。

解決済

【Rust】shakuクレートを使いDIコンテナーを導入したいが、Mutexをつけるとエラーが出るので解決したい

akira_kano1101
akira_kano1101

総合スコア16

DI (Dependence Injection)

DI (Dependence Injection)は、「依存性の注入」という概念を指します。オブジェクト間で依存性のあるコードを外部の設定ファイルから注入するソフトウェアパターン設計思想です。

Rust

Rustは、MoFoが支援するプログラミング言語。高速性を維持しつつも、メモリ管理を安全に行うことが可能な言語です。同じコンパイル言語であるC言語やC++では困難だったマルチスレッドを実装しやすく、並行性という点においても優れています。

1回答

0リアクション

1クリップ

498閲覧

投稿2022/04/29 06:03

編集2022/04/29 06:10

shakuクレートでMutexが付けられない

こんにちは。Rustでソフトウェア開発をしています。

DIコンテナーを導入して簡単にコンポーネントの依存関係を解決したいと思い、調べているとshakuというクレートを見つけました。

サンプルコードを実行してみると問題なく動きました。
このArcに直接dyn Logger入れると動作するのを確認できたのですが、実用的ではないと感じます。

なぜならArcMutexと併せて使うのが一般的で、オブジェクトを可変にできるようにしないと値が固定され変数として意味を成さないからです。

そこでMutexArcに付与してMutex<dyn Logger>を入れるようにして実行してみました。

該当のコード

rust

use shaku::{module, Component, HasComponent, Interface}; use std::sync::{Arc, Mutex}; trait Logger: Interface { fn log(&self, content: &str); } trait DateLogger: Interface { fn log_date(&self); } #[derive(Component)] #[shaku(interface = Logger)] struct LoggerImpl; impl Logger for LoggerImpl { fn log(&self, content: &str) { println!("{}", content); } } #[derive(Component)] #[shaku(interface = DateLogger)] struct DateLoggerImpl { #[shaku(inject)] logger: Arc<Mutex<dyn Logger>>, // => コンパイルエラー #[shaku(default)] today: String, #[shaku(default)] year: usize, } impl DateLogger for DateLoggerImpl { fn log_date(&self) { self.logger .log(&format!("Today is {}, {}", self.today, self.year)); } } module! { MyModule { components = [LoggerImpl, DateLoggerImpl], providers = [] } } fn main() { let module = MyModule::builder() .with_component_parameters::<DateLoggerImpl>(DateLoggerImplParameters { today: "Jan 26".to_string(), year: 2020, }) .build(); let date_logger: &dyn DateLogger = module.resolve_ref(); date_logger.log_date(); }

しかしそうするとエラーが出ます。

このエラーが解決できずに困っています。

試したこと

  • LoggerSizedトレイトをつけてみる
  • Mutex<LoggerImpl>Loggerを実装してみる

しかしエラーが出ます。

もし解決方法をご存知の方がいらっしゃいましたら、恐縮ですが教えて頂けないでしょうか。

どうぞよろしくお願いいたします。

エラーメッセージ抜粋

console

error[E0277]: the size for values of type `(dyn Logger + 'static)` cannot be known at compilation time --> src/main.rs:22:10 | 22 | #[derive(Component)] | ^^^^^^^^^ doesn't have a size known at compile-time | = help: within `Mutex<(dyn Logger + 'static)>`, the trait `Sized` is not implemented for `(dyn Logger + 'static)` = note: required because it appears within the type `Mutex<(dyn Logger + 'static)>` = note: required because of the requirements on the impl of `Interface` for `Mutex<(dyn Logger + 'static)>` note: required by a bound in `HasComponent` --> /Users/a.kano/.cargo/registry/src/github.com-1ecc6299db9ec823/shaku-0.6.1/src/component.rs:71:27 | 71 | pub trait HasComponent<I: Interface + ?Sized>: ModuleInterface { | ^^^^^^^^^ required by this bound in `HasComponent` = note: this error originates in the derive macro `Component` (in Nightly builds, run with -Z macro-backtrace for more info)
error[E0277]: the trait bound `MyModule: HasComponent<Mutex<(dyn Logger + 'static)>>` is not satisfied --> src/main.rs:40:1 | 40 | / module! { 41 | | MyModule { 42 | | components = [LoggerImpl, DateLoggerImpl], 43 | | providers = [] 44 | | } 45 | | } | |_^ the trait `HasComponent<Mutex<(dyn Logger + 'static)>>` is not implemented for `MyModule` | = help: the following implementations were found: <MyModule as HasComponent<(dyn Logger + 'static)>> <MyModule as HasComponent<<DateLoggerImpl as shaku::Component<MyModule>>::Interface>> note: required because of the requirements on the impl of `shaku::Component<MyModule>` for `DateLoggerImpl` --> src/main.rs:22:10 | 22 | #[derive(Component)] | ^^^^^^^^^ 23 | #[shaku(interface = DateLogger)] 24 | struct DateLoggerImpl { | ^^^^^^^^^^^^^^ = note: this error originates in the macro `module` (in Nightly builds, run with -Z macro-backtrace for more info)
error[E0277]: the trait bound `MyModule: HasComponent<Mutex<(dyn Logger + 'static)>>` is not satisfied --> src/main.rs:40:1 | 40 | / module! { 41 | | MyModule { 42 | | components = [LoggerImpl, DateLoggerImpl], 43 | | providers = [] 44 | | } 45 | | } | |_^ the trait `HasComponent<Mutex<(dyn Logger + 'static)>>` is not implemented for `MyModule` | = help: the following implementations were found: <MyModule as HasComponent<(dyn Logger + 'static)>> <MyModule as HasComponent<<DateLoggerImpl as shaku::Component<MyModule>>::Interface>> note: required because of the requirements on the impl of `shaku::Component<MyModule>` for `DateLoggerImpl` --> src/main.rs:22:10 | 22 | #[derive(Component)] | ^^^^^^^^^ 23 | #[shaku(interface = DateLogger)] 24 | struct DateLoggerImpl { | ^^^^^^^^^^^^^^ note: required because it appears within the type `MyModule` --> src/main.rs:41:5 | 41 | MyModule { | ^^^^^^^^ note: required by a bound in `Module` --> /Users/a.kano/.cargo/registry/src/github.com-1ecc6299db9ec823/shaku-0.6.1/src/module/module_traits.rs:36:19 | 36 | pub trait Module: ModuleInterface { | ^^^^^^^^^^^^^^^ required by this bound in `Module` = note: this error originates in the macro `module` (in Nightly builds, run with -Z macro-backtrace for more info)
error[E0277]: the trait bound `MyModule: HasComponent<Mutex<(dyn Logger + 'static)>>` is not satisfied --> src/main.rs:40:1 | 40 | / module! { 41 | | MyModule { 42 | | components = [LoggerImpl, DateLoggerImpl], 43 | | providers = [] 44 | | } 45 | | } | |_^ the trait `HasComponent<Mutex<(dyn Logger + 'static)>>` is not implemented for `MyModule` | = help: the following implementations were found: <MyModule as HasComponent<(dyn Logger + 'static)>> <MyModule as HasComponent<<DateLoggerImpl as shaku::Component<MyModule>>::Interface>> note: required because of the requirements on the impl of `shaku::Component<MyModule>` for `DateLoggerImpl` --> src/main.rs:22:10 | 22 | #[derive(Component)] | ^^^^^^^^^ 23 | #[shaku(interface = DateLogger)] 24 | struct DateLoggerImpl { | ^^^^^^^^^^^^^^ note: required because it appears within the type `MyModule` --> src/main.rs:41:5 | 41 | MyModule { | ^^^^^^^^ note: required by a bound in `HasComponent` --> /Users/a.kano/.cargo/registry/src/github.com-1ecc6299db9ec823/shaku-0.6.1/src/component.rs:71:48 | 71 | pub trait HasComponent<I: Interface + ?Sized>: ModuleInterface { | ^^^^^^^^^^^^^^^ required by this bound in `HasComponent` = note: this error originates in the macro `module` (in Nightly builds, run with -Z macro-backtrace for more info) For more information about this error, try `rustc --explain E0277`. error: could not compile `try_shaku_mutex` due to 4 previous errors Cargo-Process exited abnormally with code 101 at Fri Apr 29 14:44:53

以下のような質問にはリアクションをつけましょう

  • 質問内容が明確
  • 自分も答えを知りたい
  • 質問者以外のユーザにも役立つ

リアクションが多い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

気になる質問をクリップする

クリップした質問は、後からいつでもマイページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

下記のような質問は推奨されていません。

  • 間違っている
  • 質問になっていない投稿
  • スパムや攻撃的な表現を用いた投稿

適切な質問に修正を依頼しましょう。

まだ回答がついていません

会員登録して回答してみよう

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
87.20%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問

同じタグがついた質問を見る

DI (Dependence Injection)

DI (Dependence Injection)は、「依存性の注入」という概念を指します。オブジェクト間で依存性のあるコードを外部の設定ファイルから注入するソフトウェアパターン設計思想です。

Rust

Rustは、MoFoが支援するプログラミング言語。高速性を維持しつつも、メモリ管理を安全に行うことが可能な言語です。同じコンパイル言語であるC言語やC++では困難だったマルチスレッドを実装しやすく、並行性という点においても優れています。