// this is a unit structpub struct APICalls;// we can implement the unit struct to bundle functions under it// like so:Impl APICalls {pub asyncfn get_dog_api_data() -> Json<Dog> {... some code here// this should probably return some json data}pub asyncfn get_cat_api_data() -> Json<Cat> {... some code here// this should probably return some json data}}
fn navbar (cx: Scope) -> Element {// now we can call the data like this, or something similarletdogs = APICalls::get_dog_api_data().await;}
如大家所见,哪怕只是稍稍触及 Rust 的浅表层次,也已经能够获得相当不错的开发效果 。而且真正让人眼前一亮的,还要数 Rust 的错误处理机制,这也是其优于 Java 甚至是 Type 的关键亮点之一 。通常,如果使用 Type 进行编码,我们只有两个选择:类型检查和 try-catch 块 。但对于拥有一定开发经验的朋友们来说,不断把代友打包到 try-catch 块中仍然有其隐患 。毕竟 Type 仍可被编译为 Java,所以一旦不小心就会引发跟 JS 相关的问题(CJS 和 ECMA 兼容问题,运行时内随时可能出现的随机错误等) 。
下面来看看 Rust 的基本错误处理机制:
asyncfn foo() -> Result<String, String>{letbar = String::from("foobar!");// return is implicit, no need to write "return"match bar.trim() {"foobar!"=> Ok(bar),_ => Err("Was not foobar!".to_string())}}#[tokio::main]fn main() -> Result<String, String> {letOk(res) = foo().await else{returnErr("Was not foobar :(".to_string());}
println!("The string was: {res}!");}
这里展示了两个示例:我们可以使用基础模式匹配来确定字符串是什么,如果结果匹配则返回 OK;如果属于其他内容(会加注下划线),则只返回一个具有 String 类型的错误(也会提示 std::error::Error -,我们可以将其作为错误类型来处理) 。我们还可以声明一个变量,要求该变量必须是实际的 Result 类型,否则执行其他操作(在示例中为提前返回) 。之后,我们就可以使用 res 本体了,因为它将被声明为 Result 中包含的值 。
生态系统
虽然 Java 的生态系统(Node/npm)要比 Rust 庞大得多,但 Rust 阵营也完全能够满足大多数项目的需求 。Rust 目前对数据库、redis 和 Web 应用程序中所需的各种服务都提供良好支持,不管用哪种编程语言都能使用 。
如果您打算构建 SaaS,Rust 正好准备了几乎包罗万象的工具箱:用于 SMTP 的 lettre、用于 Stripe 支付的 async-stripe,用于处理社交网络账户登录的 OAuth 回调 oauth2,用于数据库(甚至是 airtable)的 SQLx(如果倾向于对象关系映射,还有 Diesel 或 SeaORM 可以选择) 。当然,还有用于 GPT-3 的 openai_api 。在 SaaS 投入运行之后,Rust 甚至支持用于 RabbitMQ 的 lapin 和用于 Kafka 的 rs-rdkafka 。由此看来,如果大家想开发一项坚如磐石的高性能服务,Rust 的表现完全可以跟 Java 正面抗衡 。
根据个人经验,我发现 cargo 在对接各种工具时表现突出 。以 clippy 为例,这是一款无需初始化就能使用的出色工具程序,只要输入 cargo clippy 即可启用,它能检测出不必要的借用等部分、帮助我们快速优化代码 。更重要的是,如果需要把一个项目中的配置迁移至另一项目,也可以直接在根目录下创建一个 clippy.toml 文件并随意加以配置 。
由于 Rust 本身并不是普及度最高的 Web 编程语言,所以生态系统中各厂商对它的支持态度可能没那么积极,比如开放相应服务 API 。但因为大多数服务 API 采取的都是 HTTP REST Web 服务的形式,所以 Rust 也能用得起来,大家还可以使用 reqwest 等工具检索自己需要的数据 。
部 署
在部署方面,Shuttle 是迄今为止最简单的 Rust 部署方法 。后端部署确实要麻烦一点,要么需要鼓捣配置文件、要么通过网站上的 GUI 添加环境变量来接入需要使用的服务,或者是提供相应的静态文件 。
Shuttle 的另一个优点就是采取基础设施即代码的实现理念,可以通过代码注释快速上手 。只需简单通过 Rust 宏在 main 函数中声明,大家就能避免亲自动手鼓捣配置文件 。我们可以借此交付数据库并支持静态文件,从能够编译为静态资产的 Next.js、React 等 JS 框架处添加编译前端,例如:
// main.rs#[shuttle_runtime::main]pub async fn axum (#[shuttle_shared_db::Postgres] postgres: PgPool,#[shuttle_secrets::Secrets] secrets: SecretStore,#[shuttle_static_folder] static: PathBuf) -> shuttle_axum::ShuttleAxum {// carry out database migrations (this assumes migrations are idempotent)sqlx::migrate!().run(&postgres).await.expect("Migrations failed :(");let hello_world = secrets.get("MY_VARIABLE").expect("Is MY_VARIABLE set in Secrets.toml?");
推荐阅读
- 玩游戏还能推动人工智能发展?
- 2023年人工智能行业发展现状评价与趋势预测
- AI读心重磅突破登Nature!大脑信号1秒被看穿,还能预测未来画面
- 用rust编写高效稳定的html爬虫
- Rust重写万物?
- 如何防止高级人工智能网络安全攻击
- 朱珠|律师不能风情万种?看朱珠在《平凡之路》怎样演绎“职场教科书”
- 春茶刚上市时,如何才能挑选到正宗美味的凤凰单丛茶?
- 毕福剑|生于能说,“死”于会道,央视名嘴毕福剑的封杀,早有暗示!
- Angelababy|2023年四大女顶流评比,杨颖位置被杨紫替代,杨紫被质疑越级碰瓷