DEV Community

Weerasak Chongnguluam
Weerasak Chongnguluam

Posted on

Pattern matching ฟีเจอร์ใหม่ของ Ruby 2.7

Ruby 2.7 ที่เพิ่งออกมาเมื่อวันคริสมาสต์ที่ผ่านมานั้น ได้เพิ่มฟีเจอร์ใหม่ของภาษาที่สำคัญคือ Pattern Matching

Pattern Matching ช่วยให้เราเปรียบเทียบโครงสร้างของข้อมูล ว่าอยู่ในรูปร่างแบบไหน และ เราสามารถแกะค่าบางค่าจากโครงสร้างนั้นได้ (ถ้าอ่านเจอใน document จะเรียกว่าการ deconstruct)

สำหรับ Ruby 2.7 จะใช้ syntax คือ case/in ซึ่งโครงสร้างจะเป็นประมาณนี้

case val
in pattern_1
  # action_for_pattern_1
in pattern_2
  # action_for_pattern_2
else
  # action_when_no_any_match
end
Enter fullscreen mode Exit fullscreen mode

คือเราเขียน pattern หลังจาก in และเขียนโค้ดที่ต้องการทำงานถ้าเกิดค่าที่เรามาเช็คใน case ตรงกับ pattern ของ in นั้นๆ และในส่วนของ else คือการทำงานในกรณีที่ไม่ match กับ pattern ไหนเลยที่เราเขียนไว้

มาดูตัวอย่างกันดีกว่า ตัวอย่างแรกเป็นการเขียน pattern matching ค่าที่อยู่ใน Array

array = [0, [1, 2, 3]]

case array
in [0, [a, *rest]]
  p a     # a จะเป็นค่า 1
  p rest  # rest จะเป็น [2,3]
end
Enter fullscreen mode Exit fullscreen mode

จะเห็นว่า pattern เรามีตัวแปร a ในตำแหน่งที่ 1 ของค่า array ที่ซ้อนอยู่ ทำให้ a มีค่า 1 และ *rest เป็นการ matching ค่าที่เหลือทั้งหมดของ array ทำให้ rest เป็น array ที่มีค่า [2, 3]

ต่อไปเป็นตัวอย่าง pattern maching ค่าที่อยู่ใน Hash

require "json"

json = <<END
{
  "name": "Alice",
  "age": 30,
  "children": [{ "name": "Bob", "age": 2 }]
}
END

case JSON.parse(json, symbolize_names: true)
in {name: "Alice", children: [{name: "Bob", age: age}]}
  p age # age จะมีค่าเป็น 2
end
Enter fullscreen mode Exit fullscreen mode

จากตัวอย่างจะเห็นว่าเราเอา json string มา parse ให้เป็น Hash จากนั้นลองเขียน pattern เพื่อ deconstruct ค่า age ที่อยู่ใน key :children และอยู่ใน Hash key :age ที่ซ้อนอยู่ใน array ตัวแรกอีกที

พอเราใช้ Pattern Matching ได้ก็ทำให้เราแกะค่า (deconstruct) ของที่ซ้อนอยู่ในโครงสร้างหลายชั้นแบบนี้ได้ง่ายๆขึ้นมากๆ

Ref: อ่านรายละเอียดเรื่อง syntax เพิ่มเติมได้ที่นี่ Pattern matching - New feature in Ruby 2.7

Top comments (0)