使用'as'编译的第一次转换,但使用'From'特性的第二次转换不会:
fn main() {
let a: u64 = 5;
let b = a as usize;
let b = usize::from(a);
}
Run Code Online (Sandbox Code Playgroud)
使用Rust 1.22.1我收到以下错误:
error[E0277]: the trait bound `usize: std::convert::From<u64>` is not satisfied
--> src/main.rs:4:13
|
4 | let b = usize::from(a);
| ^^^^^^^^^^^ the trait `std::convert::From<u64>` is not implemented for `usize`
|
= help: the following implementations were found:
<usize as std::convert::From<bool>>
<usize as std::convert::From<std::num::NonZeroUsize>>
<usize as std::convert::From<u16>>
<usize as std::convert::From<u8>>
= note: required by `std::convert::From::from`
Run Code Online (Sandbox Code Playgroud)
当我更换u64时u8,没有更多的错误.从错误消息中,我了解该 …
背景:我为一些非常专业的数据处理创建了许多小实用程序.通常,我是唯一的用户.我甚至不考虑多线程编程,因为运行时性能足以满足我的用例.关键资源是我的编程时间.所以我想避免多线程编程所需的额外工作.
但是,当我将来重用我的代码时,似乎存在风险,即我的源代码在多线程上下文中执行.
注意:有许多例子,其中"已知"永远不会在多线程程序中运行的代码作为多线程程序的一部分运行.经常多年以后.通常,此类程序会导致删除数据争用的痛苦努力.因此,从不打算在多线程环境中运行的代码应该清楚地标记为这样,并且理想情况下需要使用编译或运行时强制机制来尽早捕获这些使用错误.
同一来源中的大多数建议实际上让我开始使用多线程编程.我想遵循的一个建议是:
拒绝在多线程环境中构建和/或运行.
所以我的问题是,我该怎么做?例如,是否有一个包含文件,#pragma左右,以确保源文件中的所有内容的单线程构建/执行?
我有一个库,它使用 std::cout 和 std::cerr 将消息发送到控制台。
我知道,我可以在我的 GUI 应用程序中重定向它。但是,我想知道的是,是否有办法检测在消息实际刷新之前是否使用了 cout 或 cerr?
背景:如果文本来自cerr,我希望能够更改文本颜色并在消息前面放置一个类似“错误:”的字符串。
例如,如果有一条线
cerr << "File not found" << endl;
Run Code Online (Sandbox Code Playgroud)
在库中,是否有一种回调或事件可用于确保我可以执行
cerr << "Error: ";
Run Code Online (Sandbox Code Playgroud)
从我这边之前的原始错误信息而不触及原始库?
请注意,在问题中重定向到字符串将stdout/stderr 重定向到字符串需要我知道库何时创建输出并对该字符串执行某些操作。相反,我正在寻找一种自动机制。
我有一个名为“ foo”的控制台应用程序,该应用程序将参考文本文件作为输入(in.txt),并在标准输出处生成文本(我想保持这种行为)。
在make(不是cmake)中,我使用一个测试目标,该目标调用foo并将输出重定向到文件(out.txt),如下所示。然后,我使用diff将文件out.txt与预期的参考(ref.txt)进行比较
test:
./foo -a test/in.txt > test/out.txt
diff test/out.txt test/ref.txt
Run Code Online (Sandbox Code Playgroud)
使用make可以正常工作。现在我的问题是;我如何使用cmake创建类似的Makefile?
我在一个称为build的子目录中尝试
project(foo)
...
add_test(NAME test1 COMMAND ./foo ../test/in.txt > ../test/out.txt)
enable_testing()
Run Code Online (Sandbox Code Playgroud)
使用cmake版本3.5,我得到的Makefile没有错误,但调用时make test,测试本身失败。似乎cmake命令add_test支持命令行参数,但不支持重定向。我尝试使用引号并逃脱成功。由于我无法通过这部分,因此我没有尝试使用diff。我只是想象我可以像使用bash一样使用&将foo和diff打包在一起。那将是第二步。
我创建了一个 Rust 应用程序,它使用crates.io 中的sqlite箱
我只是按原样使用这个板条箱,当我使用 运行我的应用程序时cargo run,我确实得到了我想要的。但是,我的应用程序现在似乎依赖于sqlite3.dll,它需要位于我的路径中。
从我阅读的 Cargo 文档中,我的理解是 sqlite 箱本身是静态链接的,但不是它所依赖的 C 库。
在我自己的计算机上,我通过简单地将 sqlite3.dll 复制到我的路径中的文件夹或货物创建可执行文件的同一目录中来解决这个问题。
但是,我意识到这不适用于任何 sqlite3.dll 文件,但它适用于我在文件.multirust夹深处找到的文件。
此外,当我将此应用程序交给其他人时,我还必须确保 DLL 也在那里。
因此,我想通过将此 DLL 静态链接到我的可执行文件来避免这些复杂情况。
有没有办法告诉 Cargo 静态链接这个 C 库,而无需深入自定义构建脚本?
我在rusqlite文档中阅读了以下内容:
Connection::open(path)相当于Connection::open_with_flags(path, SQLITE_OPEN_READ_WRITE | SQLITE_OPEN_CREATE).
我将其复制到以下简单代码中:
extern crate rusqlite;
use rusqlite::Connection;
fn main() {
let path = "/usr/local/data/mydb.sqlite";
let conn = Connection::open_with_flags(path, SQLITE_OPEN_READ_WRITE | SQLITE_OPEN_CREATE);
}
Run Code Online (Sandbox Code Playgroud)
我实际上想用这些标志替换SQLITE_OPEN_READ_ONLY,但认为这是一个很好的起点.
我收到以下错误:
error[E0425]: cannot find value `SQLITE_OPEN_READ_WRITE` in this scope
--> src/main.rs:6:50
|
6 | let conn = Connection::open_with_flags(path, SQLITE_OPEN_READ_WRITE | SQLITE_OPEN_CREATE);
| ^^^^^^^^^^^^^^^^^^^^^^ not found in this scope
error[E0425]: cannot find value `SQLITE_OPEN_CREATE` in this scope
--> src/main.rs:6:75
|
6 | let conn = Connection::open_with_flags(path, SQLITE_OPEN_READ_WRITE …Run Code Online (Sandbox Code Playgroud)