Simple Example (2)

หลังจากที่ได้ศึกษาการเขียน ruby มาพอสมควรแล้ว ลองมาดู code ที่เคยเขียนกันไปว่าแต่ละบรรทัดมีความหมายอย่างไร และมีเทคนิคหรือลูกเล่นอะไรบ้างในการนำไปใช้ รวมถึงการใช้ control statement ทั้งหลาย

Factorials

def fact(n)
บรรทัดแรก def เป็นการ define function หรือกำหนด function นั่นเอง (หรืออีกนัยหนึ่งก็เป็น method ซึ่งจะพูดต่อไปในบทข้างหน้า) โดยที่ตรงนี้ทำการกำหนด function fact ขึ้นมาโดยทำหน้าที่รัย argument เพียงตัวเดียวคือ "n"
if n == 0
if เป็นการ ตรวจสอบเงื่อนไข โดยจะทำเมื่อเป็นจริงแต่ถ้าไม่จริงก็จะไปทำใน else
1
ค่าเป็น 1 เมื่อเงื่อนไขของ if เป็นจริง
else
ถ้าเงื่อนไขใน if ไม่เป็นจริงก็จะกลับมาทำที่ else
n * fact(n-1)
ถ้าเงื่อนไขใน if ยังคงไม่เป็นจริง ค่าของ if จะเป็น n คูณกับ fact(n-1)
end
end ตัวแรกเป็นการปิดของ if
end
end ตัวที่สองเป็นการปิดของ def
print fact(ARGV[0].to_i), "\n"
เป็นการเรียกใช้งาน function fact() โดยใช้ค่าที่ได้รับจาก command line และเมื่อเสร็จสิ้นให้ทำการแสดงค่าออกมาด้วย ARGV เป็น ค่า array ที่ใช้รับ argument จาก command line โดยที่สมาชิกของ ARGV เป็นค่า string ดังนั้นเราจึงต้องทำการแปลงค่าไปเป็น integer โดยใช้ .to_i Ruby ไม่ได้ทำการแปลงค่าจาก strings ไปเป็น integer โดยอัตโนมัติเหมือน perl Strings จากนนี้เราจะมาดูเกมที่เราเคยเขียนใน บทของ strings โดยเป็นการเดาคำ เราจะทำการกำหนดเลขบรรทัดเพื่อให้ง่าสยต่อการอ้างอิงดังนี้
01 words = ['foobar', 'baz', 'quux']
            02 secret = words[rand(3)]
            03
            04 print "guess? "
            05 while guess = STDIN.gets
            06   guess.chop!
            07   if guess == secret
            08     print "you win\n"
            09     break
            10   else
            11     print "you lose.\n"
            12   end
            13   print "guess? "
            14 end
            15 print "the word is ", secret, ".\n"
ใน program นี้เราได้มีคำสั่งควบคุม while โดยที่ code ที่อยู่ระหว่าง while และ end นั้นจะกูเรียกใช้ต่อเมื่อเงื่อนไขของ while ยังคงถูก rand(3) ในบรรทัดที่ 2 นั้นจะเป็นการสุ่มตัวเลขระหว่างช่วง 0 ถึง 2 และเลขสุ่มนี้ถูกใช้ในการเลือกสมาชิกใน array ที่ชื่อ word ในบรรทัดที่ 5 program ได้ถูกเรียกให้อ่านค่าจาก stabdard input โดยใช้ method STDIN.gets ถ้า EOF (End Of Line)หรือ enter เกิดขึ้นขณะที่รับค่า, gets จะ return nil ดังนั้น code มันจะเข้ากรณีของ while จะทำซ้ำไปเรื่อยๆจนกว่าจะเจอ ^D (^Z บน DOS) จึงจะหยุด guess.chop! ในบรรทัดที่ 6 นั้นเป็นการเอาค่า character ตัวสุดท้ายออกจากตัวแปล guess ซึ่งนั่นก็คือ newline charater ในบรรทัดที่ 15 program ทำการแสดงค่า secret word โดยที่คำสั่ง print ทำการรับค่า 3 argument เนื่องจากมี , คั่นอยู่ แต่เราสามารถแสดงค่าโดยใช้คำสั่ง print โดยรับ argument เพียงแค่ตัวเดียวเท่านั้นก็ได้ โดยเขียน secret เป็น #{secret} โดยมันจจะทำการแป ลค่าตัวแปลออกมาเลย
print "the word is #{secret}.\n" 

Regular Expressions สุดท้ายเรามาดู code จากบน regular expression กัน
01 st = "\033[7m"
            02 en = "\033[m"
            03
            04 while TRUE
            05   print "str> "
            06   STDOUT.flush
            07   str = gets
            08   break if not str
            09   str.chop!
            10   print "pat> "
            11   STDOUT.flush
            12   re = gets
            13   break if not re
            14   re.chop!
            15   str.gsub! re, "#{st}\\&#{en}"
            16   print str, "\n"
            17 end
            18 print "\n"
ในบรรทัดที่ 4 เงื่อนไขของ while นั้นถูกกำหนดตายตัวว่าเป็นค่า TRUE เสมอ ดังนั้นรูปแบบนี้จะมองเป็น loop ที่ไม่มีวันจบ แต่เราได้ทำการใส่ค่า break ในบรรทัดที่ 8 และ 13 เพื่อให้หลุดจาก loop คำสั่ง break ทั้ง 2 อันนก็เป็นอีกหนึ่งตัวอย่างในการใช้ if นั่นคือจะทำคำสั่งข้างซ้ายต่อเมื่อเงื่อนไขทางขวาเป็นจริง ส่วน chop! ในบรรทัดที่ 9 และ 14 โดยบางครั้งเราเติม '!' หรือ '?' ต่อท้าย method โดยที่ ! แสดงถึงการเปลี่ยนแปลงค่าในตัวเองได้ chop! จะมีผลโดยทันทีกับตัวแปลนั้นๆทันที่เรียกใช้แต่ถ้า chop ที่ไม่มี ! แล้วจะมีผลต่อเมื่อมีการ copy ค่าเท่านั้นดังตัวอย่าง
ruby> s1 = "forth"
            "forth"
            ruby> s1.chop!       # This changes s1.
            "fort"
            ruby> s2 = s1.chop   # This puts a changed copy in s2,
            "for"
            ruby> s1             # ... without disturbing s1.
            "fort"
หลังจากนี้จะได้พบกับ method ที่ลงท้ายด้วย ? แสดงถึง ความคิด โดยที่จะทำการ return ค่าไม่ true ก็ false บรรทัดที่ 15 ต้องรัวังให้ดี อย่างแรกคือ gsub! เป็น method ที่ใช้เปลี่ยนแปลงเช่นกัน มันจะทำการเปลี่ยนค่า str โดยแทนที่ทุกๆค่าที่ตรงกับ รูปแบบ "re" (sub หมายถึง subsitute และ g หมายถึง global) โดยที่ทำการเปลี่ยนค่าด้วย st และ en ที่เราทำการกำหนดไว้ในบรรทัด 1 และ 2 ด้วย ANSI ที่ทำให้ตัวหนังสือมีสี และในบรรทัดที่ 15 นี้ยังมีการเรียกใช้ #{ } เพื่อให้แน่ใจว่าได้ถูกแปล (และแน่ใจว่าจะไม่มีชื่อตัวแปลแสดงออกมา) ระหว่างนั้นยังมี " \\&" เป็นเพิ่มเทคนิคเมื่อการแทนที่ string อยู่ใน เครื่องหมายฟันหนู เครื่องหมาย backslash 2 อันจะถูกแปลเป็น backslash เพียงอันเดียว ดังนั้น gsub ก็จะเห็นเป็นเพียง "\&" และเกิดขึ้นกับข้อความที่แทนที่แล้วข้อความใหม่ที่ถูกแสดงจะเหมือนเดิม ยกเว้นส่วนที่ถูกแทนที่จะมีสีเพิ่มขึ้นมา

Tue, 25 Jul 2006 16:10 Posted in

Tags , , , ,

Comment Simple Example (2)


RSS