我偶然发现了一些奇怪的行为,我还不能理解. 我有以下功能:

pub fn complete(self) {
    let last_value: Option<BasicValueEnum<'ctx>> = self.last_value.into_inner();
    // self.builder.build_return(last_value.as_ref()); // <- does not work

    match last_value {
        Some(value) => {
            self.builder.build_return(Some(&value)); // <- works
        },
        None => { self.builder.build_return(None); },
    }

    self.function.verify(true);
}

其中,self.builder.build_return具有以下签名:

pub fn build_return(&self, value: Option<&dyn BasicValue<'ctx>>) -> InstructionValue<'ctx>

现在,构建器来自一个图书馆,所以我不知道太多细节,但单从签名来看,这种行为对我来说很奇怪.Option.as_ref()不应该返回Option<&T>吗?在我的例子中,它应该与我的Match表达式所做的相同.

我有一种强烈的感觉,我错过了一些概念,而不是我遇到了一些错误.

如果它有帮助,建造者来自墨水井图书馆.

推荐答案

使用工作代码,编译器发现&value必须是&dyn BasicValue<'ctx>类型,并且可以强制它.

但是具有签名fn(&self) -> Option<&T>Option::as_ref不可能有coercion,因为它总是将&Option<T>转换成Option<&T>,因此类型是不同的, 一个是Option<&BasicValueEnum<'ctx>>,另一个是Option<&dyn BasicValue<'ctx>>.

要使其与as_ref一起工作,您可以手动将具体引用转换为对特征对象的引用:

self.builder.build_return(last_value.as_ref().map(|x| x as _));

其中,_可以由编译器导出为&dyn BasicValue<'ctx>

Rust相关问答推荐

在一个tauri协议处理程序中调用一个rectuc函数的推荐技术是什么?

从Rust调用C++虚拟方法即使在成功执行之后也会引发Access违规错误

在Rust中,有没有一种方法让我定义两个 struct ,其中两个都遵循标准 struct ?

为什么我不能从带有字符串的 struct 的引用迭代器中收集VEC<;&;str&>?

在析构赋值中使用一些现有绑定

告诉Rust编译器返回值不包含构造函数中提供的引用

程序在频道RX上挂起

为什么 vec![Vec::with_capacity(n)] 为子向量创建 0 容量?

如何将一个矩阵的列分配给另一个矩阵,纳尔代数?

如何迭代存储在 struct 中的字符串向量而不移动它们?

通过写入 std::io::stdout() 输出不可见

Rust ECDH 不会产生与 NodeJS/Javascript 和 C 实现相同的共享密钥

在没有任何同步的情况下以非原子方式更新由宽松原子操作 Select 的值是否安全?

Rust 为什么被视为borrow ?

没有得到无法返回引用局部变量`queues`的值返回引用当前函数拥有的数据的值的重复逻辑

强制特征仅在 Rust 中的给定类型大小上实现

Cargo:如何将整个目录或文件包含在功能标志中?

Rust:如果我知道只有一个实例,那么将可变borrow 转换为指针并返回(以安抚borrow 判断器)是否安全?

如何将 while 循环内的用户输入添加到 Rust 中的向量?

在传输不可复制的值时实现就地枚举修改