หน้าเว็บ

วันจันทร์ที่ 6 กันยายน พ.ศ. 2553

แปลง String ให้เป็น Constant

าจมีหลายๆ ครั้ง ที่เราต้องใส่ค่า argument ที่เป็นค่าคงที่ในการเรียกใช้เมธอดหนึ่งๆ ซึ่งค่าคงที่ ที่ใส่ลงไป อาจมีอยู่หลายค่าขึ้นอยู่กับเงื่อนไขที่เหมาะสม พอเราเขียนโค้ดขึ้นมา ผ่านเงื่อนไขต่างๆ จนได้มาซึ่งค่าของ constant ที่เราต้องการแล้ว กลับพบว่าค่าที่เรากรองได้จากการเงื่อนไขพวก if หรือ swicth มันเป็นสตริงที่มีชื่อเหมือนกับชื่อของ constant หาใช่ constant ไม่



เช่น

ในการเรียกใช้เมธอด ที่ชื่อ save_file เพื่อเซฟไฟล์รูปนั้น ต้องใส่พารามิเตอร์ให้เมธอดนี้ 2 ตัวคือ filename และ type ซึ่งพารามิเตอร์ type คือนามสกุลของรูปที่ต้องการเซฟ (JPEG, BMP, ...) แต่เจ้าพารามิเตอร์ตัวนี้ถูกกำหนดให้เป็น constant เท่านั้น สมมติว่า ค่าของ type ที่เป็นไปได้ ได้แก่

BITMAP_TYPE_BMP # สำหรับไฟล์รูปนามสกุล BMP
BITMAP_TYPE_GIF # สำหรับไฟล์รูปนามสกุล GIP
BITMAP_TYPE_PNG # สำหรับไฟล์รูปนามสกุล PNG
...


ทีนี้ เวลาที่ผมต้องการเซฟไฟล์รูปขึ้นมา ผมอาจจะเขียนโค้ดเพื่อ ดักเอา นามสกุลของไฟล์รูปที่ผู้ใช้ป้อนเข้ามาเมื่อต้องการเซฟรูป ด้วยเมธอด save_img(filename) ก่อนแล้วค่อยนำค่าของชื่อไฟล์และนามสกุลที่ดักได้มาเรียกเมธอด save_file อีกที ดังนี้
def save_wafermap_img(filename)
  filename.match(/\.(\w+)$/)
  type = "BITMAP_TYPE_" + $1.upcase
  @bitmap.save_file(filename, type)
end

แต่เมื่อรันเมธอดข้างต้นแล้ว ก็จะพบว่ารันไม่ผ่าน error message บอกว่าพารามิเตอร์ตัวที่ 2 ต้องเป็น constant ไม่ใช้สตริง

เริ่มเห็นประเด็นแล้วนะครับ

อย่างไรก็ตาม ยังมีวิธีที่สามารถทำให้ค่าสตริงที่มีชื่อเหมือนกับ constant นั้นกลายเป็น constant ของคลาสนั้นไปจริงๆได้ วิธีนั้นก็คือ การเรียกใช้เมธอด const_get ครับ

const_get เป็นเมธอดที่อยู่ในคลาส Kernal ดังนั้นเราจึงสามารถเรียกใช้มันจากคลาสอื่นๆ ได้เช่นกัน
เมธอด const_get จะรับพารามิเตอร์เข้ามาเป็นสตริง หากสตริงนั้นมีค่าตรงกับค่าของ constant ที่มีอยู่ในคลาสนั้นจริง เมธอด const_get จะคืนค่าออกมาเป็น constant ชื่อเดียวกับสตริงที่้ป้อนเข้าไปให้มัน
ลองมาดูตัวอย่างเบื้องต้นของการใช้ const_get กันก่อนครับ

C:\>irb --simple-prompt
>> Math::PI
=> 3.141592653589793
>> Math.const_get("PI")
=> 3.141592653589793
>>

จากโค้ดข้างต้น จะเห็นว่าเมธอด const_get ที่มีสตริง "PI" เป็นพารามิเตอร์นั้นจะทำตัวเสมือนเป็น constant PI ซึ่งให้ผลลัพธ์เป็น 3.14159... เหมือนกันแป๊ะ

เราสามารถใช้เมธอด const_get เพื่อแก้ปัญหาที่เราเจอกับเมธอด save_file ในตอนต้นได้เช่นกัน
ค่าของ type ที่จะใส่เข้าไปในเมธอด save_file จึงมีหน้าตาใหม่ดังนี้
def save_wafermap_img(filename)
  filename.match(/\.(\w+)$/)
  type = "BITMAP_TYPE_" + $1.upcase
  @bitmap.save_file(filename, Wx::const_get(type)
end

ลองรันอีกที ก็รันผ่านฉลุยแล้วนะครับ

ไม่มีความคิดเห็น:

แสดงความคิดเห็น