Informatik: Einführung in Ruby
Released by matroid on Fr. 06. Juli 2007 21:16:29 [Statistics]
Written by matph - 5241 x read [Outline] Printable version Printer-friendly version -  Choose language   
Informatik

\(\begingroup\)
Einführung in

Ruby


Die Programmiersprache Ruby - eine kleiner Überblick...


Allgemeines
Ruby ist 1993 in Japan entstanden, wo es erstmals 1995 veröffentlicht wurde, und freut sich im neuen Jahrtausend weltweit immer mehr Beliebtheit. Derzeit aktuell ist Ruby 1.8.6, auch wenn schon an den nächsten Versionen gearbeitet wird. Ruby gehört zu den interpretierten Programmiersprachen, ist Prototyp-basiert und besitzt mehrere Paradigmen, wie Funktionsbasiert, Imperativ, Nebenläufig und Objekt Orientiert - jeder Typ ist ein Objekt, sogar Klassen und elementare Typen wie Zahlen, Strings usw. Die Typisierung in Ruby ist dynamisch - durch Duck Typing - ganz nach dem Prinzip, dass wenn ich einen Vogel sehe, der läuft wie eine Ente, schwimmt wie eine Ente und schnattert wie eine Ente, nenne ich diesen Vogel eine Ente, implizit, d.h. es werden die Datentypen über Typableitung erkannt, und stark womit gemeint ist, dass eine Bindung zwischen Wert und Datentyp existiert, welche nicht ohne explizite Anweisung modifiziert wird. Die Philosophie besteht in POLS (Principle Of Least Surprise) - Prinzip der geringsten Überraschung - so wie Produktivität, Spaß und gutem Design.
Hello World
Starten wir klassisch mit einem kleinen HelloWorld-Programm. Da wir keine Main-Funktion oder Deklarationen schreiben müssen, umfasst dieses genau eine Zeile: \sourceon Ruby puts "Hello World!" \sourceoff helloWorld.rb puts gibt hier den Strings aus und hängt einen Zeilenumbruch an die Ausgabe. Doch werfen wir gleich einen etwas genaueren Blick auf die Sprache: \sourceon Ruby class Hello attr_writer :what @@klassenVariable = 1 def world print "Hello ", @what, @instanceVariable, "\n" end def initialize(a) @instanceVariable = a end end :symbol Konstante = 1 $globaleVariable = 1 lokaleVariable = 1 a=Hello.new('!') a.what = "World" a.world \sourceoff helloWorld_1.rb Hier kreieren wir eine Klasse mit dem Namen Hello, welche die Methode world besitzt. initialize wird automatisch mit new ausgeführt, und Initialisiert unsere @instanceVariable welche an a gebunden ist. Die @@klassenVariable ist für jedes Objekt der Klasse die selbe. Konstanten beginnen mit einem Großbuchstaben wie auch Klassennamen, im Gegensatz zu Methoden oder lokalen Variablen. Mit $ werden globale Variablen gekennzeichnet, Symbole mit :, welche ähnlich zu Atomen in andern High-Level-Sprachen sind. Methoden werden via def name(args) definiert, und sind ohne weitere Deklaration public (bis auf initialize, welche immer Privat ist). protected können nur aufgerufen werden von den Objekten der definierenden Klasse und Subklassen, private kann nur im Kontext des aktuellen Objekts aufgerufen werden. Mit attr_writer sparen wir uns explizit eine Methode zu schreiben, um Zugriff auf @what zu erhalten. Ähnlich wie in vielen anderen objektorientierten Sprachen lassen sich Methoden aufrufen und auf eine Klasse Bezug nehmen, in dem wir einen . verwenden.
irb
Interactive Ruby - irb Alles was wir bereits gesehen haben, und ebenfalls alles was wir noch sehen werden, lässt sich nicht nur in ein File speichern, um es später aus zu führen, sondern auch direkt in der irb eingeben. So lässt sich diese problemlos als Taschenrechner, zum Testen von Programmen und zum Lernen der Sprache benutzen. Eine Sitzung sieht z.B. folgendermaßen aus: \sourceon irb irb(main):001:0> 5**2 => 25 irb(main):002:0> \sourceoff Hier quadrieren wir 5, das Ergebnis ist 25, und eine neue Eingabe wird erwartet, mit exit können wir diese wieder verlassen.
Learning by Example
Am besten lernt man eine Sprache kennen, in dem man sich ein paar Beispiel-Programme ansieht: \sourceon Ruby include Math # Dies ist ein Kommentar print "Zeilenzahl in SinTabelle: " # Aufforderung zur Eingabe c = gets.to_i # Zeile Einlesen und in Int umwandeln k = PI / c # Ausgabe durch eine kleine Schleife: (0...c).each do |i| puts(sin(k*i)) end puts 0.0 \sourceoff sinTabelle.rb Mit include Math machen wir mathematische Funktionen wie die trigonometrischen, so wie Konstanten wie PI usw. verfügbar, welche wir in diesem Programm benötigen, denn wir wollen eine Sinus-Tabelle ausgeben. Die Anzahl der Werte in dieser soll dabei vom User bestimmt werden, daher Fragen wir diesen nach der Zeilenzahl, und lesen via gets dessen Eingabe ein. Nach dem das Typsystem Stark ist, müssen wir diese explizit in einen Integeren Wert umwandeln, was mittels obj.to_i geschieht. Die Ausgabe soll nun in einer kleinen Schleife erfolgen, die hier mittels Bereich und each definiert ist. Der jeweilig aktuelle Wert wird dabei in der nur in der Schleife zur Verfügung stehenden Variable i gespeichert. So würde (1..5).each{|i| puts i} die Zahlen 1,2,3,4 und 5 ausgeben. Hier verwenden wir den Bereich der Art (1...5).each{|i| puts i}, welcher nur die zahlen 1,2,3 und 4 zur folge hätte. Es gäbe hierfür natürlich noch viele weitere Schleifen-Typen welche wir einsetzten könnten, so z.B. while boolean-expression [ do | : ] body end oder for name [, name ]... in expression [ do | : ] body end oder eine Endlosschleife loop do body end. Wie einfach es sein kann, Programme mit riesigem Effekt zu schreiben, soll das folgende Beispiel demonstrieren, in dem wir unsere eigene kleine interaktive Umgebung schreiben: \sourceon Ruby while gets.strip.downcase != ":q" do puts(eval($_)) end \sourceoff c.rb In einer while-Schleife die solange läuft, wie die Eingabe nicht :q entspricht, evaluieren wir jeweils die Eingabe des Users und geben das Ergebnis dieser in einer Zeile aus. $_ besitzt hierbei den selben Wert wie durch gets zurückgegeben. So haben wir unseren eigenen kleinen Ruby-Interpreter geschrieben. Mit strip entfernen wir dabei alle Whitespaces vom Anfang und Ende der Eingabe, mittels downcase verwandeln wir alle Großbuchstaben in Kleinbuchstaben, um auch bei :Q unser Programm zu beenden. Gerade hier am Matheplaneten ist es natürlich sehr wichtig, dass eine Sprache bereits mit den klassischen mathematischen Konstrukten umgehen kann: \sourceon Ruby require 'matrix' require 'mathn' include Math def rotM(phi) Matrix[[cos(phi),-sin(phi)],[sin(phi),cos(phi)]] end m1 = rotM(PI/2) v1 = Vector[1,7] puts m1*v1, m1.inv * v1 print "Rang: #{m1.rank}, Singulär: #{m1.singular? ? 'Ja' : 'Nein'}", "\nDet: ", m1.determinant, "\n" \sourceoff matrix.rb Als Beispiel hierfür sehen wir uns Matrizen und Vektoren an, welche in der Std. Lib. Matrix definiert sind, welche wir über require in unser Programm einfügen. In der Bibliothek mathn sind automatische Konvertierungen zwischen Bignum, Complex, Fixnum, Integer und Rational definiert, um elegantere Ausgaben zu ermöglichen. So wird Beispielsweise sobald diese eingefügt ist 6/12 nicht als Division behandelt, sondern als Rationale Zahl, und die Ausgabe wird 1/2 sein. In diesem Beispiel definieren wir rotM, wobei die Rückgabe eine Rotationsmatrix für den übergebenen Winkel phi ist. Diese Matrix können wir nun mit Vektoren, anderen Matrizen multiplizieren und entsprechend den mathematischen Konventionen addieren, invertieren,... Des weiteren sehen wir hier das Konstrukt m1.singular? ? 'Ja' : 'Nein', welches ein Ternary-Operator ist. Falls m1 Singulär sein sollte, so wird hier der String Ja zurückgegeben, andernfalls Nein. Diesen fügen wir in die Ausgabe direkt im String ein, in dem wir "Text #{Anweisung}" schreiben. Natürlich gibt es auch für die bedingte Ausführung von Code if boolean-expression [ then | : ] body [ elsif boolean-expression [ then | : ] body , ... ] [ else body ] end und unless so wie case-Konstrukte. Sehen wir uns zum Abschluss noch ein paar Zeilen etwas komplizierten Code an: \sourceon Ruby class Array def foldr(f,z) x=self.length return z if x==0 f.call(self.first,self[1,x-1].foldr(f,z)) end def tail self[1,self.length-1] end end # Horner Startwert puts lambda{|xs| xs.tail.foldr(lambda{|s,t| s+t*xs.first},0)}. # Eingabe & Verarbeitung call(gets.split.map{|x|x.to_f}) \sourceoff polynomial.rb Mit diesem lassen sich Polynome beliebigen Grades an einer Stelle auswerten, so z.B. für p(x)=0+2x+2x2 für p(5). Hierfür schreiben wir die Eingabe: 5 0 2 2 und 60 wird ausgegeben. Ein weiteres Beispiel: 2*x0+1*x1+7*x2 für x=10 (ist einfacher zu lesen als 2+x+7x2) würde der Eingabe: 10 2 1 7 entsprechen, die Ausgabe währe: 712 Um dies zu erreichen haben wir die Klasse Array um 2 weitere Methoden erweitert, zum einen foldr, welche unser Array von rechts mit einer übergebenen Funktion faltet, zum anderen tail, die uns das Array ohne dem ersten Element zurückgibt. Wir sehen daran, dass wir jederzeit, jede Klasse beliebig erweitern können. Diese nun implementierten Möglichkeiten benötigen wir im Weiteren, um die Auswertung der Polynome nach dem Horner-Schema zu bewerkstelligen. Dafür lesen wir wiederum eine Zeile mittels gets ein, splitten diese an hand der Leerzeichen auf (split), und wandeln alle Zahlen in den Typ Float um: map{|x|x.to_f}. Dieses Array übergeben wir nun mittels call an eine First-Class-Funktion, welche wir mittels lambda definiert haben. Auch an foldr übergeben wir eine entsprechende Funktion, um das Array mit dieser zu Falten. tail benötigen wir um das erste Element als Wert zu separieren, denn an dieser wollen wir das Polynom in linearer Laufzeit auswerten.
Weiteres

\(\endgroup\)
Get link to this article Get link to this article  Printable version Printer-friendly version -  Choose language     Kommentare zeigen Comments  
pdfFür diesen Artikel gibt es keine pdf-Datei


Arbeitsgruppe Alexandria Dieser Artikel ist im Verzeichnis der Arbeitsgruppe Alexandria eingetragen:
: Informatik :: automatisch eingefügt und unbearbeitet :
Einführung in Ruby [von matph]  
Einführung in Die Programmiersprache Ruby - eine kleiner Überblick...
[Die Arbeitsgruppe Alexandria katalogisiert die Artikel auf dem Matheplaneten]

 
 
Aufrufzähler 5241
 
Aufrufstatistik des Artikels
Insgesamt 216 externe Seitenaufrufe zwischen 2012.01 und 2022.01 [Anzeigen]
DomainAnzahlProz
https://google.com115.1%5.1 %
http://google.de19590.3%90.3 %
https://google.de52.3%2.3 %
http://r.duckduckgo.com20.9%0.9 %
http://www.bing.com20.9%0.9 %
https://duckduckgo.com10.5%0.5 %

Häufige Aufrufer in früheren Monaten
Insgesamt 194 häufige Aufrufer [Anzeigen]
DatumAufrufer-URL
2013-2018 (62x)http://google.de/url?sa=t&rct=j&q=
201209-12 (33x)http://google.de/url?sa=t&rct=j&q=ruby quadrieren
201205-05 (13x)http://google.de/url?sa=t&rct=j&q=taschenrechner mit ruby programmiersprache
201204-04 (12x)http://google.de/url?sa=t&rct=j&q=ruby taschenrechner addieren
201203-03 (12x)http://google.de/url?sa=t&rct=j&q=ruby sinus
2020-2021 (9x)https://google.com/
2012-2013 (8x)http://google.de/url?sa=t&rct=j&q=ruby mathematik
201206-06 (7x)http://google.de/url?sa=t&rct=j&q=winkelberechnung sinus ruby
201304-04 (7x)http://google.de/url?sa=t&rct=j&q=ruby taschenrechner
201202-02 (5x)http://google.de/url?sa=t&rct=j&q=ruby potenz math
201306-06 (5x)http://google.de/url?sa=t&rct=j&q=ruby vektoren matrizen
201302-02 (5x)http://google.de/url?sa=t&rct=j&q=programmier sprache ruby mathe %
201305-05 (4x)http://google.de/url?sa=t&rct=j&q=ruby programmiersprache integral
201301-01 (4x)http://google.de/url?sa=t&rct=j&q=ruby eingabe einlesen
202011-11 (4x)https://google.de/
201208-08 (4x)http://google.de/url?sa=t&rct=j&q=ruby matrizen

[Top of page]

"Informatik: Einführung in Ruby" | 2 Comments
The authors of the comments are responsible for the content.

Re: Einführung in Ruby
von: freeclimb am: Fr. 06. Juli 2007 21:30:41
\(\begingroup\)Vielen Dank für diesen netten Exkurs in Ruby. Obwohl einige Konzepte angesprochen wurden, so kann man doch immer deinen Ausführungen folgen. Ein sehr interessanter Einblick! mfg, free\(\endgroup\)
 

Re: Einführung in Ruby
von: Ex_Mitglied_40174 am: So. 02. September 2007 12:03:38
\(\begingroup\)Man sollte von dem C wegkommen - 1960 hatte eine Festplatte 10 Kilo Byte Kapazität. Daten sind was anderes geworden.\(\endgroup\)
 

 
All logos and trademarks in this site are property of their respective owner. The comments are property of their posters, all the rest © 2001-2022 by Matroids Matheplanet
This web site was originally made with PHP-Nuke, a former web portal system written in PHP that seems no longer to be maintained nor supported. PHP-Nuke is Free Software released under the GNU/GPL license.
Ich distanziere mich von rechtswidrigen oder anstößigen Inhalten, die sich trotz aufmerksamer Prüfung hinter hier verwendeten Links verbergen mögen.
Lesen Sie die Nutzungsbedingungen, die Distanzierung, die Datenschutzerklärung und das Impressum.
[Seitenanfang]