Monday, November 13, 2006

Ruby 's Core Extension ใน Rails

เห็นคุณ Apirak post เรื่อง เจอของเจ๋งใน ruby
เลยขอโฆษณา feature ของ Rails หน่อย

ข้อดีอย่างหนึ่งของ Ruby ก็คือ Class มัน Open
ความหมายก็คือ เราสามารถ extends class ได้
โดยไม่ต้องไปยุ่งกับการ edit และ recompile ตัว source ของมัน

ถ้าเราไปดูใน Module ActiveSupport ของ rails
จะเห็นว่ามันมี directory อยู่อัน ที่ชื่อ core_ext
ตรงนี้คือที่ rails ใช้เก็บ extension ต่างๆ ที่ rails ต่อยอดจาก ruby core class



อย่างตัวอย่างที่คุณ Apirak ยกมา
x = x + 1.month 

ถ้าลองเปิด file core_ext/nummeric/times.rb ดู
จะเห็นว่าเขาเขียนไว้ประมาณนี้
module ActiveSupport #:nodoc:
module CoreExtensions #:nodoc:
module Numeric #:nodoc:

...
module Time

def seconds
self
end
alias :second :seconds

def minutes
self * 60
end
alias :minute :minutes

def hours
self * 60.minutes
end
alias :hour :hours

def days
self * 24.hours
end
alias :day :days

def weeks
self * 7.days
end
alias :week :weeks

...

จะเห็นว่าเขียนเป็น module อยู่
file ที่ include จริงๆ จะอยู่ใน core_ext/numeric.rb
class Numeric #:nodoc:
include ActiveSupport::CoreExtensions::Numeric::Time
include ActiveSupport::CoreExtensions::Numeric::Bytes
end


ลองดูตัวอย่างอื่นๆ ที่ rails เขา extends ไว้
1.even? # => false
2.odd? # => false

1.ordinalize # => "1st"
3.ordinalize # => "3.rd"

[1,2,3].to_sentence # => "1, 2, and 3"


ของที่บ้านเราใช้กัน ก็น่าจะพวก
11.to_thai # => สิบเอ็ด

Related link from Roti

No comments: