คุณกำลังเขียนโปรแกรม 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 นี้
ขอบคุณที่อ่าน! 🙂