ติดตั้ง 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 ทั้งหมดหรือไม่ ไม่แน่ใจ).