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
คือเราเขียน 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
จะเห็นว่า 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
จากตัวอย่างจะเห็นว่าเราเอา 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)