Tag Archives: Closure

closure, FP และ OOP

เมื่อวานนี้พูดถึงคำนิยามของ closure ไป วันนี้ผมจะนำมันมาใช้สร้างโค้ดที่มีลักษณะคล้ายโค้ดจากภาษา Object-oriented programming (OOP) ให้ดูครับ

เริ่มต้นด้วยโค้ด OOP บน Ruby ก่อน

class Prepend
  def initialize(start_word)
    @start_word = start_word
  end

  def prepend_for(end_word)
    @start_word + " " + end_word  # Not idiomatic Ruby but should be more familiar for other languages user
  end
end

hello = Prepend.new("Hello")
hello.prepend_for("Tap") # => "Hello Tap"
hello.prepend_for("OOP") # => "Hello OOP"

ผมทำสร้างคลาส Prepend ซึ่งมี constructor method ที่รับพารามิเตอร์ 1 ตัวคือคำแรก (start_word) เก็บไว้เป็น instance variable และสร้างเมท็อด prepend_for ที่รับพารามิเตอร์หนึ่งตัวคือคำท้าย (end_word) นำคำแรกและคำท้ายต่อกัน

Continue reading

Lambda กับ Closure ต่างกันยังไง

ตั้งแต่แรกที่ผมได้ยินเกี่ยวกับเรื่อง Functional programming ผมก็ได้ยิน 2 คำนี้มาตลอด แต่ไม่เคยรู้ซักทีว่าเมื่อไหร่ควรใช้คำใด เมื่อไหร่เราควรเรียกว่า Lambda เมื่อไหร่เราควรเรียกว่า Closure พอวันนี้รู้แล้วก็เลยมาเล่าให้ฟังครับ ขออธิบายแบบไม่ทางการนะครับ

Lambda คือการประกาศฟังก์ชันแบบไม่มีชื่อ โดยการประกาศนี้บอกแค่เพียงว่าฟังก์ชันนี้รับพารามิเตอร์อะไรบ้าง และทำกระบวนการอะไรภายในนั้นกับพารามิเตอร์เหล่านั้น

ตัวอย่างเช่น

function(x,y) {
  return x+y;
}

ซึ่งเจ้า Lambda function นี้อาจจะถูกเรียกใช้ทันที

(function(x,y) {
  return x+y;
})(1,2) // => 3

จะถูกเก็บไว้ในตัวแปรเพื่อเรียกใช้ทีหลัง

var sum = function(x,y) {
  return x+y;
}
sum(1,2)

หรือจะถูกส่งเป็นอาร์กิวเมนต์เข้าไปให้ฟังก์ชันอื่นก็ได้

Continue reading