Tag Archives: Refinements

ฟีเจอร์ใหม่ของ Ruby 2.0 ตอนที่ 1 – Refinements

วันที่ 24 กุมภาพันธ์ 2555 จะเป็นวันครบรอบ 20 ปีของภาษา Ruby และเป็นวันกำหนดการปล่อยเวอร์ชั่น 2.0 ตัวเต็มอีกด้วย ฟีเจอร์ใหม่ใน 2.0 มีอะไรบ้าง เอามาเล่าให้ฟังกันครับ

Refinements

[ต้องบอกไว้ก่อนว่า Refinements นี้ หากเจอ bug มากๆ ก็ยังอาจจะถูกถอดออกจากเวอร์ชั่น 2.0 ได้อยู่นะครับ]

Refinements เป็นฟีเจอร์ที่ถูกเพิ่มเข้ามาเพื่อทำให้เราทำ Monkey patching กันได้อย่างปลอดภัยมากขึ้นครับ

สำหรับคนที่ไม่รู้จัก Monkey patching เป็นฟีเจอร์หนึ่งของ Ruby ที่อนุญาตให้เราเข้าไปแก้ไขหรือเพิ่มเติมเนื้อหาของ class ใดๆ ก็ได้ที่ได้ถูกประกาศไว้แล้ว เช่นที่ Rails ได้ทำการ monkey patch Fixnum ซึ่งเป็น class ของตัวเลข 1,2,3,… ใน Ruby เพื่อให้เราสามารถเรียกใช้คำสั่งแบบ 2.days.ago ที่จะคืนค่าเป็นเวลาเมื่อ 2 วันที่แล้วได้

ปัญหาของเจ้า Monkey patching นี่คือ เมื่อเราได้มีการ load ไฟล์ที่มีการประกาศเจ้า Monkey patch แล้ว ทุกๆ ที่ใน code เราจะได้รับผลกระทบหมด ทำให้อาจเกิดปัญหาอย่างเช่น การตั้งชื่อ method ซ้ำซ้อนกันแล้วถูกทับกัน เกิดเป็น bug ที่สืบเสาะหายากมากๆ ได้ Refinements จึงเข้ามามีบทบาทในการจำกัดขอบเขตของการ monkey patch ดังตัวอย่างนี้ครับ

Module Insane
  refine Fixnum
    def +(other)
      self
    end
  end
  p 1 + 2  #=> 1
end
p 1 + 2  #=> 3

การ refine ไม่ได้ถูกจำกัดอยู่เพียงแค่ใน module ครับ เรายังสามารถนำไปใช้ที่อื่นได้ ด้วยคำสั่ง using แบบนี้ครับ

def use_refinements
  using Insane
  2 + 3  #=> 2
end

คำสั่ง using นี้สามารถใช้ได้ทุกที่เลยครับไม่ได้จำกัดแค่เฉพาะภายใน method อย่างในตัวอย่าง เราสามารถ using ใน class หรือ module อื่นๆ ได้หมด

สำหรับ Refinements มีเพียงเท่านี้ครับ ฟีเจอร์อื่นๆ จะตามมาในวันหลัง สำหรับใครที่สนใจ ลองเล่นเวอร์ชั่น preview กันได้แล้ววันนี้ โดยใครที่ใช้ rvm ก็ rvm install 2.0.0-preview1 กันได้เลยครับ สำหรับคนที่ใช้ OSX แล้วมีปัญหาการติดตั้งเวอร์ชั่น 2.0 ลองทำตา gist นี้ดูครับ Installing Ruby 2.0.0-preview1 with RVM on OS X

อ้างอิง