ruby เบื้องต้น
อัดรูปดิจิตอล ทำสมุดภาพของคุณเอง
รอรับได้. ท่องเที่ยว แต่งงาน ฯลฯ
www.tanabutr.co.th/photobook
Submitted by poonlap on Sat, 2005-12-10 21:56.
ไม่รู้ว่าจะเริ่มยังไงดี. เอาเป็นว่าเริ่มจาก built-in method เบื้องต้นก็แล้วกัน. built-in method นี่ก็คือ private method ที่แนะนำไปในครั้งที่แล้วหรือเรียกอีกอย่างว่า kernel method.
สคริปต์ต่อไปนี้สมมติว่าชื่อ inout.rb. เวลารันมันจะถามให้คนใช้พิมพ์อะไรเข้าไปแล้วส่งสิ่งที่พิมพ์นั้นกลับมาทางหน้าจอ. ตัวเลขที่อยู่หน้าทุกบรรทัดนั้นเพื่อความสะดวกในการอ้างอิง, ไม่ต้องพิมพ์ตาม.
1 #!/usr/bin/ruby
2 # filename: inout.rb
3 # version: 0.1
4 print "Input something: "
5 gets
6 print
ลองรันกันก่อนเลยดีกว่า
$ ./inout.rb
Input something: Hello there
Hello there
จะเห็นได้ว่าเราพิมพ์คำว่า Hello there ลงไปมันก็แสดงคำนั้นออกมาเท่านั้นเอง.
บรรทัดที่ 1 เป็นบรรทัดที่ต้องเขียนอยู่แล้วคือบอกว่า ruby มันอยู่ที่ไหน. บรรทัดที่ 2, 3 เป็นคอมเมนต์. ruby ก็เหมือนกับ perl, bash คือ ruby จะไม่แปลความหมายของสิ่งที่เขียนหลังเครื่องหมาย # (pound sign, ทำไมเมืองไทยเรียกเครื่องหมายสี่เหลี่ยมหวา) ไปจนจบบรรทัด. บรรทัดที่ 4 เป็นการใช้ kernel method "print" แสดงสายอักขระบนเทอร์มินอล (stdout) และไม่เติม newline ("\n") ให้ (ขึ้นบรรทัดใหม่). บรรทัดที่ 5, gets จะอ่านข้อมูลจาก stdin หนึ่งบรรทัดและเก็บไว้ในตัวแปรพิเศษ $_ (เหมือน perl). ส่วนบรรทัดที่ 6, ใช้ print อย่างเดียวจะพิมพ์ข้อมูลที่อยู่ในตัวแปร $_ ออกมา. ข้อสังเกตของการทำงานของสคริปต์ตัวนี้อยู่ที่เวลาเราพิมพ์ข้อความแล้วกด Enter ไป, ตัวโปรแกรมจะอ่าน newline ที่เกิดจากการกดคีย์ Enter ไปด้วย. ดังนั้นเวลาใช้ print ที่บรรทัดที่ 6 มันจะขึ้นบรรทัดใหม่ให้ด้วย. คราวนี้ลองมาแกไขตัวโปรแกรมใหม่ให้ดูดีกว่านี้
1 #!/usr/bin/ruby
2 # filename: inout.rb
3 # version: 0.2
4 print "Input something: "
5 line = readline
6 line.chomp!
7 print "You typed \"" + line + "\"\n"
แล้วลองรันดู
$ ./inout.rb
Input something: Hello ruby
You typed "Hello ruby"
ส่วน output ของโปรแกรมเปลี่ยนไปเล็กน้อยคือมีเครื่องหมายคำพูดล้อมคำที่พิมพ์เข้าไป.
โค้ดที่แตกต่างจากอันที่แล้วคือบรรทัดที่ 5, คือใช้ method "readline" แทน "gets". readline กับ gets ทำงานเหมือนกันแต่ readline จะมีการส่ง exception EOFError เมื่อจบข้อมูล. ส่วนสิ่งที่อ่านมาได้จาก stdin ก็เก็บไว้ในตัวแปรที่ชื่อ line (ตั้งชื่อเอง). ตัวแปรใน ruby เป็นอักขระ ASCII ที่ขึ้นต้นด้วย _ หรืออักษรตัวเล็ก. อย่างที่บอกไปแล้วว่าข้อมูลที่อ่านมากจะมี newline ติดมาด้วย, ถ้าต้องการจะตัด newline ("\n") ออกให้เหลือแต่สายอักขระล้วนๆก็ใช้ method "chomp" ที่เป็น method ที่อยู่ในคลาส String. คือข้อมูลจาก readline จะมาเป็นสายอักขระหมายความว่า line มันคือ String. เวลาเรียกใช้ method ก็แค่ใช่ใช้จุดช่วยโดยมีแบบรูปเป็นobj.method() หรือ obj.method
Ruby มันอนุญาตไม่ต้องใส่วงเล็บเวลาเรียก method ก็ได้ถ้าไม่กำกวม.
method บางตัวอาจมีได้ 2 แบบเช่นในคลาส String จะมี chomp กับ chomp! อันนี้เป็นคุณลักษณะพิเศษของ ruby คือ method ที่ลงท้ายด้วยเครื่องหมายตกใจ ! จะเป็นการแก้ข้อมูลของ object ที่เรียกใช้ method นั้น. ส่วนถ้าเป็นชื่อเดียวกันแต่ไม่มีเครื่องหมายตกใจก็จะเป็นการส่งค่านั้นออกมาโดยไม่แก้ไขข้อมูลใน object. บรรทัดที่ 7 สาธิตการเอาสายอักขระมารวมกัน. การรวมสายอักขระใน ruby ใช้เครื่องหมายบวก +string1 + string2 + ...
จริงๆแล้ว + เป็น method อย่างหนึ่งของคลาส String, พวกนี้เรียกว่า "Instance method". ให้ดูตัวอย่างจาก irb คงเห็นภาพได้ชัดเจนขึ้น.
irb(main):001:0> data = "abc"
=> "abc"
irb(main):002:0> data + "def"
=> "abcdef"
irb(main):003:0> data.+("def")
=> "abcdef"
irb(main):004:0> data.+ "def"
=> "abcdef"
อีกอย่างจากตัวอย่างสคริปต์คือการสร้าง object ของคลาส String ทำได้โดยการเขียนสายอักขระในเครื่องหมายคำพูดเท่านั้นเอง. หมายความว่าถ้าเราเขียน "Hello" ในโค้ดก็เรียก method ได้เลยตามตัวอย่างที่แสดงต่อไปนี้.
irb(main):001:0> "Hello".length => 5 irb(main):002:0> var = "Hello".upcase => "HELLO" irb(main):003:0> var.downcase! => "hello" irb(main):004:0> var => "hello"สรุป
- print เป็น kernel method ใช้พิมพ์ข้อความออกทาง stdout
- gets คล้ายกับ readline แต่ readline มีการปล่อย EOFError เมื่ออ่านข้อมูลเสร็จ
- gets กับ readline ถ้าไม่มีการเอาผลลัพธ์ไปใส่ตัวแปรก็จะเก็บค่าที่อ่านจาก stdin ไว้ที่ตัวแปรพิเศษที่ชื่อ $_
- การเรียกใช้ method ของ object ทำได้โดยการเขียนเครื่องหมายจุด . ระหว่าง object กับ method.
- เวลาเรียกใช้ method ไม่ต้องใส่เครื่องหมายวงเล็บก็ได้ หรือจะใส่ถ้าไม่อยากให้งง
- object หรือ instance ของคลาส String สร้างขึ้นมาโดยใช้เครื่องหมายคำพูดเช่น "Hello", 'Hello'.
- การรวมสายอักขระใช้เครื่องหมายบวก ซึ่งจริงๆแล้วเป็นการเรียก instance method ที่ชื่อ +.