มารั่วกันต่อ#2


ตอนที่แล้วทำเรื่องเกี่ยวกับเขียนโปรแกรมเลยรู้สึกว่าใช้ Blogger แล้วขัดใจนิดหน่อยจะทำบล๊อกทำตารางก็ต้องสลับไปโหมด HTML แถมโค้ดยังเรียงติดกันเป็นพรืดอ่านยากถ้าเนื้อหาบทความยาวๆ จะไปแก้ไขอะไรทีก็ลำบาก อย่างบทความก่อนหน้าต้องไปจัดสไตล์ในแต่ละบล๊อกยุ่งยากตอนนี้เลยไปเอา CSS มาแปะเพิ่มในธีมเวลาเรียกใช้ก็แค่เรียกใช้คลาสที่กำหนดไว้ลดความยุ่งยากลงมานิดนึง
มาต่อเรื่องของ Lua กัน เนื่องดัวยการออกแบบให้ core มีขนาดเล็กทำงานได้รวดเร็วทำให้มีลักษณะบางอย่างต่างจากภาษาอื่นๆ หลายตัวเช่นมีประเภทตัวแปรน้อย มีตัวดำเนินการหลักๆ ไม่กี่อย่างแต่ก็สามารถทำงานครอบคลุมงานทั่วๆ ไปได้อย่างดี ในคราวนี้เราจะมาเรียนรู้เรื่องตรรกะของ Lua กัน



Booleans & Relational operators & Logical operators

ก่อนเข้าเรื่องเรามาสรุปสัญลักษณ์เครื่องหมายกันก่อน
Relational operators Logical operators
<น้อยกว่าandและ
>มากกว่าorหรือ
<=น้อยกว่าหรือเท่ากับnotไม่
>=มากกว่าหรือเท่ากับBooleane types
~=ไม่เท่ากับtrueจริง
==เท่ากับfalseเท็จ
จากตอนที่แล้วเรารู้ว่า ตัวแปรประเภท boolean นั้นมีสองตัวคือ 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 ด้วยเช่น
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 กรณีที่เป็นจริงทั้งคู่จะคืนค่าทางขวา กรณีที่เป็นเท็จทั้งคู่จะคืนค่าทางซ้าย และกรณีที่จริงกับเท็จจะคืนค่าเท็จ
การใช้ 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
เราสามารถนำมาประยุกต์ใช้ได้หลายอย่างเช่น short if อย่างในภาษาตระกูล C ทั้งหลายรวมถึง Java และ PHP มักจะเขียนในรูปแบบTernary operator
(ตัวแปร) = (เงื่อนไข) ? (ค่ากรณีที่จริง) : (ค่ากรณีที่เท็จ)
หรือ 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 ได้ดังนี้
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 ได้เช่น
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

แถมท้าย

ที่จริงควรบอกเป็นเรื่องแรกๆ แต่ลืมเลยเอามาต่อท้ายเกี่ยวกับเรื่องตัวแปร

การตั้งชื่อ
เหมือนกับภาษา 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

ตอนที่ 1 มารั่วกันเถอะ
ตอนที่ 3 มารั่วกันต่อ#3
ตอนที่ 4 มารั่วกันต่อ#4  

หัดเขียนโปรแกรมแบบบ้านๆ ตอนที่ 3 พื้นฐานภาษา Lua

ความคิดเห็น