gpt4 book ai didi

rust - 如何返回特征的实例?

转载 作者:行者123 更新时间:2023-11-29 08:34:41 25 4
gpt4 key购买 nike

我正在研究 a SQL migration tool .现在我只支持 Postgresql,但我想添加 Mysql 等。

我有驱动程序需要实现的以下特性:

pub trait Driver {
fn ensure_migration_table_exists(&self);
fn remove_migration_table(&self);
fn get_current_number(&self) -> i32;
fn set_current_number(&self, number: i32);
fn migrate(&self, migration: String, number: i32) -> MigrateResult<()>;
}

我想做一个函数get_driver这将具有以下概念定义 fn get_driver(url: &str) -> MigrateResult<Driver> .

根据一个月前在 IRC 上的讨论,这显然是不可能的。我之前的最佳猜测是这样失败的:

fn get_driver<T: Driver + Sized>(url: &str) -> MigrateResult<T>

expected `core::result::Result<T, errors::MigrateError>`,
found `core::result::Result<drivers::pg::Postgres, errors::MigrateError>`

(预期类型参数, 找到结构 drivers::pg::Postgres ) [E0308]

有什么办法可以解决这个问题吗?

full code is available .

最佳答案

在这个函数中:

fn get_driver<T: Driver + Sized>(url: &str) -> MigrateResult<T>

T是一个类型参数。它由函数的调用者选择。

看起来您想根据 url 的值返回不同的类型.但是 Rust 是静态类型的:代码中任何一点的任何表达式的类型都需要在编译时知道。 (即使泛型在使用时也会专门针对具体类型。)处理这个问题的方法是使用特征对象:

例如,在:

fn get_driver(url: &str) -> MigrateResult<Box<Driver>>

Box<Driver>是一个胖指针,由指向值的指针和指向实现 Driver 的具体类型的虚拟调用表 的指针组成特征。该 vtable 包含指向特征的每个方法的代码的指针。

阅读更多信息 http://doc.rust-lang.org/book/trait-objects.html

关于rust - 如何返回特征的实例?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34708584/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com