我想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 会施加的每次访问惩罚,并计算出可以忽略不计的一次性运行时惩罚。
我正在解析一个使用整数作为枚举器的 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最简洁的方法吗?
我已经用 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来阻止错误的意外传播。对于这个特定的例子,我并不在乎,因为它更像是一个内部工具。
我试图使用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) 我有这样的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) 我尝试的一切都给了我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包装类型创建一个解析器)但更大的图片我想了解如何正确地自己构建一个解析器.