< 返回版块

Cupnfish 发表于 2022-10-13 21:43

Async UI:一个Rust UI库,一切皆有可能

这篇博文是为在async Rust方面有一些经验的读者准备的。它假定你知道什么是Future!

什么是Async UI?

Async UI是一个概念验证的Rust UI库,它的后端是Web(HTML/JS)和GTK 4。

很有意思的一个概念,可惜作者是在校学生,现在忙于学习,没有时间继续更新,但是这个概念真的很有意思,之前的macroquad (一个Rust实现的游戏引擎),获取下一帧也是用到了异步,说到底,Rust的异步本身的核心思想就是状态机,而UI也是一个个状态机组合在一起的,两者的碰撞就很有意思。

macroquad的简单事例:

use macroquad::prelude::*;

#[macroquad::main("BasicShapes")]
async fn main() {
    loop {
        clear_background(RED);

        draw_line(40.0, 40.0, 100.0, 200.0, 15.0, BLUE);
        draw_rectangle(screen_width() / 2.0 - 60.0, 100.0, 120.0, 60.0, GREEN);
        draw_circle(screen_width() - 30.0, screen_height() - 30.0, 15.0, YELLOW);

        draw_text("IT WORKS!", 20.0, 20.0, 30.0, DARKGRAY);

        next_frame().await
    }
}

async_ui的简单事例:

async fn hello_world() {
	text(&"Hello World!").await;
}

async fn hello_world_2() {
	// create a Fragment
	fragment((
		// use the component we previously made!
		hello_world(),
		// have a button beside it
		button(ButtonProps {
			children: fragment((
				text(&"Say hello back"),
			)),
			on_press: Some(
				&mut |_ev: PressEvent| {
					todo!();
				}
			),
			..Default::default()
		})
	)).await;
}

async fn login_flow() {
	loop {
		let (username, password) = login_form().await;
		if check_login(username, password).await {
			// Login successful!
			break;
		}
		else {
			race(
				// Render the popup component.
				invalid_login_popup(),

				// Race with a future that will complete in 5 seconds.
				// In 5 seconds, this future will "win" the race and cause
				// the popup future to be dropped, unmounting the popup.
				wait_5_seconds()
			).await;
			// Loop back to the login form!
		}
	}
}

async fn counter() {
	let mut count = 0;

	// Like a RefCell that you can subscribe to!
	let count_string = ReactiveCell::new(count.to_string());

	fragment((
		// When count_string changes, the text will change.
		text(&count_string.as_observable()),

		button(ButtonProps {
			children: fragment((
				text(&"+"),
			)),
			on_press: Some(&mut |_ev| {
				// Upon press, increment count and update the string accordingly.
				count += 1;
				*count_string.borrow_mut() = count.to_string();
			}),
			..Default::default()
		})
	)).await;
}

具体请看原文:

原文: https://wishawa.github.io/posts/async-ui-intro/

一个小公司的CTO在reddit上发帖询问是否应该在公司内推广Rust

我是一家小公司的首席技术官,我负责大部分的编程工作,根据工作量的大小,我们会有2到4个开发人员在我手下工作。

我们90%的工作代码和物流有关,大部分时间是在建立应用程序,通过API接收信息、处理数据,提供API接口来预订货物,等等。

我们需要开始升级我们的代码库;目前在GO和Rust之间争论。我喜欢这两种语言,但更倾向于Rust。因为我做了大部分的工作,我觉得我应该选择我更喜欢用的那个。但我担心初级开发人员永远不会明白这一点。

我想知道你们的看法。我应该使用Rust,因为我想用它,还是应该使用GO,因为更多的人知道它,而且它可能更容易找到开发人员?

以下是一些高赞回答:

我也是CTO。我们雇用了大学毕业的应届生,让他们学习Rust。他们没有遇到任何问题就学会了,并且正在编写干净的、性能良好的代码,单元测试覆盖率达到100%。然而,Rust的库生态系统并不像Node或Go那样完善。但是,它也正在努力发展。


另一位CTO:我一直在教同事(一个拥有多年Go后端经验,另外两个有前端/TypeScript经验)写Rust代码时,即使写的时间相对有限,也有相当高的效率。学习曲线可能会很陡峭,但如果有人可以教授和指导,我认为这不会是一个大问题。我们写TypeScript的程序员非常喜欢Rust,并希望能用它做更多的事情。


我管理一个项目,其中有大量的restapi调用,它是从Python移植到Rust的。光是Serde就为我们节省了数百甚至数千小时的工作。我对Go不是很熟悉,但Rust的工具(库和基础设施)很不错。


如果你想和一群初级开发人员一起快速入门,就使用Go。如果你想更容易地产生可维护和可靠的东西,并且愿意帮助后辈和新人度过Rust陡峭的学习阶段,那么就使用Rust。

Go(在我看来)是一种有缺陷的语言,它有很多令人不舒服的地方和奇怪的错误处理。另一方面,一些伟大的软件是用它写的,它相对较小,也相对简单。它的编译速度很快,可以让一个新的开发人员能在几周内完成工作并至少有一定的生产力。

Rust有更多的安全机制,更好的内存处理,更好的错误处理,更少的语法噪音,更友好的社区,更低的资源使用,所有这些都是好东西。然而,如果你是个新手,而且你还不是一个可靠的开发者,你将需要所有你能得到的(优秀的)文档和帮助,这仍然需要花费一些时间。

选择你的取舍。

This Week in Rust 464

Rust周报645期

This Week in Rust 464: https://this-week-in-rust.org/blog/2022/10/12/this-week-in-rust-464/

From 日报小组 Cupnfish

社区学习交流平台订阅:

评论区

写评论

还没有评论

1 共 0 条评论, 1 页