Dreaming Black Cat

Whispers of an ordinary cat...

Ruby နွင့္ ေတြ့ ဆုံျခင္း ၁

ကြ်န္ေတာ့္ ဘ၀ တြင္ Programming နွင့္ပတ္သက္၍ အျကီးမားဆုံး အေျပာင္း အလဲ နွစ္ခု ရွိပါသည္။ ပထမတစ္ခုမွာ ကြန္ပ်ူ တာ ပထမနွစ္တြင္ ေဒါက္တာေဒါ္အိအိလုွိင္ နွင့္ C++ ျဖင့္ Programming အေျခခံကုိ သင္ျကားခဲ့ ရျခင္းျဖစ္ျပီး ဒုတိယတစ္ခုမွာေတာ့ Ruby on Rails ကုိ စတင္ ေလ့လာခြင့္ ရခဲ့ျခင္းျဖစ္ပါသည္။ Ruby on Rails ကုိ စတင္ေလ့လာခြင့္ ရခဲ့ခ်ိန္မွ စ၍ Programming အေပါ္ထားေသာ ကြ်န္ေတာ့္ သေဘာထား မ်ား စြာ ေျပာင္းလဲခဲ့ ပါသည္။ ယင္းမတုိင္မီ က Web Development သည္ ကြ်န္ေတာ့ အတြက္ ခက္ခဲေသာ ဘာသာတစ္ခုျဖစ္ခဲ့ သည္။ သုိ့ေသာ္ Convention Over Configuration နွင့္ Programmer Happiness ကုိ အဓိကထားေသာ Rails Framework နွင့္ Ruby Language က Web Development ကုိ လြယ္ကူေအာင္ ဖန္တီးေပးခဲ့သည္။ ထုိ့ အျပင္ ယခင္ က Programming Language အသစ္မ်ား၊ Technology အသစ္မ်ားကုိ ေျကာက္ရြံ ့ခဲ့ေသာ ကြ်န္ေတာ့္ကုိ လည္း အသစ္ အဆန္း ဆုိတာ ေျကာက္စရာမဟုတ္ေျကာင္း မီးေမာင္းထုိးျပေပးခဲ့ပါသည္။ _why က ေျပာခဲ့သည့္ Vitamin Rအား ကြ်န္ေတာ္နွင့္ အလားတူ ခံစားေနရသူမ်ား အတြက္ ကြ်န္ေတာ္ တတ္စြမ္းသေလာက္ ကြ်န္ေတာ္ ျပန္လည္ ေ၀မွ်ခ်င္သည့္အတြက္ ဤ စာကုိ ေရးပါသည္။

Vitamin R. Goes straight to the head. Ruby will teach you to express your ideas through a computer. You will be writing stories for a machine. * Why’s Poignant guide to Ruby-_why_the_lucky_stiff*

ရူဘီ အေျခခံကုိ ေလ့လာရန္ အတြက္ ေလ့လာစရာ အရင္းအျမစ္မ်ား အင္တာနက္ေပါ္တြင္ အလြန္မ်ားျပားပါသည္။ သုိ့ေသာ္ ၀မ္းနည္းစရာတစ္ခ်က္က ကြ်န္ေတာ္ ဤ စာကို ေရးသည့္အခ်ိန္ ထိ ျမန္မာဘာသာျဖင့္ ေရးသားေသာ ရူဘီ ပရုိဂရမ္မင္း အေျကာင္း စာမ်ား အေတာ္ပင္နည္းပါး လွပါသည္။ ထုိ ကဲ့ သုိ့ လြတ္ေနေသာ ကြက္လပ္ တစ္ခု တြင္ တတ္စြမ္းသမွ် ၀င္ေရာက္ ျဖည့္ဆည္းေပးခ်င္ပါသည္။

ကြ်န္ေတာ္ ရူဘီကုိ စတင္ေလ့လာ စဥ္ က Java,C++,Javascript အစရွိသည့္ ပရုိဂရမ္ဘာသာစကားမ်ား အထိုက္အသင့္ ေလ့လာခဲ့ ျပီး ျဖစ္ပါသည္။ ထုိ့ အတြက္ ပရုိဂရမ္ဘာသာစကား အားလုံးအတြက္ အေျခ ခံ ျဖစ္ေသာ variable, loop, function, array, data types, conditionals အစရွိသည္မ်ား ကုိ ကြ်မ္း၀င္ ျပီး ျဖစ္သည္။ ဤ စာဖတ္သူ အမ်ားစုလည္း အလားတူ ျဖစ္မည္ ဟု ယူဆပါသည္။ ထုိ့ေျကာင့္ ထုိ အပုိင္းမ်ားကို ကြ်န္ေတာ္ ေသခ်ာ ရွင္းျပမည္ မဟုတ္ပါ။ အျခား language မ်ားနွင့္ ကြဲျပားျခားနား သည္မ်ားကို သာ ဦးစားေပးေရးသြားမည္ျဖစ္ပါသည္။ ထို့ အတူ ရူဘီ ကုိ install လုပ္ ျခင္း နွင့္ သက္ဆုိင္ ေသာအေျကာင္းအရာမ်ားကုိ လည္း ေရးသြားမည္မဟုတ္ပါ။ အကယ္၍ ရူဘီကုိ install လုပ္ခ်င္ပါက “how to install ruby” ဟုသာ ဂူဂယ္ လုိက္ပါ။ သိပ္အခက္အခဲ မရွိပဲ သြင္းနုိင္ပါလိမ့္မည္။ပထမဆုံး variable မ်ားအေျကာင္းက စပါမည္။

Variables

ရူ ဘီ သည္ dynamic language တစ္ခု ျဖစ္ပါသည္။ ထုိ့ ေျကာင့္ variable ေျကညာျခင္းကုိ သတ္သတ္လုပ္စရာ မလုိပါ။ စသုံးသည့္ ေနရာမွာ တင္ ေျကညာလုိက္လုိ့ ရပါသည္။ဥပမာ a = 1 ဟု ေရးလုိက္ လွ်င္ a ဟူေသာ variable ကုိ ေျက ညာျပီး 1 ဟူသည့္ တန္ဖုိး ထည့္ ျပီး ျဖစ္သည္။ @ နွင့္ စေသာ variable မ်ား မွာ instance variable မ်ား တစ္နည္း အားျဖင့္ object တစ္ခု ၏ ကုိယ္ပုိင္ member variable မ်ား ျဖစ္သည္။ ဥပမာ @name ဟု ေရးလွ်င္ @name သည္ ထုိ variable ကုိ အသုံးျပု သည့္ class ၏ member variable ျဖစ္သည္။ Instance အဆင့္မဟုတ္ ပဲ class အဆင့္ variable မ်ားအား @@ နွစ္လုံးျဖင့္ ေရးပါသည္။ ဥပမာ @@count ဟုေရးလ်ွင္ ထုိ class တစ္ခုလုံး နွင့္ သက္ဆုိင္သည့္ shared variable တစ္လုံးအျဖစ္ အသုံး ျပု နုိင္ပါသည္။ name, person အစရွိသျဖင့္ ပုံမွန္ နာမည္ အားလုံး သည္ local variable ဒါမွမဟုတ္ method call အျဖစ္ သတ္မွတ္ပါသည္။ ရူဘီ တြင္ ruby keyword, space သုိ့မဟုတ္ ဂဏန္းျဖင့္စေသာ နာမည္မ်ားမွ လြဲ၍ variable အမည္ ေပးနုိင္ပါသည္။ က်န္ေသာ language မ်ား နွင့္ သိပ္မကြာ ျခားပါ။ Global variable မ်ားကုိ ေတာ့ $ ျဖင့္ စတင္ပါသည္။ ဥပမာ $name သည္ Global variable တစ္လုံးျဖစ္ပါသည္။ ရူဘီ တြင္ variable မ်ား၊ method မ်ား အား နာမည္ေပးရာတြင္ စကားလုံးျခားနားေသာပုဒ္မ်ား တြင္ underscore “_” (snake case ဟုေခါ္ပါသည္) ျဖင့္ သုံးေလ့ရွိပါသည္။ ဥပမာ user_name, my_var အစရွိသျဖင့္ သုံးေလ့ရွိပါသည္။ Java အစရွိေသာ language မ်ားတြင္ Camel Case ဟုေခါ္ေသာ အစဆုံးစာလုံးအေသး ေနာက္ စကားစုမ်ားကုိ အစစာလုံး အျကီးနွင့္ေရးေလ့ရွိေသာ ပုံစံကုိ သုံးေလ့မရွိပါ။ သုံး၍ေတာ့ ရပါသည္။ ထုံးစံမရွိျခင္းသာ ျဖစ္ပါသည္။

Types

ရူဘီ သည္ loosely-typed language တစ္ခုျဖစ္သည္။ တစ္နည္းအားျဖင့္ variable တစ္လုံး ၏ အမ်ိ ုး အစားကုိ မျဖစ္မေနသတ္မွတ္ရန္မလုိေပ။ variable တစ္လုံး အား “String” ျဖစ္ေစ “Integer” ျဖစ္ေစ အျခား Object တစ္ခုခု ျဖစ္ေစ assign လုပ္ခြင့္ရွိပါသည္။ သို့ ေသာ္ Type လုံး၀ ကင္းမဲ့သည္ေတာ့မဟုတ္ပါ။ variable အားလုံးသည္ object မ်ား ျဖစ္၍ ထုိ object အတြင္း ထည့္သြင္းထားသည့္ အမ် ိ ုးအစားကုိ ေတာ့ ေဆာင္ေနမည္ျဖစ္ပါသည္။ ဥပမာ a = "Hello" ဟု ေရးလွ်င္ variable a သည္ String type ေဆာင္သည့္ variable ျဖစ္ေနပါမည္။ သုိ့ေသာ္ a = 2 ဟု ေျပာင္းလဲလုိက္ပါက ၎၏ type လည္း လုိက္ ေျပာင္းသြားမည္ျဖစ္သည္။ ထုိ့ေျကာင့္ explicit type conversion ေခါ္ type ေျပာင္းလဲေပးရျခင္းကုိ ပရုိဂရမ္မာ က တာ၀န္ယူစရာမလုိပါ။ သုိ့ေသာ္ object အခ်င္းခ်ငး္ message မ်ား ပုိ့ရာတြင္ basic type မ်ား ေျပာင္းလဲလုိ ပါက explicit ေျပာင္းလဲနုိင္ရန္ to_s, to_i အစရွိသျဖင့္ Type Conversion Method မ်ား ထည့္သြင္းေပးထားပါသည္။

Hello World

Programming Language မ်ား ေလ့လာရာတြင္ Hello World program ျဖင့္ စတင္ျခင္းသည္ ထုံး စံ တစ္ခု လုိပင္ ျဖစ္ေနပါျပီ။ ရူဘီ အတြက္ Hello World မွာ အလြန္ လြယ္ကူ ပါသည္။ puts "Hello World" ဆုိလွ်င္ ့ Hello World ထုတ္ေပးေသာ program တစ္ခု ျဖစ္ပါျပီ။ puts သည္ console ကုိ print ထုတ္ေပးေသာ system function တစ္ခု ျဖစ္သည္။ ေနာက္ က “Hello World” ဟူေသာ string ထည့္ေပးလုိက္ေသာအခါ console ေပါ္ တြင္ output ထြက္လာပါသည္။ ~ puts သည္ အလုိအေလ်ာက္ ေနာက္ တစ္လုိင္း ဆင္းေပးပါသည္။’\n’ သတ္သတ္ထည့္ေပးစရာမလုိပါ။

(EDIT: 26-May-2014, ပထမအျကိမ္ ဤ ေဆာင္းပါးေရးစဥ္က Ruby Comments နွင့္ Constant မ်ား အေျကာင္းက်န္ခဲ့ ၍ ထပ္ျဖည့္ထားပါသည္။ )

Comments

ရူဘီ တြင္ source ကုတ္ အတြင္း commentေပးလိုပါက # sign ျဖင့္ စေပးရပါသည္။# ျဖင့္စထားေသာေနရာမွစ၍ ထုိ တစ္လုိင္းလုံးကုိ comment အျဖစ္သတ္မွတ္ျပီး execute လုပ္ရာတြင္ လ်စ္လ်ူ ရွုသြားမည္ျဖစ္ပါသည္။ ရူဘီတြင္ inline comment ပုံစံမရွိပါ။

Constants

ရူဘီ တြင္ constant မ်ား အားလုံးကို English Capital Letter ျဖင့္ စေရးေလ့ရွိပါသည္။ class name, module name အစရွိေသာ constant မ်ားကုိ အစစာလုံးသာ အျကီးထားေလ့ရွိျပီး တန္ဖုိး constant မ်ားကုိ ေတာ့ ALL_CAPITAL ပုံစံျဖင့္ ေရးေလ့ရွိပါသည္။

(END EDIT:)

Methods or Functions

ရူဘီ method တစ္ခု ကုိ def နွင့္ end keyword နွစ္ခုျဖင့္ သတ္မွတ္ပါသည္။

“ruby”
1
2
3
def my_method
  puts "Hello World"
end

ရူဘီ တြင္ method မ်ားအား အသုံးျပု ပုံဂရမ္မာက ထူးျခား ပါသည္။ အျခား language မ်ား ကဲ့ သုိ့ ၀ုိက္ကြင္း နွစ္ခု ထည့္ စရာမလုိပါ။ မိမိေခါ္လုိေသာ method name ကုိ ေရးလုိက္လွ်င္ ေခါ္လုိ့ ရပါသည္။ အကယ္၍ parameter ေပးလွ်င္ space ျခား ျပီး ေပးရုံပဲ ျဖစ္သည္။ ဥပမာ puts "Hello" သည္ puts method ကုိ “Hello” parameter ေပး၍ ေခါ္ထားျခင္းျဖစ္သည္။ multiple parameter ေပးလွ်င္ ေကာ္မာ , ခံျပီးထပ္ထည့္လုိ့ ရပါသည္။ ဥပမာ add 1,2 သည္ add method ကုိ parameter 1 နွင့္ 2 ေပး၍ ေခါ္လိုက္ျခင္းျဖစ္သည္။အကယ္၍ ၀ုိက္ကြင္း ေပး ျပီး ေခါ္ခ်င္လွ်င္လည္း ေခါ္လုိ့ ရပါသည္။ ဥမာ add(1,2)သည္ လည္း မွန္ကန္ေသာ ေရးနည္းျဖစ္သည္။ မ်ားေသာအားျဖင့္ တစ္ဆင့္ထဲေခါ္ေသာ method မ်ားကုိ space ျဖင့္ ေရးျပီး နွစ္ဆင့္သုံးဆင့္ေခါ္ ေသာ၊ ရွုပ္ေထြးနုိင္သည့္ method call မ်ားတြင္ ၀ုိက္ကြင္း ထည့္ေရးေလ့ရွိသည္။ ရူဘီ တြင္ method အားလုံးသည္ return ျပန္ ပါသည္။ return keyword ျဖင့္ သတ္သတ္ return ျပန္လုိ့ရသလုိ return keyword မပါ လွ်င္လည္း ေနာက္ဆုံ းအေျကာင္း ၏ ရလဒ္ကုိ အလုိလုိ return ျပန္ သြားမည္ျဖစ္သည္။ ရူဘီ method မ်ားအား class တစ္ခုထဲတြင္ member တစ္ခု အေနနွင့္ထည့္ေရးနုိင္သလုိ global space တြင္ သူ့ခ်ည္းသက္သက္လည္း ေရးနုိင္ပါသည္။

မွတ္ခ်က္။ ။ ရူဘီသည္ object မ်ားကုိ အေျခခံထားေသာ language တစ္ခုျဖစ္ပါသည္။ ရူဘီ တြင္ အရာရာ သည္ object မ်ား နွင့္ ၎တုိ့ အခ်င္းခ်င္း ဆက္သြယ္ေနျကေသာ message မ်ားသာျဖစ္ပါသည္။ထုိအေျကာင္းကုိ class နွင့္ object မ်ားအေျကာင္းေရာက္မွ အေသးစိတ္ရွင္းသြားပါမည္။

Conditionals

အျခားျခားေသာ language မ်ားလုိပင္ ရူဘီ တြင္လည္း conditional statement မ်ား ေရးနုိင္ပါသည္။ if ေနာက္တြင္ မိမိစစ္လုိေသာ မွန္\မွား expression ကုိ ေရး၍ then ေနာက္တြင္ မွန္လွ်င္လုပ္မည့္ expression, else ေနာက္တြင္ မွားလွ်င္ လုပ္မည့္ expression ကုိ ေရးရပါသည္။ မွတ္ရမည့္တစ္ခ်က္မွာ if ဖြင့္ ျပီးတုိင္း ေနာက္က end ပိတ္ေပးရျခင္းျဖစ္သည္။ ဥပမာ

“ruby”
1
2
3
4
5
 if true then
      puts "True"
  else
      puts "False"
  end

else ကုိျကားထဲတြင္ ျကုိက္သေလာက္ ညွပ္ထည့္၍ေရးနုိင္ပါသည္။ မွန္\မွား expression ကုိ () ၀ုိက္ကြင္း မထည့္လည္းရပါသည္။ အဓိကက if တစ္ခုဖြင့္တုိင္း ထုိ if နွင့္သက္ဆုိင္ရာ အဆုံးသတ္တြင္ end ထည့္ေပးရျခင္းျဖစ္သည္။ ရူဘီတြင္ if နွင့္ ဆန့္က်င္ဘက္ unless လည္းရွိပါသည္။ unless မွာ if not နွင့္ အတူတူျဖစ္သည္။ ပုိမုိ ရုိးရွင္းေသာ english grammar ပုံစံအတုိင္းေရး နုိင္ေအာင္ ထည့္သြင္းေပးထားျခင္းျဖစ္သည္။ unless ကုိ သုံးခ်င္လွ်င္ if ေနရာမွာ unless ကုိ အစားထုိးေရးရုံပဲ ျဖစ္သည္။ if unless နွစ္ခုလုံးကုိ အတုိေရးနုိင္ေသာ ပုံစံလည္းရွိသည္။ တစ္ေျကာင္း if ဟုတ္ ေခါ္ေသာ ပုံစံျဖစ္သည္။ မွန္လွ်င္လုပ္မည့္ expression ကုိ ေရွ့ က ေရး၍ ေနာက္ တြင္ if နွင့္ မွန္\မွား expression ကုိ ထည့္ရသည္။ဥပမာ puts "True" if true , puts "false" unless false စသျဖင့္ ပုံစံမ်ိ ုး ျဖစ္သည္။ တစ္ေျကာင္း ပုံစံတြင္ end keyword ထည့္ေပးရန္မလုိပါ။ ရူဘီတြင္ switch statement လည္းရွိပါသည္။ သုိ့ေသာ္ switch keyword ကိုေတာ့ မသုံးပါ။ case…when ပုံစံျဖင့္ သုံးပါသည္။ caseေနာက္ တြင္ စစ္ခ်င္ေသာ မွန္\မွား expression ကုိ ထည့္၍ ေအာက္ က when ေနာက္တြင္ မိမိစစ္ခ်င္ေသာ expression တစ္ခုခ်င္းအတြက္ စစ္နုိင္ပါသည္။default statement ကိုေတာ့ else ျဖင့္ သုံးရပါသည္။ အားလုံးျပီးသြားလွ်င္ end keyword ပိတ္ေပးဖုိ့လုိပါသည္။ ဥပမာ

“ruby”
1
2
3
4
5
6
7
8
9
 my_number = 3
  case my_number
  when 3
      puts 3
  when 4
      puts 4
  else
      puts "Default"
  end

Operators

ရူဘီတြင္ အျခား language မ်ားတြင္သုံးေသာ operator အမ်ား စုကုိ အသုံးျပုနုိင္ပါသည္။ သုိ့ေသာ္ +,–,,/ ,% စေသာ arithmatic operator မ်ားသည္ အမွန္တကယ္ေတာ့ method name မ်ားသာ ျဖစ္ပါသည္။ ထုိ operator မ်ား အား special method မ်ားအျဖစ္ သတ္မွတ္ထားျခင္းျဖစ္သည္။ ယင္းအေျကာင္းကုိ class နွင့္ object မ်ား အေျကာင္းတြင္ ထပ္မံ ရွင္းပါမည္။ ရူဘီ တြင္ and, or နွင့္ not နွစ္မ်ိ ုး ေရးလုိ့ ရပါသည္။ and, or နွင့္ not ဟူ ၍ english စာလုံးအတုိင္းျဖစ္ေစ၊ &&,|| နွင့္ ! ဟူ၍ sign နွင့္ျဖစ္ေစ ေရးနုိင္ပါသည္။၎ သုံးခုမွာ non-method operator မ်ား ျဖစ္၍ method တစ္ခုကဲ့ သုိ့ အသုံးျပု၍ မရနုိင္ပါ။ အျခား conditional operator မ်ားမွာ “>, >= ,<, <=, ==, ===, !=” စသည္ျဖင့္ ျဖစ္ပါသည္။ ၎ တုိ့မွာ method မ်ား ျဖစ္၍ override လုပ္လုိ့ ရနုိင္ပါသည္။ assignment operator မွာ = ျဖစ္ျပီး +=,-=,*=,/= စသည့္ shortcut assignment မ်ားလည္းရွိပါသည္။ - နွင့္ + ကို unary တစ္လုံး operator မ်ား အျဖစ္လည္းသုံးနုိင္ပါသည္။ ++ နွင့္ -- ကဲ့သုိ့ increment operator မရွိပါ။ ထူးျခားသည့္ operator အခ်ိ ု့ မွာ namespace operator ::, array subscript operator [] နွင့္ << operator တုိ့ ျဖစ္သည္။ ၎တုိ့ ၏ အသုံးကုိ ဆီေလ်ာ္ရာ ေနရာတြင္ ထည့္သြင္းရွင္းျပသြားမည္ျဖစ္ပါသည္။ if-else conditional မ်ားကုိ ternary operator ? : ျဖင့္လည္း ေရးနုိင္ပါသည္။ ဥပမာ 1===1 ? puts "one" : puts "two" ပုံစံမ် ိ ုးျဖစ္သည္။ ,/ သည္ +,– ထက္ precedence ျမင့္ပါသည္။ Range operator မ်ား လည္းရွိပါသည္။ .. နွင့္ … မွာ range operator မ်ားျဖစ္သည္။ Range operator မ်ားသည္ ဂဏန္း နွစ္ခု အျကား အေရအတြက္ကုိ သတ္မွတ္ပါသည္။ ဥပမာ 1..10 သည္ 1 နွင့္ 10 ျကားမွ ဂဏန္း အားလုံးကို ရည္ညြွန္းပါသည္။ dot နွစ္လုံး ..မွာ inclusive range operator ျဖစ္ျပီး 1..10 ဆုိပါက 10 ပါ အပါအ၀င္ ဆယ္လုံးျဖစ္သည္။ dot သုံးလုံး ... ကေတာ့ non-inclusive ျဖစ္ျပီး 1...10 ဟုဆုိလွ်င္ 10 မပါ၀င္ဘဲ 1 to 9 ကုိ သာ ဆုိလုိပါသည္။ Range operator မ်ား မွာ looping statement မ်ား ေရးရာတြင္ အလြန္အသုံး၀င္ေသာ operator မ်ား ျဖစ္သည္။

ဆက္ပါဦးမည္..

ေက်းဇူးတင္ပါသည္

dbc

ေနာက္ေဆာင္းပါး : Ruby နွင့္ ေတြ့ ဆုံ ျခင္း ၂