Unsere Datenschutzrichtlinie wird in Kürze aktualisiert. Bitte sehen Sie sich die Vorschau an.

Scala Grundkurs

Funktionen und Methoden

Testen Sie unsere 2016 Kurse

10 Tage kostenlos!

Jetzt testen Alle Abonnements anzeigen
Funktionen und Methoden sind die Grundbausteine für die Definition von Logikabschnitten. Im Vergleich zu rein objektorientierten Sprachen wie Java gibt es in Scala beim Umgang mit Funktionen und Methoden einige Unterschiede, die Sie in diesem Film näher kennenlernen.

Transkript

Scala ist eine funktionale und objektorientierte Programmiersprache. Als solche sind Funktionen also das Fundament von Scala. Anders als in reinen objektorientierten Programmiersprache, wie Java, gibt es hier also nun einige Unterschiede in der Art und Weise, wie Funktionen und Methoden gehandhabt werden. Wie genau sich diese Unterschiede äußern, werde ich Ihnen nun demonstrieren. Innerhalb meiner IDE befinde ich mich nun in einem Methodenrumpf, beispielsweise der Methodenrumpf der Methode "main", signalisiert durch die geschweiften Klammern und der Zuweisung. Anders als beispielsweise In Java, kann ich nun auch innerhalb dieses Methodenrumpfs andere Methoden beziehungsweise Funktionen definieren. Beispielsweise die Funktion "add", die als Argument einen Integer a und einen Integer b entgegennimmt. Das Resultat dieser Funktion ist die Addition aus a + b. Um das ganze nun zu testen, verwende ich also einen Println-Aufruf auf die Addition von 2 und 3. Das Ergebnis ist wie erwartet 5. An der Stelle sind nun einige weitere Besonderheiten zu erkennen. Zum einen nimmt diese Funktion nun also zwei Argumente entgegen, bestimmt aber keinen expliziten Rückgabewert und dessen Typ. Das bedeutet also, dass die Addition aus a+b automatisch einen Integer zurückgibt, denn hier werden zwei Integer miteinander addiert. Dies kann der Scala Compiler selbst erkennen. Des weiteren gibt es hier keine explizite Angabe durch einen Return-Keyword. Die Annahme von Scala ist automatisch, dass das letzte Statement innerhalb des Rumpfes der Funktion den Ausgabewert darstellt, in dem Fall also nun a + b. Funktionen können innerhalb von Scala auch wie Objekte verwendet werden. Beispielsweise kann ich nun also eine Konstante mit der Bezeichnung "addFunc" definieren. Diese nimmt, ähnlich wie im oberen Beispiel, zwei Argumente entgegen, a und b, vom Typ Integer, und addiert diese. Ähnlich wie im oberen Beispiel, kann auch ein Aufruf dieser Konstante stattfinden mit beispielsweise den Argumenten 5 und 6. Die Besonderheit liegt hier also in der Notation bei der Zuweisung. Hierbei handelt es sich also um ein Funktionsobjekt, das etwas anders definieren wird als eine reguläre Funktion. Weiterhin ist es auch möglich eine normal definierte Funktion, wie beispielsweise die Funktion "add", später eine Konstante zuzuweisen. Zum Beispiel könnte ich diese Konstante nun "addFuncDef" nennen, und verwende hier die Notation der Methode "add _ " . Der Underscore dient hier zu Notation, dass die Argumente, die von diesem konstanten Objekt hier, an die Methode "add" übergeben werden sollen. Wichtig zu verstehen ist also, immer dann wenn ich eine Referenz verwenden möchte, auf eine solche reguläre Methode, die beispielsweise auch innerhalb einer Klasse stehen könnte, verwende ich den Underscore. Statt dem Scala Compiler zu überlassen, welcher Rückgabetyp von meiner Funktion ausgegeben werden soll, kann ich dies auch explizit definieren. Beispielsweise definiere ich nun also eine Funktion "addLong", und sage, dass der Rückgabetyp hier von Typ "Long" ist. Damit findet auch automatisch eine Konvertierung des Datentyps "Integer" zu "Long" statt, und der Ausgabetyp wird durch die Notation des Doppelpunktes nach den Argumenten angegeben. Wenn ich nicht möchte, dass es sich hierbei um eine Funktion handelt, kann ich auch einen besonderen Rückgabetyp verwenden. Ich nenne meine Funktion nun also "addnotResult" und mache sie zu einer Methode, indem ich den Rückgabetyp auf "Unit" ändere. Des weiteren ist es mir möglich Methoden beziehungsweise Funktionen zu definieren, die generische Eingabetypen haben. Beispielsweise die Funktion mit dem Titel "valFunc", die lediglich eine Prinln durchführt. Das Argument "Value" kann ich nun beispielsweise auf "Any" setzten. Das bedeutet nun, dass ich die Funktion "valFunc" sowohl mit einem Text verwenden kann als such mit einer Zahl. Ich könnte nun hier die Definition ändern, indem ich beispielsweise das Ganze auf "AnyVal" umstelle. In dem Fall könnte ich nun keinen Text mehr übergeben, da es sich dabei um eine Reference handelt, also den Typen "AnyRef". Wiederum die Zahl wäre legitim als Eingabewert. Würde ich das Ganze nun auf "AnyRef" ändern, so wird, wie auch hier durch IntelliJ signalisiert, die Zahl 1 kein konkreter Eingabetyp mehr sein. Ähnlich wie bei Variablen und Konstanten kann ich für den Bezeichner einer Funktion beziehungsweise Methode auch Texte verwenden. Dies funktioniert ähnlich über Backticks. Beispielsweise kann ich meine Funktion nun eben mit dem Titel "meine Funktion" bezeichnen und einen Integer entgegennehmen, den ich mit sich selbst multipliziere. Der Aufruf funktioniert dann auch wieder über die Backticks und dem Variablenwert für meine Parameter. Wie man bereits innerhalb des Methodenblocks "main" sehen kann, kann ich also Funktionen innerhalb von Funktionen definieren. Diese dienen dann lediglich der inneren Funktion. Das bedeutet, sie sind nicht nach außen sichtbar. Wenn ich also beispielsweise eine Funktion "quadrieren" schreibe, die einen Integer entgegennimmt, kann diese innerhalb Ihres Methodenrumpfes noch eine Funktion "multiply" definieren, die einen Integer a und einen Integer b entgegennimmt, und das Ganze dann durch multiplizieren ausrechnet. Da diese "multiply" Funktion nun innerhalb von "quadrieren" zur Verfügung steht, kann ich also das Ergebnis dadurch berechnen, dass ich a mit sich selbst multipliziere. Damit würde ich theoretisch auch meine "multiply" Funktion davor schützen, dass sie von anderen genutzt wird innerhalb von Kontexten, für die sie nicht bestimmt wurde, und muss mir nicht, wie in anderen Programmiersprachen, mit komplexen Konstrukten, wie Private, Protected und Hilfsklassen behelfen. Ich habe Ihnen also gezeigt, wie Sie eine Funktion mit Hilfe des "def" Keywords oder als Funktionsobjekt definieren. Solche Funktionsobjekte werden in der Praxis oft als Lambda-Funktionen oder Closure bezeichnet. Bei den Parametern war es immer nötig, den relevanten Typen für den Eingabeparameter korrekt zu definieren. Für den Ausgabetypen einer solchen Funktion gab es verschiedene Möglichkeiten. Dieser war zunächst einmal optional, sofern der Scala Compiler selbst herausfinden konnte, was der korrekte Ausgabetyp ist. In anderen Fällen kann ich Ihnen explizit angeben, um sicherzustellen, dass auch das herauskommt, was ich mir wünsche. In meinem Beispiel war es weiterhin möglich ein Typcasting vorzunehmen. Beispielsweise bei der Addition von zwei Integern konnte ich das Ganze in ein Long umwandeln. Und wenn ich keine explizite Rückgabe erwünscht habe, habe ich das Ganze mit Unit als Ausgabetyp definiert und somit eine Methode deklariert. Des weiteren haben Sie gesehen, dass es generische Eingabetypen, wie Any, AnyVal und AnyRef gibt. Diese sind je nach Kontext entsprechend einzusetzen. Auch wie bei Val- und Var-Definitionen ist bei Methodennamen möglich das Ganze in Form eines Textes anzugeben, der beispielsweise auch Leerzeichen enthalten kann. Und zu guter Letzt, habe ich Ihnen noch geschachtelte Funktionen gezeigt. Diese erlauben es also die Hilfsfunktionen einer einzelnen Funktion innerhalb Ihres Kontextes beziehungsweise Ihres Methodenrumpfes zu verbergen.

Scala Grundkurs

Entdecken Sie die Möglichkeiten und Eigenschaften der modernen Programmiersprache Scala.

4 Std. 44 min (39 Videos)
Derzeit sind keine Feedbacks vorhanden...
 
Exklusiv für Abo-Kunden
Erscheinungsdatum:12.04.2017

Dieser Online-Kurs ist als Download und als Streaming-Video verfügbar. Die gute Nachricht: Sie müssen sich nicht entscheiden - sobald Sie das Training erwerben, erhalten Sie Zugang zu beiden Optionen!

Der Download ermöglicht Ihnen die Offline-Nutzung des Trainings und bietet die Vorteile einer benutzerfreundlichen Abspielumgebung. Wenn Sie an verschiedenen Computern arbeiten, oder nicht den ganzen Kurs auf einmal herunterladen möchten, loggen Sie sich auf dieser Seite ein, um alle Videos des Trainings als Streaming-Video anzusehen.

Wir hoffen, dass Sie viel Freude und Erfolg mit diesem Video-Training haben werden. Falls Sie irgendwelche Fragen haben, zögern Sie nicht uns zu kontaktieren!