מתודה דינמית ברובי

אם זה הולך כמו ברווז, זה נראה כמו ברווז ונשמע כמו ברווז, אולי זו שפת תכנות דינאמית 🙂

אחת היכולות של שפת תכנות דינאמית על פני שפת תכנות סטטית היא האפשרות ליצור אלמנטים בזמן ריצה כדוגמת מתודות. הרבה אנשים מאוד לא אוהבים את רובי ועוד יותר את Rails, כי מאוד מקובל להשתמש ביצירה דינאמית של מתודות, כדוגמת מתודות החיפוש ב ActiveRecord ועוד כמה…

הרעיון של יצירה דינאמית אומרת שאם משתמשים נכון, אפשר לקבל פונקציות מותאמות אישית למה שאנחנו צריכים כאשר יש צורך לקבל אותם, וכך במקום נגיד לכתוב 20 שורות קוד עבור כל דבר, אפשר לעשות את זה בצורה דינאמית בעת הצורך. למשל:

#!/usr/bin/env ruby

class Duck
 VOICES = {
 :duck    => 'quack',
 :dog     => 'woof',
 :cow     => 'mooo',
 :person  => 'blabla',
 :rooster => 'koookoriko',
 :frog    => 'rabbit'
 }   

 VOICES.each do |animal, voice|
   define_method "#{animal.to_s}_voice" do
     voice
   end # define_method "#{animal.to_s}_voice" do
 end # VOICES.each do |item|

 define_method 'get_voices' do
   VOICES
 end # define_method 'get_voices' do
end # class Duck 

duck = Duck.new

duck.get_voices.each do |animal, voice|
 s = '%s sounds like: ' % animal
 print s
 puts duck.method("#{animal.to_s}_voice").call
end

puts duck.flaf_voice

בדוגמא הקצת מאולצת, רציתי שהיא תסביר את זה בצורה פשוטה איך אפשר להשתמש במתודה define_method . המתודה קיימת רק בחלק הראשי של מחלקה. כלומר זה לא קיים כאשר יורדים למתודה בתוך המחלקה או לא משתמשים במחלקות בכלל.

הפלט שנוצר מהתוכנית הזו הוא:

frog sounds like: rabbit
duck sounds like: quack
dog sounds like: woof
cow sounds like: mooo
person sounds like: blabla
rooster sounds like: koookoriko
duck.rb:36: undefined method `flaf_voice' for #<Duck:0x7faf30aea678> (NoMethodError)

וככה בעצם אפשר לראות שהיצירה של מתודות בצורה דינאמית עובדת.

3 מחשבות על “מתודה דינמית ברובי

  1. meir

    כדי להבהיר: בטכניקות דומות משתמשים ב-Django עם ה-get_xxx_display לדוגמא במודלים או get_next_by_xxx וכדו'. כך גם בתשתיות אחרות.

    אתה מפספס את המשמעות של ה"קסם". מצד שני, אם פספסת כנראה זה לא משמעותי עבורך, אז כולם מרוצים 🙂

כתיבת תגובה

הזינו את פרטיכם בטופס, או לחצו על אחד מהאייקונים כדי להשתמש בחשבון קיים:

הלוגו של WordPress.com

אתה מגיב באמצעות חשבון WordPress.com שלך. לצאת מהמערכת / לשנות )

תמונת Twitter

אתה מגיב באמצעות חשבון Twitter שלך. לצאת מהמערכת / לשנות )

תמונת Facebook

אתה מגיב באמצעות חשבון Facebook שלך. לצאת מהמערכת / לשנות )

תמונת גוגל פלוס

אתה מגיב באמצעות חשבון Google+ שלך. לצאת מהמערכת / לשנות )

מתחבר ל-%s