gpt4 book ai didi

function - 显式转换涉及特定功能项类型的类型

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

这是一个例子:

use std::iter::Filter;
use std::slice::Iter;

fn test(xs: &[i32]) -> Filter<Iter<i32>, fn(&&i32) -> bool> {
fn nothing(_: &&i32) -> bool { false }

let ys = xs.iter().filter(nothing);
ys
}

fn main () {
}

编译失败:

src/main.rs:8:5: 8:7 error: mismatched types:
expected `core::iter::Filter<core::slice::Iter<'_, i32>, fn(&&i32) -> bool>`,
found `core::iter::Filter<core::slice::Iter<'_, i32>, fn(&&i32) -> bool {test1::nothing}>`
(expected fn pointer,
found fn item) [E0308]
src/main.rs:8 ys
^~

这是因为 ys 的推断类型有 type of a specific function item in it .在这种特殊情况下,问题很容易解决:可以在绑定(bind)中显式指定没有函数项的类型,或者完全避免 let

这两个工作:

fn test(xs: &[i32]) -> Filter<Iter<i32>, fn(&&i32) -> bool> {
fn nothing(_: &&i32) -> bool { false }

let ys: Filter<Iter<i32>, fn(&&i32) -> bool> = xs.iter().filter(nothing);
ys
}
fn test(xs: &[i32]) -> Filter<Iter<i32>, fn(&&i32) -> bool> {
fn nothing(_: &&i32) -> bool { false }

xs.iter().filter(nothing)
}

因此,正如引用文献所说,Rust 本身确实能够执行这种强制转换。但是,如果代码更复杂并且我必须手动执行此转换怎么办?我该怎么做?

在这种情况下,as 将不起作用,而 transmute 似乎有点矫枉过正,尽管我相信它可以完成工作。

最佳答案

您实际上可以使用 as 进行转换:

fn test(xs: &[i32]) -> Filter<Iter<i32>, fn(&&i32) -> bool> {
fn nothing(_: &&i32) -> bool { false }

let ys = xs.iter().filter(nothing as fn(&&i32) -> bool);
^~~~~~~~~~~~~~~~~~~~
ys
}

但是你需要使用 as 来改变函数的类型,而不是 Filter 类型,因为 as 不允许改变任意类型.


就我个人而言,我认为强制转换的必要性是一个缺点,并希望类型推断能够改进到它变得不必要的地步。它适用于直接返回的事实是转移注意力,它可能也适用于中间值。

关于function - 显式转换涉及特定功能项类型的类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34787928/

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