相关疑难解决方法(0)

用下划线实例化Rust泛型是什么意思?

在使用serde_json读取json文档时,我编写了以下代码行来获取解包返回值的结果serde_json::from_str:

fn get_json_content(content_s: &str) -> Option<Value> {
    let ms: String = serde_json::from_str(content_s).unwrap; // <--

    match serde_json::from_str(content_s) {
        Ok(some_value) => Some(some_value),
        Err(_) => None
    }
}
Run Code Online (Sandbox Code Playgroud)

如您所见,我忘记了()调用结束时unwrap,导致以下错误:

错误:尝试unwrap在类型上获取方法的值 core::result::Result<_, serde_json::error::Error>

let ms: String = serde_json::from_str(content_s).unwrap;
Run Code Online (Sandbox Code Playgroud)

但是当我进一步看到这一点时,让我感到奇怪的是:

core::result::Result<_, serde_json::error::Error>
Run Code Online (Sandbox Code Playgroud)

我理解匹配上下文中的下划线意味着什么,但实例化泛型?那么这是什么意思?我在Rust书籍,参考书或网络搜索中找不到任何答案.

generics rust

9
推荐指数
1
解决办法
2242
查看次数

为什么在实现基于类型的宏时需要在 &lt;$a&gt; 中使用尖括号?

我可以实现一个采用如下类型的宏:

trait Boundable<A> {
    fn max_value() -> A;
}

impl Boundable<u8> for u8 {
    fn max_value() -> u8 { u8::MAX }
}
Run Code Online (Sandbox Code Playgroud)

当我将 转为impl宏时,为什么需要用尖括号将类型本身括起来,如下所示?

macro_rules! impl_boundable {
    ($a:ty) => {
        impl Boundable<$a> for $a {
            fn max_value() -> $a { <$a>::MAX }
        }
    };
}

impl_boundable!(i8);
Run Code Online (Sandbox Code Playgroud)

尤其,<$a>::MAX。没有它,编译器会给我错误missing angle brackets in associated item path。我很困惑为什么宏代码需要与非宏代码不同。

操场

macros rust

9
推荐指数
1
解决办法
1445
查看次数

标签 统计

rust ×2

generics ×1

macros ×1