t_wの輪郭

Feedlyでフォローするボタン
Rust

Box

2022/2/24 7:17:00
rustc –explain E0782rustc –explain E0782 日本語訳Box<dyn Foo>Boxがスマートポインタなのは、Derefトレイトを実装しているからBox<Error>あれあれBoxはポインタボックスで再帰的な型を可能にするあれ

あれ

2022/3/2 20:20:00
fn hello(text:&str) {
    println!("Hello, {}!", &text);
}
let m = Box::new(String::from("Rust"));
hello(&m);    //Hello, Rust!

あれ

2022/3/2 20:05:00
let x=5;
let y=Box::new(x);

assert_eq!(5, x);
assert_eq!(5, *y);
//assert_eq!(5, y); //can't compare `{integer}` with `Box<{integer}>`

あれ

2022/3/2 19:38:00

Boxに値を入れると、スタックではなくヒープにデータを格納することができる

特質オブジェクトdyn キーワードを含んでいなければなりません。

誤ったコード例

trait Foo {}
fn test(arg: Box<Foo>) {}. // エラー!

特質オブジェクトは、実行するまでわからないが、ある特質に適合する型のメソッドを呼び出すための方法です。

特質オブジェクトBox<dyn Foo> で形成されるべきですが、上のコードでは dyn が省略されています。

このため、arg が単にヒープに確保された Foo という型ではなく、特質オブジェクトであることがわかりにくくなっています。

この問題を解決するには、特質名の前に dyn を追加します。

trait Foo {}
fn test(arg: Box<dyn Foo>){}。// ok!

2021版以前は許可されていましたが、現在はエラーとなります。

rustc –explain E0782

2022/2/24 7:52:00

Trait objects must include the dyn keyword.

Erroneous code example:

trait Foo {}
fn test(arg: Box<Foo>) {} // error!

Trait objects are a way to call methods on types that are not known until runtime but conform to some trait.

Trait objects should be formed with Box<dyn Foo>, but in the code above dyn is left off.

This makes it harder to see that arg is a trait object and not a simply a heap allocated type called Foo.

To fix this issue, add dyn before the trait name.

trait Foo {}
fn test(arg: Box<dyn Foo>) {} // ok!

This used to be allowed before edition 2021, but is now an error.