Терминът „мета“ стана доста натоварен през последните години. За съвременната публика думата може да предизвика видения за излизане със Зукърбърг във VR, ядене на барбекю с вашите виртуални аватари и харчене на $1,99 за микро-транзакция за салфетка. Концепцията за „мета“ за щастие далеч предхожда това модерно приложение. В контекста на кодирането мета програмирането по същество е „код, който пише код“. По-конкретно, може да се мисли като когато програмите създават методи в движение, вместо да се налага да ги дефинират от самото начало.

Мета програмиране в Ruby

За да демонстрираме, ще разгледаме Ruby, за да предоставим някои бързи и лесни примери за мета програмиране в действие. Когато разработчиците започнат да изучават Ruby, те се запознават отрано с променливите на екземпляра и методите за достъп до атрибути. Четейки това, предполагам, че вече сте запознати с тези основи. Но като кратко обобщение, променливите на екземпляра се използват за съхраняване на данни за обикновен ruby ​​клас.

> cat = Cat.new(Elio)
=> #<Cat:0x0000000104c70df8 @name=Elio>
> cat.meows
=> Elio says MEOW
> cat.name
undefined method `name’ for #<Cat:0x0000000104c70df8 @name=”Elio”> (NoMethodError)

Горният пример съхранява name като променлива на екземпляр и е достъпен чрез метода meows в рамките на класа Cat. Ако обаче искаме да имаме достъп до тази променлива извън класа, трябва да дефинираме метод, който да я извиква.

> cat = Cat.new('Elio')
=> #<Cat:0x0000000106d330b8 @name="Elio">
> cat.name
=> "Elio"

Тук извикваме метода name, който добавихме, който ни връща стойността на name.

И така, какво точно общо има това с мета-програмирането? Е, актът на създаване на един „получаващ“ метод е сравнително безболезнен, но какво ще стане, ако имаме много променливи в клас, до които искаме достъп? Ако мислите, че не изглежда много СУХО да се повтарят дефинициите на getter и setter отново и отново за всеки метод, ще бъдете прави! За щастие, тези, които дойдоха преди нас, създадоха кратка ръка, за да позволят всички тези методи да бъдат дефинирани автоматично магически, използвайки силата на мета програмирането.

attr_accessor динамично създава getter и setter методи за всеки от атрибутите, които предаваме като символи. Тази техника е вградена функционалност с Ruby, но ние можем да използваме същите принципи, за да създадем наши собствени динамични методи, като използвамеdefine_method и method_missing.

Дефиниране на методи в движение (method_missing)

С method_missing навлизаме в същинското месо и картофи на мета програмирането. method_missing дава на вашите обекти способността да се справят със ситуации, когато се извиква метод, който не съществува. Нека да разгледаме още веднъж нашия пример с котка.

> cat = Cat.new(Elio)
=> #<Cat:0x0000000104c70df8 @name=Elio>
> cat.meows
=> Elio says MEOW

Страхотно, нашата котка може да мяука! Но какво ще стане, ако помолим котката си да лае?

> cat.bark
undefined method `bark' for #<Cat:0x0000000106d330b8 @name="Elio"> (NoMethodError)

Получаваме грешка. Нашият клас Cat няма метод, наречен bark. Сега може би си мислите: „Защо просто не дефинираме метод, наречен bark“? Това е чудесно решение за обработка на всеки един екземпляр, но не можем непременно да предвидим всеки потенциален метод, който някой може да опита да извика в нашия клас. С method_missing не е необходимо да предвиждаме. Всъщност можем да кажем на нашия клас как да обработва извиквания на методи, които не съществуват.

> cat.meows
=> "Elio says MEOW"
> cat.barks
=> "Sorry, cats can not do that!"

В нашия пример method_missing се погрижи за извикването barks и върна низа, който написахме в нашата дефиниция. Имаме възможност да видим колко мощен може да бъде method_missing. В този пример ние просто връщаме низ. Въпреки това, докато се гмуркате по-нататък във възможностите на method_missingще намерите примери за използването му за дефиниране на нови методи в движение, което в комбинация с ActiveRecord и други инструменти на Ruby може да ви позволи да CRUD по-динамично .

Тази форма на мета програмиране идва с някои предупреждения. Както всички знаем, с голямата сила идва и голяма отговорност. В случай на мета програмиране, ние трябва да гарантираме, че внедряването е защитено, правилно обработва злонамерени входове, неочаквани входове и т.н. Преди да преминете незабавно към мета-решение, не забравяйте да прецените дали това е правилната техника за работата, която изпълнявате опитвайки се да постигнете и проучете практически примери, за да сте сигурни, че разбирате всички последици от вашето внедряване.

Допълнителна информация







«Разбиране на методите attr в Ruby!
Ако сте работили с Ruby, вероятно сте срещали методи като attr_accessor, attr_reader и attr_writer…dev. да се"