Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> Ruby

เชี่ยวชาญ Ruby gets และ chomp: อ่านอินพุตจากผู้ใช้อย่างมีประสิทธิภาพ

คุณกำลังเขียนโปรแกรม Ruby และอยากถามคำถามผู้ใช้…

จะทำอย่างไร?

ใช้เมธอด gets ของ Ruby เพื่ออ่านอินพุตจากผู้ใช้

เรียก gets แล้วโปรแกรมจะรอให้คุณพิมพ์บนคีย์บอร์ดและกด Enter

ผลลัพธ์?

ได้ string กลับมา string นี้มีเนื้อหาที่คุณ (หรือผู้ใช้) พิมพ์ไป หากกำหนด string นี้ให้ตัวแปร จะใช้งานได้

ตัวอย่างทั่วไปคือโปรแกรมทักทาย

โค้ด长这样:

name = gets.chomp
puts "Hello #{name}, nice to meet you!"

#{name} เรียกว่า string interpolation

ลองรันดูเองว่าทำงานยังไง

  • บันทึกโค้ดเป็นไฟล์ "greeting.rb"
  • รันด้วย "ruby greeting.rb" (จากเทอร์มินัล)

พิมพ์ชื่อ โปรแกรมจะทักทายคุณ! ดีนะ

ตอนนี้:

chomp นี้เป็นอะไร?

เป็นเมธอด Ruby ที่เปลี่ยนผลลัพธ์ของ gets อย่างเฉพาะเจาะจง

ลองเอา chomp ออก รวมถึงจุด (.) นำหน้า ดังนั้น name = gets แทน name = gets.chomp

ถ้าบันทึกและรันอีกครั้ง…

ทักทายจะแตกเป็น 2 บรรทัด แทนที่จะอยู่บรรทัดเดียว

เกิดอะไรขึ้น?

มากลับไปดูรายละเอียดกัน!

เข้าใจ newline และอักขระพิเศษ

Ruby อ่านทุกอย่างที่คุณพิมพ์เข้าโปรแกรมขณะ gets ทำงานอยู่

สำหรับ โปรแกรมทักทาย นี้ รวมถึงชื่อของคุณ และอักขระ "new line" พิเศษที่ทำให้ข้อความทักทายแตก 2 บรรทัด!

เจอกับอักขระ new line:

\n

อักขระพิเศษเหล่านี้ปกติมองไม่เห็น แสดงออกมาแค่ new line, space, สี ฯลฯ

อยากเห็นต้องใช้ไฟแช็คเวทพิเศษราคา $10,000

แค่เล่น! แค่ใช้เมธอด p หรือ inspect ก็พอ

ตัวอย่างใช้งาน:

p name # "Jesus\n"

เจอแล้ว! อักขระ "new line" (\n) ของเรา

นี่คือคำตอบคำถามเดิม…

chomp ทำหน้าที่อะไร?

วัตถุประสงค์ของ chomp คือลบอักขระ newline ที่ท้าย string ซึ่งช่วยมาก!

ตัวอย่างเพิ่มเติม

การมีอักขระ newline หรืออักขระพิเศษอื่นๆ ส่งผลไม่แค่ลักษณะ string ตอนพิมพ์

ยังส่งผลต่อ if statement ด้วย!

ตัวอย่าง:

name = gets
if name == "David"
  puts "Hello David, we were expecting you!"
end

ในโค้ดนี้ ถ้าไม่ใช้ chomp กับ gets string ทั้งสองจะไม่เหมือนกันเพราะอักขระ newline (\n) ทำให้ evaluate เป็น false

Btw…

เรื่องนี้ใช้กับ string จากแหล่งอื่นได้ เช่น ข้อมูลจาก database, ไฟล์ หรือแหล่งอื่น ระวังอักขระพิเศษเหล่านี้!

chomp vs chop vs strip

อีก 2 เมธอดที่ช่วยทำความสะอาดอินพุตผู้ใช้คือ chop และ strip

กับ strip ลบ whitespace ได้

ตัวอย่าง:

" John Smith ".strip

กับ chop จะลบตัวอักษรสุดท้ายเสมอ

ลบตัวอักษรตัวแรก

อาจต้องลบตัวอักษรจากต้น string

ทำได้แบบนี้:

str = "Mr. John"
str[0..3] = ""
str # "John"

นี่ลบ 4 ตัวอักษรแรก

มี gets 2 แบบ? เรื่องซับซ้อนขึ้น!

มีกรณีพิเศษ… ต้องใช้ $stdin.gets แทน gets ธรรมดา

ถ้าเจอ error แบบนี้:

gets': No such file or directory @ rb_sysopen

ทำไม?

เพราะมี 2 version ของเมธอด gets

  • version เริ่มต้นพยายามอ่านชื่อไฟล์
  • version ทางเลือก ($stdin.gets) อ่านจากอินพุตผู้ใช้เสมอ

ตอนนี้รู้แล้ว หากเจอ error แบบนั้นขณะใช้ gets ให้ลองเปลี่ยนเป็น $stdin.gets

สรุป

คุณเรียนรู้เกี่ยวกับเมธอด gets และ chomp สิ่งที่พวกมันทำ ยังไง และทำไมถึงมีประโยชน์!

เรียนรู้ต่อกับบทช่วยสอน Ruby นี้

ขอบคุณที่อ่าน! 🙂