Rust 中使用受限泛型的函数指针

2024-02-24

我正在尝试创建一个如下所示的结构:

struct MediaLibrary<B>
where
    B: Ord,
{
    root_dir: PathBuf,
    item_meta_fn: String,
    self_meta_fn: String,
    media_item_filter: fn(&Path) -> bool,
    media_item_sort_key: fn(&Path) -> B,
}

最后两个字段旨在用作谓词来测试给定路径是否是有效的媒体文件并对路径向量进行排序(使用sort_by_key), 分别。

然而,就目前而言,设计不灵活:两个函数都固定为只接受Path。我希望能够使用P: AsRef<Path>正如 stdlib 用于其许多文件和路径方法一样,但我不确定如何添加它。

我用过的一些方法impl'd for MediaLibrary已经在使用P: AsRef<Path>对于他们的论点,所以我的直觉告诉我会有冲突。


据我所知,你不能拥有一个具有泛型类型的函数指针,我什至不认为 Rust 解析器接受这样的构造。

此外,您不能简单地切换到结构上的额外类型参数,因为结构本身不会使用它们:

struct MediaLibrary<F, P1, K, P2, B>
where
    F: Fn(P1) -> bool,
    P1: AsRef<Path>,
    K: Fn(P2) -> B,
    P2: AsRef<Path>,
    B: Ord,
{
    root_dir: PathBuf,
    item_meta_fn: String,
    self_meta_fn: String,
    media_item_filter: F,
    media_item_sort_key: K,
}
error[E0392]: parameter `P1` is never used
 --> src/main.rs:3:24
  |
3 | struct MediaLibrary<F, P1, K, P2, B>
  |                        ^^ unused type parameter
  |
  = help: consider removing `P1` or using a marker such as `std::marker::PhantomData`

相反,您可以选择仅将约束应用于使用它们的函数:

struct MediaLibrary<F> {
    media_item_filter: F,
}

impl<F> MediaLibrary<F> {
    fn do_filter<P>(&self)
    where
        F: Fn(P) -> bool,
        P: AsRef<Path>,
    {}
}

正如消息所述,您还可以使用PhantomData.

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

Rust 中使用受限泛型的函数指针 的相关文章

随机推荐

  • 将 ArrayList 转换为 JSON - Android

    我有一个数组列表和一个单独的字符串 我想将它们转换为 JSON 格式并期望它低于 json 格式 预期格式 last sync date 2014 06 30 04 47 45 recordset contact group guid y3
  • 在 Rstudio 中使用 gtsummary 计算缺失值的百分比

    我的问题有点类似于这个one https stackoverflow com questions 63640473 calculate percent from total observations in r gtsummarytbl su
  • XSl:Variable - 检查值是否存在的条件

    使用XSLT 1 0 如何检查变量中的值是否存在 我最初从 XML 数据将值分配给变量 然后需要检查它是否存在
  • 查找数组的最大切片 | JavaScript

    我需要找到包含不超过两个不同数字的数组的最大切片 这是我的数组 1 1 1 2 2 2 1 1 2 2 6 2 1 8 我对此的思考过程是找到不重复的数字并在新数组中返回它们的索引 这是我到目前为止所拥有的 function goThrou
  • 在 Python 的 sqlite3 中使用外键

    我正在编写一个通过 python 创建 sqlite3 数据库的程序 我有一个作者表 AuthorID Name 和第二个图书表 BookID Title AuthorID 我创建的这些表如下所示 Authors sqlite3 conne
  • Twitter Bootstrap 3.0 行比窗口宽

    我正在摆弄 Twitter Bootstrap 并注意到我的 row比屏幕长度更宽 这里是example http bootply com 90307 当 bootstrap 3 0 出来时我没有经历过这个 右侧的额外空间来自margin
  • 如何检测WKWebView中的hash变化?

    我有一个使用 javascript 的网站 它使用 Angular 来控制您在网站上看到的内容 所以http somewebsite com page1 http somewebsite com page1显示 当您单击位置更改为的选项卡时
  • 用于计算矩阵指数的 C++ 库

    对于实现矩阵指数计算的库有什么建议吗 Expokit http www maths uq edu au expokit 用 Fortran 编写 但可以嵌入 C 中 它工作得很好 并且包含稀疏矩阵的优化算法
  • 如何检查文件是否包含纯文本?

    我有一个装满文件的文件夹 我想搜索其中的一些字符串 问题是有些文件可能是 zip exe ogg 等 我可以以某种方式检查它是什么类型的文件 所以我只打开并搜索 txt PHP 等文件 我不能依赖文件扩展名 使用Python的mimetyp
  • React Native - Expo:fontFamily“SimpleLineIcons”不是系统字体,尚未通过 Font.loadAsync 加载

    所以我在 Android 设备 模拟器上收到此错误 另一方面 在 iOS 上 它编译得很好 并且simple line icons都可以正确显示 我正在运行最新版本的expo 我的package json name FamScore3 ve
  • Rapidjson 使用 JSON 字符串作为编写器的输入进行漂亮打印

    下列的rapidjson 文档 http rapidjson org md doc sax html Writer我能够以逐个键的方式生成漂亮打印的 JSON 输出 例如 rapidjson StringBuffer s rapidjson
  • 如何使用多个 Google 文件选择器处理回电

    如果我在一页上有多个 Google 云端硬盘文件选择器 我该如何处理回调以确保数据传递到正确的部分 我基本上列出了许多项目 每个项目都有一个链接到文件选择器的选择文件按钮 所有示例都只是将数据传递回同一个位置 但我需要每个请求的数据都不同
  • 无法通过 http 克隆 git 存储库;未找到信息/参考文献

    我正在尝试使 git 存储库可通过 http 进行只读访问 我用老式的方式来做 因为git http backend在我的主机系统上不可用 也就是说 我只是将裸存储库放在 http 可访问的位置 我使用以下命令在主机上成功创建了裸存储库gi
  • java - 如何检查日历实例最初是否是错误的日期

    我有一个 Calendar 实例 通过以下方式从 XSD 日期时间解析javax xml bind DatatypeConverter parseDateTime http docs oracle com javase 7 docs api
  • 防止 Vue.js 在慢速客户端上显示括号[重复]

    这个问题在这里已经有答案了 我刚刚做了我的第一个Vue js应用程序 它太棒了 我遇到的唯一问题与慢速连接上的绑定值有关 例如 在我的template我有这个代码 div div class start time event start t
  • 无法从 jcenter 获取新项目的依赖关系[关闭]

    Closed 这个问题是无法重现或由拼写错误引起 help closed questions 目前不接受答案 我无法通过新项目从 jcenter 获取 kotlin pom 我所做的就是转到 文件 gt 新建项目 并创建一个没有任何活动的新
  • 尝试使用 PowerShell 脚本从 Active Directory 中的所有组中删除用户

    我正在尝试使用 PowerShell 脚本根据用户想要从所有组中删除的用户来接受用户的输入 我的语法错误吗 这是我到目前为止所拥有的 User1 Read Host Prompt Enter the username of the empl
  • 发现正在进行的无限循环?

    有没有办法找出当前执行的代码来找出无限循环 我有使用当前源运行的应用程序 我附有 Visual Studio 调试器 我只需要知道代码当前在哪里 以便我可以进一步调试它 如果您从 Visual Studio 运行它 则可以使用代码页中的 暂
  • Selenium Chromedriver 挂起?

    我有一个长时间运行的 python 应用程序 它将定期 每 30 60 秒 打开一个带有 selenium 和 chrome 驱动程序的网页 运行一些 javascript 并截取屏幕截图 它在 Xvfb 中带有 chrome 的 EC2
  • Rust 中使用受限泛型的函数指针

    我正在尝试创建一个如下所示的结构 struct MediaLibrary b where B Ord root dir PathBuf item meta fn String self meta fn String media item f