หน้าเว็บ

วันพฤหัสบดีที่ 29 ตุลาคม พ.ศ. 2552

เทคนิกเล็กๆน้อยๆกับสตริง

ต้องคอยเตือนตัวเองไว้เสมอว่าเกือบทุกอย่างใน Ruby นั้นเป็นอ็อบเจกต์แทบทั้งหมด
สตริงก็เหมือนกันครับ เป็นอ็อบเจกต์
เมื่อมันเป็นอ็อบเจกต์ คุณก็น่าจะคาดได้ว่าเราสามารถเรียกใช้เมธอดของคลาสตริงจากอ็อบเจกต์ได้ด้วย เมธอดส่วนใหญ่เป็น build-in เมธอดที่ถูกกำหนดอยู่ในคลาส String ซึ่งเป็นคลาสมาตรฐานใน Ruby อยู่แล้ว เช่น
puts "string".reverse
puts "string".upcase

ผลลัพธ์ที่ออกมาก็เป็นไปตามคาด

gnirts
STRING

ที่น่าสนใจน่ะอันนี้ต่างหาก
ถ้าผมทำอย่างนี้ล่ะ พอจะเดากันออกมั้ยครับว่าจะได้ผลลัพธ์ยังไง
puts "string"[0]
puts "string"[1]
puts "string"[2]
puts "string"[3]
puts "string"[4]
puts "string"[5]
puts "string"[6]

ตอนแรกผมเดาว่าน่าจะได้ผลออกมาเป็น charecter แต่ละตัวของคำๆนี้เช่น "s", "t", ....
แต่ไม่ใช่
สิ่งที่ได้คือ ASCII โค้ดของตัวอักษรแต่ละตัวต่างหาก ซึ่งถ้าเราใส่ index ที่ไม่มีตัวอักษรในตำแหน่งนั้นเราก็จะได้ค่าเป็น nil ออกมาแทน(ตามตัวอย่างคือตำแหน่งที่ 6)

115
116
114
105
110
103
nil

พอเป็นอย่างนี้ผมก็สามารถใช้เทกนิคนี้มาใช้แปลงลำดับของตัวอักษรที่ผมอยากทำให้มันเป็น index ได้ง่ายๆยกตัวอย่างเช่น
ถ้าผมอยากแปลงตำแหน่งของระบบ row, column อย่างที่ใช้ใน Excel มาเป็นระบบคู่ลำดับ x,y เช่นตำแหน่ง A1 ก็คือ (1,1) หรือ H6 ก็คือ (8, 6) ผมก็สามารถเขียน function แปลงได้ดังนี้
def convert(cell)
  str = cell.downcase
  x = str[0] - 'a'[0]
  y = str[1] - '0'[0]
  
  return x, y
end

pos = convert("J5")
puts pos

พอจะได้ idea นะครับ
อย่างไรก็ตาม function นี้ยังมีจุดที่ต้องระวังเวลานำไปใช้ คือมันจะ work ก็ต่อเมื่อค่าของ row และ column นั้นเป็นตัวอักษรตัวเดียวเท่านั้น ถ้าเราใส่เป็น AB3 หรือ A16 อย่างงี้มันจะแสดงผลไม่ถูกต้องครับ ลองคิดต่อเล่นๆละกันครับว่าถ้าอย่างให้มันแสดงค่าได้ถูกต้องนั้นต้องทำยังไง


วันนี้พอแค่นี้ ไปก่อนล่ะครับ หุหุ