ในขณะที่Rustนั้นเป็นสิ่งที่ไม่ค่อยมีการแข่งขันในการแข่งขันการแข่งขันรหัส (Java มักจะสั้นกว่า) แต่ก็ยังสนุกกับการเล่นกอล์ฟ
กรุณาโพสต์เพียงหนึ่งเคล็ดลับในแต่ละคำตอบ
ในขณะที่Rustนั้นเป็นสิ่งที่ไม่ค่อยมีการแข่งขันในการแข่งขันการแข่งขันรหัส (Java มักจะสั้นกว่า) แต่ก็ยังสนุกกับการเล่นกอล์ฟ
กรุณาโพสต์เพียงหนึ่งเคล็ดลับในแต่ละคำตอบ
คำตอบ:
ปิด:
|n|n+1
สั้นกว่าฟังก์ชั่น:
fn f(n:i32)->i32{n+1}
การปิดนานกว่าคำสั่งเดียวต้องใช้เครื่องหมายปีกกา แต่ยังสั้นกว่าฟังก์ชันมาก
สมมุติว่าคุณมี x บางตัวที่ใช้ IntoIterator Trait และคุณต้องเรียกใช้ฟังก์ชัน f ที่รับดัชนีขององค์ประกอบและการอ้างอิงถึงมัน วิธีมาตรฐานในการทำเช่นนี้คือ
x.iter().enumerate().map(f)
แต่คุณสามารถทำได้
(0..).zip(x).map(f)
และช่วยตัวเองไม่เพียง แต่แจงยาวผิดปกติ แต่ยังโทรไป iter!
หากคุณต้องการตัวแปรที่เปลี่ยนแปลงได้จำนวนมากอาจทำให้เสียพื้นที่จำนวนมากในการประกาศและกำหนดค่าเริ่มต้นเนื่องจากแต่ละตัวต้องใช้คำหลัก mut และคุณไม่สามารถทำอะไรเช่น a = 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
ตัวอย่างเช่น: ใช้format!("")
แทนString::new()
การบันทึก 2 ไบต์
หากการอนุมานประเภททำงานได้:
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
สามารถใช้ตัววนซ้ำได้บรรทัดที่ซ้ำไม่สิ้นสุดในบรรทัดใหม่ จำเป็นต้องนำเข้าแบบ glob เพื่อนำเข้าBufRead
จำเป็นlines
ต้องมีสำหรับStdinLock<'_>
ชนิด
use std::io::*;let y=stdin();y.lock().lines()
ในฟังก์ชันที่ส่งคืน()
โดยที่นิพจน์สุดท้ายเป็นประเภท()
คุณไม่จำเป็นต้องมีการติดตาม;
:
fn main(){print!("Hello, world!")}
เมื่อทำงานกับสตริงที่มีการขึ้นบรรทัดใหม่คุณสามารถบันทึกหนึ่งไบต์หากคุณใช้ตัวแบ่งบรรทัดตามตัวอักษรในซอร์สโค้ดเทียบกับการมี a \n
ในสตริง
println!("Hello
World!");
น้อยกว่า 1 ไบต์:
println!("Hello\nWorld!);
เมื่อใช้หมายเลขทศนิยมทั้งจำนวนคุณสามารถละเว้นการต่อท้าย.0
เพื่อบันทึกหนึ่งไบต์
let a=1.
น้อยกว่า 1 ไบต์:
let a=1.0