我在 Rust + Actix-web 中有一个 hello world web 项目。我有几个问题。首先是代码的每次更改都会导致重新编译整个项目,包括下载和编译每个 crate。我想像在正常开发中一样工作 - 这意味着缓存编译的 crate 并且只重新编译我的代码库。第二个问题是它不会暴露我的应用程序。无法通过网络浏览器访问
Dockerfile:
FROM rust
WORKDIR /var/www/app
COPY . .
EXPOSE 8080
RUN cargo run
Run Code Online (Sandbox Code Playgroud)
docker-compose.yml:
version: "3"
services:
app:
container_name: hello-world
build: .
ports:
- '8080:8080'
volumes:
- .:/var/www/app
- registry:/root/.cargo/registry
volumes:
registry:
driver: local
Run Code Online (Sandbox Code Playgroud)
主.rs:
extern crate actix_web;
use actix_web::{web, App, HttpServer, Responder};
fn index() -> impl Responder {
"Hello world"
}
fn main() -> std::io::Result<()> {
HttpServer::new(|| App::new().service(web::resource("/").to(index)))
.bind("0.0.0.0:8080")?
.run()
}
Run Code Online (Sandbox Code Playgroud)
货物.toml:
[package]
name = …Run Code Online (Sandbox Code Playgroud) 是否有任何固执且更优雅的方式来转换Vec<Result<T, E>>为Result<Vec<T>, E>?我想知道Ok<Vec<T>>vector 的所有值是否都是Ok<T>,Err<E>如果至少有一个是Err<E>。
例子:
fn vec_of_result_to_result_of_vec<T, E>(v: Vec<Result<T, E>>) -> Result<Vec<T>, E>
where
T: std::fmt::Debug,
E: std::fmt::Debug,
{
let mut new: Vec<T> = Vec::new();
for el in v.into_iter() {
if el.is_ok() {
new.push(el.unwrap());
} else {
return Err(el.unwrap_err());
}
}
Ok(new)
}
Run Code Online (Sandbox Code Playgroud)
我正在寻找一种更具声明性的方式来写这个。这个功能迫使我写一个where永远不会被使用并且Err(el.unwrap_err())看起来毫无用处的子句。换句话说,代码做了很多事情只是为了让编译器满意。我觉得这是一个很常见的情况,有更好的方法来做到这一点。
我看到很多 TypeScript 开发人员过度使用接口。事实上,他们几乎将它用于所有事情,即使他们的代码比面向对象更实用。就我个人而言,我更喜欢type哪个更灵活,并且如果接口由任何类实现或者仅用于定义对象类型,则不会混淆。是否有任何优势可以使用,interface或者type它是开发人员习惯做的某种遗留的事情吗?