在像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中是如何工作的.
是否在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)
显然,我希望对事务中的这两个柴油调用进行排序。不幸的是,我没有找到任何有关此的信息。另外,我发现了一些或多或少的相关信息,但是它已经很老了。
我想编写使用Postgresql作为DBMS的应用程序.要编写客户端应用程序,我需要libpq库和头文件吗?如果是的话我将获得libpq库和头文件.
我有一个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)?
impl Traits可以用作函数参数.这个和具有特征约束的泛型函数之间是否存在差异?
trait Foo {}
fn func1(_: impl Foo) {}
fn func2<T: Foo>(_: T) {}
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)
因为
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.
在我写的箱子里,我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)
我希望用户看到和使用forward和stop,但不会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) 我应该在println!宏中使用什么格式字符串才能打印0.0为00000.000?
println!("={:05.3}", 0.0);
Run Code Online (Sandbox Code Playgroud)
输出: =0.000
预期: =00000.000
我的板条箱的 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”设为默认值?
我的机器正在运行win7 64bit.我安装了Cygwin并添加C:\cygwin64\bin到了PATH.现在linux命令可以在cmd上运行,但是export无法识别:
'export'不被识别为内部或外部命令,可操作程序或批处理文件.
而它在Cygwin64终端中正常工作.我应该如何将其添加到Windows默认cmd?
rust ×8
async-await ×1
asynchronous ×1
batch-file ×1
cmd ×1
cygwin ×1
export ×1
formatting ×1
future ×1
postgresql ×1
rust-cargo ×1
syntax ×1
traits ×1
wasm-bindgen ×1
windows ×1