18.08.2012 meta ruby

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

Upload: andrey-kumanyaev

Post on 22-Jul-2015

66 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: 18.08.2012 meta ruby

1

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

Page 2: 18.08.2012 meta ruby

2

О чем пойдет речь?

• Метапрограммирование, техники М., применение М.

• Насколько Ruby предрасположен к метапрограммированию? и почему?

• Инструменты метапрограммирования в Ruby

• Примеры применения в популярных гемах (ActiveRecord, oAuth)

Page 3: 18.08.2012 meta ruby

3

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

3

Page 4: 18.08.2012 meta ruby

4

Техники метапрограммирования

• Компилируемые

• Интерпретируемые

• Гибридные

Page 5: 18.08.2012 meta ruby

5

Техники метапрограммирования

• Компилируемые

• Шаблоны, макросы и параметрический полиморфизмом

• Оптимизирующая прекомпиляция

• Генераторы исходного кода для компилируемых языков

• DSL

Page 6: 18.08.2012 meta ruby

6

Техники метапрограммирования

• Интерпретируемые

• Эвалуациея кода (eval)

• LOP

• Декларативные языки

• Языки запросов

Page 7: 18.08.2012 meta ruby

7

Техники метапрограммирования

• Гибридные

• Интроспекция

• Динамическая интерпретация метамоделей

• Распределенная интерпретация метамоделей

Page 8: 18.08.2012 meta ruby

8

Ruby &&

Meta programmingMeta programmingMeta programming

• Classes are open

• Runtime Class defenitions

• Any called method have a reciver

• Class «==» Object

Page 9: 18.08.2012 meta ruby

9

Page 10: 18.08.2012 meta ruby

10

Классы открыты

Page 11: 18.08.2012 meta ruby

11

Определения работают

Page 12: 18.08.2012 meta ruby

12

Классы - это объекты?

Page 13: 18.08.2012 meta ruby

1313

Page 14: 18.08.2012 meta ruby

14

Методы класса... они не существуют?они не существуют?

Page 15: 18.08.2012 meta ruby

15

Интроспекция

Page 16: 18.08.2012 meta ruby

16

• Object#respond_to?

• Object#class

• Object#methods

• Object#class.superclass

• Object#class.ancestors

• Object#private_instance_methods

• Object#publuc_instance_methods

• ...

Page 17: 18.08.2012 meta ruby

17

Динамический вызов методов

Page 18: 18.08.2012 meta ruby

18

• object_instance.hello(args)

• object_instance.send(«{#hello}», args)

• object_instance.send(:hello, args)

Page 19: 18.08.2012 meta ruby

1919

Page 20: 18.08.2012 meta ruby

2020

Page 21: 18.08.2012 meta ruby

21

missing_method

Page 22: 18.08.2012 meta ruby

22

• https://gist.github.com/rails/rails/blob/master/activerecord/lib/active_record/dynamic_matchers.rb

22

Page 23: 18.08.2012 meta ruby

23

define_method

Page 24: 18.08.2012 meta ruby

24

pattern dispatch

Page 25: 18.08.2012 meta ruby

25

Page 26: 18.08.2012 meta ruby

26

store evaluation

Page 27: 18.08.2012 meta ruby

27

Page 28: 18.08.2012 meta ruby

28

Инструменты метапрограммирования

в Rubyв Ruby• Получение, установка значений и уничтожение

переменных

• Получение, установка значений и уничтожение констант

• Добавление и удаление методов

• Динамическое выполнение кода

• Методы для рефлексии (интроспекции)

Page 29: 18.08.2012 meta ruby

29

Вопросы?