Ruby Diary #1

ช่วงนี้รู้สึก information overload เลยกลับมาหัดเขียนโปรแกรมดีกว่า ด้วยชื่อเสียงของ Ruby on Rails ก็ทำให้ Ruby เป็นภาษาถัดไปของเรา

ต้องบอกก่อนว่านี่ไม่ใช่ tutorial สำหรับ Ruby เป็นแค่สมุดจดบันทึกของผมเท่านั้น ดังนั้นอะไรที่ผมรู้อยู่แล้ว ก็จะข้ามไป อยากรู้ก็ไปขวนขวายกันเอาเองนะครับ ประสบการณ์ในการเขียนโปรแกรมของผมมีดังนี้

  • ภาษาที่เขียนเยอะ
    • C - ไม่อยากกลับไปยุ่งกับ pointer อีกแล้ว
    • Python - ใช้หากิน
  • ภาษาที่เขียนเป็น
    • Perl
    • PHP
    • Java
    • C# (.NET/Mono)
  • ความรู้พื้นฐาน
    • regexp - เขียนได้
    • OOP - พอรู้บ้าง แต่โดยทั่วไปแล้วเขียนแบบปกติ (ขี้เกียจ)

แอบดู

Ruby เป็นภาษาแบบ interpreter ยุคใหม่เช่นเดียวกับ Python ตอนดูแวบแรกก็ เฮ้ย นี่มัน Python แบบไม่ใช้ indent นี่หว่า (Ruby ใช้ end ในการกำหนดขอบเขตบล็อก) แต่อ่านจาก Wikipedia เค้าบอกว่าได้แรงบันดาลใจมาจาก Perl ตะหาก

หนังสือเรียน
แรกสุดก็หาเอกสารประกอบการศึกษาก่อน เนื่องจากว่าผมมีพื้นในการเขียนโปรแกรมมาพอสมควร เลยขี้เกียจอ่านหนังสือเต็มรูปแบบอย่าง Programming Ruby (มีเวอร์ชันออนไลน์ให้อ่านฟรี) ส่วน Reference Manual ก็เอาไว้เปิดเวลาสงสัยมากกว่า

สิ่งที่ผมอยากได้คือ คู่มือง่ายๆ แบบ learning by example ดูตัวอย่างโค้ดแล้วสังเกตการเปลี่ยนแปลงเอา มีอธิบายตรงคำสั่งสำคัญๆ สุดท้ายมาจบที่ Ruby in Highlight ที่เขียนโดย Matz คนสร้างภาษา Ruby นี่เอง (Matz เป็นญี่ปุ่น ฉบับนี้เป็นแปลอังกฤษ)

เพิ่งเคยเจอ tutorial ที่ regexp มาก่อน array ก็ใน Ruby นี่ล่ะ

เตรียมของ
apt-get install ruby บน Debian ทีเดียวจบ ส่วนเรื่อง syntax highlight ภาษาแปลกๆ vi ยังทำได้ นับประสาอะไรกับ Ruby ฉลุย!

ลองรัน
Ruby จะคล้ายกับ Python มาก สามารถเขียนโค้ดลง console หรือลงไฟล์แล้วค่อยเรียกก็ได้ นามสกุลไฟล์เป็น .rb
การรันก็
ruby filename.rb

ช็อตโน้ต

  • Data Structure
    • dictionary ของ Python มาอยู่บน Ruby เรียก hash
    • คิดว่า Ruby ไม่มี tuple
    • การจัดการตัวแปรชนิดมาตรฐาน (string, array) คล้ายกัน เช่น การ concatenate เป็นต้น
    • ใช้ #{} สำหรับตัวแปร เช่น #{var}
  • Regular Expression
    • ไม่แน่ใจว่า regexp ของ Ruby ใช้แบบไหน (คาดว่า Perl) แต่ยังไงผมก็ใช้แต่เซ็ตมาตรฐานของ sed อยู่แล้ว
  • Control Structure
    • Loop ก็คล้ายกับ Python อีก คือ for สำหรับ range และ while สำหรับ conditional
  • OOP
    • ไม่มีอะไรต่างมาก ทั้งการประกาศ Class การสร้าง method (ใช้ def เหมือนกัน) รวมไปถึงการสร้าง instance การ inherit เป็นต้น

ข้อสังเกต

  • Ruby มี method มาตรฐานมาให้ค่อนข้างครบครัน เช่น .lenght, .chop
  • ชื่อ method น่าสนใจมาก อันนี้เคยสังเกตเจอในบล็อกของคุณ pphetra มาก่อนแล้ว
    • ลงท้ายด้วย ! (exclamation) หมายถึง method ที่ออกไปทางทำลายล้าง เช่น string_a.chop! จะทำการตัดตัว string_a โดยตรง ในขณะที่ string_b = string_a.chop เป็นการกระทำที่ตัวก็อปปี้
    • ลงท้ายด้วย ? - ยังอ่านไม่ถึง
  • ดูท่าทางว่า Ruby จะยังเน้นการเขียนแบบลดรูป (เอามาจาก Perl) พอสมควร ซึ่งมันเป็นจุดอ่อนร้ายแรงของ Perl เลย (มันคนเขียน ลำบากคนอ่าน) เช่น เราสามารถเรียก
    Class_name.new.method_name
    ได้ตรงๆ แทน
    var = Class_name.new
    var.method_name
    ซึ่งเรื่องพวกนี้ผมค่อนข้างจะหัวเก่านิดหน่อย ถือซะว่ายอมเขียนลำบากในวันนี้ เพื่อการอ่านเข้าใจในวันหน้า
  • special variable ก็ตามมาจาก Perl ด้วย
  • ไม่รู้ว่ามี module ให้มาเยอะขนาดไหน คิดว่าน่าจะครอบคลุม

(ก็ยัง)คาใจ

  • Iterator
    • การใช้เครื่องหมาย absolute เช่น

      "a\nb\nc\n".each_line{|l| print l}
  • Procedure object



วันแรกพอแค่นี้ก่อน

Keyword
Submitted byLewCPEon Mon, 11/28/2005 - 20:52

พอเจอมึงบอกว่ามี Special Variable นี่กูถอยเลย โคตรเกลียดอ่ะ

Submitted bypphetraon Mon, 11/28/2005 - 21:25

ตอนผมเรียนรู้ ผมเรียนมาจากฝั่ง RoR ก่อน
(คือมีประสบการณ์ mvc framework อยู่แล้ว
ก็เพียงแต่หัด syntax ของภาษาเพิ่มอีกนิดหน่อย)
ตอนนั้น ก็รู้สึกว่าภาษามัน clean กว่า perl
ในแง่ เขียนง่าย อ่านไม่ยาก (นัก)

ต่อมา พอหัดมาดู syntax จริงๆจัง
เข้าไปอ่านตาม ruby blog ต่างๆ
ก็ชักเห็นด้วยกับ mk แล้วว่า
ถ้าเขียนให้อ่านยากแล้ว
ruby ก็น้องๆ perl นี่เอง

ส่วนผมเวลาเขียน ruby
เนื่องจากติดมาจาก java แล้ว
ก็เลยเขียนทื่อๆ ไม่นิยม magic syntax นัก
(แต่ไม่แน่ พอชำนาญแล้ว อาจเปลี่ยนใจ)

Submitted bymkon Mon, 11/28/2005 - 21:52

lew:

ยังจำตอนเขียน Perl ได้อยู่เลย $@ ตามหลอกหลอน



pphetra:

ผมค่อนข้างนิยม Python ตรงมัน clean นี่ล่ะครับ แต่เรื่อง indent ของ Python จะมองให้เป็นจุดอ่อนก็ได้เหมือนกัน เท่าที่เขียนมาก็คิดว่าการใช้วงเล็บ { } ในสายตระกูล C นี่ค่อนข้างจะ fault-tolerant มากที่สุด

Submitted bybact'on Wed, 11/30/2005 - 00:14

regular expression
ตอนแรกพยายามเขียนให้เป็น Regexp.new
ติดจาก Python มา แล้วมันก็ดูง่ายดี

แต่ทำไปทำมา มันดูเยอะ ๆ พิกล ยาว ๆ

เลยเปลี่ยนมาใช้ / /

ก็สั้นดี แต่ก็ไม่ค่อยชอบใจ ไม่ชอบน่ะ

เลยเปลี่ยนมาเป็น %r{}
อยู่ตรงกลาง ๆ .. มั้ง

นี่ว่าจะกลับไปใช้ Regexp.new ใหม่

Submitted bybact'on Wed, 11/30/2005 - 00:17

พวก foreach, each, each_line นี่
เปิดดู api doc เอา

ใช้เครื่องหมาย | | คิดซะว่ามันคือ argument สำหรับ code block นั้นน่ะ

อย่าง a.each { |item| print item }
ก็ ข้อมูลแต่ละ'ก้อน'ใน a จะกลายมาเป็น item แล้วเราก็ print item

เพิ่งหัดเขียนเหมือนกัน เมื่อสุดสัปดาห์ที่ผ่านมา / ยังไม่ได้บล็อก
ทำไปทำมาจะกลายเป็นโครงการใหญ่ แก้ LEXiTRON :P