小编Fin*_*ber的帖子

如何在 May 和 IO 中使用 Do 表示法

我正在努力掌握do notationHaskell 中的内容。

我可以将它与 Maybe 一起使用,然后打印结果。像这样:

maybeAdd :: Maybe Integer
maybeAdd = do one <- maybe1
              two <- maybe2
              three <- maybe3
              return (one + two + three)

main :: IO ()
main = putStr (show $ fromMaybe 0 maybeAdd)
Run Code Online (Sandbox Code Playgroud)

但是,我没有使用单独的函数,而是尝试在主函数中使用带有 Maybe 的 do 表示法。但我没有任何运气。我尝试的各种尝试包括:

main :: IO ()
main = do one <- maybe1
          two <- maybe2
          three <- maybe3
          putStr (show $ fromMaybe 0 $ return (one + two + three))
Run Code Online (Sandbox Code Playgroud)
main :: IO ()
main …
Run Code Online (Sandbox Code Playgroud)

monads haskell do-notation

3
推荐指数
1
解决办法
421
查看次数

Thread.yield 是否与 Java 中的非阻塞 IO 相同

我知道非阻塞 IO 不会阻塞调用线程,而是在等待 IO 时释放它来做其他事情。

我刚刚了解了Thread. yield允许线程告诉 CPU 运行其他线程的方法......技术上产生控制。

这两个东西,非阻塞 IO 和Thread. yield听起来和我很相似,所以我想知道,在最基本的层面上,非阻塞 IO 是Thread. yield在做 IO 时才使用的吗?

java io multithreading

3
推荐指数
1
解决办法
95
查看次数

如何使 enumerate 返回索引作为 u32 而不是 usize?

我看到当enumerate被调用时,该index值以usize. 为什么是这样?我怎样才能让它返回索引作为另一种数字类型?比如说u32?

现在我必须手动转换为u32. 例如:

let mut even_index: Vec<u32> = Vec::new();
for (i, v) in vec![10,27,31,40,5].iter().enumerate() {
    if v % 2 == 0 {
        even_index.push(i as u32); // any way to avoid this?
    }
}
Run Code Online (Sandbox Code Playgroud)

有没有办法不必手动执行转换u32enumerate返回索引u32

我查看了这里的文档,文档包含以下内容:

enumerate() 将其计数保留为 usize。如果您想按不同大小的整数进行计数,zip 函数提供类似的功能。

我查看了该zip函数,看起来它做了一些不同的事情,所以我不明白为什么当需要按不同大小的整数进行计数时建议将其作为替代方案。

rust

3
推荐指数
1
解决办法
997
查看次数

Rust中Clone是用于在堆上复制,而Copy是用于在堆栈上复制吗?

正如标题所说,我可以正确地说 Clone 用于在堆上复制,而 Copy 用于在 Rust 中的堆栈上复制吗?

这基本上就是这篇文章所说的内容但我对其正确性表示怀疑。

rust

3
推荐指数
1
解决办法
1319
查看次数

如何在同一个 Axum 处理程序中返回成功和错误情况?

好的,我有一个 axum 处理程序,看起来有点像这样:

#[debug_handler]
async fn handler(
    State(server_state): State<Arc<Server>>,
    Query(query_params): Query<Query>,
) -> impl IntoResponse {
    match server_state.store.handle(query_params).await {
        Ok(res) => (StatusCode::OK, Json(res)),
        Err(err) => (StatusCode::INTERNAL_SERVER_ERROR, Json(err))
    }
}
Run Code Online (Sandbox Code Playgroud)

此操作失败并出现以下错误:

   |
42 | /     match server_state.store.handle(query_params).await {
43 | |         Ok(res) => (StatusCode::OK, Json(res)),
   | |                   -------------------------- this is found to be of type `(StatusCode, axum::Json<Vec<Data>>)`
44 | |         Err(err) => (StatusCode::INTERNAL_SERVER_ERROR, Json(err))
   | |                     ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ expected struct `Vec`, found enum `sqlx::Error`
45 | |     }
   | |_____- `match` arms …
Run Code Online (Sandbox Code Playgroud)

rust rust-axum

3
推荐指数
1
解决办法
2597
查看次数

如何使用 Docker compose 定义子网和 IP 地址并将其分配给容器

我认为我想做的事情很简单,但是通读有关网络的 docker compose 文档部分https://docs.docker.com/compose/networking/我发现没有有用的信息:(

我想创建 2 个子网(将来可能会更多 - 但现在我们只创建两个子网),并且能够手动将每个子网的 IP 地址分配给我在 docker-compose 中指定的容器。

如何才能做到这一点?

docker docker-compose docker-network

2
推荐指数
1
解决办法
5054
查看次数

动态大小类型总是在堆上吗?

我对 Rust 的学习让我了解了动态大小类型 (DST),并且我知道这些类型的大小在编译时无法得知。例如str

我现在的问题是,我说 DST 永远不会存在于堆栈上,它们只存在于堆上,这样说对吗?

另外,另一方面,说大小类型可以存在于堆栈中是否正确:

(eg. let x:u32 = 10)

但也可以存在于堆上,例如通过使用 Box

(eg let x: Box<u32> = Box::new(10))

上述这些说法是否正确?

rust

2
推荐指数
1
解决办法
166
查看次数

Rust 中的复制和克隆之间的区别是什么?

我试图理解RustCloneCopyRust 之间的区别。谷歌搜索我看到的答案似乎可以归结为:Clone专为任意重复而设计,而Copy代表可以通过memcpy.

所有这些答案的问题在于所有参考都memcpy假设读者知道什么memcpy

但对于像我这样不确定的人来说,memcpy因为我没有 C/C++ 经验,所以不确定这如何帮助解释复制和克隆之间的区别。

有人可以帮助解释复制memcpy和克隆之间的区别吗?特别是如何提及它?

rust

1
推荐指数
1
解决办法
538
查看次数

为什么引用 str 且生命周期较短的结构在 Rust 中编译?

所以我试图测试我是否理解生命周期,并想创建一个在编译时失败的场景。我想出的代码如下:

#[test]
fn lifetime() {

    struct Identity<'a> {
        first_name: &'a str
    }
    
    let name: Identity;

    {
        let first: &str = "hello";

        name = Identity {
            first_name: first
        };
    }

    println!("{}", name.first_name);
}
Run Code Online (Sandbox Code Playgroud)

推理是 的实例Identity应该与引用的一样长first_name

let first: &str = "hello"然后在我使用较小范围创建的代码中,将其设置为let name: Identity;,然后在first应该超出范围之后,我尝试打印name.first_name. 我原以为这不会编译,但它编译得很好。

我对生命周期如何工作以及为什么要编译的理解中缺少什么?

#编辑

更新代码以使其编译失败:

        let string = String::from("hello");
        let first: &str = string.as_str();
Run Code Online (Sandbox Code Playgroud)

仍然好奇为什么原始代码有效。

rust

1
推荐指数
1
解决办法
115
查看次数

如何保持 mod 私有并在 Rust 中同一项目的另一个模块中使用它?

所以我想定义一些模块lib.rs但不公开它们,但只能在项目中使用。

在 my 中lib.rs,如果我有这样的定义:

pub mod args;
Run Code Online (Sandbox Code Playgroud)

在我的中main.rs,我可以args这样使用模块:

use my_lib::args::Cli;
Run Code Online (Sandbox Code Playgroud)

其中my_lib定义Cargo.tml

[lib]
name = "my_lib"
path = "src/lib.rs"
Run Code Online (Sandbox Code Playgroud)

但我不想pub mod args;。我尝试更改为,pub(crate) mod args;但这会导致编译错误,args无法找到模块。

如何使args定义的模块lib.rs可用而不需要给予它最宽松的可见性?

visibility module rust

1
推荐指数
1
解决办法
268
查看次数

为什么 Rust 中 Arc&lt;Mutex&gt; 有锁方法,但 Arc&lt;i32&gt; 没有?

只是玩弄 Arc 和 Mutex,我发现该join方法仅显示在类型值上Arc<Mutex<i32>>,而不是Arc<i32>直接使用时显示。

    let counter = Arc::new(Mutex::new(0));
    counter.lock() // method exists and returns LockResult<MutexGuard<'_, T>>

    // but
    let counter = Arc::new(0);
    counter.lock() // method does not exist

Run Code Online (Sandbox Code Playgroud)

我本以为lock是给定第一个示例的方法Arc,但似乎该方法仅在Arc包装 a时出现Mutex

什么类型的机器允许这种情况发生?

rust

0
推荐指数
1
解决办法
116
查看次数