ChaosBot avatar

【Rust每日新闻】 2018-11-09

blackanger

Published: 10 Nov 2018 › Updated: 10 Nov 2018【Rust每日新闻】 2018-11-09

【Rust每日新闻】 2018-11-09

Rust 1.30.1 发布

修补了一些bug

Read More


「录播视频」11-07晚上杭州秘猿Rust开发分享会

秘猿计划每个月的Dev Meetup第一场都会开设Rust专题

B站视频前面几分钟无声音,后面有了

B站

油管视频声音比较完整


Tide 中间件

#tide #middleware

Tide 初始版本已经开始动工,大约1000行代码实现了一个基本的框架雏形。目前还存在很多问题,不过「骨架」已经到位了,剩下的就是社区的努力一起为其填充「血肉」。

在这个初始版本里,加入了一个简单的中间件设计和计算值。

一、中间件

中间件的设计直接来自于actix-web :

pub trait Middleware<Data>: Send + Sync {
    /// Asynchronously transform the incoming request, or abort further handling by immediately
    /// returning a response.
    // 对进入的请求做点啥
    fn request(
        &self,
        data: &mut Data,
        req: Request,
        params: &RouteMatch<'_>,
    ) -> FutureObj<'static, Result<Request, Response>>;

    /// Asynchronously transform the outgoing response.
    // 对响应再做点啥
    fn response(
        &self,
        data: &mut Data,
        head: &Head,
        resp: Response,
    ) -> FutureObj<'static, Response>;
}

当然,具体的trait方法和actix-web略有不同(tide里用request替代了actix-web的start),但基本的思想是一致的。 详细可参考actix-web中间件的文档.

在未来FutureObj将会换成Box<Future>,这样可以避免复杂的类型跟踪,虽然可能有性能开销,但预计成本会极低,这个已经在actix-web中得到了证明。

虽然受actix-web极大的启发,但目前没有加入finish方法,原因是目前基于hyper当前的API很难实现finish(在响应结束后调用该方法)。目前团队还在想办法。

中间件写好以后,可以通过以下方式方便加到应用中:

impl<Data> App<Data> {
    pub fn middleware(&mut self, middleware: impl Middleware<Data> + 'static) -> &mut Self { ... }
}

之后还会支持更细粒度的中间件应用,比如,仅将其应用于特定的子路由。

二、计算值

计算值(Computed values) 就像一个算术公式一样去从现有的状态或其他值去计算出需要的值。虽然中间件很灵活,但对于某些情况来说,比较重。Tide的一个新的概念就是计算值。这些值是可以根据请求生成的值。例如,经常要根据URL的query部分生成组件,在endpoint或其他中间件中可能使用该组件。可以通过计算值来处理这种解析,而非实现中间件。

/// A value that can be computed on-demand from a request.
trait Compute: 'static + Sync + Send + Clone + Sized {
    /// Compute the value directly from the given request.
    // 直接从给定请求中计算值
    fn compute_fresh(req: &mut Request) -> Self;

    /// Compute the value, or return a copy if it has already been computed for this request.
    fn compute(req: &mut Request) -> Self { ... }
}

简单的示例:

struct ParsedQuery { .. }

impl Compute for ParsedQuery { .. }
// Computed专用于endpoint来获取计算值
async fn my_endpoint(query: Computed<ParsedQuery>) { ... }

tide

actix-web中间件

Read More


Rust实现可选参数

#optional_args

本文记录了作者使用Rust实现可选参数的一步步思路,也是对Rust设计API的思考。

P.S 这还是一个PingCAP隐藏的招聘贴呢。

Read More


「Job」来自丹麦的召唤:Rust全栈工程师

#job #remote

丹麦的一家正规公司:impero,目前正在招募Rust全栈工程师。可远程。

Read More

vulkano 0.11 发布

#Vulkan

vulkano是对Vulkan API的安全包装

vulkano

Read More

「讨论」Rust解析浮点数很慢

作者在移植一个高性能C++库,用于在字符串和数字之间进行转换。发现Rust解析浮点数的性能很慢。

解析32位浮点数比解析64位整数慢约100倍,比解析32位整数慢约150倍。更为明显的是,解析64位浮点数比解析64位整数慢约450倍,比解析32位整数慢约650倍。

感兴趣可以看看讨论。

Read More


每日新闻订阅地址:

欢迎通过GitHub issues投稿。

Leave 【Rust每日新闻】 2018-11-09 to:

Written by

Read more #rust posts


Best Posts From ChaosBot

We have not curated any of blackanger's posts yet. But you can encourage our curation team to review posts by visiting them regularly and by referring other readers. Because we give priority to frequently read content.

More Posts From ChaosBot