ติดตั้ง ruby แล้ว Hello world!
www.tanabutr.co.th/photobook
ว่าจะข้ามตรงนี้ไปเลยก็อดไม่ได้ที่จะเขียนให้. วันนี้เป็นเรื่องของการติดตั้ง ruby.
สำหรับคนที่ใช้ิลินุกซ์ตระกูล debian ก็ apt-get. พวกที่ใช้ fedora ก็ใช้ yum, พวกที่ใช้ gentoo ก็ emerge. หรือดาว์นโหลดรหัสต้นฉบับจาก ruby-1.8.3 จากเว็บไซด์ต้นตำหรับ. ถ้าจะใช้บนวินโดวส์ก็ลง cygwin หรือ RubyForge ก็ได้.
สมมติว่าเป็น debian เหมือนที่ผมใช้อยู่บน colinux ก็ขอดูก่อนแล้วกันว่ามี package อะไรบ้างที่เกี่ยวกับ ruby. ที่น่าสนใจก็มี
# apt-cache search ruby ... eruby - Embedded Ruby Language ... irb - Interactive Ruby (irb) ... rails - MVC ruby based framework geared for web application development rake - a ruby build program rbbr - a browser for Ruby classes and documentation ... ri - Ruby Interactive reference (ri) ... ruby - An interpreter of object-oriented scripting language Ruby ruby-elisp - Emacs-lisp ruby-mode for Ruby ... ruby-gnome2 - GNOME-related bindings for the Ruby language ruby-manual - Manual for the scripting language Ruby. ... rubybook - the "Programming Ruby" book ... vim-ruby - Vi IMproved, with ruby scripting support ...
อยากดูรายละเอียดอีกหน่อยก็ apt-cache show ตามด้วยชื่อแพ็กเกจเอง. แต่ที่แน่ๆต้อง install ขั้นต่ำคือ ruby กับ irb. ส่วนเอกสารหรือหนังสือจะ install ด้วยก็ดี.
# apt-get install ruby irb ri ruby-manual
เวลาสร้างสคริปต์, ก็เหมือนกับการสร้างเชลล์สคริปต์หรือสคริปต์อื่นๆทั่วไปในยูนิกซ์คือบรรทัดแรกเริ่มต้นด้วย shabang (sharp and bang) แล้วตามด้วย path ของโปรแกรม ruby. หลังจากนั้นก็เขียนสคริปต์ได้เลยเช่น
#!/usr/bin/ruby
print("Hello world!\n")
print "Hello world\n"
เสร็จแล้วก็ chmod ให้ไฟล์สคริปต์นั้น execute ได้
$ chmod +x hello.rb $ ./hello.rb Hello world! Hello world!
สรุึปว่าอันนี้เป็น ruby สคริปต์อันแรกแล้วกัน. มันไม่ได้ทำอะไรมากแค่เรียกใช้ method ชื่อ print พิมพ์สายอักขระ Hello world! ออกทางเทอร์มินอลเท่านั้นเอง. expression แต่ละประโยคไม่ต้องมีเครื่องหมาย ; เหมือน perl หรือ C. จะเห็นได้ว่าเวลาเขียนสามารถละเครื่องหมายวงเล็บได้ด้วย. ทำให้สับสนไหม? ก็เลือกเอาสักอย่างแล้วกันว่าถนัดเขียนแบบไหน. คนออกแบบภาษาเขาอุตสาห์ยืดหยุ่นให้.
ที่นี้ ruby มันจะมีคำสั่ง irb ย่อมาจาก Interactive ruby เป็นตัวแปลภาษาเชิงโต้ตอบคล้ายๆกับเชลล์นั่นแหละ. ลองสั่งดู
$ irb irb(main):001:0>
main คือชื่อ method, 001 แสดงจำนวนบรรทัด, เลข 0 นั่นเป็นระดับความลึก (level) ของโค้ดเวลาเขียนพวก expression ที่ซับซ้อนเป็นชุด. เช่น
irb(main):012:0> if true irb(main):013:1> print "Yes" irb(main):014:1> end Yes=> nil irb(main):015:0>
จะเห็นว่าพวกอยู่ใน expression ของ if แล้วระดับจะเปลี่ยนจาก 0 เป็น 1 แล้วกลับมาเป็น 0 เหมือนเดิมตอนจบ. ก็เลยได้เรียนรู้อีกอย่างว่าพวกที่เป็นบล็อกๆพวก if นี่จะจบด้วย end. คำว่า "if", "true", "end" พวกนี้เรียกว่า Reserved words ได้แก่
BEGIN class ensure nil self when
END def false not super while
alias defined for or then yield
and do if redo true
begin else in rescue undef
break elsif module retry unless
case end next return until
คำพวกนี้เอามาสร้างเป็นชื่อตัวแปรหรืออะไรทำนองนี้ไม่ได้. อ่านในช่วง syntax เพิ่มเติม
ลองกลับมาดูสคริปต์ Hello world! อีกทีหนึ่ง. จะเห็นว่า print มันก็เหมือนกับฟังก์ชัน print ใน perl. แต่จริงๆแล้วมันเหมือนกัน. ruby เป็นภาษาแบบ object oriented แต่ถ้าเขียน print แบบนี้มันก็ไม่ใช่ object oriented สิ. ในแนวคิดของ object oriented มันต้องมี receiver ที่คอยรับ message ซึ่งจริงๆแล้ว print เป็น message ที่ส่งให้กับ receiver ที่พิเศษที่เรียกว่า self (ใน java เทียบเท่ากับ this). ถ้าจะเขียนเต็มยศต้องเป็น
self.print( "Hello world!\n")
คือมี self เป็น receiver. แต่อันนี้จะมี error, ruby ไม่อนุญาตให้ใช้ print แบบนี้. ใน ruby เรียก method ที่ไม่ต้องระบุ receiver (เรียกใช้เหมือนฟังก์ชันในภาษาอื่นๆ)เช่น method print เหล่านี้ว่า "private method". ลองดูใน irb ก็ได้
irb(main):001:0> self.print "He\n"
NoMethodError: private method `print' called for main:Object
from (irb):1
irb(main):002:0>
irb มันบอกว่า "private method `print' called for main:Object".
ก่อนจากกัน. ความรู้หนึ่งที่ไปอ่านจาก why’s (poignant) guide to ruby มาคือ irb นี่มันทำ command line completion ได้.
$ irb -r irb/completion
irb(main):007:0> Kernel:: กด tab สองครั้ง
...
Kernel::Array Kernel::loop
Kernel::Float Kernel::method
Kernel::Integer Kernel::method_defined?
Kernel::String Kernel::method_missing
Kernel::__id__ Kernel::methods
Kernel::__send__ Kernel::module_eval
Kernel::` Kernel::name
...
irb ก็จะแสดงพวก private method ให้ดูด้วย (ใช่ private method ทั้งหมดหรือไม่ ไม่แน่ใจ).