กำเนิด สวัสดีชาวโลก(Hello world!)

posted on 14 Nov 2009 06:42 by infinite-loop  in Reseach

วันนี้นึกสงสัยว่าทำไมหนังสือสอนเขียนโปรแกมทุกเล่ม ต้องสอนไอ้เจ้าโปรแกรม Hello World ซึ่งก็คือการรันโปรแกรมแล้วให้โปรแกรมแสดงคำว่า "Hello world" ออกทางหน้าจอ(แค่เนียะ)

ไม่ว่าจะเขียนภาษาอะไรก็ต้องเริ่มด้วย ไอ้โปรแกรมนี้ตลอดเลย

ก็เลยไปค้น Google ดู เลยรู้ว่า มันเริ่มมาจากหนังสือสอนภาษา C เล่มหนึ่งที่ชื่อ "The C Programming Language" เขียนโดย Brian W. Kerninghan และ Dennis M. Richie ตีพิมพ์ในปี 1978 นู่นแน่ะ(ยังไม่เกิดเลยตรู)

จากนั้นหนังสือเล่มอื่นก็นำ Hello World มาใช้จนเป็นธรรมเนียมปฏิบัติกันไปเรียบร้อย ซึ่งก็คงเป็นเพราะว่ามันเป็นตัวอย่าง ที่ง่ายที่สุดในการเขียนโปรแกรมนั่นแหละ(แค่ print ข้อความ) อีกทั้งยังทำให้เรารู้ว่าเครื่องของเรานั้นพร้อมที่จะเริ่มเขียนโปรแกรมภาษานั้นๆหรือยัง(เผื่อลืม install อะไรบางอย่างไป)

มีหน้าปกมาให้ดูด้วย

 

ภาพจาก Wikipedia: http://en.wikipedia.org/wiki/File:K%26R_C.jpg

แค่นี้แหละ ลาก่อนชาวโลก(Good Bye, World!)

Ruby: Metaprogramming Episode II "method_missing"

posted on 08 Nov 2009 10:00 by infinite-loop  in RoR

มาต่อเรื่อง Metaprogramming อีกดีกว่า(เป็น feature ที่ชอบที่สุดในภาษา Ruby เลยแฮะ )

Entry นี้คงต้องพูดถึง method ที่สำคัญสุดๆ method หนึ่ง ในเรื่องของ metaprogramming นั่นคือ method_missing ซึ่งถ้าเราไปแกะ code ของ Rails ก็จะพบว่า Rails เอา method_missing ไปใช้เยอะมากเลยล่ะ

มาดูตัวอย่างการใช้งานดีกว่า

ปกติถ้าผมจะ try..catch คำสั่งหรือ method ใน program ผมก็ต้องทำแบบนี้

#try..catch ใน Ruby เป็น begin..rescue

begin

   a.length

rescue

end

ใน ตย. ผม try..catch method length ด้วยวิธี basic สุดๆ

แต่มันไม่ cool!!? บวกกับมันยาวไป(เพิ่มมาตั้ง 3 บรรทัด) ผมจึงต้องสร้างข้อตกลงขึ้นมาใหม่ นั่นก็คือ ถ้าผมเรียก a.try_length แล้วล่ะก็ program มันจะต้องรู้เองว่า ผมจะ try..catch method length()

*อ้ออย่างงนะครับ method ใน Ruby เวลาเรียกไม่ต้องมีวงเล็บก็ได้ แหะๆ

เพราะงั้นในสถานการณ์นี้เราก็ต้องใช้ method missing กันล่ะ

มาลองดูกัน

class Object
  def method_missing(method, *args, &block)
    name = method.to_s #แปลง method เป็น String

    #ถ้าชื่อ method เริ่มด้วย try_ ให้ try..catch
    if name =~ /^try_/
      begin

        #ตัด try_ ออกแล้วเรียก method ที่ต้องการ
        self.send(name.split("try_")[1].to_sym, *args, &block)
      rescue
        puts "Hello method_missing!"
      end
    else
      super
    end
  end
end

จากข้างบนลอง เรียก

"aaaaa".length  >> 5

nil.length >>  error!

nil.try_length >>  Hello method_missing!

 And Good Bye :P