66425


現在Redditから拾ってきた任意の範囲の素数を漏れなく求めるプログラムを自分なりに改良しています。  
そこで気になったのが、`std::env::args()`が文字リテラルを生成してしまう点です。

### 伺いたいこと

このようなコードがあった場合、どのようにして、引数を取らせばよいのでしょうか？

[code]

    fn t_or_f(x1: i64, ps1: &Vec<i64>) -> bool {
        for p1 in ps1 {
            if p1 * p1 > x1 {
                 break; 
            } else if x1 % p1 == 0 {
                 return false; 
                }
        }
        true
    }
    fn prime(n1: i64) {
        let mut ps2 = vec![2];
        let mut x2 = 3;
        while x2 <= n1 {
            if t_or_f(x2, &ps2) {
                ps2.push(x2);
            }
            x2 += 2;
        }
        println!("{:?}", ps2);
    }
    
    fn main() {
       prime(100); //ここの関数prime()に任意の数nを受け取らせるギミックを施したい。
    }
    
[/code]

いつもは`std::env::args()`で解決した問題でしたが、今回はprime()が`i64`整数を取るため悩んでいます。

### 追記

回答者様のアドバイスを適用してみた所、`cargo test`は問題なく通りましたが、`cargo test
100`を実行してみた所以下のようなエラーで異常終了してしましました。

**現時点のコード**

[code]

    fn t_or_f(x1: i64, ps1: &Vec<i64>) -> bool {
        for p1 in ps1 {
            if p1 * p1 > x1 {
                 break; 
            } else if x1 % p1 == 0 {
                 return false; 
                }
        }
        true
    }
    fn prime(n1: i64) {
        let mut ps2 = vec![2];
        let mut x2 = 3;
        while x2 <= n1 {
            if t_or_f(x2, &ps2) {
                ps2.push(x2);
            }
            x2 += 2;
        }
        println!("{:?}", ps2);
    }
    
    fn main() {
        let arg: String = std::env::args().next().unwrap();
        let p: i64 = arg.parse().unwrap();
       prime(p);
    }
    
[/code]

`cargo test`の内容

[code]

        Finished dev [unoptimized + debuginfo] target(s) in 0.03s                                                                           
         Running target\debug\deps\viewp-a9faf854653fbc3d.exe
    
    running 0 tests
    
    test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out
    
[/code]

`cargo run 100`の内容

[code]

        Finished dev [unoptimized + debuginfo] target(s) in 0.05s
         Running `target\debug\viewp.exe`
    thread 'main' panicked at 'called `Result::unwrap()` on an `Err` value: ParseIntError { kind: InvalidDigit }', src\libcore\result.rs:999:5
    note: Run with `RUST_BACKTRACE=1` environment variable to display a backtrace.
    error: process didn't exit successfully: `target\debug\viewp.exe` (exit code: 101)
    
[/code]

`RUST_BACKTRACE=1`を適用した結果

[code]

        Finished dev [unoptimized + debuginfo] target(s) in 0.03s
         Running `target\debug\viewp.exe 100`
    thread 'main' panicked at 'called `Result::unwrap()` on an `Err` value: ParseIntError { kind: InvalidDigit }', src\libcore\result.rs:999:5
    stack backtrace:
       0: std::sys::windows::backtrace::set_frames
                 at /rustc/9eac386342c601b14311b435f2b6d314fc817bb5\/src\libstd\sys\windows\backtrace\mod.rs:94
       1: std::sys::windows::backtrace::set_frames
                 at /rustc/9eac386342c601b14311b435f2b6d314fc817bb5\/src\libstd\sys\windows\backtrace\mod.rs:94
       2: std::sys::windows::backtrace::set_frames
                 at /rustc/9eac386342c601b14311b435f2b6d314fc817bb5\/src\libstd\sys\windows\backtrace\mod.rs:94
       3: std::sys_common::backtrace::print
                 at /rustc/9eac386342c601b14311b435f2b6d314fc817bb5\/src\libstd\sys_common\backtrace.rs:58
       4: std::sys_common::backtrace::print
                 at /rustc/9eac386342c601b14311b435f2b6d314fc817bb5\/src\libstd\sys_common\backtrace.rs:58
       5: std::panicking::default_hook
                 at /rustc/9eac386342c601b14311b435f2b6d314fc817bb5\/src\libstd\panicking.rs:215
       6: std::panicking::rust_panic_with_hook
                 at /rustc/9eac386342c601b14311b435f2b6d314fc817bb5\/src\libstd\panicking.rs:478
       7: std::panicking::continue_panic_fmt
                 at /rustc/9eac386342c601b14311b435f2b6d314fc817bb5\/src\libstd\panicking.rs:385
       8: std::panicking::rust_begin_panic
                 at /rustc/9eac386342c601b14311b435f2b6d314fc817bb5\/src\libstd\panicking.rs:312
       9: core::panicking::panic_fmt
                 at /rustc/9eac386342c601b14311b435f2b6d314fc817bb5\/src\libcore\panicking.rs:85
      10: core::result::unwrap_failed<core::num::ParseIntError>
                 at /rustc/9eac386342c601b14311b435f2b6d314fc817bb5\src\libcore\macros.rs:16
      11: core::result::Result<i64, core::num::ParseIntError>::unwrap<i64,core::num::ParseIntError>
                 at /rustc/9eac386342c601b14311b435f2b6d314fc817bb5\src\libcore\result.rs:798
      12: viewp::main
                 at .\src\main.rs:25
      13: std::rt::lang_start::{{closure}}<()>
                 at /rustc/9eac386342c601b14311b435f2b6d314fc817bb5\src\libstd\rt.rs:64
      14: std::rt::lang_start_internal::{{closure}}
                 at /rustc/9eac386342c601b14311b435f2b6d314fc817bb5\/src\libstd\rt.rs:49
      15: std::rt::lang_start_internal::{{closure}}
                 at /rustc/9eac386342c601b14311b435f2b6d314fc817bb5\/src\libstd\rt.rs:49
      16: panic_unwind::__rust_maybe_catch_panic
                 at /rustc/9eac386342c601b14311b435f2b6d314fc817bb5\/src\libpanic_unwind\lib.rs:92
      17: std::panicking::try
                 at /rustc/9eac386342c601b14311b435f2b6d314fc817bb5\/src\libstd\panicking.rs:276
      18: std::panicking::try
                 at /rustc/9eac386342c601b14311b435f2b6d314fc817bb5\/src\libstd\panicking.rs:276
      19: std::panicking::try
                 at /rustc/9eac386342c601b14311b435f2b6d314fc817bb5\/src\libstd\panicking.rs:276
      20: std::rt::lang_start<()>
                 at /rustc/9eac386342c601b14311b435f2b6d314fc817bb5\src\libstd\rt.rs:64
      21: main
      22: invoke_main
                 at d:\agent\_work\4\s\src\vctools\crt\vcstartup\src\startup\exe_common.inl:78
      23: invoke_main
                 at d:\agent\_work\4\s\src\vctools\crt\vcstartup\src\startup\exe_common.inl:78
      24: BaseThreadInitThunk
      25: RtlUserThreadStart
    error: process didn't exit successfully: `target\debug\viewp.exe 100` (exit code: 101)
    
[/code]


CC BY-SA 4.0
2020-05-08T02:51:18.077
66410
2020-05-08T06:55:32.383
2020-05-08T04:52:24.217
30493
30493
question
rust
任意の引数（std::env:args()）を数値として受け取り関数に渡すには？


[String::parse](https://doc.rust-
lang.org/std/string/struct.String.html#method.parse) を使うことで文字列を整数に変換できます。

[code]

    fn main() {
        let arg: String = std::env::args().next().unwrap();
        let arg: i64 = arg.parse().unwrap();
    }
    
[/code]


CC BY-SA 4.0
2020-05-08T03:14:19.540
66415
2020-05-08T03:14:19.540
40049
66410
answer


追記に対する回答です。[Argsのドキュメント](https://doc.rust-lang.org/std/env/struct.Args.html)に

> 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.

とあるので、0番目の要素ではなく1番目の要素をとればいいかと思います。

[code]

    fn main() {
        let arg: String = std::env::args().nth(1).unwrap();
        let arg: i64 = arg.parse().unwrap();
    }
    
[/code]


CC BY-SA 4.0
2020-05-08T06:55:32.383
66425
2020-05-08T06:55:32.383
12269
66410
answer