ခဏလေး ဒီလိုပဲ စဉ်းစားကြည့်
ဒီ 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 နမူနာ
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 }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 ကို အမြဲသတိထားပါ။