【问题标题】:How do I tackle this issue "expected a closure that implements the `Fn` trait, but this closure only implements `FnOnce`"我如何解决这个问题“期望一个实现 `Fn` 特性的闭包,但这个闭包只实现了 `FnOnce`\"
【发布时间】:2023-01-14 09:15:40
【问题描述】:

我正在尝试使用 Governor crate 限制速率以与 Warp 一起使用。但是,当我尝试使用包裹在闭包的 Arc 部分中的 rate_limiter 实例时,我不断收到“期望闭包实现 Fn 特性,但此闭包仅实现 FnOnce

我尝试在闭包内外克隆 rate_limiter 实例,但它仍然抱怨。有人可以帮我解决这个问题吗?

use crate::rejections::RateLimitFailure;
use dashmap::DashMap;
use governor::{
    clock::{QuantaClock, QuantaInstant},
    middleware::NoOpMiddleware,
    state::InMemoryState,
    Quota, RateLimiter,
};
use nonzero_ext::nonzero;
use std::collections::hash_map::RandomState;
use std::sync::Arc;
use warp::{Filter, Rejection};

const LIMIT: u32 = 50;

#[derive(Debug, Clone)]
pub struct FridayRateLimiter<'a> {
    pub lim: Arc<
        RateLimiter<
            &'a str,
            DashMap<&'a str, InMemoryState, RandomState>,
            QuantaClock,
            NoOpMiddleware<QuantaInstant>,
        >,
    >,
}

impl<'a> FridayRateLimiter<'a> {
    pub fn new() -> Self {
        let lim = Arc::new(RateLimiter::keyed(Quota::per_second(nonzero!(LIMIT))));
        FridayRateLimiter { lim }
    }
}

pub fn with_rate_limiter(
    rate_limiter: FridayRateLimiter,
) -> impl Filter<Extract = (bool,), Error = Rejection> + Clone {
    let addr = warp::header::<String>("HTTP_X_FORWARDED_FOR");
    let rate_limiter = rate_limiter.clone();

    addr.and_then(|ip: String| async move {
        let rate_limiter = rate_limiter.clone();

        if rate_limiter.lim.check_key(&ip.as_str()).is_err() {
            return Err(warp::reject::custom(RateLimitFailure));
        }

        Ok(true)
    })
}

【问题讨论】:

  • 你能发布一个编译器输出吗?

标签: rust rust-warp


【解决方案1】:

来自这里:When does a closure implement Fn, FnMut and FnOnce?

克隆速率限制器里面对于初学者来说,关闭似乎是错误的。

接下来,我不明白为什么您需要拥有任何东西的所有权,所以我会删除 move。你真的只需要一个不变的借用来调用速率限制器上的check_key,不是吗?

这就是实施Fn的条件:不会弄乱其环境的东西,因为它只需要&amp;-访问它。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-01-04
    • 1970-01-01
    • 2015-07-22
    • 2022-09-24
    • 1970-01-01
    • 2020-11-16
    相关资源
    最近更新 更多