在Rust 书的第 13 章中,您实现了一个Cacher用于延迟初始化的结构,以演示闭包和函数式编程的使用。作为一种练习,他们鼓励读者尝试创建一个Cacher可以存储多个值的泛型。为此,他们建议使用Hashmap.
尝试修改 Cacher 以保存哈希映射而不是单个值。哈希映射的键将是传入的 arg 值,哈希映射的值将是对该键调用闭包的结果。value 函数不会直接查看 self.value 是否具有 Some 或 None 值,而是在哈希映射中查找 arg 并返回该值(如果存在)。如果它不存在,缓存器将调用闭包并将结果值保存在与其参数值关联的哈希映射中。
当前 Cacher 实现的第二个问题是它只接受采用 u32 类型参数并返回 u32 的闭包。例如,我们可能想要缓存采用字符串切片并返回 usize 值的闭包的结果。要解决此问题,请尝试引入更多通用参数以提高缓存器功能的灵活性。
为了解决这个练习,我使用了以下代码:
struct Cacher<T, K, V>
where T: Fn(K) -> V
{
calculation: T,
values: HashMap<K, V>,
}
impl<T, K, V> Cacher<T, K, V>
where T: Fn(K) -> V,
K: std::cmp::Eq + std::hash::Hash + Clone,
{
fn new(calculation: T) -> Cacher<T, K, V> {
Cacher { …Run Code Online (Sandbox Code Playgroud) 我有一个基类,其中包含一个已实现的函数和一个共享名称但不共享参数的纯虚函数。我无法从派生类的实例调用在基类中实现的函数。
我已经尝试将函数添加到派生类而不是基类并且它可以工作,但这意味着我必须将函数添加到每个派生类而不是在基类中实现一次。我也尝试过更改函数名称并且它有效。似乎是由于两个重载函数之间发生了冲突。
template <typename T>
class Base {
public:
virtual T some_function(int x) = 0;
T some_function() {
// some code
}
}
class Derived final: public Base<int> {
int some_function() {
// some code
}
}
int main() {
Derived var = Derived();
var.some_function(3);// Compilation error
}
Run Code Online (Sandbox Code Playgroud)
上面的代码没有编译,表明它没有找到函数:some_function(int)。