4. รวมเข้าด้วยกัน
www.tanabutr.co.th/photobook
เราดูอ็อบเจคที่ต่างๆกันไปแล้ว (ตัวเลขและสตริงก์), และเราก็สร้างตัวแปรให้ชี้ไปที่มัน; สิ่งที่เราจะทำต่อไปคือทำให้สิ่งเหล่านั้นทำงานด้วยกัน.
เรารู้แล้วว่าถ้าเราต้องการให้โปรแกรมพิมพ์ 25, โค้ดต่อไปนี้ไม่เวิร์ก, เพราะเราไม่สามารถรวม(บวก)ตัวเลขเข้ากับสตริงก์.
var1 = 2 var2 = '5' puts var1 + var2
ส่วนที่เป็นปัญหาคือคอมพิวเตอร์ไม่รู้ว่าคุณต้องการ 7 (2 + 5), หรือคุณต้องการ 25 ('5' + '5').
ก่อนที่จะรวมสิ่งเหล่านี้เข้าด้วยกัน, เราต้องการวิธีบางอย่างเพื่อที่จะให้ได้ var1 ในรูปแบบของสตริงก์, หรือเพื่อให้ได้ var2 ในรูปแบบของตัวเลข.
การเปลี่ยนประเภท (conversions)
เพื่อที่จะได้สภาพที่เป็นสตริงก์ของอ็อบเจค, เราเขียน .to_s ตามข้างหลังมัน:
var1 = 2 var2 = '5' puts var1.to_s + var2
25
ในทำนองเดียวกัน, ใช้ to_i เพื่อแปลงอ็อบเจคให้อยู่ในรูปจำนวนเต็ม, และ to_f ให้อยู่ในรูปจำนวนจริง. เรามาดูกันว่าเมทธอตเหล่านี้ทำ (แลไม่ทำ) อะไรกันในรายละเอียดอีกนิด.
var1 = 2 var2 = '5' puts var1.to_s + var2 puts var1 + var2.to_i
25 7
ให้สังเกตว่า, ถึงแม้ว่าหลังจากการแปลงประเภทของ var1 โดยที่ใช้ to_s แล้วก็ตาม, var1 ยังชี้ไปที่ 2 เสมอ, และไม่ใช่ชี้ที่ '2'. จนกว่าเราจะตั้งค่าให้ var1 ใหม่ (ซึ่งจะใช้เครื่องหมาย =), ซึ่งมันจะชี้ไปที่ 2 ตลอดจนจบโปรแกรม.
ตอนนี้เราลองทดสอบตัวอย่างการแปลงประเภทที่น่าสนใจ(และดูแปลกๆ):
puts '15'.to_f puts '99.999'.to_f puts '99.999'.to_i puts '' puts '5 is my favorite number!'.to_i puts 'Who asked you about 5 or whatever?'.to_i puts 'Your momma did.'.to_f puts '' puts 'stringy'.to_s puts 3.to_i
15.0 99.999 99 5 0 0.0 stringy 3
อาจจะมีเซอร์ไพรส์บ้าง. ตัวอย่างแรกค่อนข้างจะเป็นมาตรฐาน, ให้ผลเป็น 15.0. ถัดมา, เราแปลงสตริงก์ '99.999' ให้เป็นจำนวนจริงและจำนวนเต็ม. จำนวนจริงเป็นไปตามที่คาด; จำนวนเต็มถูกปัดเศษตามปรกติ.
ถัดมา, เรามีตัวอย่างบางอันที่สตริงก์ที่ไม่ปรกติแปลงเป็นตัวเลข. to_i เพิกเฉยสิ่งที่มันไม่เข้าใจที่เห็นเป็นตัวแรก, และตั้งแต่จุดนั้นเป็นต้นไป. ดังนั้นตัวอย่างแรกจึงแปลงเป็น 5, แต่อันอื่นเพราะขึ้นต้นด้วยตัวอักษรเลยถูกเพิกเฉยโดยสิ้นเชิง...ดังนั้นคอมพิวเตอร์เลยเลือกศูนย์.
สุดท้ายเราก็เห็นว่าตัวอย่าง 2 อันหลังไม่ได้ทำอะไรเลย, แค่เหมือนกับที่เราคาดการณ์ไว้.
มาดู PUTS อีกแบบ
มีบางอย่างแปลกๆกับเมทธอตที่เราชอบ... ให้ดูตัวอย่างนี้:
puts 20 puts 20.to_s puts '20'
20 20 20
ทำไม่สามแบบข้างบนจึงแสดงผลเหมือนกัน? โอเค, สองตัวหลัีงควรจะเป็นเช่นนั้นเพราะ 20.to_s คือ '20'. แล้วตัวอย่างแรกหล่ะ, จำนวน 20? มันหมายความอย่างไร สำหรับให้คอมพิวเตอร์แสดงจำนวนเต็ม 20? ถ้าคุณเขียน 2 และ 0 ลงบนกระดาษ, คุณกำลังเขียนสตริงก์, ไม่ใช่จำนวนเต็ม. จำนวนเต็ม 20 คือจำนวนนิ้วมือและนิ้วเท้าที่ผมมี; มันไม่ใช่ 2 ตามด้วย 0.
มันมีความลับซ่อนอยู่ในเมธอต puts: ก่อนที่ puts พยายามจะเขียนอ็อบเจค, มันใช้ to_s แปลงอ็อบเจคให้เป็นสตริงก์. จริงๆแล้ว s ใน puts ย่อมาจาก string. puts จริงๆแล้วมีความหมายว่า put string.
นี่ดูเหมือนจะไม่ตื่นเต้นในตอนนี้, แต่มันมีอ็อบเจคมากมายหลายชนิดใน Ruby (คุณจะเรียนรู้วิธีสร้างมันด้วย!), และมันก็เป็นสิ่งที่ดีที่คุณจะรู้ว่าเกิดอะไรเวลาที่ puts อ็อบเจคที่พิสดารๆ, เช่นรูปคุณยาย, ไฟล์ดนตรี หรือบางสิ่งบางอย่าง. แต่นั่นเอาไว้ก่อนแล้วกัน...
ในตอนนี้, เรามีเมธอตบางอย่างให้คุณ, และมันทำให้เราเขียนโปรแกรมอื่นๆได้สนุกด้วย...
เมธอต GETS และ CHOMP
ถ้า puts หมายถึง put string, ผมแน่ใจว่าคุณคงรู้ว่า gets หมายถึงอะไร. ทำนองเดียวกับที่ puts ปล่อยสตริงก์ออกมา, gets จะเป็นตัวดึงสตริงก์เข้ามา. แล้วมันเอามาจากไหน?
จากคุณไง! โอเค, จริงๆแล้วก็จากแป้นพิมพ์. เพราะว่าแป้นพิมพ์เป็นตัวที่ทำให้เกิดสตริงก์, มันทำออกมาได้สวยมาก. สิ่งที่เกิดขึ้นคือ gets อยู่เฉยๆ, อ่านสิ่งที่คุณพิมพ์จนกว่าคุณจะกด Enter. มาลองดูกัน.
puts gets
Is there an echo in here?
Is there an echo in here?สิ่งที่คุณพิมพ์จะย้อนกลับมาหาคุณ. ลองรันแล้วพิมพ์อะไรที่แตกต่างดู. ตอนนี้คุณก็สร้างโปรแกรมที่โต้ตอบได้แล้ว! ในตัวอย่างอันนี้, พิมพ์ชื่อของคุณลงไปแล้วโปรแกรมจะทักทายคุณ.
puts 'Hello there, and what\'s your name?' name = gets puts 'Your name is ' + name + '? What a lovely name!' puts 'Pleased to meet you, ' + name + '. :)'
ผมพึ่งพิมพ์ชื่อของผมลงไป, และนี่คือสิ่งที่มันแสดงออกมา
Hello there, and what's your name?
Chris
Your name is Chris
? What a lovely name!
Pleased to meet you, Chris
. :)
อืม... ดูเหมือนว่าตอนที่ผมพิมพ์ตัวอักษร C, h, r, i, s แล้วกด Enter, gets ได้ตัวอักษรทุกตัวและก็ Enter ด้วย! โชคดีที่มีเมธอตสำหรับจัดการเรื่องแบบนี้: chomp. มันช่วยขจัด Enter ที่อยู่ข้างท้ายสตริงก์ของคุณ. ลองรันโปรแกรมใหม่อีกครั้ง, แต่ครั้งนี้ chomp จะช่วยคุณ.
puts 'Hello there, and what\'s your name?' name = gets.chomp puts 'Your name is ' + name + '? What a lovely name!' puts 'Pleased to meet you, ' + name + '. :)'
Hello there, and what's your name?
Chris
Your name is Chris? What a lovely name!
Pleased to meet you, Chris. :)
ดีขึ้น! สังเกตว่า name ชี้ไปที่ gets.chomp, เราไม่ต้องเขียนว่า name.chomp เพราะ name ได้ถูก chomp เรียบร้อยแล้ว.
บางอย่างที่น่าลอง
- เขียนโปรแกรมที่ถามชื่อ, นามสกุล. และโปรแกรมทักทายด้วยชื่อเต็มๆ.
- เขียนโปรแกรมที่ถามเลขที่ชอบ. ให้โปรแกรมบวกเลขนั้นด้วยหนึ่ง แล้วแนะนำผลลัพธ์ซึ่งใหญ่กว่าและดีกว่าตัวเลขที่ชอบนั้น. (ใำห้ทำโปรแกรมฉลาดๆ) (ผู้แปล: แปลแล้วรู้สึกงงๆ)
หลังจากที่คุณเสร็จสองโปรแกรมนี้แล้ว(หรือทำอย่างอื่นอีกถ้าต้องการ), มาเรียนอะไรเพิ่มขึ้นไปอีกเกี่ยวกับเมธอต.