小编Fre*_*ios的帖子

在Rust中async/await的目的是什么?

在像C#这样的语言中,给出这个代码(我没有await故意使用关键字):

async Task Foo()
{
    var task = LongRunningOperationAsync();

    // Some other non-related operation
    AnotherOperation();

    result = task.Result;
}
Run Code Online (Sandbox Code Playgroud)

在第一行中,long操作在另一个线程中运行,并Task返回a(即未来).然后,您可以执行另一个与第一个并行运行的操作,最后,您可以等待操作完成.我认为,这也是行为async/ await在Python,JavaScript等

另一方面,在Rust中,我在RFC中读到:

Rust的期货与其他语言的期货之间的根本区别在于,除非进行调查,否则Rust的期货不会做任何事情.整个系统是围绕这个建立的:例如,取消正在降低未来正是出于这个原因.相比之下,在其他语言中,调用异步fn会旋转一个立即开始执行的未来.

在这种情况下,是什么目的async/ await鲁斯特?看到其他语言,这种表示法是一种运行并行操作的便捷方式,但是如果调用async函数没有运行任何东西,我无法看到它在Rust中是如何工作的.

syntax asynchronous future rust async-await

12
推荐指数
3
解决办法
4729
查看次数

Rust中函数参数评估和结构初始化的顺序是什么?

是否在Rust中定义了函数参数评估的顺序?

fn f(a: u64, b: u64, c: u64) {}
fn g() -> u64 { 0 }
fn h() -> u64 { 1 }
fn i() -> u64 { 2 }

fn main() {
    f(g(), h(), i());
}
Run Code Online (Sandbox Code Playgroud)

另外,我担心结构的初始化顺序:

fn f() {}
fn g() {}

A {
    a: f(),
    b: g(),
}
Run Code Online (Sandbox Code Playgroud)

是保证顺序a,然后b

对于我的特定用例,我将diesel像这样在事务中初始化一个结构:

db_connection.transaction(||
    Ok(CompanyAndUser {
        company: companies::register_company(...)?, // performs diesel insert
        user: users::register_user(...)?, // performs diesel insert
    })
);
Run Code Online (Sandbox Code Playgroud)

显然,我希望对事务中的这两个柴油调用进行排序。不幸的是,我没有找到任何有关此的信息。另外,我发现了一些或多或少的相关信息,但是它已经很老了。

rust

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

我从哪里获得libpq源代码?

我想编写使用Postgresql作为DBMS的应用程序.要编写客户端应用程序,我需要libpq库和头文件吗?如果是的话我将获得libpq库和头文件.

postgresql

11
推荐指数
3
解决办法
3万
查看次数

Rust中是否有内置标识功能?

我有一个Options 矢量,我想只过滤Somes.我使用filter_map身份:

let v = vec![Some(1), None, Some(2)];
for i in v.into_iter().filter_map(|o| o) {
    println!("{}", i);
}
Run Code Online (Sandbox Code Playgroud)

是否有内置函数允许编写类似的东西filter_map(identity)

rust

11
推荐指数
2
解决办法
1164
查看次数

impl trait参数和泛型函数参数之间有什么区别?

impl Traits可以用作函数参数.这个和具有特征约束的泛型函数之间是否存在差异?

trait Foo {}

fn func1(_: impl Foo) {}

fn func2<T: Foo>(_: T) {}
Run Code Online (Sandbox Code Playgroud)

rust

11
推荐指数
2
解决办法
785
查看次数

为什么 T 不实现 AsRef&lt;T&gt;?

此代码无法编译:

fn ref_on_int<T>(_: T) where T: AsRef<i32> {}

fn main() {
    ref_on_int(&0_i32)
}
Run Code Online (Sandbox Code Playgroud)

因为

fn ref_on_int<T>(_: T) where T: AsRef<i32> {}

fn main() {
    ref_on_int(&0_i32)
}
Run Code Online (Sandbox Code Playgroud)

为什么会这样?

这可能对例如像这样的新类型很有用

struct MyInt(i32);

impl AsRef<i32> for MyInt {
    /* etc. */
}
Run Code Online (Sandbox Code Playgroud)

那么您可以无差别地传递 an 上i32的引用或 a 上的引用MyInt,因为在这两种情况下我们都有一个i32.

rust

11
推荐指数
2
解决办法
960
查看次数

如何拥有特质的私密部分?

在我写的箱子里,我struct向用户提供了一堆内部公共信息并分享了一些代码.一些共享代码是公共的,一些是内部实现.为了有效地共享代码,我正在使用宏,但是现在项目有更多的功能,这开始变得混乱,我对此的语义不满意.

我想使用特征,但不暴露实现.例如:

pub trait MyTrait {
    type Next;

    // This function is for the user.
    fn forward(&self) -> Self::Next {
        self.do_the_job()
    }

    // This function is for the user.
    fn stop(&self) {
        self.do_the_job();
    }

    // This function is an implementation detail.
    fn do_the_job(&self) -> Self::Next;
}
Run Code Online (Sandbox Code Playgroud)

我希望用户看到和使用forwardstop,但不会do_the_job,而我的数据将只实现do_the_job.

是否有可能设计我的代码来做那样的事情?我试图想象一些解决方案,但没有想到我的想法.

操场


在具有继承的面向对象语言中,我会做(伪代码):

public interface MyTrait {
    type Next;

    fn forward(&self) -> Self::Next;

    fn stop(&self);
}

public abstract class MyCommonCode extends MyTrait { …
Run Code Online (Sandbox Code Playgroud)

design-patterns traits rust

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

如何格式化具有特定精度的f32和前置零?

我应该在println!宏中使用什么格式字符串才能打印0.000000.000

println!("={:05.3}", 0.0);
Run Code Online (Sandbox Code Playgroud)

输出: =0.000

预期: =00000.000

floating-point formatting rust

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

当目标架构是 WASM 时默认启用 Cargo 功能?

我的板条箱的 Cargo.toml 的一部分:

[features]
wasm = ["ed25519-dalek/nightly", "rand/wasm-bindgen", "js-sys"]
Run Code Online (Sandbox Code Playgroud)

当在另一个项目中使用该板条箱并且明确选择“wasm”功能时,这是有效的。

我想仅当目标架构是 WASM 时自动启用此功能。我尝试添加这个:

#[cfg(target_arch = "wasm32")]
default = ["wasm"]
Run Code Online (Sandbox Code Playgroud)

当我针对 WASM 以外的目标进行编译时,“wasm”作为默认值包含在内,如何仅当目标是 WASM 时才将“wasm”设为默认值?

rust rust-cargo wasm-bindgen

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

安装Cygwin时,cmd中无法识别导出

我的机器正在运行win7 64bit.我安装了Cygwin并添加C:\cygwin64\bin到了PATH.现在linux命令可以在cmd上运行,但是export无法识别:

'export'不被识别为内部或外部命令,可操作程序或批处理文件.

而它在Cygwin64终端中正常工作.我应该如何将其添加到Windows默认cmd?

windows cygwin cmd export batch-file

9
推荐指数
2
解决办法
2万
查看次数