< 返回版块

damody 发表于 2019-08-09 21:20

Tags:rust

Tokio v0.2.0-alpha.1; 現在有 async & await.

現在一個簡單的 echo server可以寫成這樣

#![feature(async_await)]

use tokio::net::TcpListener;
use tokio::prelude::*;

#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
    let addr = "127.0.0.1:8080".parse()?;
    let mut listener = TcpListener::bind(&addr)?;

    loop {
        let (mut socket, _) = listener.accept().await?;

        tokio::spawn(async move {
            let mut buf = [0; 1024];

            // In a loop, read data from the socket and write the data back.
            loop {
                let n = match socket.read(&mut buf).await {
                    // socket closed
                    Ok(n) if n == 0 => return,
                    Ok(n) => n,
                    Err(e) => {
                        println!("failed to read from socket; err = {:?}", e);
                        return;
                    }
                };

                // Write the data back
                if let Err(e) = socket.write_all(&buf[0..n]).await {
                    println!("failed to write to socket; err = {:?}", e);
                    return;
                }
            }
        });
    }
}

到目前為止,感謝社區的回饋與rust團隊對rust語言的維護,也感謝tokio有專業的團隊在維護。

read more

我學習rust的前三個月

作者是c++ 老手,看到了一些rust的傳聞很感興趣,所以來試著用用看。

一開始的感覺還不錯,所有權解決了很多在C++會遇到的問題,

這並不是免費的午餐,他依賴更複雜的語法限制,且你不能把其它語言的常識套用在rust。

但這樣也沒什麼不好,rust寫出來的程式很難會有難聞的代碼味,你可以很放心的維護你的程式。

rust相較於c++,需要你顯式宣告各種語法,你的程式語意明確不會被誤解。

作者覺得rust生態還不夠完整,直接使用的風險還過高,

但這個問題正在逐步被改善,像微軟、亞馬遜、臉書等公司都在使用,

相信rust的未來是很光明的。

read more

Await 一下,何必要這麼麻煩呢?

這篇文章講解了從純future轉換到 async/await之後,

程式碼的閱讀性會有顯著的提高,也更容易寫出非同步的程式。

使用future

fn handle_get_counters(
    &self,
    p: &mut P::Deserializer,
) -> impl Future<Item = ProtocolEncodedFinal<P>, Error = Error> + Send + 'static {
    let ret: Result<_, Error> = (|| {
        let args = {};
        Ok(self.service.get_counters(args))
    })(); 
    let ret = ret.map(|res| { 
        res.then(move |res| {
            res.and_then(move |res| write_message(
                p, "getCounters", MessageType::Reply, |p| res.write(p),
            ))
        })
    }); 
    ret.into_future().flatten()
}

async/await

async fn handle_get_counters(
    &self,
    p: &mut P::Deserializer,
) -> Result<ProtocolEncodedFinal<P>, Error> {
    let args = {};
    let res = self.service.get_counters(args).await?;
    let enc = write_message(p, "getCounters", MessageType::Reply, |p| res.write(p))?;
    Ok(enc)
}

相信大家都跟我一樣迫不及待想要趕快使用rust 1.38版!

read more

Project Servo 使用過去繼有的技術拯救未來的自己

裡面提到了 rust 目前所擁有的語言特性大部份是參考過去程式語言的解法

只是更優雅的整合在了一起,這是其它語言所沒有的。

read more

gfx-hal-0.3 來了

現在所有的型別都實作 Debug

MSAA 反鋸齒做好了

事件API

對3D圖形底層api有興趣的可以看看。

read more


From 日报小组 @Damody

日报订阅地址:

独立日报订阅地址:

社区学习交流平台订阅:

评论区

写评论

还没有评论

1 共 0 条评论, 1 页