SlideShare a Scribd company logo
1 of 32
Download to read offline
LESSON 5:
DEFINE_METHOD AND ITS FRIENDS
DYNAMIC RUBY
DEFINE_METHOD
DEFINE_METHOD
define_method
DEFINE_METHOD
DEFINE_METHOD
Существуют два типа objectified
methods: объекты класса Method и
объекты класса UnboundMethod. Это
так называемые “связанные” и
“несвязанные” методы-объекты.
BOUND METHODS
Как правильно связывать методы
BOUND METHODS
“Связанные” методы всегда
ассоциированы с каким-то
конкретным объектом (receiver-ом).

Создаются при помощи вызова
метода Object#method.
BOUND METHODS
UNBOUND METHODS
Вы держитесь здесь,
вам всего доброго,
хорошего
настроения
и здоровья!
UNBOUND METHODS
“Несвязанные” методы не привязаны к
конкретному объекту (receiver-у).

Они создаются при помощи вызова
метода Module#instance_method или
методом “отвязывания” обычного
метода.
UNBOUND METHODS
UNBOUND METHODS
Unbound methods не могут быть
выполнены при помощи метода call.
Но они могут быть снова привязаны к
некоторому receiver-у при помощи
метода UnboundMethod#bind.
UNBOUND METHODS
Объект, к которому мы можем
подвязать unbound method должен
быть частью дерева наследования
оригинального класса, которому
принадлежал этот метод.
UNBOUND METHODS
PROC IN DEFINE_METHOD
CONTEXT
MATTERS
PROC IN DEFINE_METHOD
Итак, с методами разобрались.

Вернемся к блокам.
Если в качестве тела метода, который
создается через define_method, мы
передадим блок, то в каком контексте
он будет выполняться?
PROC IN DEFINE_METHOD
PROC IN DEFINE_METHOD
На помощь приходит
BasicObject#instance_eval.
Этот метод выполняет “evaluate”
строки, содержащей ruby код или
блока (но уже в контексте receiver-a).
PROC IN DEFINE_METHOD
PROC IN DEFINE_METHOD
Подобную к instance_eval миссию
выполняет instance_exec, принимающий
только блок, но зато с аргументами.
Кроме того, существует семантически
близкая пара методов class_eval и
class_exec, расширяющая контекст не
объекта, но класса, который объект
описывает.
T
I
P
PROC IN DEFINE_METHOD
DEFAULT ARGUMENTS
Поведение
по
умолчанию
PROC IN DEFINE_METHOD
Как и при статическом объявлении
метода, у вас остается возможность
определять аргументы по умолчанию.
Все как и раньше, только аргументы
определяются через в соответствии с
синтаксисом блока.
PROC IN DEFINE_METHOD
DEFINE_METHOD AND ITS FRIENDS
REFERENCES
▸ https://ruby-doc.org/core-2.3.1/Module.html#method-i-
define_method
▸ https://ruby-doc.org/core-2.3.1/UnboundMethod.html
▸ http://stackoverflow.com/a/9057977
▸ http://www.saturnflyer.com/blog/jim/2015/04/22/the-
difference-between-instance_eval-and-instance_exec/
THANK YOU!
Alex Mikitenko
nonkor@gmail.com
https://github.com/nonkor
TO BE CONTINUED…

More Related Content

Viewers also liked

BeeGo для веб приложений, API и демонов
BeeGo для веб приложений, API и демоновBeeGo для веб приложений, API и демонов
BeeGo для веб приложений, API и демоновAnton Piskunov
 
Go meetup smotri+ 23.04.2015
Go meetup smotri+ 23.04.2015Go meetup smotri+ 23.04.2015
Go meetup smotri+ 23.04.2015Mikhail Salosin
 
kranonit S15 Vladimir Melnik - Ruby on Rails, BDD
kranonit S15 Vladimir Melnik - Ruby on Rails, BDDkranonit S15 Vladimir Melnik - Ruby on Rails, BDD
kranonit S15 Vladimir Melnik - Ruby on Rails, BDDKrivoy Rog IT Community
 
Вторая лекция по основам ruby для студентов itc73.ru
Вторая лекция по основам ruby для студентов itc73.ruВторая лекция по основам ruby для студентов itc73.ru
Вторая лекция по основам ruby для студентов itc73.ruAlexander Shcherbinin
 
развертывание среды Rails (антон веснин, Locum Ru)
развертывание среды Rails (антон веснин, Locum Ru)развертывание среды Rails (антон веснин, Locum Ru)
развертывание среды Rails (антон веснин, Locum Ru)guest40e031
 
Alexander Dymo - IT Jam 2009 - Ruby: Beaty Or The Beast
Alexander Dymo - IT Jam 2009 - Ruby: Beaty Or The BeastAlexander Dymo - IT Jam 2009 - Ruby: Beaty Or The Beast
Alexander Dymo - IT Jam 2009 - Ruby: Beaty Or The BeastAlexander Dymo
 
Debbug Rails Application For Dummies
Debbug Rails Application For DummiesDebbug Rails Application For Dummies
Debbug Rails Application For DummiesAndrey Subbota
 
10 reasons I love RubyOnRails
10 reasons I love RubyOnRails10 reasons I love RubyOnRails
10 reasons I love RubyOnRailsPavel Gabriel
 
Когда технологий много - iForum 2013
Когда технологий много - iForum 2013Когда технологий много - iForum 2013
Когда технологий много - iForum 2013Andrey Listochkin
 
I18n ruby-приложений
I18n ruby-приложенийI18n ruby-приложений
I18n ruby-приложенийAndrey Sitnik
 
Как сделать контрибут в Ruby on Rails
Как сделать контрибут в Ruby on RailsКак сделать контрибут в Ruby on Rails
Как сделать контрибут в Ruby on RailsYaroslav Markin
 
Призма24 - Маркетплейсы.
Призма24 - Маркетплейсы.Призма24 - Маркетплейсы.
Призма24 - Маркетплейсы.Vitalii Tytskyi
 
Александр Тищенко - "Антикризисная презентация"
Александр Тищенко - "Антикризисная презентация"Александр Тищенко - "Антикризисная презентация"
Александр Тищенко - "Антикризисная презентация"railsclub
 
Фронтенд для рубиста
Фронтенд для рубистаФронтенд для рубиста
Фронтенд для рубистаKir Shatrov
 

Viewers also liked (20)

OOP в Go
OOP в GoOOP в Go
OOP в Go
 
BeeGo для веб приложений, API и демонов
BeeGo для веб приложений, API и демоновBeeGo для веб приложений, API и демонов
BeeGo для веб приложений, API и демонов
 
Go meetup smotri+ 23.04.2015
Go meetup smotri+ 23.04.2015Go meetup smotri+ 23.04.2015
Go meetup smotri+ 23.04.2015
 
kranonit S15 Vladimir Melnik - Ruby on Rails, BDD
kranonit S15 Vladimir Melnik - Ruby on Rails, BDDkranonit S15 Vladimir Melnik - Ruby on Rails, BDD
kranonit S15 Vladimir Melnik - Ruby on Rails, BDD
 
Вторая лекция по основам ruby для студентов itc73.ru
Вторая лекция по основам ruby для студентов itc73.ruВторая лекция по основам ruby для студентов itc73.ru
Вторая лекция по основам ruby для студентов itc73.ru
 
развертывание среды Rails (антон веснин, Locum Ru)
развертывание среды Rails (антон веснин, Locum Ru)развертывание среды Rails (антон веснин, Locum Ru)
развертывание среды Rails (антон веснин, Locum Ru)
 
Alexander Dymo - IT Jam 2009 - Ruby: Beaty Or The Beast
Alexander Dymo - IT Jam 2009 - Ruby: Beaty Or The BeastAlexander Dymo - IT Jam 2009 - Ruby: Beaty Or The Beast
Alexander Dymo - IT Jam 2009 - Ruby: Beaty Or The Beast
 
Debbug Rails Application For Dummies
Debbug Rails Application For DummiesDebbug Rails Application For Dummies
Debbug Rails Application For Dummies
 
RSpec. Part 3
RSpec. Part 3RSpec. Part 3
RSpec. Part 3
 
10 reasons I love RubyOnRails
10 reasons I love RubyOnRails10 reasons I love RubyOnRails
10 reasons I love RubyOnRails
 
Rails Concerns
Rails ConcernsRails Concerns
Rails Concerns
 
Когда технологий много - iForum 2013
Когда технологий много - iForum 2013Когда технологий много - iForum 2013
Когда технологий много - iForum 2013
 
I18n ruby-приложений
I18n ruby-приложенийI18n ruby-приложений
I18n ruby-приложений
 
Как сделать контрибут в Ruby on Rails
Как сделать контрибут в Ruby on RailsКак сделать контрибут в Ruby on Rails
Как сделать контрибут в Ruby on Rails
 
RSpec. Part 1
RSpec. Part 1RSpec. Part 1
RSpec. Part 1
 
Призма24 - Маркетплейсы.
Призма24 - Маркетплейсы.Призма24 - Маркетплейсы.
Призма24 - Маркетплейсы.
 
Александр Тищенко - "Антикризисная презентация"
Александр Тищенко - "Антикризисная презентация"Александр Тищенко - "Антикризисная презентация"
Александр Тищенко - "Антикризисная презентация"
 
Ruby on Rails for noobs
Ruby on Rails for noobsRuby on Rails for noobs
Ruby on Rails for noobs
 
RSpec. Part 2
RSpec. Part 2RSpec. Part 2
RSpec. Part 2
 
Фронтенд для рубиста
Фронтенд для рубистаФронтенд для рубиста
Фронтенд для рубиста
 

More from Alex Mikitenko

Testing stage. being ahead business with cucumber
Testing stage. being ahead business with cucumberTesting stage. being ahead business with cucumber
Testing stage. being ahead business with cucumberAlex Mikitenko
 
End-to-end web-testing in ruby ecosystem
End-to-end web-testing in ruby ecosystemEnd-to-end web-testing in ruby ecosystem
End-to-end web-testing in ruby ecosystemAlex Mikitenko
 
Dynamic Ruby. Lesson #4: method_missing and its friends
Dynamic Ruby. Lesson #4: method_missing and its friendsDynamic Ruby. Lesson #4: method_missing and its friends
Dynamic Ruby. Lesson #4: method_missing and its friendsAlex Mikitenko
 
Dynamic Ruby. Lesson #3: Blocks, procs and lambdas
Dynamic Ruby. Lesson #3: Blocks, procs and lambdasDynamic Ruby. Lesson #3: Blocks, procs and lambdas
Dynamic Ruby. Lesson #3: Blocks, procs and lambdasAlex Mikitenko
 
Dynamic Ruby. Lesson #2: Methods and modules
Dynamic Ruby. Lesson #2: Methods and modulesDynamic Ruby. Lesson #2: Methods and modules
Dynamic Ruby. Lesson #2: Methods and modulesAlex Mikitenko
 
Тестирование web-приложений на базе технологий Ruby/Cucumber/Watir Webdriver
Тестирование web-приложений на базе технологий Ruby/Cucumber/Watir WebdriverТестирование web-приложений на базе технологий Ruby/Cucumber/Watir Webdriver
Тестирование web-приложений на базе технологий Ruby/Cucumber/Watir WebdriverAlex Mikitenko
 
Ruby: интерпретируемый, динамичный, человеколюбивый
Ruby: интерпретируемый, динамичный, человеколюбивыйRuby: интерпретируемый, динамичный, человеколюбивый
Ruby: интерпретируемый, динамичный, человеколюбивыйAlex Mikitenko
 
Introduction to Ubuntu
Introduction to UbuntuIntroduction to Ubuntu
Introduction to UbuntuAlex Mikitenko
 

More from Alex Mikitenko (8)

Testing stage. being ahead business with cucumber
Testing stage. being ahead business with cucumberTesting stage. being ahead business with cucumber
Testing stage. being ahead business with cucumber
 
End-to-end web-testing in ruby ecosystem
End-to-end web-testing in ruby ecosystemEnd-to-end web-testing in ruby ecosystem
End-to-end web-testing in ruby ecosystem
 
Dynamic Ruby. Lesson #4: method_missing and its friends
Dynamic Ruby. Lesson #4: method_missing and its friendsDynamic Ruby. Lesson #4: method_missing and its friends
Dynamic Ruby. Lesson #4: method_missing and its friends
 
Dynamic Ruby. Lesson #3: Blocks, procs and lambdas
Dynamic Ruby. Lesson #3: Blocks, procs and lambdasDynamic Ruby. Lesson #3: Blocks, procs and lambdas
Dynamic Ruby. Lesson #3: Blocks, procs and lambdas
 
Dynamic Ruby. Lesson #2: Methods and modules
Dynamic Ruby. Lesson #2: Methods and modulesDynamic Ruby. Lesson #2: Methods and modules
Dynamic Ruby. Lesson #2: Methods and modules
 
Тестирование web-приложений на базе технологий Ruby/Cucumber/Watir Webdriver
Тестирование web-приложений на базе технологий Ruby/Cucumber/Watir WebdriverТестирование web-приложений на базе технологий Ruby/Cucumber/Watir Webdriver
Тестирование web-приложений на базе технологий Ruby/Cucumber/Watir Webdriver
 
Ruby: интерпретируемый, динамичный, человеколюбивый
Ruby: интерпретируемый, динамичный, человеколюбивыйRuby: интерпретируемый, динамичный, человеколюбивый
Ruby: интерпретируемый, динамичный, человеколюбивый
 
Introduction to Ubuntu
Introduction to UbuntuIntroduction to Ubuntu
Introduction to Ubuntu
 

Dynamic Ruby. Lesson #5: define_method and its friends