ארכיון יומי: 6 יולי, 2012

הרצת מתודות בצורה דינאמית חלק שני

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

לרובי יש שלוש צורות שאני מכיר, על מנת להריץ מתודות בצורה דינאמית. הדרך הראשונה היא שימוש ב eval.
eval מאפשרת להריץ תוכן של מחרוזת המועברת למתודה. המחרוזת היא קוד רובי.

s = 'Hello World'
eval "puts s"

התוכן שיודפס הוא "Hello World", היות והמשתנה s הוגדר כבר למערכת.

הדרך השניה שיש ברובי, היא דרך להכניס מתודות למשתנה, ולהריץ אותן בזמן "אחר":

myproc = method(:puts)
myproc.call 'Hello World'

math = 1.method('+')
puts math.call(1) #prints 2

מה שקורה הוא, שֵהמתודה method מחזירה מחלקה בשם Method עם המתודה שרוצים להריץ, וקריאה ל call, מריצה אותה. כאשר יש צורך בפרמטרים, אז מעבירים ל call את הפרמטרים עצמם.

הדרך האחרונה  להריץ מתודה בצורה דינאמית, היא על ידי שימוש במתודה send:

puts String.send('to_s') # prints 'String'
puts 'Hello World'.send('[]', 1) # prints 'H'

תכנות דינאמי נעים 🙂