Thuta Learning
ရှာဖွေရန်
ExercisesProgrammingbeginner

Practice Exercises 2

စိတ်လျှော့ပါ။ ဒီခန်းကို စာအုပ်လိုမဟုတ်ဘဲ စကားပြောသလိုပဲ၊ နားလည်လွယ်အောင် ရှင်းပါမယ်။

ဒီခန်းပြီးရင် ဘာတတ်သွားမလဲ

  • Practice Exercises 2 ကို ကိုယ်တိုင် လေ့ကျင့်ကြည့်မယ်
  • သင်ခဲ့ပြီးသား skill တွေကို practice လုပ်ပြီး ခိုင်မာအောင်လုပ်မယ်
  • အမှားရှာ၊ ပြင်တတ်၊ ကိုယ်တိုင် check လုပ်တတ်မယ်

ခဏလေး ဒီလိုပဲ စဉ်းစားကြည့်

ဒီ lesson ဟာ Exercises 1 ထက် ပိုခက်ပြီး OOP class design, block/yield, Hash data structure တွေကို ပေါင်းစပ်အသုံးချရတဲ့ task တွေကို ပါဝင်ပါတယ်။ Advanced chapter မှာ သင်ခဲ့တဲ့ class-object, initialize, getters-setters, blocks concept တွေကို real scenario နီးပါးအနေနဲ့ ကျင့်သားနိုင်ပါတယ်။ task တွေကို order အလိုက် လုပ်ရင် class design ကနေ block-based iteration အထိ တစ်ဆင့်ချင်း တိုးမြှင့် ကျင့်သားရရှိပါလိမ့်မယ်။

လေ့ကျင့်ခန်းများ

Task 1: Book class ကို title, author attribute နှစ်ခုနဲ့ attr_accessor, initialize သုံးပြီး ဆောက်ပါ။ Task 2: Library class ကို ဆောက်ပြီး @books array ထဲ add_book(book) method နဲ့ Book object တွေ ထည့်နိုင်အောင် ပြင်ဆင်ပါ - ပြီးရင် find_by_author(name) method ထဲမှာ .select block သုံးပြီး author name ကိုက်ညီတဲ့ book စာရင်းကို ပြန်ပေးပါ။ Task 3: word_frequency(text) ဆိုတဲ့ method ရေးပြီး Hash.new(0) သုံးကာ sentence တစ်ကြောင်းထဲက word တစ်လုံးချင်းစီရဲ့ ပေါ်လာအကြိမ်ရေကို ရေတွက်ပါ။ Task 4: yield_even_numbers(numbers) { |n| ... } ဆိုတဲ့ method ရေးပြီး method ကို ခေါ်တဲ့သူက ပေးလိုက်တဲ့ block ကို array ထဲက even number တစ်ခုချင်းစီအတွက် yield လုပ်ပေးပါ။

Code နမူနာ

ruby
class Book
  attr_accessor :title, :author

  def initialize(title, author)
    @title = title
    @author = author
  end
end

class Library
  def initialize
    @books = []
  end

  def add_book(book)
    @books << book
  end

  def find_by_author(name)
    # TODO: block/select သုံးပြီး author name နဲ့ ကိုက်ညီတဲ့ book တွေကို ပြန်ပေးပါ
  end
end

def word_frequency(text)
  # TODO: Hash.new(0) သုံးပြီး word တစ်လုံးချင်းစီရဲ့ အကြိမ်ရေကို ရေတွက်ပါ
end

def yield_even_numbers(numbers)
  # TODO: block ကိုသုံးပြီး even number တစ်ခုချင်းစီအတွက် yield ပေးပါ
end

library = Library.new
library.add_book(Book.new("Ruby Basics", "Matz"))
p library.find_by_author("Matz")
p word_frequency("ruby is fun and ruby is easy")
yield_even_numbers([1, 2, 3, 4, 5, 6]) { |n| puts n }
You should see
find_by_author က Book object list ကို ပြန်ပေးပြီး, word_frequency က {"ruby"=>2, "is"=>2, ...} လို Hash တစ်ခု ပြန်ပေးကာ, yield_even_numbers က 2, 4, 6 ဆိုတဲ့ number တွေကို puts နဲ့ print ထုတ်ပါလိမ့်မယ်။

၅ မိနစ် စမ်းကြည့်

Library class ထဲမှာ find_by_title(keyword) ဆိုတဲ့ method အသစ်တစ်ခု ထပ်ရေးပြီး title ထဲမှာ keyword ပါဝင်တဲ့ book တွေကို .select block သုံးကာ ပြန်ပေးအောင် 5 minutes အတွင်း စမ်းကြည့်ပါ။

သတိလေးတစ်ချက်

yield ကို သုံးမယ့် method တွေမှာ block_given? နဲ့ block ပါ/မပါ အရင်စစ်ထားရင် error handling ပိုကောင်းပါတယ် - production code ရေးတဲ့အခါ ဒီ pattern ကို အမြဲသတိထားပါ။

ဒီနေရာမှာ လူအများမှားတတ်တယ်

  • find_by_author ထဲမှာ @books.select do |book| ... end block ရဲ့ condition ကို book.author == name လို့ မရေးဘဲ book == name လို့ ရေးမှားတတ်ပါတယ်
  • yield_even_numbers method ထဲမှာ block ပါ/မပါ စစ်ဆေးဖို့ မေ့သွားပြီး block_given? မသုံးဘဲ yield ကို တိုက်ရိုက်ခေါ်လိုက်တဲ့အခါ block မပါလာရင် LocalJumpError တက်တတ်ပါတယ်

အခု ကိုယ်တိုင် စမ်းကြည့်

Library class ထဲမှာ find_by_title(keyword) ဆိုတဲ့ method အသစ်တစ်ခု ထပ်ရေးပြီး title ထဲမှာ keyword ပါဝင်တဲ့ book တွေကို .select block သုံးကာ ပြန်ပေးအောင် 5 minutes အတွင်း စမ်းကြည့်ပါ။

You'll know it worked when: find_by_author က Book object list ကို ပြန်ပေးပြီး, word_frequency က {"ruby"=>2, "is"=>2, ...} လို Hash တစ်ခု ပြန်ပေးကာ, yield_even_numbers က 2, 4, 6 ဆိုတဲ့ number တွေကို puts နဲ့ print ထုတ်ပါလိမ့်မယ်။

Practice Exercises 2 | Thuta Learning