মরচে টিউটোরিয়াল কম্যান্ড লাইন থেকে প্যারামিটার নেয় কিভাবে ব্যাখ্যা করে নি। fn main()
সমস্ত উদাহরণে খালি প্যারামিটার তালিকা দিয়ে দেখানো হয়েছে।
কমান্ড লাইন প্যারামিটারগুলি অ্যাক্সেস করার সঠিক উপায়টি কী main
?
মরচে টিউটোরিয়াল কম্যান্ড লাইন থেকে প্যারামিটার নেয় কিভাবে ব্যাখ্যা করে নি। fn main()
সমস্ত উদাহরণে খালি প্যারামিটার তালিকা দিয়ে দেখানো হয়েছে।
কমান্ড লাইন প্যারামিটারগুলি অ্যাক্সেস করার সঠিক উপায়টি কী main
?
উত্তর:
আপনি 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);
}
}
কমান্ড লাইন যুক্তি পার্স করার জন্য আপনি ক্রেটস.আইওতে লাইব্রেরিগুলি খুঁজে পেতে পারেন :
ডাস্টপট রাস্টের জন্যও উপলব্ধ, যা ব্যবহারের স্ট্রিং থেকে আপনার জন্য পার্সার তৈরি করে। মরচে বোনাস হিসাবে, একটি ম্যাক্রো স্বয়ংক্রিয়ভাবে কাঠামো তৈরি করতে এবং টাইপ ভিত্তিক ডিকোডিং করতে ব্যবহার করা যেতে পারে:
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 এবং ডকুমেন্টেশনে প্রচুর পরিপূর্ণ কাজের উদাহরণ রয়েছে।
দাবি অস্বীকার: আমি এই গ্রন্থাগারের অন্যতম লেখক।
মরচে হয়েছে getopt
-style CLI যুক্তি পার্স getopts বাক্স ।
আমার জন্য, গিওপটগুলি সর্বদা খুব নিম্ন স্তরের অনুভূত হয় এবং ডকপ্ট.আরএস খুব বেশি যাদু ছিল। আমি সুস্পষ্ট এবং সরল কিছু চাই যা এখনও আমার সমস্ত বৈশিষ্ট্যগুলির যদি প্রয়োজন হয় তবে তা সরবরাহ করে।
এখানেই তালি-আরএস কার্যকর হয়।
এটি পাইথন থেকে আরগপার্সের মতো কিছুটা অনুভব করে। এটি দেখতে কেমন লাগে তার একটি উদাহরণ এখানে দেওয়া হয়েছে:
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);
( সরকারী ডকুমেন্টেশন থেকে অনুলিপি করা )
সংস্করণ 0.8 / 0.9 হিসাবে, ফাংশন আরগস () এর সঠিক পথটি হবে ::std::os::args
, অর্থাত:
fn main() {
let args: ~[~str] = ::std::os::args();
println(args[0]);
}
দেখে মনে হচ্ছে এমনকি স্ট্যান্ডার্ড আইও দিয়ে মরিচা এখনই বেশ অস্থির।
মরিচা আবার পাল্টে গেল। 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();
মরিচা - পরিবর্তন ব্যথা আলিঙ্গন করতে শিখুন।
env::args().collect()
।
@ বারজাক যা বলেছেন তা স্ট্রিংয়ের জন্য কাজ করে, তবে আপনার যদি সংখ্যা হিসাবে যুক্তির প্রয়োজন হয় (এই ক্ষেত্রে একটি ইউিন্ট) আপনার এই জাতীয় রূপান্তর করতে হবে:
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")
}
}
স্ট্রোকপটও পরীক্ষা করে দেখুন:
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);
}
নতুন মরিচা সংস্করণ হিসাবে (মরিচা> 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
এস ইনডেক্স সিনট্যাক্স সমর্থন করে । আমার ধারণা এটি এক মাস বা তার জন্য আছে। এই উদাহরণটি দেখুন ।
মে ২০১৩ সাল থেকে ক্যালভিনের উত্তর থেকে মরিচা বিকশিত হয়েছে 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
পরিবর্তে ব্যবহার করা উচিত।
মরচে বই "না 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
মডিউল অন্যান্য উত্তর উল্লেখিত জিনিসগুলি একটি অনেক ভালো উপায় বলে মনে হয়। আমি এই উত্তরটি সম্পূর্ণ করার জন্য পোস্ট করছি।
println(args[0])