作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
这是一个例子:
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/
我是一名优秀的程序员,十分优秀!