尝试使用 Box<_> 应用多态性时出现错误“无法移动值...无法静态确定大小”

car*_*aez 5 rust

我正在将Rust 中的多态性解决方案应用于我的问题。我想使用这个解决方案,Box<_>因为它看起来最直接和简单,但它不起作用。

#[derive(Clone, Copy)]
pub struct NewPost;

#[derive(Clone, Copy)]
pub struct Post;

#[derive(Clone, Copy)]
pub struct PgConnection;

#[derive(Clone, Copy)]
pub struct DBPost;

pub trait DBAdapter {
    fn create(self, post: NewPost) -> Post;
    fn read(self) -> Vec<Post>;
}

impl DBPost {
    // DATABASE classes
    pub fn establish_connection(self) -> PgConnection {
        unimplemented!()
    }
}

impl DBAdapter for DBPost {
    fn create(self, _post: NewPost) -> Post {
        unimplemented!()
    }

    fn read(self) -> Vec<Post> {
        unimplemented!()
    }
}

struct GetPostsCase {
    db: Box<dyn DBAdapter>,
}

impl GetPostsCase {
    pub fn new(db: Box<dyn DBAdapter>) -> GetPostsCase {
        GetPostsCase { db: db }
    }

    pub fn run(&self) -> Vec<Post> {
        let result = self.db.read();
        result
    }
}
Run Code Online (Sandbox Code Playgroud)

错误是:

#[derive(Clone, Copy)]
pub struct NewPost;

#[derive(Clone, Copy)]
pub struct Post;

#[derive(Clone, Copy)]
pub struct PgConnection;

#[derive(Clone, Copy)]
pub struct DBPost;

pub trait DBAdapter {
    fn create(self, post: NewPost) -> Post;
    fn read(self) -> Vec<Post>;
}

impl DBPost {
    // DATABASE classes
    pub fn establish_connection(self) -> PgConnection {
        unimplemented!()
    }
}

impl DBAdapter for DBPost {
    fn create(self, _post: NewPost) -> Post {
        unimplemented!()
    }

    fn read(self) -> Vec<Post> {
        unimplemented!()
    }
}

struct GetPostsCase {
    db: Box<dyn DBAdapter>,
}

impl GetPostsCase {
    pub fn new(db: Box<dyn DBAdapter>) -> GetPostsCase {
        GetPostsCase { db: db }
    }

    pub fn run(&self) -> Vec<Post> {
        let result = self.db.read();
        result
    }
}
Run Code Online (Sandbox Code Playgroud)

Den*_*ret 8

您的read方法采用(未调整大小的)值而不是引用(其大小始终相同)。

您可以通过更改合同来解决问题 DBAdapter

fn read(self) -> Vec<Post> {
Run Code Online (Sandbox Code Playgroud)

fn read(&self) -> Vec<Post> {
//      ^--- added the ampersand
Run Code Online (Sandbox Code Playgroud)

(取决于您可能需要的实现&mut