小编Cha*_*man的帖子

如何在 Rust 中将彩色文本打印到终端?

如何使用 Rust 将彩色文本输出到终端?我尝试使用在python 答案中找到的特殊转义字符,但它们只是按字面打印。这是我的代码:

fn main() {
    println!("\033[93mError\033[0m");
}
Run Code Online (Sandbox Code Playgroud)

terminal rust output

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

如何使用 Rust 程序禁用 VS 代码中的提示行?

在此处显示的屏幕截图中:

vs 代码 Rust

VS code 自动在 Rust 代码第 14 行和第 15 行之间添加了一条提示行,显示为“1 实现”。

我的问题是:如何禁用这条灰色提示线?插入的此类提示线的正式名称是什么?

rust visual-studio-code

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

Rust 将指向结构体第一个成员的指针转换为指向该结构体的指针是否合法?

在 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)

undefined-behavior language-lawyer rust

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

这个更高等级的特质界限意味着什么?

在萨尔萨舞中,一个特征上有一个更高级别的特征。我见过关于函数定义的 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

traits lifetime rust

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

无论如何使用 TryInto 泛型::Error

该函数预计接受一个可以转换为字符串的命令,而且我也正在使用无论如何来处理错误。这是代码:

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

generics error-handling rust

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

如何扩展 Rust 中在其他地方定义的特征?

我想创建一个新的迭代器方法,例如:

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特征添加一个新方法,但找不到适用于此的示例

逻辑不是问题,因为我有一个运行良好的免费函数,我只是希望能够像代码示例中那样使用它,以获得更好的人体工程学效果。

rust

7
推荐指数
2
解决办法
3223
查看次数

如何记录错误并返回/继续结果/选项

我遇到过很多情况,我需要编写类似于此代码片段的代码。我想知道是否有更短的方法可以做到这一点?

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()永远不会这么短。它可能是一些已经太长的函数调用链。

也许我这样做的方式是唯一的方法,或者也许我做错了什么,导致这样做,而我不应该这样做!?

rust

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

我可以强制子类实现接口吗?

我有一个基类,比如 named B。我有两个派生类,D1D2.

好像:

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 …

c#

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

match 如何在其怀抱中使用 `continue` 进行编译?

我正在阅读《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执行它?整个赋值表达式本身会发生什么?它是否从调用堆栈中删除(如果这是正确的术语)?

rust

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

为什么无法使用格式化打印来打印结构体字段?

就像下面的代码一样,当值是原始值或结构(具有派生调试属性)或其他内容时,它确实可以使用格式化打印来打印值。但当值是结构字段时,我无法打印值。

#[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)

rust

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