rust - Rust 中的文字字符串和 Args 有什么区别?

标签 rust

我有一个使用正则表达式的字符串解析函数:fn parse(s: &str) -> Option<MyObj> .它在使用 parse("test string") 进行测试时有效.但是在使用 Args 时失败了.失败是正则表达式无法匹配 s 中的任何内容.

我使用的方式 Args是:args().map(|arg| parse(&arg)).collect() .我在这里看不到类型错误。和 printlnparse显示s与“测试字符串”相同的字符串。


更新了我的描述。我不确定我的问题是否与 String 和 str 的不同有关。因为我用的是 str还是失败了。

extern crate regex;

use regex::Regex;
use std::env::args;

struct IPRange {
    start: u32,
    mask: u8,
}

fn parse_iprange(ipr: &str) -> Option<IPRange> {
    let parser = Regex::new(
        r"^(\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})/(\d+|\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})$",
    )
    .unwrap();
    let caps = parser.captures(ipr).unwrap();
    return Some(IPRange { start: 0, mask: 0 });
}

fn main() {
    let v: Vec<_> = args().map(|arg| parse_iprange(&arg)).collect();
}
$ RUST_BACKTRACE=1 cargo run 192.168.3.1/24
    Finished dev [unoptimized + debuginfo] target(s) in 0.04s
     Running `target/debug/ip_helper 192.168.3.1/24`
thread 'main' panicked at 'called `Option::unwrap()` on a `None` value', src/libcore/option.rs:345:21
stack backtrace:
   0: std::sys::unix::backtrace::tracing::imp::unwind_backtrace
             at src/libstd/sys/unix/backtrace/tracing/gcc_s.rs:39
   1: std::sys_common::backtrace::_print
             at src/libstd/sys_common/backtrace.rs:70
   2: std::panicking::default_hook::{{closure}}
             at src/libstd/sys_common/backtrace.rs:58
             at src/libstd/panicking.rs:200
   3: std::panicking::default_hook
             at src/libstd/panicking.rs:215
   4: std::panicking::rust_panic_with_hook
             at src/libstd/panicking.rs:478
   5: std::panicking::continue_panic_fmt
             at src/libstd/panicking.rs:385
   6: rust_begin_unwind
             at src/libstd/panicking.rs:312
   7: core::panicking::panic_fmt
             at src/libcore/panicking.rs:85
   8: core::panicking::panic
             at src/libcore/panicking.rs:49
   9: <core::option::Option<T>>::unwrap
             at /rustc/2aa4c46cfdd726e97360c2734835aa3515e8c858/src/libcore/macros.rs:10
  10: ip_helper::parse_iprange
             at src/main.rs:18

最佳答案

args()的第一项是实现行为:

The first element is traditionally the path of the executable, but it can be set to arbitrary text, and may not even exist. This means this property should not be relied upon for security purposes.

因此,您应该跳过它:

let v: Vec<_> = args().skip(1).map(|arg| parse_iprange(&arg)).collect();

关于rust - Rust 中的文字字符串和 Args 有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55488254/

相关文章:

rust - 反序列化具有通用类型的可选结构字段会导致语义怪异

copy - 如果可能,是否应该始终实现 Copy 特性?

rust - 如何将元组作为参数传递以便在稳定的 Rust 中顺序应用具有多个返回值的函数?

rust - 如何在 Rust 中声明类型为 <&str, String> 的 hashmap?

rust - 我可以对 trait 对象进行类型自省(introspection),然后向下转型吗?

rust - 如何使用从 rust Vec 中提取的参数列表调用可变参数 C 函数?

rust - 使用结构实现中的特征方法

asynchronous - 如何转换 future 的输出?

reference - let r1 =&s;和有什么区别?并令r1 =&mut s?

rust - "does not necessarily outlive the lifetime"问题