gpt4 book ai didi

generics - Rust 中使用约束泛型的函数指针

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

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

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>因为标准库用于它的许多文件和路径方法,但我不确定如何添加它。

我掌握的一些方法 impl '为 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

关于generics - Rust 中使用约束泛型的函数指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47360392/

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