जवाबों:
मान लें कि आपके पास कुछ x है जो IntoIterator Trait को लागू करता है और आपको एक फ़ंक्शन f को कॉल करने की आवश्यकता है जो एक तत्व का सूचकांक और एक संदर्भ लेता है। ऐसा करने का मानक तरीका है
x.iter().enumerate().map(f)
इसके बजाय आप कर सकते हैं
(0..).zip(x).map(f)
और अपने आप को न केवल असामान्य रूप से लंबे समय तक बचाने के लिए, बल्कि पुनरावृति के लिए भी कॉल करें!
यदि आपको कई परिवर्तनशील चर की आवश्यकता है, तो यह उन्हें घोषित करने और उन्हें आरंभ करने के लिए बहुत सारे स्थान को बर्बाद कर सकता है, क्योंकि प्रत्येक को मूस कीवर्ड की आवश्यकता होती है और आप = b = c = 0 जैसे कुछ भी नहीं कर सकते। एक समाधान तो एक परिवर्तनशील सरणी घोषित करना है
let mut a=[0;5];
जब भी आप उन्हें एक सामान्य चर के रूप में उपयोग करते हैं, तो आप हर बार 3 अतिरिक्त बाइट खर्च करते हैं:
a[0]+=1;
लेकिन यह अक्सर इसके लायक हो सकता है।
एक ही चाल के लिए टुपल्स का उपयोग करना अक्सर बेहतर विकल्प होता है:
let mut t=(1,4,"this", 0.5, 'c');
यह सरणी के प्रत्येक उपयोग पर एक बाइट को बचाने का लाभ है:
t.0=2
यह उन्हें विभिन्न प्रकार के होने की सुविधा भी देता है। नकारात्मक पक्ष पर, इसे आरंभ करने के लिए अधिक वर्णों की आवश्यकता होती है।
&str
हो रहा हैString
ये कभी न करें:
s.to_string() // 13 bytes
s.to_owned() // 12 bytes
यह हमेशा छोटा होता है:
s.repeat(1) // 11 bytes
यदि s
एक स्ट्रिंग शाब्दिक है:
format!(s) // 10 bytes
उदाहरण के लिए: 2 बाइट्स को बचाने के format!("")
बजाय उपयोग करें String::new()
।
यदि प्रकार का निष्कर्ष कार्य करता है:
s.into() // 8 bytes
उदाहरण के लिए स्ट्रिंग फ़ॉर्मेटिंग का उपयोग करते समय print!()
, कोई भी एक आइटम के लिए प्रति प्रारूप एक बाइट को बचाने के लिए गिने और अनावश्यक दोनों प्रकार के फॉर्मेटर्स का उपयोग कर सकता है:
एक उदाहरण के साथ सबसे अच्छा दिखाया:
fn main(){
print!("{}{}{}. Yes, {0}{}{2}. All you other{1}{2}s are just imitating.",
"I'm",
" Slim",
" Shady",
" the real");
}
कौन से आउटपुट:
I'm Slim Shady. Yes, I'm the real Shady. All you other Slim Shadys are just imitating.
तो अनिर्दिष्ट फॉर्मेटर्स क्रम में वस्तुओं को सौंपा जाएगा, इससे आप उन पर सूचकांक छोड़ सकते हैं। ध्यान दें कि आप प्रति आइटम प्रारूपित करने के लिए केवल एक अनिर्धारित फॉर्मेटर का उपयोग कर सकते हैं, इसके बाद इसका उपयोग किया जाएगा।
विभिन्न बातों पर विचार करने के बाद, मुझे लगता है कि आम तौर पर एक पंक्ति को पुनः प्राप्त करने का सबसे छोटा तरीका है। लाइन में एक नई रेखा है, इसे ट्रिमिंग ( .trim()
) द्वारा हटाया जा सकता है या यदि स्लाइस करके नहीं किया जा सकता है।
let y=&mut"".into();std::io::stdin().read_line(y);
कई लाइनों के लिए, lines
इटरेटर का उपयोग किया जा सकता है, पुनरावृत्त लाइन न्यूलाइन में समाप्त नहीं होती है। आयात करने के लिए एक ग्लोब आयात की आवश्यकता होती है BufRead
, lines
जिसे StdinLock<'_>
टाइप के लिए उपलब्ध होना चाहिए ।
use std::io::*;let y=stdin();y.lock().lines()
लौटने वाले कार्यों में ()
, जहां अंतिम अभिव्यक्ति भी प्रकार की है ()
, आपको अनुगामी की आवश्यकता नहीं है ;
:
fn main(){print!("Hello, world!")}