কমান্ড লাইন পরামিতি অ্যাক্সেস কিভাবে?


153

মরচে টিউটোরিয়াল কম্যান্ড লাইন থেকে প্যারামিটার নেয় কিভাবে ব্যাখ্যা করে নি। fn main()সমস্ত উদাহরণে খালি প্যারামিটার তালিকা দিয়ে দেখানো হয়েছে।

কমান্ড লাইন প্যারামিটারগুলি অ্যাক্সেস করার সঠিক উপায়টি কী main?

উত্তর:


168

আপনি std::env::argsবা std::env::args_osফাংশন ব্যবহার করে কমান্ড লাইন আর্গুমেন্ট অ্যাক্সেস করতে পারেন । উভয় ফাংশন আর্গুমেন্টের উপর একটি পুনরাবৃত্তি ফেরত দেয়। পূর্ববর্তী পুনরুক্তিগুলি String( যেগুলির সাথে কাজ করা সহজ) তবে প্যানিকগুলি যদি কোনও যুক্তি বৈধ ইউনিকোড না করে থাকে। দ্বিতীয়টি পুনরাবৃত্তি করে OsStringএবং কখনই আতঙ্কিত হয় না।

দ্রষ্টব্য যে পুনরাবৃত্তির প্রথম উপাদানটি নিজেই প্রোগ্রামটির নাম (এটি সমস্ত বড় ওএসের একটি কনভেনশন), সুতরাং প্রথম যুক্তিটি আসলে দ্বিতীয়টি পুনরাবৃত্ত উপাদান।

ফলাফলের সাথে মোকাবিলা করার একটি সহজ উপায় argsহ'ল এটিকে রূপান্তর করা Vec:

use std::env;

fn main() {
    let args: Vec<_> = env::args().collect();
    if args.len() > 1 {
        println!("The first argument is {}", args[1]);
    }
}

আপনি এই আর্গুমেন্টগুলির সাথে কাজ করতে পুরো স্ট্যান্ডার্ড আইট্রেটর টুলবক্স ব্যবহার করতে পারেন । উদাহরণস্বরূপ, শুধুমাত্র প্রথম যুক্তিটি পুনরুদ্ধার করতে:

use std::env;

fn main() {
    if let Some(arg1) = env::args().nth(1) {
        println!("The first argument is {}", arg1);
    }
}

কমান্ড লাইন যুক্তি পার্স করার জন্য আপনি ক্রেটস.আইওতে লাইব্রেরিগুলি খুঁজে পেতে পারেন :

  • ডকপট : আপনি কেবল সহায়তা বার্তাটি লিখুন, এবং আপনার জন্য পার্সিং কোড উত্পন্ন হয়।
  • তালি : আপনি সাবলীল এপিআই ব্যবহার করে পার্স করতে চান এমন বিকল্পগুলি বর্ণনা করে। ডকপ্টের চেয়ে দ্রুত এবং আপনাকে আরও নিয়ন্ত্রণ দেয়।
  • getopts : জনপ্রিয় সি লাইব্রেরির বন্দর। নিম্ন-স্তরের এবং আরও বেশি নিয়ন্ত্রণ।
  • স্ট্রোকপট : তালি উপরে নির্মিত, এটি ব্যবহার করা আরও বেশি এরগনোমিক

2
মরিচা 0.8 এর সাথে আপনার কেবল ব্যবহার করা উচিতprintln(args[0])
লিও কোরিয়া

6
উপরের মন্তব্যগুলি (@LooCorrea / @ S4M দ্বারা) উত্তরের একটি পুরানো সংস্করণ উল্লেখ করেছে; উত্তরের বর্তমান সংস্করণে সর্বাধিক আপ টু ডেট তথ্য রয়েছে।
নিকোলে

22

ডাস্টপট রাস্টের জন্যও উপলব্ধ, যা ব্যবহারের স্ট্রিং থেকে আপনার জন্য পার্সার তৈরি করে। মরচে বোনাস হিসাবে, একটি ম্যাক্রো স্বয়ংক্রিয়ভাবে কাঠামো তৈরি করতে এবং টাইপ ভিত্তিক ডিকোডিং করতে ব্যবহার করা যেতে পারে:

docopt!(Args, "
Usage: cp [-a] SOURCE DEST
       cp [-a] SOURCE... DIR

Options:
    -a, --archive  Copy everything.
")

এবং আপনি এর সাথে আরগগুলি পেতে পারেন:

let args: Args = Args::docopt().decode().unwrap_or_else(|e| e.exit());

README এবং ডকুমেন্টেশনে প্রচুর পরিপূর্ণ কাজের উদাহরণ রয়েছে।

দাবি অস্বীকার: আমি এই গ্রন্থাগারের অন্যতম লেখক।



10

আমার জন্য, গিওপটগুলি সর্বদা খুব নিম্ন স্তরের অনুভূত হয় এবং ডকপ্ট.আরএস খুব বেশি যাদু ছিল। আমি সুস্পষ্ট এবং সরল কিছু চাই যা এখনও আমার সমস্ত বৈশিষ্ট্যগুলির যদি প্রয়োজন হয় তবে তা সরবরাহ করে।

এখানেই তালি-আরএস কার্যকর হয়।
এটি পাইথন থেকে আরগপার্সের মতো কিছুটা অনুভব করে। এটি দেখতে কেমন লাগে তার একটি উদাহরণ এখানে দেওয়া হয়েছে:

let matches = App::new("myapp")
                      .version("1.0")
                      .author("Kevin K. <kbknapp@gmail.com>")
                      .about("Does awesome things")
                      .arg(Arg::with_name("CONFIG")
                           .short("c")
                           .long("config")
                           .help("Sets a custom config file")
                           .takes_value(true))
                      .arg(Arg::with_name("INPUT")
                           .help("Sets the input file to use")
                           .required(true)
                           .index(1))
                      .arg(Arg::with_name("debug")
                           .short("d")
                           .multiple(true)
                           .help("Sets the level of debugging information"))
                      .get_matches();

আপনি যেমন আপনার প্যারামিটার অ্যাক্সেস করতে পারেন:

println!("Using input file: {}", matches.value_of("INPUT").unwrap());

// Gets a value for config if supplied by user, or defaults to "default.conf"
let config = matches.value_of("CONFIG").unwrap_or("default.conf");
println!("Value for config: {}", config);

( সরকারী ডকুমেন্টেশন থেকে অনুলিপি করা )


1
আমি এই তালি পছন্দ করি - আরএস আপনাকে একটি ইমেল ফাইলটিতে আপনার ইন্টারফেসটি সংজ্ঞায়িত করতে দেয়। এছাড়াও, এটি সত্যিই দুর্দান্ত দেখাচ্ছে ব্যবহারের বিবৃতি তৈরি করে।
চক ওয়াটার্স

এটি আমাকে দ্রুত আমার সিএলআই অ্যাপ্লিকেশন সেট আপ করতে সহায়তা করেছে। ধন্যবাদ!
ডিমিটার্ভ

4

সংস্করণ 0.8 / 0.9 হিসাবে, ফাংশন আরগস () এর সঠিক পথটি হবে ::std::os::args, অর্থাত:

fn main() {
  let args: ~[~str] = ::std::os::args();
  println(args[0]);
}

দেখে মনে হচ্ছে এমনকি স্ট্যান্ডার্ড আইও দিয়ে মরিচা এখনই বেশ অস্থির।


আপডেটের জন্য ধন্যবাদ! অনুমান করুন 1.0 প্রকাশের পরে আমাকে গৃহীত উত্তরগুলি পুনর্বিবেচনা করতে হবে।
shutefan

3

মরিচা আবার পাল্টে গেল। os::args()পক্ষে হ্রাস করা হয় std::args()। তবে std::args()একটি অ্যারে নয়, এটি একটি পুনরাবৃত্তি প্রদান করে । আপনি কমান্ড লাইন আর্গুমেন্টগুলি দিয়ে পুনরাবৃত্তি করতে পারেন, তবে সাবস্ক্রিপ্টগুলির মাধ্যমে সেগুলি অ্যাক্সেস করতে পারবেন না।

http://doc.rust-lang.org/std/env/fn.args.html

আপনি যদি কমান্ড লাইনটি স্ট্রিংয়ের ভেক্টর হিসাবে আর্গুমেন্ট চান তবে এটি এখন কাজ করবে:

use std::env;
...
let args: Vec<String> = env::args().map(|s| s.into_string().unwrap()).collect();

মরিচা - পরিবর্তন ব্যথা আলিঙ্গন করতে শিখুন।


8
আপনার এখন কেবল দরকার env::args().collect()
tshepang

2

@ বারজাক যা বলেছেন তা স্ট্রিংয়ের জন্য কাজ করে, তবে আপনার যদি সংখ্যা হিসাবে যুক্তির প্রয়োজন হয় (এই ক্ষেত্রে একটি ইউিন্ট) আপনার এই জাতীয় রূপান্তর করতে হবে:

fn main() {
    let arg : ~[~str] = os::args();
    match uint::from_str(arg[1]){
         Some(x)=>io::println(fmt!("%u",someFunction(x))),
         None=>io::println("I need a real number")
    }
}

2

স্ট্রোকপটও পরীক্ষা করে দেখুন:

extern crate structopt;
#[macro_use]
extern crate structopt_derive;

use structopt::StructOpt;

#[derive(StructOpt, Debug)]
#[structopt(name = "example", about = "An example of StructOpt usage.")]
struct Opt {
    /// A flag, true if used in the command line.
    #[structopt(short = "d", long = "debug", help = "Activate debug mode")]
    debug: bool,

    /// An argument of type float, with a default value.
    #[structopt(short = "s", long = "speed", help = "Set speed", default_value = "42")]
    speed: f64,

    /// Needed parameter, the first on the command line.
    #[structopt(help = "Input file")]
    input: String,

    /// An optional parameter, will be `None` if not present on the
    /// command line.
    #[structopt(help = "Output file, stdout if not present")]
    output: Option<String>,
}

fn main() {
    let opt = Opt::from_args();
    println!("{:?}", opt);
}

https://github.com/TeXitoi/structopt


1

নতুন মরিচা সংস্করণ হিসাবে (মরিচা> 0.10 / 11) অ্যারে সিনট্যাক্স কাজ করবে না। আপনি গেট পদ্ধতিটি ব্যবহার করবেন।

[সম্পাদনা] অ্যারে সিনট্যাক্স রাতের বেলা (আবার) কাজ করে। সুতরাং আপনি গিটার বা অ্যারে সূচকগুলির মধ্যে চয়ন করতে পারেন।

use std::os;

fn main() {
  let args = os::args();
  println!("{}", args.get(1));
}

// Compile
 rustc args.rs && ./args hello-world // returns hello-world

এটি অপ্রচলিত বিবৃতি। সর্বশেষতম রাস্ট নাইটলাইজগুলি Vecএস ইনডেক্স সিনট্যাক্স সমর্থন করে । আমার ধারণা এটি এক মাস বা তার জন্য আছে। এই উদাহরণটি দেখুন ।
ভ্লাদিমির মাত্তেভ

1

মে ২০১৩ সাল থেকে ক্যালভিনের উত্তর থেকে মরিচা বিকশিত হয়েছে one এখন কেউ কমান্ড লাইনের যুক্তিগুলির সাথে পার্স করবে as_slice():

use std::os;

fn seen_arg(x: uint)
{       
    println!("you passed me {}", x);
}
fn main() {
    let args = os::args();
    let args = args.as_slice();
    let nitems = {
            if args.len() == 2 {
                    from_str::<uint>(args[1].as_slice()).unwrap()
            } else {
                    10000
            }
    };

    seen_arg(nitems);
}

কেবল রেকর্ডের জন্য: as_slice()আর উপস্থিত নেই এবং &argsপরিবর্তে ব্যবহার করা উচিত।
স্লাভা সেমুশিন

1

মরচে বই "না stdlib" অধ্যায় কভার কিভাবে কমান্ড লাইন প্যারামিটার (অন্য উপায়) অ্যাক্সেস করতে।

// Entry point for this program
#[start]
fn start(_argc: isize, _argv: *const *const u8) -> isize {
    0
}

এখন, উদাহরণটিও #![no_std]আমার রয়েছে বলে মনে হয় যা সাধারণত বলে থাকে যে স্টাড লাইব্রেরিতে আপনার বাইনারিটির সত্যিকারের প্রবেশের পয়েন্ট থাকবে এবং এটি একটি বিশ্বব্যাপী ফাংশন বলে main()। আরেকটি বিকল্প হ'ল ' mainশিম অক্ষম করুন ' #![no_main]। কোনটি যদি আমার ভুল না হয় তবে এটি সংকলককে বলছে যে কীভাবে আপনার প্রোগ্রামটি শুরু হচ্ছে তার উপরে আপনি সম্পূর্ণ নিয়ন্ত্রণ নিচ্ছেন।

#![no_std]
#![no_main]

#[no_mangle] // ensure that this symbol is called `main` in the output
pub extern fn main(argc: isize, argv: *const *const u8) -> isize {
    0
}

আপনারা যা করতে চান তা হ'ল কমান্ড লাইন আর্গুমেন্টগুলি পড়লে জিনিসগুলি করার এটি একটি 'ভাল' উপায় বলে আমি মনে করি না। std::osমডিউল অন্যান্য উত্তর উল্লেখিত জিনিসগুলি একটি অনেক ভালো উপায় বলে মনে হয়। আমি এই উত্তরটি সম্পূর্ণ করার জন্য পোস্ট করছি।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.