Metaprogramowanie w Ruby

Podobne dokumenty
Programowanie w Ruby

Programowanie w Ruby

Wstęp do ruby dla programistów javy

Programowanie w Ruby

Programowanie obiektowe

Programowanie obiektowe

Programowanie w Ruby

media Blitz wydajne sytemy szablonów

Programowanie w Ruby

Kurs programowania. Wstęp - wykład 0. Wojciech Macyna. 22 lutego 2016

Programowanie w Ruby

Wykład 4: Klasy i Metody

Spis treści. Dekoratory. 1 Dekoratory 1.1 Zadanie Zadanie Zadanie Zadanie 4

Programowanie obiektowe

EPI: Interfejs Graficzny 2011/2012 Laboratorium nr 2 Programowanie obiektowe

Marcin Luckner Politechnika Warszawska Wydział Matematyki i Nauk Informacyjnych

Programowanie obiektowe

JAVA W SUPER EXPRESOWEJ PIGUŁCE

Dariusz Brzeziński. Politechnika Poznańska, Instytut Informatyki

Klasy abstrakcyjne, interfejsy i polimorfizm

Technologie cyfrowe semestr letni 2018/2019

Kurs rozszerzony języka Python

C++ - klasy. C++ - klasy. C++ - klasy. C++ - klasy. C++ - klasy INNE SPOSOBY INICJALIZACJI SKŁADOWYCH OBIEKTU

Programowanie obiektowe

Polimorfizm. dr Jarosław Skaruz

Dekoratora używa się wstawiając linijkę zaczynającą się przed definicją dekorowanego obiektu (klasy czy funkcji).

Facelets ViewHandler

Kurs programowania. Wykład 2. Wojciech Macyna. 17 marca 2016

PHP 5 język obiektowy

KLASA UCZEN Uczen imię, nazwisko, średnia konstruktor konstruktor Ustaw Wyswietl Lepszy Promowany

Ruby. Leksykon kieszonkowy

Tworzenie stron internetowych z wykorzystaniem HTM5, JavaScript, CSS3 i jquery. Łukasz Bartczuk

Typy metod: konstruktory, destruktory, selektory, zapytania, iteratory.

1. Które składowe klasa posiada zawsze, niezależnie od tego czy je zdefiniujemy, czy nie?

Podstawy programowania III

Kurs programowania. Wykład 1. Wojciech Macyna. 3 marca 2016

Informatyka I. Dziedziczenie. Nadpisanie metod. Klasy abstrakcyjne. Wskaźnik this. Metody i pola statyczne. dr inż. Andrzej Czerepicki

Klasy Obiekty Dziedziczenie i zaawansowane cechy Objective-C

Kurs WWW. Paweł Rajba.

Programowanie Obiektowe i C++

Tworzenie własnych komponentów

Obiekt klasy jest definiowany poprzez jej składniki. Składnikami są różne zmienne oraz funkcje. Składniki opisują rzeczywisty stan obiektu.

C++ - klasy. C++ - klasy. C++ - klasy. C++ - klasy. C++ - klasy INNE SPOSOBY INICJALIZACJI SKŁADOWYCH OBIEKTU

Singleton. Cel: Przykład: Zastosowanie: Zapewnienie, że klasa ma tylko jedną instancję i dostarczenie globalnego dostępu do niej.

Dokumentacja do API Javy.

Współbieżność w środowisku Java

TECHNOLOGIE INTERNETOWE WYKŁAD 6. JavaScript Funkcje i obiekty

Zaawansowany kurs języka Python

Zaawansowane programowanie w języku C++ Klasy w C++

Programowanie obiektowe i zdarzeniowe wykład 4 Kompozycja, kolekcje, wiązanie danych

Programowanie obiektowe Wykład 6. Dariusz Wardowski. dr Dariusz Wardowski, Katedra Analizy Nieliniowej, WMiI UŁ 1/14

Java. Wykład. Dariusz Wardowski, Katedra Analizy Nieliniowej, WMiI UŁ

Programowanie i projektowanie obiektowe

Wykład 5: Więcej o Klasach i Metodach

Wywoływanie metod zdalnych

Podstawy JavaScript ćwiczenia

Obszar statyczny dane dostępne w dowolnym momencie podczas pracy programu (wprowadzone słowem kluczowym static),

wykład IV uzupełnienie notatek: dr Jerzy Białkowski Programowanie C/C++ Język C, a C++. wykład IV dr Jarosław Mederski Spis Język C++ - wstęp

Kurs języka Ruby. Ruby on Rails ActionPack

Klasy. dr Anna Łazińska, WMiI UŁ Podstawy języka Java 1 / 13

Wykład 7: Pakiety i Interfejsy

Google Web Toolkit. Piotr Findeisen

Mechanizm dziedziczenia

Laboratorium nr 12. Temat: Struktury, klasy. Zakres laboratorium:

JAVAScript w dokumentach HTML (1) JavaScript jest to interpretowany, zorientowany obiektowo, skryptowy język programowania.

Wprowadzenie do języka Ruby

Programowanie obiektowe

Wykład 6: Dziedziczenie

Na przykładzie języków Java, C# i odrobiny C++ Dariusz Brzeziński. Politechnika Poznańska, Instytut Informatyki

10. Programowanie obiektowe w PHP5

WSNHiD, Programowanie 2 Lab. 2 Język Java struktura programu, dziedziczenie, abstrakcja, polimorfizm, interfejsy

Rozdział 4 KLASY, OBIEKTY, METODY

Języki i paradygmaty programowania Wykład 2. Dariusz Wardowski. dr Dariusz Wardowski, Katedra Analizy Nieliniowej, WMiI UŁ 1/18

Kurs programowania. Wykład 3. Wojciech Macyna. 22 marca 2019

Katalog książek cz. 2

Języki i metody programowania Java. Wykład 2 (część 2)

Wstęp do programowania obiektowego. Wykład 2

Dariusz Brzeziński. Politechnika Poznańska, Instytut Informatyki

Diagramy klas. dr Jarosław Skaruz

TEMAT : KLASY DZIEDZICZENIE

KLASA UCZEN Uczen imię, nazwisko, średnia konstruktor konstruktor Ustaw Wyswietl Lepszy Promowany

Interfejsy. Programowanie obiektowe. Paweł Rogaliński Instytut Informatyki, Automatyki i Robotyki Politechniki Wrocławskiej

2.4 Dziedziczenie. 2.4 Dziedziczenie Przykłady programowania w C - kurs podstawowy

Programowanie i projektowanie obiektowe

Obiektowy PHP. Czym jest obiekt? Definicja klasy. Składowe klasy pola i metody

Instrukcja laboratoryjna cz.3

TEST KOŃCOWY DLA KLASY III GIMNAZJUM- POGRAMOWANIE. Szkoła Podstawowa Nr 5. im. Księcia Mazowieckiego Siemowita IV w Gostyninie.

Aplikacje w środowisku Java

Szablony klas, zastosowanie szablonów w programach

Pola i metody statyczne. Klasy zawierające pola i metody statyczne

XML extensible Markup Language. część 5

C++ - dziedziczenie. C++ - dziedziczenie. C++ - dziedziczenie. C++ - dziedziczenie. C++ - dziedziczenie C++ - DZIEDZICZENIE.

Wywoływanie metod zdalnych

Pakiety i interfejsy. Tomasz Borzyszkowski

Polimorfizm, metody wirtualne i klasy abstrakcyjne

Abstrakcyjny typ danych

Programowanie 2. Język C++. Wykład 3.

Wykład 4 Delegat (delegate), właściwości indeksowane, zdarzenie (event) Zofia Kruczkiewicz

Programowanie w Internecie. Java

Klasa jest nowym typem danych zdefiniowanym przez użytkownika. Najprostsza klasa jest po prostu strukturą, np

Transkrypt:

24 marca 2011

Cechy języka Wieloparadygmatowy Imperatywny Typowanie Silne Dynamiczne Otwarte klasy Interpretowany Wszystko jest obiektem

Moduły i mixiny Moduły Moduły pozwalają na łatwe włączanie ich kodu w klasy. Moduł definiuje się dokładnie tak jak klasę, tylko słowem kluczowym module zamiast class. Mixiny Mixin to po prostu moduł włączony w jakąś klasę, np. tak: class Klasa include Enumerable

Hierarchia klas obiekt.class obiekt.singleton_class Klasa.ancestors # Czy jest instancją InnejKlasy? obiekt.instance_of? InnaKlasa #... lub jej podklasy? obiekt.is_a? InnaKlasa Klasa.class_eval &blok obiekt.instance_eval &blok

Jak się dostać do środka klasy zmienne i stałe obiekt.instance_variable_defined? :@nazwa obiekt.instance_variable_get :@nazwa obiekt.instance_variable_set :@nazwa, wartość obiekt.instance_variables Klasa.class_variable_defined? :@@nazwa Klasa.class_variable_get :@@nazwa Klasa.class_variable_set :@@nazwa, wartość Klasa.class_variables Klasa.const_defined? :Nazwa Klasa.const_get :Nazwa Klasa.const_set :Nazwa, wartość Klasa.remove_const :Nazwa Klasa.constants

Jak się dostać do środka klasy metody # Zwraca metodę o nazwie :metoda Klasa.instance_method :metoda Klasa.instance_methods Klasa.alias_method :nowa_metoda, :stara_metoda # Ustawia widoczność metody na public, protected # lub private Klasa.public :metoda Klasa.protected :metoda Klasa.private :metoda Klasa.method_defined? :metoda

Jak się dostać do środka klasy metody # Zwraca metodę o danej nazwie, przypisaną do obiektu obiekt.method :metoda # Wywołanie metody o nazwie :metoda obiekt.s :metoda, *argumenty, &blok # Czy można wywołać metodę? obiekt.respond_to? :metoda

Imperatywność Ruby jest w pełni imperatywny, co oznacza że nie ma w kodzie miejsc, w których nie można wykonać kodu.

Imperatywność Ruby jest w pełni imperatywny, co oznacza że nie ma w kodzie miejsc, w których nie można wykonać kodu. class Klasa 2 + 3 # => 5

Imperatywność Ruby jest w pełni imperatywny, co oznacza że nie ma w kodzie miejsc, w których nie można wykonać kodu. class Klasa 2 + 3 # => 5 Dlaczego w klasie?

Imperatywność Ruby jest w pełni imperatywny, co oznacza że nie ma w kodzie miejsc, w których nie można wykonać kodu. class Klasa 2 + 3 # => 5 Dlaczego w klasie? Kod w środku klasy jest wykonywany w kontekście klasy. class Klasa def self.return5 2 + 3 return5 # => 5 Klasa.return5 # => 5

Otwartość klas Klasy, nawet te wbudowane, można dynamicznie modyfikować.

Otwartość klas Klasy, nawet te wbudowane, można dynamicznie modyfikować. class Fixnum alias_method :plus, :+ def + b 1.plus self.plus(b) 2 + 2 # => 5

Wszystko jest obiektem Object.is_a? Class # => true Class.is_a? Object # => true Object.class # => Class Class.class # => Class Class.ancestors # => [Class, Module, Object, Kernel, BasicObject]

Wszystko jest obiektem Object.is_a? Class # => true Class.is_a? Object # => true Object.class # => Class Class.class # => Class Class.ancestors # => [Class, Module, Object, Kernel, BasicObject] nil.class # => NilClass nil.class.ancestors # => [NilClass, Object, Kernel, BasicObject]

Singletony Uwaga W ruby, singleton to nie jest nazwa na design pattern.

Singletony Uwaga W ruby, singleton to nie jest nazwa na design pattern. class << obiekt # Środek singletonu singleton = class << obiekt; self;

Singletony Uwaga W ruby, singleton to nie jest nazwa na design pattern. class << obiekt # Środek singletonu singleton = class << obiekt; self; class Klasa class << self def metoda # metoda statyczna Klasy class Klasa def self.metoda # metoda statyczna Klasy

Dlaczego singleton? a = Object.new class << a def test 5 a.test # => 5 Object.new.test # NoMethodError

Dynamiczne definiowanie metod class Class def attr_reader name define_method name do instance_variable_get "@#{name}" def attr_writer name define_method "#{name}=" do value instance_variable_set "@#{name}", value

Dynamiczne definiowanie metod w singletonach class Class def class_attr_reader name singleton_class.s(:define_method, name) do instance_variable_get "@#{name}" def class_attr_writer name singleton_class.s(:define_method, "#{name}=") do value instance_variable_set "@#{name}", value

Przechwytywanie informacji o tym, co się zmienia Klasa.method_added name Klasa.inherited by Modul.included by class Klasa def self.method_added name puts "Dodano metodę #{name}." def self.inherited by puts "Nowa podklasa: #{by}."

Wywołania nieistniejących metod Gdy na obiekcie wywołana jest metoda, która nie jest zdefiniowana, ruby wywołuje: Obiekt.method_missing nazwa, *argumenty, &blok Jej domyślna implementacja rzuca wyjątkiem NoMethodError.

Wywołania nieistniejących metod Gdy na obiekcie wywołana jest metoda, która nie jest zdefiniowana, ruby wywołuje: Obiekt.method_missing nazwa, *argumenty, &blok Jej domyślna implementacja rzuca wyjątkiem NoMethodError. Przykład implementacji class Klasa def method_missing name, *args super unless name.to_s._with?! puts "Wywołano metodę #{name} z " + "#{args.length} argumentami." def respond_to? name; name.to_s._with?! ;

Przykład Domain Specific Language Przykład klasy, która pozwala łatwo tworzyć pliki xml. class XML < BasicObject def method_missing sym, attr = {}, &block @output << "<#{sym}" attr.each do key, value @output << " #{key}= #{value} " if block @output << ">" << block.call.to_s << "</#{sym}>" else @output << " />" nil

Przykład Domain Specific Language class XML def initialize file = $stdout @output = file def respond_to? true def self.rer file = $stdout, &block self.new(file).instance_eval &block

Domain Specific Language użycie XML.rer do html :xmlns => "http://www.w3.org/1999/xhtml" do head do title { "Hello World" } body do h1 { "Hello World" } ul :type => "disc" do 10.times do i li { i } nil div :style => "font-family:serif" do "To jest przykładowy dokument XML"

Pytania