Fn 类型未实现 Size

2024-03-13

我想构建一个将列表分成两部分的函数:一个列表包含原始列表中满足特定谓词的元素,另一个列表包含所有不满足特定谓词的元素。以下是我的尝试:

fn split_filter<T: Clone + Sized>(a: &Vec<T>, f: Fn(&T) -> bool) -> (Vec<T>, Vec<T>) {
    let i: Vec<T> = vec![];
    let e: Vec<T> = vec![];
    for u in a.iter().cloned() {
        if f(&u) {
            i.push(u)
        } else {
            e.push(u)
        }
    }

    return (i, e);
}

fn main() {
    let v = vec![10, 40, 30, 20, 60, 50];
    println!("{:?}", split_filter(&v, |&a| a % 3 == 0));
}

但是,我收到两个错误:

error[E0277]: the trait bound `for<'r> std::ops::Fn(&'r T) -> bool + 'static: std::marker::Sized` is not satisfied
 --> src/main.rs:1:47
  |
1 | fn split_filter<T: Clone + Sized>(a: &Vec<T>, f: Fn(&T) -> bool) -> (Vec<T>, Vec<T>) {
  |                                               ^ `for<'r> std::ops::Fn(&'r T) -> bool + 'static` does not have a constant size known at compile-time
  |
  = help: the trait `std::marker::Sized` is not implemented for `for<'r> std::ops::Fn(&'r T) -> bool + 'static`
  = note: all local variables must have a statically known size

error[E0308]: mismatched types
  --> src/main.rs:17:39
   |
17 |     println!("{:?}", split_filter(&v, |&a| a % 3 == 0));
   |                                       ^^^^^^^^^^^^^^^ expected trait std::ops::Fn, found closure
   |
   = note: expected type `for<'r> std::ops::Fn(&'r {integer}) -> bool + 'static`
              found type `[closure@src/main.rs:17:39: 17:54]`

第二个错误似乎暗示闭包不是Fn。我尝试使用语法f: |&T| -> bool我在网上找到了它,但这似乎在最新版本的 Rust 中不起作用。

至于第一个错误,我本来希望使T Sized将使该函数具有已知的大小,但显然它没有。


你应该阅读 Rust 官方书籍,尤其是关于闭包的章节 https://doc.rust-lang.org/stable/book/second-edition/ch13-01-closures.html。您的函数声明不正确;你指定的是f有一个纯粹的特质类型,这是不可能的;这正是错误所在Sized是关于。您应该改用泛型类型参数:

fn split_filter<T: Clone, F>(a: &[T], f: F) -> (Vec<T>, Vec<T>)
where
    F: for<'a> Fn(&'a T) -> bool,

我也改变了类型a from &Vec<T> to &[T];在任何情况下,您都不会更喜欢前者而不是后者。&Vec<T>自动强制&[T]必要时。看

第二个错误与函数声明中的错误密切相关;你的原始函数声明指定了一个裸特征类型,但闭包没有这种类型,它们只是实现了函数特征。

最终程序如下所示:

fn split_filter<T: Clone, F>(a: &[T], f: F) -> (Vec<T>, Vec<T>)
where
    F: Fn(&T) -> bool,
{
    let mut i: Vec<T> = vec![];
    let mut e: Vec<T> = vec![];
    for u in a.iter().cloned() {
        if f(&u) {
            i.push(u);
        } else {
            e.push(u);
        }
    }

    return (i, e);
}

fn main() {
    let v = vec![10, 40, 30, 20, 60, 50];
    println!("{:?}", split_filter(&v, |&a| a % 3 == 0));
}

尝试一下.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Fn 类型未实现 Size 的相关文章

随机推荐

  • 如何保存和使用应用程序的窗口大小?

    使用 NET 4 在关闭时保存应用程序的窗口大小和位置并在下次运行时使用这些值启动应用程序的窗口的最佳方法是什么 我不想接触任何类型的注册表 但不知道是否有某种 app config 类似于 ASP NET 应用程序的 web config
  • 获得使用 FTP-WinSCP 处理我的 Amazon EC2 Ubuntu 服务器上的文件的权限

    我在 Amazon 上有一个 Ubuntu 服务器 我安装了使用它的所有内容 php mysql phpmyadmin apache 问题是我无法使用 FTP 移动或编辑文件 我收到错误消息 Permission denied Error
  • 如何在Backbone.js中使用groupBy对集合进行分组?

    示例集合 仅显示模型 name Bob date Thu Mar 29 2012 name James date Fri Mar 30 2012 name Dylan date Fri Mar 30 2012 name Stanley da
  • D3 鼠标事件——单击和拖动结束

    在 D3 中 如果您定义了这样的拖动函数 var drag d3 behavior drag on drag function alert drag on dragend function alert dragEnd 您确实不能执行以下操作
  • 如何在Android中的地图视图中获取3D建筑视图?

    我使用了地图设置 googleMap setBuildingsEnabled true 但这不起作用 大约一个月前 它运行良好 附上屏幕截图以供参考 这是我一个月前得到的观点 现在地图显示 2D 视图 None
  • 在 Android TV 模拟器上运行时缺少 MainActivity 错误

    我创建了一个示例 Android TV 应用程序用于测试目的 我按照以下文档进行操作 https developer android com training tv start start https developer android c
  • Netbeans + 德比 + 休眠

    我正在跟进http netbeans org kb docs java hibernate java se html http netbeans org kb docs java hibernate java se html学习在 Netb
  • 一次从目录导入所有模块 [NODE]

    MyApp main js modules a js b js c js d js e js 在我的 NodeJS 应用程序中 如何一次性导入 main js 文件中的所有自定义模块 a b c d e 我有一长串模块 我不想单独导入它们
  • JAX-WS 从 jar 加载 WSDL

    我正在编写一个胖客户端 它使用 SOAP 服务来实现某些功能 错误报告等 我的 JAX WS 工作正常 但默认情况下 至少在 netbeans 中 它会在每次初始化服务时从远程服务器获取 WSDL 我希望这有助于提供一些版本控制支持等 但这
  • SQL Select 语句中的动态列,保留“未定义”值

    这是基于我之前的问题的一个新问题 该问题被标记为问题的 重复 mySQL 使用三个表中的数据和列创建新表 https stackoverflow com questions 26665499 mysql create a new table
  • 使用 React 定期运行 fetch

    我有一个包含不同反应组件的网格 所有组件都是独立的 因为它们获取自己的数据并显示它 我想以某种方式让它们每 15 分钟自动重新获取和更新一次 我的第一个想法是 HOC 但是随着更新的钩子和功能组件的出现 我尝试了一些使用钩子的东西 所以我已
  • 何时抑制 PHP 中的错误

    我有一些可能已定义或未定义的变量 isLoggedIn布尔值 我正在尝试清除错误消息 我想知道是否有任何理由不应该使用错误抑制运算符 if isLoggedIn 或者我是否应该首先检查变量是否存在 if isset isLoggedIn a
  • javafx.scene.control.TableColumn 无法转换为 javafx.scene.control.TableColumn$CellDataFeatures

    我在填充 javafx tableview 时遇到问题 我目前正在开发一个基于 GUI 的事件管理工具 适用于大学 并且我一直在尝试填充 Tableview 列表 该列表应该位于边框窗格布局的中心 这是我的代码 它很长的想法 它的主窗口函数
  • C 中正弦函数的实现不起作用

    我尝试用 C 语言实现正弦函数 但得到了奇怪的结果 以下是我用来计算正弦的三个函数 define PI 3 14159265358979323846 define DEPTH 16 double sine long double long
  • 不支持混合类型

    请看一下下面的头文件 pragma once using namespace UsbLibrary ref class MissileLauncher public MissileLauncher void private Bytes us
  • 缩小名称和变量名称

    我知道缩小负责删除 空白字符 换行符 注释 有时还有块分隔符 不久前我读到它还负责缩短变量名称 但我一直认为这是混淆的一部分 我对吗 或者现在缩小库也包含这样的功能 好吧 由于缩小的目标是尽可能减少代码的大小 因此重命名变量是实现这一目标的
  • Angular CDK的OverlayModule,cdk-overlay-pane不会将位置设置为绝对?

    我正在使用 Angular 的 CDK 的 Overlay 模块 我只是找不到将position absolute添加到覆盖层的方法 该模块将收到一个top and a left与连接元素位置匹配的位置 但覆盖层不会接收到position
  • Pandas _metadata的DataFrame持久化错误

    我终于弄清楚如何使用 DataFrame 中的 metadata 一切正常 除了我无法将其持久化 例如 hdf5 或 json 我知道它有效 因为我复制框架 而 metadata 属性复制到 非 metadata 属性则不然 example
  • CakePHP-cakeDC搜索插件实现

    我目前正在尝试找出一种在我的应用程序中实现 cakeDC 搜索插件的方法 但我发现很难理解在我可以让它在我的应用程序中 很好地 工作之前需要完成的管道工作 需要考虑的事项 搜索必须是 实时搜索 检索到的记录需要分页 搜索将使用选定的条件 i
  • Fn 类型未实现 Size

    我想构建一个将列表分成两部分的函数 一个列表包含原始列表中满足特定谓词的元素 另一个列表包含所有不满足特定谓词的元素 以下是我的尝试 fn split filter