কোনও স্ট্রিংকে মরিচায় রূপান্তর করবেন?


186

দ্রষ্টব্য: এই প্রশ্নটিতে অবমানিত প্রাক -১.০ কোড রয়েছে! যদিও উত্তরটি সঠিক।

একটি রূপান্তর করতে strএকটি থেকে intমরচে এ, আমি এই কাজ করতে পারেন:

let my_int = from_str::<int>(my_str);

একমাত্র উপায় আমি কিভাবে রূপান্তর করতে জানি Stringএকটি থেকে intএটি একটি ফালি পেতে এবং তারপর ব্যবহার করা হয় from_str, যাতে মত করুন:

let my_int = from_str::<int>(my_string.as_slice());

একটি উপায় আছে সরাসরি একটি রূপান্তর করতে হয় Stringএকটি থেকে int?


1
আরও দেখুন: স্টেইনওভারফ্লো.com / q / 32381414 / 500207 দশমিক নয় (যেমন, হেক্স)।
আহমেদ ফসিহ

2
কিছুটা সুস্পষ্ট, তবে যে কেউ এই প্রশ্নটি 2014 এর পরে ভালভাবে খুঁজে পেয়েছে এবং কেন_জাস্টার সুযোগ নেই তা ভেবে অবাক হচ্ছেন, এটি উপস্থাপনায় নেই। use std::str::FromStr;এটি স্থির করে আপনি চাইলে from_str এ আরও বেশি। doc.rust-lang.org/std/str/trait.FromStr.html#tymethod.from_str
-l04

উত্তর:


259

আপনি str::parse::<T>()পদ্ধতিটি ব্যবহার করে সরাসরি কোনও ইন্টে রূপান্তর করতে পারেন ।

let my_string = "27".to_string();  // `parse()` works with `&str` and `String`!
let my_int = my_string.parse::<i32>().unwrap();

আপনি টার্বোফিশ অপারেটর ( ::<>) এর সাথে পার্স করার জন্য টাইপটি উপরে বর্ণিত বা স্পষ্ট প্রকারের টীকা দ্বারা নির্দিষ্ট করতে পারেন:

let my_int: i32 = my_string.parse().unwrap();

মন্তব্যে উল্লিখিত হিসাবে, parse()রি ResultErrস্ট্রিংটি নির্দিষ্ট ধরণের হিসাবে পার্স করা না গেলে এই ফলাফলটি হবে (উদাহরণস্বরূপ, স্ট্রিংটিকে "peter"পার্স করা যায় না i32)।


35
নোট করুন যে parseএকটি প্রদান করেResult , তাই আপনাকে প্রকৃত অবিচ্ছেদ্য ধরণের কাছে যেতে উপযুক্তভাবে এটি মোকাবেলা করতে হবে।
শেপমাস্টার

54
let my_u8: u8 = "42".parse::<u8>().unwrap();
let my_u32: u32 = "42".parse::<u32>().unwrap();

// or, to be safe, match the `Err`
match "foobar".parse::<i32>() {
  Ok(n) => do_something_with(n),
  Err(e) => weep_and_moan(),
}

str::parse::<u32>একটি Result<u32, core::num::ParseIntError>এবং Result::unwrap"ফলাফলকে মোড়ক Okদেয়, মান [বা] Errআতঙ্কের বিষয়বস্তু সরবরাহ করে যদি মান হয় তবে Errএর মান দ্বারা সরবরাহিত আতঙ্কিত বার্তা ।"

str::parseএকটি জেনেরিক ফাংশন , তাই কোণ বন্ধনী টাইপ করুন।


9
আপনি যদি ভেরিয়েবলের প্রকার ( let my_u8: u8) উল্লেখ করেন তবে আপনার কোণ বন্ধনীগুলির মান প্রয়োজন হবে না। এছাড়াও লক্ষ করুন যে প্রচলিত মরিচা শৈলীটি নির্দেশ করে যে :বাম দিকে আটকে থাকা উচিত।
শেপমাস্টার 4:51

5
বিশেষত, আমি বোঝাতে let my_u32: u32 = "42".parse().unwrap()
চাইছি

9

আপনি যদি আপনার স্ট্রিংটি থেকে পান তবে আপনাকে stdin().read_lineপ্রথমে এটি ছাঁটাই করতে হবে।

let my_num: i32 = my_num.trim().parse()
   .expect("please give me correct string number!");

6

একটি সাম্প্রতিক রাত্রে, আপনি এটি করতে পারেন:

let my_int = from_str::<int>(&*my_string);

এখানে যা ঘটছে তা হ'ল Stringএটিকে এখন একটি হিসাবে চিহ্নিত করা যেতে পারে str। যাইহোক, ফাংশনটি একটি চায় &str, তাই আমাদের আবার ধার নিতে হবে। রেফারেন্সের জন্য, আমি বিশ্বাস করি যে এই নির্দিষ্ট প্যাটার্নটিকে ( &*) বলা হয় "ক্রস-বোনিং"।


ঠিক আছে আমি রাতের বেলা নেই তবে আমি এটি একটি উত্তর হিসাবে গ্রহণ করব যেহেতু আমি আসলে Stringএক পর্যায়ে একটিটিকে অবলম্বন করার চেষ্টা করেছি এবং আশা করি এটি কার্যকর হবে।
এমটাহেমেড

2
বিকল্পভাবে, আপনি my_sttring.as_slice()হিসাবে প্রকাশ করতে পারেন my_string[](বর্তমানে slicing_syntaxবৈশিষ্ট্যযুক্ত, তবে সম্ভবত এটির কোনও রূপ ভাষাতেই শেষ হবে)।
টেম্পেস্টেপডেপ

1

আপনি FromStrবৈশিষ্ট্যের from_strপদ্ধতিটি ব্যবহার করতে পারেন , যা এর জন্য প্রয়োগ করা হয় i32:

let my_num = i32::from_str("9").unwrap_or(0);

0

ভাল, না। কেন সেখানে থাকা উচিত? আপনার আর প্রয়োজন না হলে কেবল স্ট্রিংটি বাতিল করুন।

&strStringযখন আপনাকে কেবল একটি স্ট্রিং পড়তে হবে তার চেয়ে বেশি দরকারী , কারণ এটি কেবলমাত্র তথ্যের মূল অংশে দেখা যায়, এর মালিক নয়। আপনি এটির চেয়ে সহজেই এটিকে পাস করতে পারেন String, এবং এটি অনুলিপিযোগ্য, সুতরাং এটি অনুরোধ পদ্ধতিগুলি দ্বারা গ্রাস করা হয় না। এক্ষেত্রে এটি আরও সাধারণ: আপনার যদি একটি থাকে তবে আপনি Stringএটি যেখান &strথেকে প্রত্যাশিত সেখানে পৌঁছে দিতে পারেন, তবে যদি আপনার কাছে থাকে তবে আপনি &strকেবল Stringনতুন বরাদ্দ দিলে প্রত্যাশিত কার্যগুলিতেই এটি পাস করতে পারেন ।

আপনি এই দুটিয়ের মধ্যে পার্থক্য এবং অফিসিয়াল স্ট্রিং গাইডে কখন এগুলি ব্যবহার করবেন সে সম্পর্কে আরও সন্ধান করতে পারেন ।


হ্যাঁ, আমার মতে, "কেন সেখানে থাকা উচিত" এর একটি স্পষ্ট কারণ হ'ল স্ট্রিংয়ের .as_slice()জন্য আমাকে যতবার করার প্রয়োজন হবে তা করতে হবে না from_str। কমান্ড লাইন আর্গুমেন্ট, উদাহরণস্বরূপ, এক স্থান যেখানে আমি from_strসমস্ত int
আর্গগুলিতে

as_slice()স্ট্রিং হ্যান্ডলিংয়ের একটি ছোটখাটো দিক। উদাহরণস্বরূপ, আপনি স্লাইসিং সিনট্যাক্স ( s[]) ব্যবহার করতে পারেন বা Derefজবরদস্তি ( &*s) ব্যবহার করতে পারেন । এমনকি এমন একটি প্রস্তাব রয়েছে যা কেবল লিখতে দেয় &s
ভ্লাদিমির মাত্তেভ

Ooooh! &sএকটি স্ট্রিং জন্য কি করবে ? এটি কি একটি strফিরে দিতে হবে? আপনি কি আমাকে প্রস্তাব দিতে পারেন?
এমটাহেমেড

1
প্রথমত, strআপনি যা নিয়ে কাজ করছেন তা নয়; এটা হয় &str। এগুলি আলাদা (তবে সম্পর্কিত)। পূর্ববর্তীটি হ'ল গতিশীল আকারের ধরণের যা আপনি প্রায়শই সরাসরি ব্যবহার করতে পারবেন না, তবে পরেরটি একটি স্ট্রিং স্লাইস যা ফ্যাট পয়েন্টার। প্রস্তাবটিকে ডেরেফ জবরদস্তি বলা হয় ; তা থেকে বাধ্য করতে সম্ভব হবে &Tথেকে &Uযদি T: Deref<U>। যেহেতু String: Deref<str>ইতিমধ্যে, আপনি প্রাপ্ত করতে সক্ষম হবে &strথেকে Stringমাত্র সঙ্গে &। এটি এখনও আলোচনায় রয়েছে তবে আমি সন্দেহ করি যে এটি 1.0 এর আগেই ঘটবে - খুব কম সময় বাকি আছে।
ভ্লাদিমির মাত্তেভ

-1

সুতরাং মূলত আপনি একটি স্ট্রিংকে ডানকে পূর্ণসংখ্যায় রূপান্তর করতে চান! এখানে আমি বেশিরভাগ ব্যবহার করি এবং এটি সরকারী নথিতেও উল্লেখ করা আছে ..

fn main() {

    let char = "23";
    let char : i32 = char.trim().parse().unwrap();
    println!("{}", char + 1);

}

এটি স্ট্রিং এবং এন্ডআর উভয়ের পক্ষে কাজ করে আশা করি এটিও সহায়তা করবে।

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