ตอนที่แล้วทำเรื่องเกี่ยวกับเขียนโปรแกรมเลยรู้สึกว่าใช้ Blogger แล้วขัดใจนิดหน่อยจะทำบล๊อกทำตารางก็ต้องสลับไปโหมด HTML แถมโค้ดยังเรียงติดกันเป็นพรืดอ่านยากถ้าเนื้อหาบทความยาวๆ จะไปแก้ไขอะไรทีก็ลำบาก อย่างบทความก่อนหน้าต้องไปจัดสไตล์ในแต่ละบล๊อกยุ่งยากตอนนี้เลยไปเอา CSS มาแปะเพิ่มในธีมเวลาเรียกใช้ก็แค่เรียกใช้คลาสที่กำหนดไว้ลดความยุ่งยากลงมานิดนึง
มาต่อเรื่องของ Lua กัน เนื่องดัวยการออกแบบให้ core มีขนาดเล็กทำงานได้รวดเร็วทำให้มีลักษณะบางอย่างต่างจากภาษาอื่นๆ หลายตัวเช่นมีประเภทตัวแปรน้อย มีตัวดำเนินการหลักๆ ไม่กี่อย่างแต่ก็สามารถทำงานครอบคลุมงานทั่วๆ ไปได้อย่างดี ในคราวนี้เราจะมาเรียนรู้เรื่องตรรกะของ Lua กัน
จากตอนที่แล้วเรารู้ว่า ตัวแปรประเภท boolean นั้นมีสองตัวคือ true(จริง) กับ false(เท็จ) เช่น
การใช้ or กรณีที่เป็นจริงทั้งคู่จะคืนค่าทางซ้าย กรณีที่เป็นเท็จทั้งคู่จะคืนค่าทางขวา และกรณีที่จริงกับเท็จจะคืนค่าจริง
เราสามารถนำมาประยุกต์ใช้ได้หลายอย่างเช่น short if อย่างในภาษาตระกูล C ทั้งหลายรวมถึง Java และ PHP มักจะเขียนในรูปแบบTernary operator
การตั้งชื่อ
เหมือนกับภาษา Python คือประกอบไปด้วยตัวอักษรภาษาอังกฤษทั่วไป(ไม่สามารถใช้ภาษาไทยเหมือน Java ได้) ตัวเลข และ _ โดยไม่มีช่องว่างหรืออักขระพิเศษแทรกอยู่ และห้ามขึ้นต้นด้วยตัวเลข และจะต้องไม่ซ้ำกับคำสงวนของ Lua โดยที่ตัวอักษรตัวเล็กและตัวใหญ่แตกต่างกันเช่น v_ar1 กับ V_ar1 เป็นคนละตัวแปร
Global & Local
ในภาษาอื่นอาจกำหนดตัวแปร global และ local จากวิธีการตั้งชื่อเช่น Ruby ใช้ $ นำหน้าตัวแปล global หรือในภาษา Python ใช้ตำแหน่งที่ตัวแปรถูกสร้างและเรียกใช้ เช่นถ้าสร้างตัวแปรไว้นอกบล๊อกก็จะเป็น global แต่ถ้าสร้างไว้ในบล๊อกก็จะเป็น local ของบล๊อกนั้น แต่ใน Lua ตัวแปรทุกตัวเป็น global โดยพื้นฐานไม่ว่าจะสร้างที่ส่วนไหนของโปรแกรม ถ้าต้องการใช้งานตัวแปร local ต้องระบุ local หน้าชื่อตัวแปร เช่น
ตอนที่ 1 มารั่วกันเถอะ
ตอนที่ 3 มารั่วกันต่อ#3
ตอนที่ 4 มารั่วกันต่อ#4
หัดเขียนโปรแกรมแบบบ้านๆ ตอนที่ 3 พื้นฐานภาษา Lua
มาต่อเรื่องของ Lua กัน เนื่องดัวยการออกแบบให้ core มีขนาดเล็กทำงานได้รวดเร็วทำให้มีลักษณะบางอย่างต่างจากภาษาอื่นๆ หลายตัวเช่นมีประเภทตัวแปรน้อย มีตัวดำเนินการหลักๆ ไม่กี่อย่างแต่ก็สามารถทำงานครอบคลุมงานทั่วๆ ไปได้อย่างดี ในคราวนี้เราจะมาเรียนรู้เรื่องตรรกะของ Lua กัน
Booleans & Relational operators & Logical operators
ก่อนเข้าเรื่องเรามาสรุปสัญลักษณ์เครื่องหมายกันก่อนRelational operators | Logical operators | ||
< | น้อยกว่า | and | และ |
> | มากกว่า | or | หรือ |
<= | น้อยกว่าหรือเท่ากับ | not | ไม่ |
>= | มากกว่าหรือเท่ากับ | Booleane types | |
~= | ไม่เท่ากับ | true | จริง |
== | เท่ากับ | false | เท็จ |
a = 2>1
print(type(a),a) -----> boolean true
b = 'a'=='b'
print(type(b),b) -----> boolean false
ตัวแปรประเภท boolean ในภาษา Lua จะเหมือนกับ Ruby ถือว่าค่าทุกตัวยกเว้น false กับ nil เป็น true หมดในขณะที่หลายๆภาษามักจะนับค่า 0 และ ""(ค่าอักขระว่าง) รวมเข้าใน false ด้วยเช่น
print(type(a),a) -----> boolean true
b = 'a'=='b'
print(type(b),b) -----> boolean false
Lua
if 0 and "" then --จริงและจริง=จริง
print("Zero is true")
else
print("Zero is false")
end --ผลลัพธ์คือ Zero is true
เทียบ Ruby
if 0 && "" #จริงและจริง=จริง
print "True"
else
print "False"
end
# ผลลัพธ์คือ True
เทียบกับ Python
if 0 or "" : # เท็จหรือเท็จ=เท็จ
print("True")
else:
print("False")
# ผลลัพธ์คือ False
เทียบ PHP
if(0 || ""){ // เท็จหรือเท็จ=เท็จ
echo "True";
}else{
echo "False";
}
// ผลลัพธ์คือ False
การใช้ and กรณีที่เป็นจริงทั้งคู่จะคืนค่าทางขวา กรณีที่เป็นเท็จทั้งคู่จะคืนค่าทางซ้าย และกรณีที่จริงกับเท็จจะคืนค่าเท็จif 0 and "" then --จริงและจริง=จริง
print("Zero is true")
else
print("Zero is false")
end --ผลลัพธ์คือ Zero is true
เทียบ Ruby
if 0 && "" #จริงและจริง=จริง
print "True"
else
print "False"
end
# ผลลัพธ์คือ True
เทียบกับ Python
if 0 or "" : # เท็จหรือเท็จ=เท็จ
print("True")
else:
print("False")
# ผลลัพธ์คือ False
เทียบ PHP
if(0 || ""){ // เท็จหรือเท็จ=เท็จ
echo "True";
}else{
echo "False";
}
// ผลลัพธ์คือ False
การใช้ or กรณีที่เป็นจริงทั้งคู่จะคืนค่าทางซ้าย กรณีที่เป็นเท็จทั้งคู่จะคืนค่าทางขวา และกรณีที่จริงกับเท็จจะคืนค่าจริง
print("a" and 2) | ----> | 2 |
print(false and nil) | ----> | false |
print(nil and "asdf") | ----> | nil |
print("a" or 2) | ----> | a |
print(false or nil) | ----> | nil |
print(nil or "asdf") | ----> | asdf |
print(not 0) | ----> | false |
pritn(not "") | ----> | false |
print(not nil) | ----> | true |
(ตัวแปร) = (เงื่อนไข) ? (ค่ากรณีที่จริง) : (ค่ากรณีที่เท็จ)
หรือ return (เงื่อนไข) ? (ค่ากรณีที่จริง) : (ค่ากรณีที่เท็จ) #ในการคืนค่ากลับ
เช่น
PHP/Perl
$a = ($b=="Yes")?$b:"No";
/* เหมือนกับ
if ($b=="Yes"){
$a = $b;
} else {
$a = "No";
}
*/
Java/C/C++/C#
result = (a>b)?a:b;
Python มีหลายแบบ
result = a if a>b else b
#หรือ
result = (b,a)[a>b]
#หรือ
result = {True:a,False:b}[a>b] เป็นต้น
ส่วน Lua จากคุณสมบัติ and กับ or เราสามารถนำมาเขียนในรูปของ short if ได้ดังนี้
หรือ return (เงื่อนไข) ? (ค่ากรณีที่จริง) : (ค่ากรณีที่เท็จ) #ในการคืนค่ากลับ
เช่น
PHP/Perl
$a = ($b=="Yes")?$b:"No";
/* เหมือนกับ
if ($b=="Yes"){
$a = $b;
} else {
$a = "No";
}
*/
Java/C/C++/C#
result = (a>b)?a:b;
Python มีหลายแบบ
result = a if a>b else b
#หรือ
result = (b,a)[a>b]
#หรือ
result = {True:a,False:b}[a>b] เป็นต้น
result = (a>b) and x or y
--[[
เงื่อนไขค่า x และ y จะต้องไม่เป็น nil หรือ false
ในกรณีที่ (a>b) เป็นจริง (a>b) and x จะคืนค่าทางขวาเสมอได้ค่า x และ x or y จะคืนค่าทางซ้ายซึ่งก็คือ x ดังนั้นเมื่อ a>b จริงจะคืนค่า x
ในกรณีที่ (a>b) เป็นเท็จ (a>b) and x จะคืนค่า false และ false or y จะคืนค่า y ดังนั้นเมื่อ a>b เท็จจะคืนค่า y
--]]
และยังสามารถเอาไปประยุกต์กับ default value ใน arguments ของ function ได้เช่น
--[[
เงื่อนไขค่า x และ y จะต้องไม่เป็น nil หรือ false
ในกรณีที่ (a>b) เป็นจริง (a>b) and x จะคืนค่าทางขวาเสมอได้ค่า x และ x or y จะคืนค่าทางซ้ายซึ่งก็คือ x ดังนั้นเมื่อ a>b จริงจะคืนค่า x
ในกรณีที่ (a>b) เป็นเท็จ (a>b) and x จะคืนค่า false และ false or y จะคืนค่า y ดังนั้นเมื่อ a>b เท็จจะคืนค่า y
--]]
function fun(a,b,c)
b = b or 4
c = c or 5
print(a,b,c)
end
fun(10) ----> 10 4 5
fun(3,8) ----> 3 8 5
b = b or 4
c = c or 5
print(a,b,c)
end
fun(10) ----> 10 4 5
fun(3,8) ----> 3 8 5
แถมท้าย
ที่จริงควรบอกเป็นเรื่องแรกๆ แต่ลืมเลยเอามาต่อท้ายเกี่ยวกับเรื่องตัวแปรการตั้งชื่อ
เหมือนกับภาษา Python คือประกอบไปด้วยตัวอักษรภาษาอังกฤษทั่วไป(ไม่สามารถใช้ภาษาไทยเหมือน Java ได้) ตัวเลข และ _ โดยไม่มีช่องว่างหรืออักขระพิเศษแทรกอยู่ และห้ามขึ้นต้นด้วยตัวเลข และจะต้องไม่ซ้ำกับคำสงวนของ Lua โดยที่ตัวอักษรตัวเล็กและตัวใหญ่แตกต่างกันเช่น v_ar1 กับ V_ar1 เป็นคนละตัวแปร
Global & Local
ในภาษาอื่นอาจกำหนดตัวแปร global และ local จากวิธีการตั้งชื่อเช่น Ruby ใช้ $ นำหน้าตัวแปล global หรือในภาษา Python ใช้ตำแหน่งที่ตัวแปรถูกสร้างและเรียกใช้ เช่นถ้าสร้างตัวแปรไว้นอกบล๊อกก็จะเป็น global แต่ถ้าสร้างไว้ในบล๊อกก็จะเป็น local ของบล๊อกนั้น แต่ใน Lua ตัวแปรทุกตัวเป็น global โดยพื้นฐานไม่ว่าจะสร้างที่ส่วนไหนของโปรแกรม ถ้าต้องการใช้งานตัวแปร local ต้องระบุ local หน้าชื่อตัวแปร เช่น
local a = "Hello"
ยกเว้นตัวแปรเฉพาะบางตัวเช่นที่เป็น parameters ใน function หรือตัวแปรกำหนดค่าในลูป for
function f(a,b)
......
end
-- a และ b เป็นตัวแปร local ของ f()
for i=1,10 do
......
end
-- i เป็นตัวแปร local
for k,v in pairs(x) do
......
end
-- k และ v เป็นตัวแปร local
ตอนหน้าเราจะมาต่อกันในเรื่อง string และ table......
end
-- a และ b เป็นตัวแปร local ของ f()
for i=1,10 do
......
end
-- i เป็นตัวแปร local
for k,v in pairs(x) do
......
end
-- k และ v เป็นตัวแปร local
ตอนที่ 1 มารั่วกันเถอะ
ตอนที่ 3 มารั่วกันต่อ#3
ตอนที่ 4 มารั่วกันต่อ#4
หัดเขียนโปรแกรมแบบบ้านๆ ตอนที่ 3 พื้นฐานภาษา Lua
ความคิดเห็น
แสดงความคิดเห็น