ruby เบื้องต้น

อัดรูปดิจิตอล ทำสมุดภาพของคุณเอง
รอรับได้. ท่องเที่ยว แต่งงาน ฯลฯ

www.tanabutr.co.th/photobook


ไม่รู้ว่าจะเริ่มยังไงดี. เอาเป็นว่าเริ่มจาก 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 ที่ชื่อ +.