18
Metaprogramming Ruby Jan Varwig jan.varwig. org twitter.com/agento Mittwoch, 17. März 2010

Metaprogramming Ruby - Varwig · 2020-02-02 · Was ist Metaprogramming? Programme generieren Programme Java, C Precompiler Programme modifizieren sich selbst Lisp, Smalltalk, Ruby

  • Upload
    others

  • View
    15

  • Download
    0

Embed Size (px)

Citation preview

Page 1: Metaprogramming Ruby - Varwig · 2020-02-02 · Was ist Metaprogramming? Programme generieren Programme Java, C Precompiler Programme modifizieren sich selbst Lisp, Smalltalk, Ruby

MetaprogrammingRuby

Jan Varwig

jan.varwig.org

twitter.com/agento

Mittwoch, 17. März 2010

Page 2: Metaprogramming Ruby - Varwig · 2020-02-02 · Was ist Metaprogramming? Programme generieren Programme Java, C Precompiler Programme modifizieren sich selbst Lisp, Smalltalk, Ruby

Gliederung

Was ist Metaprogramming?

Möglichkeiten in Ruby

Method Lookup Mechanisms

Procs / Lambdas

Mittwoch, 17. März 2010

Page 3: Metaprogramming Ruby - Varwig · 2020-02-02 · Was ist Metaprogramming? Programme generieren Programme Java, C Precompiler Programme modifizieren sich selbst Lisp, Smalltalk, Ruby

Was ist Metaprogramming?

Programme generieren Programme

Java, C Precompiler

Programme modifizieren sich selbst

Lisp, Smalltalk, Ruby

Funktionen als Typen

Mittwoch, 17. März 2010

Page 4: Metaprogramming Ruby - Varwig · 2020-02-02 · Was ist Metaprogramming? Programme generieren Programme Java, C Precompiler Programme modifizieren sich selbst Lisp, Smalltalk, Ruby

Warum Metaprogramming?

Mächtigkeit

RSpec, Mocking

Flexibilität

Introspektion der Datenbank in ActiveRecord

Ausdruckskraft

has_many :documents

Mittwoch, 17. März 2010

Page 5: Metaprogramming Ruby - Varwig · 2020-02-02 · Was ist Metaprogramming? Programme generieren Programme Java, C Precompiler Programme modifizieren sich selbst Lisp, Smalltalk, Ruby

Möglichkeiten in Ruby

Objektinspektion

Eval

Objektmodifikation

method_missing

procs/lambdas

Mittwoch, 17. März 2010

Page 6: Metaprogramming Ruby - Varwig · 2020-02-02 · Was ist Metaprogramming? Programme generieren Programme Java, C Precompiler Programme modifizieren sich selbst Lisp, Smalltalk, Ruby

Alles in Ruby ist ein ObjektInsbesondere Klassen

Mittwoch, 17. März 2010

Page 7: Metaprogramming Ruby - Varwig · 2020-02-02 · Was ist Metaprogramming? Programme generieren Programme Java, C Precompiler Programme modifizieren sich selbst Lisp, Smalltalk, Ruby

Methodenausführung immer im Objektkontext

Immer ein self

plain rb

irb

Klassendeklaration

Mittwoch, 17. März 2010

Page 8: Metaprogramming Ruby - Varwig · 2020-02-02 · Was ist Metaprogramming? Programme generieren Programme Java, C Precompiler Programme modifizieren sich selbst Lisp, Smalltalk, Ruby

Kontextwechsel

class_eval / module_eval

instance_eval / eval

Klassendeklaration wieder öffnen

Metaklassen

Mittwoch, 17. März 2010

Page 9: Metaprogramming Ruby - Varwig · 2020-02-02 · Was ist Metaprogramming? Programme generieren Programme Java, C Precompiler Programme modifizieren sich selbst Lisp, Smalltalk, Ruby

class_eval

Steht nur auf Klassen zur Verfügung

Ändert den self-Kontext auf den Empfänger

Entspricht

class receiver ...end

Definierte Methoden sind Instanzmethoden

Mittwoch, 17. März 2010

Page 10: Metaprogramming Ruby - Varwig · 2020-02-02 · Was ist Metaprogramming? Programme generieren Programme Java, C Precompiler Programme modifizieren sich selbst Lisp, Smalltalk, Ruby

instance_eval

Ändert den self-Kontext auf den Empfänger

Zugriff auf private methoden

Entspricht

class <<receiver ...end

Definierte Methoden sind Klassenmethoden

Mittwoch, 17. März 2010

Page 11: Metaprogramming Ruby - Varwig · 2020-02-02 · Was ist Metaprogramming? Programme generieren Programme Java, C Precompiler Programme modifizieren sich selbst Lisp, Smalltalk, Ruby

Singletonklassen

class Blubb ...end

ist klar

Was ist

class <<blubb ...end

Mittwoch, 17. März 2010

Page 12: Metaprogramming Ruby - Varwig · 2020-02-02 · Was ist Metaprogramming? Programme generieren Programme Java, C Precompiler Programme modifizieren sich selbst Lisp, Smalltalk, Ruby

<<object

Singletonklasse

Unsichtbar in der Vererbungshierarchie

Hier Grafik 24.3 aus Programming Ruby 2nd Ed.

(weggelassen wg. ©)

Mittwoch, 17. März 2010

Page 13: Metaprogramming Ruby - Varwig · 2020-02-02 · Was ist Metaprogramming? Programme generieren Programme Java, C Precompiler Programme modifizieren sich selbst Lisp, Smalltalk, Ruby

Erklärt Äquivalenz von

class Bla def self.blubb; ... ; endend

class Bla class <<self def blubb; ... ; end endend

Mittwoch, 17. März 2010

Page 14: Metaprogramming Ruby - Varwig · 2020-02-02 · Was ist Metaprogramming? Programme generieren Programme Java, C Precompiler Programme modifizieren sich selbst Lisp, Smalltalk, Ruby

Variablen

Instanzvariablen

Klassenvariablen

Klasseninstanzvariablen

Mittwoch, 17. März 2010

Page 15: Metaprogramming Ruby - Varwig · 2020-02-02 · Was ist Metaprogramming? Programme generieren Programme Java, C Precompiler Programme modifizieren sich selbst Lisp, Smalltalk, Ruby

Objektinspektion

#class

#methods

#instance_variables

#instance_variable_get / set

#send

Mittwoch, 17. März 2010

Page 16: Metaprogramming Ruby - Varwig · 2020-02-02 · Was ist Metaprogramming? Programme generieren Programme Java, C Precompiler Programme modifizieren sich selbst Lisp, Smalltalk, Ruby

Objektmanipulation

send

define_method

undef_method

remove_method

include, extend

Mittwoch, 17. März 2010

Page 18: Metaprogramming Ruby - Varwig · 2020-02-02 · Was ist Metaprogramming? Programme generieren Programme Java, C Precompiler Programme modifizieren sich selbst Lisp, Smalltalk, Ruby

KTHXBYE

9elements.com

jan.varwig.org

twitter.com/agento

Mittwoch, 17. März 2010