edit
Simple Example (2)
หลังจากที่ได้ศึกษาการเขียน ruby มาพอสมควรแล้ว ลองมาดู code
ที่เคยเขียนกันไปว่าแต่ละบรรทัดมีความหมายอย่างไร
และมีเทคนิคหรือลูกเล่นอะไรบ้างในการนำไปใช้ รวมถึงการใช้ control
statement ทั้งหลาย
Factorials
บรรทัดแรก def เป็นการ define function หรือกำหนด function นั่นเอง
(หรืออีกนัยหนึ่งก็เป็น method ซึ่งจะพูดต่อไปในบทข้างหน้า)
โดยที่ตรงนี้ทำการกำหนด function fact ขึ้นมาโดยทำหน้าที่รัย argument
เพียงตัวเดียวคือ "n"
if เป็นการ ตรวจสอบเงื่อนไข โดยจะทำเมื่อเป็นจริงแต่ถ้าไม่จริงก็จะไปทำใน else
ค่าเป็น 1 เมื่อเงื่อนไขของ if เป็นจริง
ถ้าเงื่อนไขใน if ไม่เป็นจริงก็จะกลับมาทำที่ else
ถ้าเงื่อนไขใน if ยังคงไม่เป็นจริง ค่าของ if จะเป็น n คูณกับ fact(n-1)
end ตัวแรกเป็นการปิดของ if
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 ก็จะเห็นเป็นเพียง "\&"
และเกิดขึ้นกับข้อความที่แทนที่แล้วข้อความใหม่ที่ถูกแสดงจะเหมือนเดิม
ยกเว้นส่วนที่ถูกแทนที่จะมีสีเพิ่มขึ้นมา
Posted by revolution
Tue, 25 Jul 2006 16:10:35 GMT