Ruby Programmieren mit Zucker Thomas Kühn
Gliederung Geschichte Philosophie Syntax mit Zucker Sprachkonzepte Pakete und Frameworks Ausblick Beispiele
Yukihiro Matz Matsumoto Geboren am 14.April 1965 Geschichte Biografie Studierte Informatik an der Universität Tsukuba Momentan: Chefprogrammierer bei Network Applied Communication Laboratory in Japan
1993 Begeisterung für Scriptsprachen Interesse an Objektorientierung Geschichte Entstehung Eigene Programmiersprache entwickeln Vorbilder: Perl, Python, Smalltalk 1994 Beginn der Arbeit an Ruby (24.4.1994) Erste alpha Version veröffentlicht
Geschichte Entwicklung 1997 1999 Version 1.0 bis 1.4 - nur in Japan veröffentlicht 2000 2002 Version 1.6 - Erstmals mit englischer Dokumentation 2003 heute Version 1.8 (aktuelle 1.8.7) - Stabile und ausgewogene Implementierung
Geschichte Zukunft 2008 Version 1.9 (für Entwickler) - Übersetzung in Bytecode - Ausführung in virtuelle Maschine (YARV) - System für reguläre Ausdrücke (Oniguruma) - Unicode Unterstützung - Erweiterung der Standardbibliothek Zukunft Stabile Version 1.9
Philosophie Sprache der geringsten Überraschung Simpel nach Außen Komplex im Inneren Vollständige Objektorientierung hohe Flexibilität Dynamische Typbindung Absolut freie Programmiersprache
Hello World Programm puts "Hello World" Typisches Ruby Beispiel Syntax Beispiele 5.times{ puts "typisch Ruby" } Seltsames Ruby Beispiel ('a'..'z').each { c print c }
Syntax Basis Objekte Ganze Zahlen: Gleitkommazahlen: Zeichenketten: Felder: Mengen: Intervalle: reguläre Ausdrücke: 1235 == 1_235 3.51 == 351e-2 "ruby" == 'ruby' [1, 3.5, "c"] {"a"=>1, "b"=>2} 1..5 == 1...6 /.*(y Y).*/
Syntax Kontrollstrukturen Was ist Falsch? nil, false Alle Kontrollstrukturen geben das zuletzt ausgewertete Statement zurück Schleifen sollten über Iteratoren verwet werden if exp [then :] st elseif e [then :] st else st case exp when com [then :] st else st while exp [do :] st until exp [do :] st
Syntax Methoden def filter(x = nil,*rest,&comp) return [] #... Parameter mit Vorgabewert können beim Aufruf Weg gelassen werden Stern-Operator sammelt alle Argumente in ein Array Und-Operator am Ende benötigt einen Block als Argument
Syntax Klassen class Child<Parent private @@static = 0 protected CONST = "World" public def initialize @instance = /y.*/ lokal = 1..5 #... #... def Child.next @static += 1 Child.next Child::CONST child=child.new
Syntax Ausnahmebehandlung Ausnahmen werfen raise DeckException Ausnahmen behandeln begin # geschützter Abschnitt rescue DeckException => e # wird im Fehlerfall ausgeführt else # wird sonst ausgeführt ensure # wird immer ausgeführt
Sprachkonzepte Mehrfachzuweisung Normale Zuweisungen temp = a; a = b; b = temp; typisch Ruby a, b = b, a Mehrfachzuweisung mit Arrays a, b=[1,2,3] a = 1 b = 2 a,*b=[1,2,3] a = 1 b = [2, 3]
Sprachkonzepte Blöcke und Iteratoren def abc yield('a') yield('b') yield('c') abc do x puts x a = [1,2,3,4,5] a.each{ x print x," " } b=a.find_all{ i i<3 } puts b.join("-")
Sprachkonzepte Klassen in Ruby Typ einer Klasse wird nur durch seine Methoden definiert Methodenaufrufe werden als Nachrichten an die jeweilige Klasse (oder Objekt) geset Wird eine Klasse in Ruby erweitert, erzeugt Ruby eine neue virtuelle -Klasse abgeleitet von dieser Klasse Unterschiedliche Klassen implementieren vom Verhalten ähnliche Methoden mit den selben Namen
Sprachkonzepte Ducktyping class Ente def quak "Quaaaaaak!" class Frosch def quak "Quak! Quak!" def quaken(tier) puts tier.quak quaken Ente.new quaken Frosch.new Ausgabe: Quaaaaaak! Quak! Quak!
Sprachkonzepte Operatoren Als Methoden implementiert [] []= == =~ / % + - == <=> << >= < > (...) Im Interpreter übersetzt &&..... = (...) %= /= += -= *= (...) Beispiel einer Übersetzung: i += 1 i = i.+(1)
Sprachkonzepte Mehrfach Vererbung module Mixable def shuffle sort{ rand(3)-1 } class Array include Mixable [1,2,3,4].shuffle Module erweitern die Funktionalität Module können nie instanziert werden Können Klassen, Konstanten und Variablen enthalten Können vollständige Methoden enthalten
Pakete und Frameworks irb (Interactive Ruby Shell) Optimal zum Lernen und Testen RDoc Javadoc ähnliche Dokumentation RubyGems Paketmanagement System für Ruby Unterstützt Installation und Updates von Programmen und Bibliotheken
Pakete und Frameworks Ruby on Rails Framework für Webapplikationen Einfache Konfiguration Nutzt das MVC-Design-Pattern Automatische Erstellung der Klassen (Model, View, Controller) Automatische Übernahme der Daten aus der Datenbank
Ausblick Popularität dank Ruby on Rails Ruby 2.0 bessere Virtuelle Maschine Parallele und Verteilte Programme Aspektorientierte Programmierung Konzentration auf den Programmierer, nicht auf Computer
Beispiele Objektorientierte Programmierung class Computer < Player public def initialize super @fid = Player.nextId puts @fid def printcard(card) # printf(... ) #... #... def wantscard? getcardsum<17 def getname "Computer " + @fid.to_s
def sort(list, style = ", ") if ( list.respond_to?(:join) ) puts list.sort.join(style) else puts "geht nicht" # Beginn der Ausführung sort([3,4,5,2,1], ", ") sort("also with strings?", "") sort([1.2,1.3,1.6,1.8,0.9]) Beispiele Imperative Programmierung
Beispiele Funktionale Programmierung def filter(x = nil,*rest,&comp) return [] if x.nil? return [x]+filter(*rest,&comp) if (comp.call(x)) return filter(*rest,&comp) def sort(p = nil,*rest) return [] if p.nil? return sort( *filter(*rest){ x x<p} ) + [p] + sort( *filter(*rest){ x x>=p} )
Quellen Dave Thomas, Programming Ruby ISBN: 0-9745140-5-5 Offizielle Webseite http://www.ruby-lang.org/ Dokumentation http://ruby-doc.org/ Interview mit Matz http://www.linuxdevcenter.com/pub/a/linux/2001/11/2 9/ruby.html
Ruby Language determines the way we think Hypothese von Sapir-Whorf