В чем разница между литеральной строкой и Args в Rust? - PullRequest
0 голосов
/ 03 апреля 2019

У меня есть функция разбора строки с использованием регулярного выражения: 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

1 Ответ

2 голосов
/ 03 апреля 2019

Первый элемент args() - это поведение реализации:

Первый элемент традиционно представляет собой путь к исполняемому файлу, но он может быть установлен на произвольный текст и может даже не существовать. Это означает, что на это свойство нельзя полагаться в целях безопасности.

Итак, вы должны пропустить это в вашем случае:

let v: Vec<_> = args().skip(1).map(|arg| parse_iprange(&arg)).collect();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...