เช่น
ในการเรียกใช้เมธอด ที่ชื่อ save_file เพื่อเซฟไฟล์รูปนั้น ต้องใส่พารามิเตอร์ให้เมธอดนี้ 2 ตัวคือ filename และ type ซึ่งพารามิเตอร์ type คือนามสกุลของรูปที่ต้องการเซฟ (JPEG, BMP, ...) แต่เจ้าพารามิเตอร์ตัวนี้ถูกกำหนดให้เป็น constant เท่านั้น สมมติว่า ค่าของ type ที่เป็นไปได้ ได้แก่
BITMAP_TYPE_BMP # สำหรับไฟล์รูปนามสกุล BMP
BITMAP_TYPE_GIF # สำหรับไฟล์รูปนามสกุล GIP
BITMAP_TYPE_PNG # สำหรับไฟล์รูปนามสกุล PNG
...
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
ลองรันอีกที ก็รันผ่านฉลุยแล้วนะครับ
ไม่มีความคิดเห็น:
แสดงความคิดเห็น