小编spe*_*ase的帖子

有没有办法表示 OsStr 或 OsString 文字?

我想OsStr为将发生多次的扩展比较定义一个常量。例如:

const DCM_EXTENSION: Option<&'static OsStr> = Some("dcm");
const DCM_EXTENSION: Option<&'static OsStr> = Some(OsStr::new("dcm"));
Run Code Online (Sandbox Code Playgroud)

这应该使进行比较变得微不足道且可靠:

if entry.file_type().is_file() && entry.path().extension() == DCM_EXTENSION:
Run Code Online (Sandbox Code Playgroud)

由于缺少 const fn 和类型不匹配,这两种方法都不起作用。

我目前的解决方法是在进行任何比较之前在运行时进行转换:

const DCM_EXTENSION_STR: Option<&'static str> = Some("dcm");

main!(|args: Cli, log_level: verbosity| {
    let dcm_extension = DCM_EXTENSION_STR.map(OsStr::new);
    // ...
});
Run Code Online (Sandbox Code Playgroud)

我认为这避免了lazy_static 会施加的每次访问惩罚,并计算出可以忽略不计的一次性运行时惩罚。

rust

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

如何配置 Serde 以使用枚举变体的判别式而不是名称?

我正在解析一个使用整数作为枚举器的 INI 样式文件。

#[derive(Debug, Deserialize, Serialize)]
pub enum MyThing {
    First = 0,
    Second = 1,
    Third = 2,
}
Run Code Online (Sandbox Code Playgroud)

在文件中,该值将被序列化,如下所示:

#[derive(Debug, Deserialize, Serialize)]
pub enum MyThing {
    First = 0,
    Second = 1,
    Third = 2,
}
Run Code Online (Sandbox Code Playgroud)

但是,Serde 默认情况下匹配变体名称而不是判别式。定制实施是Deserialize最简洁的方法吗?

enums rust serde

5
推荐指数
1
解决办法
2760
查看次数

正确呈现actix-web端点处理程序的HTML输出的最简单方法是什么?

我已经用 actix-web 定义了一个端点,如下所示:

#[derive(Deserialize)]
struct RenderInfo {
    filename: String,
}

fn render(info: actix_web::Path<RenderInfo>) -> Result<String> {
    // ...
}
Run Code Online (Sandbox Code Playgroud)
App::new()
    .middleware(middleware::Logger::Default())
    .resource("/{filename}", |r| r.get().with(render))
Run Code Online (Sandbox Code Playgroud)

我遇到的问题是原始 HTML 显示在浏览器中而不是被呈现。我认为内容类型设置不正确。

我看到的大多数 actix-web 示例都用于impl Responder返回类型,但我无法弄清楚如何解决造成的类型推断问题。原因似乎与返回基于标准failure::Error类型的文件操作有关。看起来 actix_web 需要实现一个特殊的WebError来阻止错误的意外传播。对于这个特定的例子,我并不在乎,因为它更像是一个内部工具。

rust rust-actix

5
推荐指数
1
解决办法
1674
查看次数

在 Rust 中散列读者的正确方法?

我试图使用twox-hash为文件生成哈希,因为它似乎是最快的哈希实现,并且安全性不是此实现的问题。

为了让它与读者一起工作,我实现了一个包装器结构,该结构实现了该特征并直接从该特征Write调用。有没有更优雅或更标准的方法来做到这一点?XxHash::writeHash

#[derive(Deref)]
struct HashWriter<T: Hasher>(T);

impl<T: Hasher> std::io::Write for HashWriter<T> {
    fn write(&mut self, buf: &[u8]) -> std::io::Result<usize> {
        self.0.write(buf);
        Ok(buf.len())
    }

    fn flush(&mut self) -> std::io::Result<()> {
        Ok(())
    }
}
Run Code Online (Sandbox Code Playgroud)

hash rust

4
推荐指数
1
解决办法
1039
查看次数

使用serde将键和值列表反序列化为来自JSON的结构体?

我有这样的JSON:

{
    "fieldNames": ["MyInt", "MyFloat", "MyString"],
    "fieldValues": [5, 10.0, "hello"],
}
Run Code Online (Sandbox Code Playgroud)

我想反序列化为这样的结构:

#[derive(Deserialize)]
struct MyStruct {
    my_int: u64,
    my_float: f64,
    my_string: String,
}
Run Code Online (Sandbox Code Playgroud)

有没有办法用serde做到这一点?理想情况下,我想要的是:

#[serde(keys="fieldNames", values="fieldValues")]
Run Code Online (Sandbox Code Playgroud)

json rust serde

3
推荐指数
1
解决办法
611
查看次数

使用nom解析整数会导致不完整

我尝试的一切都给了我Incomplete(Size(1)).我现在最好的猜测是:

named!(my_u64(&str) -> u64,
    map_res!(recognize!(nom::digit), u64::from_str)
);
Run Code Online (Sandbox Code Playgroud)

测试:

#[cfg(test)]
mod test {
    #[test]
    fn my_u64() {
        assert_eq!(Ok(("", 0)), super::my_u64("0"));
    }
}
Run Code Online (Sandbox Code Playgroud)

有时在我的变体(例如添加complete!)中,如果我在最后添加一个字符,我已经能够解析它.

我想得到一个工作解析(最终我希望这将允许我为u64包装类型创建一个解析器)但更大的图片我想了解如何正确地自己构建一个解析器.

rust nom

3
推荐指数
2
解决办法
857
查看次数

标签 统计

rust ×6

serde ×2

enums ×1

hash ×1

json ×1

nom ×1

rust-actix ×1