当前位置 : 主页 > 编程语言 > java >

【Rust 日报】2021-07-04 如何在面试中确定 Rust 程序员水平?

来源:互联网 收集:自由互联 发布时间:2022-06-22
如何在面试中确定 Rust 程序员水平? 对于这个问题,张汉东老师在 RustFriday 飞书群线上沙龙第十三期中进行了分享: 视频:RustFriday 飞书群线上沙龙 第十三期 | 【讨论】如何在面试中

如何在面试中确定 Rust 程序员水平?

对于这个问题,张汉东老师在 RustFriday 飞书群线上沙龙第十三期中进行了分享:

  • 视频:RustFriday 飞书群线上沙龙 第十三期 | 【讨论】如何在面试中考察一个人 Rust 水平?_哔哩哔哩_bilibili
  • 博文:​​如何在面试中 确定 Rust 程序员水平?​​

还有一张导图很好地提供了一个结构化的框架:

【Rust 日报】2021-07-04 如何在面试中确定 Rust 程序员水平?_字符编码

Pushgen: 用于处理范围和数据流的推式设计模式

这样使用:

# fn process(x: i32) {}
# let data = [1, 2, 3, 4, 5];

for item in data.iter().filter(|x| *x % 2 == 0).map(|x| x * 3) {
process(item);
}

// 可以写成
use pushgen::{SliceGenerator, GeneratorExt};
# fn process(_x: i32) {}
# let data = [1, 2, 3, 4, 5];
// Assume data is a slice
SliceGenerator::new(&data).filter(|x| *x % 2 == 0).map(|x| x * 3).for_each(process);

GitHub 地址:AndWass/pushgen

这里还有一个对比:transrangers/rust.md at master · joaquintides/transrangers

30 行的 TCP 代理

博客地址:zeke | tcp-proxy

GitHub 地址:ZekeMedley/tcp-proxy: Simple Rust TCP proxy using Tokio

核心代码:

async fn proxy(client: &str, server: &str) -> io::Result<()> {
let listener = TcpListener::bind(client).await?;
loop {
let (eyeball, _) = listener.accept().await?;
let origin = TcpStream::connect(server).await?;

// 将连接分为读写
let (mut eread, mut ewrite) = eyeball.into_split();
let (mut oread, mut owrite) = origin.into_split();

// 生成线程复制
let e2o = tokio::spawn(async move { io::copy(&mut eread, &mut owrite).await });
let o2e = tokio::spawn(async move { io::copy(&mut oread, &mut ewrite).await });

// 如果连接某一端关闭了,则关闭另一端
select! {
_ = e2o => println!("e2o done"),
_ = o2e => println!("o2e done"),

}
}
}

使用:

# 代理 1212 到 1313
$ cargo run -- -e 0.0.0.0:1212 -o 127.0.0.1:1313
# 监听 1313 上的 tcp 连接
$ nc -l 1313
# 建立到 1212 的连接,确认是否转发
$ echo hello | nc 127.0.0.1 1212

是的,又一个 Hands-on,For 2D Game

地址:(2) Hands-On Rust : rust

Ebook:Hands-on Rust: Effective Learning through 2D Game Development and Play by Herbert Wolverson

代码开源,书要钱:)

Yore:根据 OEM 代码页解码 / 编码字符集的 Rust 库

特点:

  • 最小内存使用
  • 支持多种代码页
  • 支持重新定义 ascii (<0x80) 的代码页

来自维基百科的解释:


代码页:字符编码的别名,也称**内码表**,是特定语言的字符集的一张表。

字符编码(英语:Character encoding)、 字集码是把字符集中的字符编码为指定集合中某一对象(例如:比特模式、自然数序列、 8 位组或者电脉冲),以便文本在计算机中存储和通过通信网络的传递。常见的例子包括将拉丁字母表编码成摩斯电码和 ASCII。其中,ASCII 将字母、数字和其它符号 编号,并用 7 比特的二进制来表示这个整数。通常会额外使用一个扩充的比特,以便于以 1 个字节的方式存储。

在计算机科学及相关领域当中,内码指的是 “将信息编码后,透过某种方式存储在特定记忆设备时,设备内部的编码形式”。在不同的系统中,会有不同的内码。在以往的英文系统中,内码为 ASCII。在繁体中文系统中,目前常用的内码为 大五码。在简体中文系统中,内码则为国标码。为了软件开发方便,如国际化与本地化,现在许多系统会使用 Unicode 做为内码,常见的操作系统 Windows、Mac OS X、Linux 皆如此。许多 编程语言也采用 Unicode 为内码,如 Java、Python 3。


简单使用:

use yore::code_pages::{CP857, CP850};

// Vec contains ascii "text"
let bytes = vec![116, 101, 120, 116];

// notice that decoding CP850 can't fail because it is completely defined
assert_eq!(CP850.decode(&bytes), "text");

// encoding
assert_eq!(CP850.encode("text").unwrap(), bytes);

use yore::CodePage;
fn do_something(code_page: &dyn CodePage, bytes: &[u8]) {
println!("{}", code_page.decode(bytes).unwrap());
}

另外两个类似的库:

  • lifthrasiir/rust-encoding: Character encoding support for Rust
  • tats-u/rust-oem-cp: Rust library that handles OEM code pages (e.g. CP{437,737,850}) for single byte character sets

Rust 开发的 NPM 包搜索引擎

非常快速的 NPM 包搜索引擎:fast-npm-search.xyz | NPM packages search



社区学习交流平台订阅:

  • Rustcc 论坛:支持 rss
  • 微信公众号:Rust 语言中文社区


【文章原创作者:华为云代理 http://www.558idc.com/hw.html处的文章,转载请说明出处】
网友评论