我有一个使用正则表达式的字符串解析函数:fn parse(s: &str) -> Option<MyObj>
.它在使用 parse("test string")
进行测试时有效.但是在使用 Args
时失败了.失败是正则表达式无法匹配 s
中的任何内容.
我使用的方式 Args
是:args().map(|arg| parse(&arg)).collect()
.我在这里看不到类型错误。和 println
在parse
显示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/