如何使用 Rust 将彩色文本输出到终端?我尝试使用在python 答案中找到的特殊转义字符,但它们只是按字面打印。这是我的代码:
fn main() {
println!("\033[93mError\033[0m");
}
Run Code Online (Sandbox Code Playgroud) 在此处显示的屏幕截图中:
VS code 自动在 Rust 代码第 14 行和第 15 行之间添加了一条提示行,显示为“1 实现”。
我的问题是:如何禁用这条灰色提示线?插入的此类提示线的正式名称是什么?
在 C 中,指向结构的指针可以转换为指向其第一个成员的指针,反之亦然。也就是说,结构体的地址被定义为其第一个成员的地址。
struct Base { int x; };
struct Derived { struct Base base; int y; };
int main() {
struct Derived d = { {5}, 10 };
struct Base *base = &d.base; // OK
printf("%d\n", base->x);
struct Derived *derived = (struct Derived *)base; // OK
printf("%d\n", derived->y);
}
Run Code Online (Sandbox Code Playgroud)
这通常用于实现 C++ 风格的继承。
如果结构是repr(C)(这样它们的字段就不会被重新组织),Rust 中是否允许同样的事情?
struct Base { int x; };
struct Derived { struct Base base; int y; };
int main() {
struct Derived d = { …Run Code Online (Sandbox Code Playgroud) 在萨尔萨舞中,一个特征上有一个更高级别的特征。我见过关于函数定义的 HRTB,但没有看到关于特征的 HRTB。这是什么意思?
pub trait Query: Debug + Default + Sized + for<'d> QueryDb<'d> {
...
fn query_storage<'a>(
group_storage: &'a <Self as QueryDb<'_>>::GroupStorage,
) -> &'a Arc<Self::Storage>;
}
Run Code Online (Sandbox Code Playgroud)
https://github.com/salsa-rs/salsa/blob/fc6806a/src/lib.rs#L370
比如,我应该如何阅读这个?是不是说,对于任何Query,都有一个QueryDB具有一定生命周期的对应项?
这与
pub trait Query<'d>: Debug + Default + Sized + QueryDb<'d>
Run Code Online (Sandbox Code Playgroud)
除此之外 impls 无法指定'd?
该函数预计接受一个可以转换为字符串的命令,而且我也正在使用无论如何来处理错误。这是代码:
pub fn converter<T: TryInto<String>>(input: T) -> Result<String>
where
T::Error: Into<anyhow::Error>,
{
// error here
// the trait bound `<T as TryInto<std::string::String>>::Error: StdError` is not satisfied
// required because of the requirements on the impl of `From<<T as TryInto<std::string::String>>::Error>` for `anyhow::Error`
// required because of the requirements on the impl of `FromResidual<Result<Infallible, <T as TryInto<std::string::String>>::Error>>` for `Result<std::string::String, anyhow::Error>
let out_str = input.try_into()?;
Ok(out_str)
}
Run Code Online (Sandbox Code Playgroud)
T::Error我为as添加了类型限制T::Error: Into<anyhow::Error>,希望编译器能够进行错误处理,但显示T::Error无法转换为anyhow::Error.
类型限制引用自: https: //github.com/dtolnay/anyhow/issues/172,但我仍然不知道如何使用泛型TryInto。
我想创建一个新的迭代器方法,例如:
let test_data = vec![1,2,3,1,1,1,1];
let indexes_with_val_1 = test_data.iter().find_all(|element| element == 1).unwrap();
assert_eq!(indexes_with_val_1, vec!(0,3,4,5,6));
Run Code Online (Sandbox Code Playgroud)
所以本质上我想为该std::iter::Iterator特征添加一个新方法,但找不到适用于此的示例
逻辑不是问题,因为我有一个运行良好的免费函数,我只是希望能够像代码示例中那样使用它,以获得更好的人体工程学效果。
我遇到过很多情况,我需要编写类似于此代码片段的代码。我想知道是否有更短的方法可以做到这一点?
loop {
let res = match do() {
Ok(res) => res,
Err(e) => {
eprintln!("Error: {}", e);
continue;
}
}
// Do stuff with `res` ...
}
Run Code Online (Sandbox Code Playgroud)
或者
fn some_fn() {
let res = match do() {
Some(res) => res,
None => {
eprintln!("Error: not found");
return;
}
}
// Do stuff with `res` ...
}
Run Code Online (Sandbox Code Playgroud)
我一直在寻找类似?关键字的东西,以便在出现错误时尽早返回,但在函数不返回任何内容的情况下,如果结果是None/ ,我只想不返回任何内容Error。
也许是这样的:
loop {
do().unwrap_or_log(|e| eprintln("{}", e).continue // :D
}
Run Code Online (Sandbox Code Playgroud)
考虑do()永远不会这么短。它可能是一些已经太长的函数调用链。
也许我这样做的方式是唯一的方法,或者也许我做错了什么,导致这样做,而我不应该这样做!?
我有一个基类,比如 named B。我有两个派生类,D1和D2.
好像:
public abstract class B
{
public abstract void DoSomething();
}
public class D1 : B
{
public override void DoSomething() { ... }
}
public class D2 : B
{
public override void DoSomething() { ... }
}
Run Code Online (Sandbox Code Playgroud)
现在,我创建了一个新界面IDeepCopyable<T>,它有一个方法Clone():
public interface IDeepCopyable<T>
{
T Clone();
}
Run Code Online (Sandbox Code Playgroud)
我想强制每个子类也使用基类(即IDeepCopyable<B>.
如果我尝试将B's 声明保持原样,但只是继承自 ('implement' 是一个更准确的术语?) IDeepCopyable<T>,例如:
public abstract class B : IDeepCopyable<B>
Run Code Online (Sandbox Code Playgroud)
然后在派生类中实现它(隐式或显式),编译器给我一条错误消息“B …
我正在阅读《Rust 编程语言》一书,我偶然发现了一个简单的表达式:
let guess: u32 = match guess.trim().parse() {
Ok(num) => num,
Err(_) => continue,
};
Run Code Online (Sandbox Code Playgroud)
它的手臂如何match处理不同的表情?例如,第一个臂将简单地“返回”,num以便将其分配给,guess但在第二个臂中,表达式只是continue。如何match处理它并且不“分配”continue而是guess执行它?整个赋值表达式本身会发生什么?它是否从调用堆栈中删除(如果这是正确的术语)?
就像下面的代码一样,当值是原始值或结构(具有派生调试属性)或其他内容时,它确实可以使用格式化打印来打印值。但当值是结构字段时,我无法打印值。
#[derive(Debug)]
struct Point<T> {
x: T,
y: T,
}
fn main() {
let a = 3;
let p = Point { x: 5, y: 10 };
println!("{}", a); // Working
println!("{a}"); // Working
println!("{:?}", p); // Working
println!("{p:?}"); // Working
println!("{} {}", p.x, p.y); // Working
println!("{p.x} {p.y}"); // Not working
}
Run Code Online (Sandbox Code Playgroud)
错误消息如下。
error: invalid format string: expected `'}'`, found `'.'`
--> src/main.rs:18:17
|
18 | println!("{p.x} {p.y}"); // Not working
| - ^ expected `}` in format string …Run Code Online (Sandbox Code Playgroud)