Scala: Klassen, Methoden und Objekte

Werbung
Scala: Klassen, Methoden und
Objekte
von Simon Lerch
Überblick
●
Methoden
●
Klassen
●
Objekte
●
Basis Typen
●
Prefixes
●
Java's == vs. Scala's ==
●
Assoziativität von Operatoren
●
Rich Wrapper
30.03.10
Klassen, Methoden und Objekte
2
Parameter
●
Methoden
def add(x: Int,y: Int)
Rückgabewerte
●
def add(x: Int,y: Int): Int = {return x + y}
●
def add(x: Int,y: Int): Int = {x + y}
●
def add(x: Int,y: Int) = { x + y }
Single Expressions brauchen keine Klammern!
Unit als Rückgabewert:
●
def run(): Unit = "rennt"
30.03.10
Klassen, Methoden und Objekte
3
Methoden
Operatoren sind Methoden!
●
1 + 2 = 1 .+(2)
●
def +(y: Int) = { x = x + y }
Das heißt auch, dass Methodennamen Sonderzeichen enthalten dürfen.
Ausnahmen sind natürlich Zeichen die für die Syntax gebraucht werden!
30.03.10
Klassen, Methoden und Objekte
4
Klassen
Eine einfache Klasse aus der letzten Übung:
class Rational(numer: Int, denom: Int){
private def gcd(a: Int, b: Int): Int = if(a == b) a else gcd(a min b, a - b abs)
override def toString = numer + "/" + denom
def reduce =
{
val g = gcd(numer, denom)
new Rational(numer/g, denom/g)
}
}
def extend(f: Int) =
{
new Rational(numer*f, denom*f)
}
30.03.10
Klassen, Methoden und Objekte
5
Private
Klassen, Methoden und Variablen können jeweils auf private
gesetzt werden.
30.03.10
Klassen, Methoden und Objekte
6
Konstruktor
Der Primär Konstruktor wird gleich neben dem Klassennamen angegeben.
Beispiel: „class Rational(numer: Int, denom: Int)“
●
Parameter des Konstruktors sind in der kompletten Klasse zugänglich.
●
Andere Konstruktoren müssen als erstes auf den Main Konstruktor verweisen.
30.03.10
Klassen, Methoden und Objekte
7
Beispiel:
class YellBot(text: String){
println(text)
println(text)
def this(){
this("Dummy text!!!")
}
}
new YellBot("Ni Hao!")
new YellBot()
30.03.10
Klassen, Methoden und Objekte
8
Objekte
Objekte ersetzen statics aus Java
(singleton objects)
Beispiel:
object Robot{
def sayHello = {
"hello!"
}
}
ausführen:
println(Robot.sayHello)
30.03.10
Klassen, Methoden und Objekte
9
Objekte in Verbindung mit einer Klasse
(companion class)
Wenn eine Klasse und ein Objekt den gleichen Namen besitzen und in der
selben Datei stehen, dann teilen sich beide ihre privaten Variablen.
Ein Namenskonflikt kann dabei nicht entstehen, da die Namensräume
getrennt verwaltet werden.
Bietet eine gute Möglichkeit um eine factory für die Klasse zu erstellen.
30.03.10
Klassen, Methoden und Objekte
10
Beispiel
class CopyCounter{
CopyCounter.copyCreatedCounter = CopyCounter.copyCreatedCounter + 1
}
object CopyCounter{
private var copyCreatedCounter = 0
}
def getCount() = copyCreatedCounter
new CopyCounter
new CopyCounter
new CopyCounter
new CopyCounter
println(CopyCounter.getCount())
30.03.10
Klassen, Methoden und Objekte
11
Objekte
Die Main Methode
Es gibt zwei Möglichkeiten um eine Main-Methode zu erstellen:
Erste Möglichkeit: extends Application
object Obj extends Application{
//content
}
Diese Möglichkeit ist einfacher zu schreiben, ist aber mit Nachteilen behaftet:
● JVM hat mit dieser Art von Main-Methode Probleme mit Multithreaded Programmen.
Zweite Möglichkeit ist ausgeschrieben:
object Obj {
def main(args: Array[String]) {
//content
}
}
●
Einlesen von Kommandozeilenparametern möglich.
30.03.10
Klassen, Methoden und Objekte
12
Imports
Einfach Import:
● import java.util.Date
● import java.util._
( _ ersetzt * )
Man kann in Scala auch Java Bibliotheken benützen.
Beispiel:
import java.util.Random
val rand = new Random(System.currentTimeMillis());
val x = rand.nextInt(10);
println(x)
30.03.10
Klassen, Methoden und Objekte
13
Deep Import
Deep Import:
● import Rational.CreateRational
>> CreateRational(5,2)
Importierte Objektmethoden können direkt ausgeführt werden.
30.03.10
Klassen, Methoden und Objekte
14
Basis Typen
Typen: Byte, Short, Int, Long, Char, Float, Double, Boolean
Groß- oder Kleinschreibung ist egal, von der Scala Community wird aber die
Großschreibung bevorzugt.
30.03.10
Klassen, Methoden und Objekte
15
Zahlen
Hexadezimal: 0x00FF
Octal:
0777
Dezimal:
255
Long:
Double:
Double:
Double:
Float:
30.03.10
35L
12.345
3e5
3e5D
1.2345F
Klassen, Methoden und Objekte
16
Chars
●
Special Chars '\n', '\b', '\t', '\f', '\r', '\“', '\'', '\\' sind alle vorhanden.
Standard Unicode Buchstaben aus vier Hexadezimal Ziffern sind
vorhanden und werden \u eingeleitet:
val d = '\u0041'
>> d: Char = A
●
Unicode Buchstaben können nicht nur in Chars und Strings
benützt werden!
val B\u0041\u0044 = 1
>> BAD: Int = 1
●
Eine dort zusätzliche Funktion ist der sogenannte RawString.
30.03.10
Klassen, Methoden und Objekte
17
Strings – Rawstring
Rawstring ist ein String, der nicht sensibel für spezielle
Zeichen und Syntax ist.
Beispiel:
println("""Hello "World"
in Scala""")
.stripMargin:
println(""" |Hello "World"
|In Scala""" .stripMargin)
Löscht alle führenden Leerzeichen, als Positionsangabe der ersten Stelle in der
Zeile steht das „|“
30.03.10
Klassen, Methoden und Objekte
18
Prefixes
Prefixes sind besondere Methoden, die vor dem eigentlichen Objekt
stehen. Diese Methoden können nur aus einem dieser Zeichen
bestehen:
+,-,!,~
Aufruf erfolgt über "unary_-" bzw. "unary_!" etc.
Beispiel:
● -2.0 = (2.0).unary_● def unary_- {number = -number}
● def unary_- : Rational = {new Rational(-numer,denom)}
30.03.10
Klassen, Methoden und Objekte
19
Unary_! Beispiel
private class Lamp{
private var on = false
def unary_! {on = !on}
def isOn() = on
}
val lamp = new Lamp
!lamp
println(lamp.isOn())
!lamp
println(lamp.isOn())
30.03.10
Klassen, Methoden und Objekte
20
Java's == vs. Scala's ==
Scala vergleicht == auf equals Basis und nicht so wie in Java
nach Referenzen.
Scala:
List(1,2,3) == List (1,2,3)
>> Boolean = true
List(1,2,3) == List(4,5,6)
>> Boolean = false
1 == 1.0
>> Boolean = true
List(1,2,3) == null
>> Boolean = false
null == List(1,2,3)
>> Boolean = false
(„he“+“llo“) == „hello“
>> Boolean = true
30.03.10
Java:
>> false
>> false
>> true
>> false
>> false
>> false
Klassen, Methoden und Objekte
21
Assoziativität von Operatoren
Priorität der Operationen in Scala und Java:
1.
*/%
2.
+3.
:
4.
=!
5.
<>
6.
&
7.
^
8.
|
10. all letters
11. all assignment operators
30.03.10
Multiplikationsoperatoren
*/%
Additionsoperatoren
+-
Verschiebeoperatoren
<< >> >>>
Vergleichsoperatoren
< > >= <= instanceof
Gleichheitsoperatoren
== !=
Bitoperator Und
&
Bitoperator exklusives Oder
^
Bitoperator inklusives Oder
|
logisches Und
&&
logisches Oder
||
Bedingungsoperator
?:
Zuweisungsoperatoren
+ += -= *= /= %= >>=
<<=
>>>= &= ^= |=
Klassen, Methoden und Objekte
22
Assozivität von Operatoren
Es gibt Methoden, die Operationen umdrehen
Beispiel: aus a +: b wird b.+:(a)
Wenn ein Methodenname mit ":" endet wird die linke Seite auf
die rechte ausgeführt.
Wenn von mehreren Methoden die Assoziativität umgedreht
wird, dann werden diese auch andersherum gruppiert.
Beispiel: aus a ::: b ::: c wird a ::: (b ::: c)
30.03.10
Klassen, Methoden und Objekte
23
Rich Wrapper
Table 5.4 · Some rich
operations:
0 max 5
0 min 5
-2.7 abs
-2.7 round
1.5 isInfinity
(1.0 / 0) isInfinity
4 to 6
"bob" capitalize
"robert" drop 2
30.03.10
5
0
2.7
-3L
false
true
Range(4, 5, 6)
"Bob"
"bert"
* Listen sind aus dem Buch Programming in Scala von
Martin Odersky
Klassen, Methoden
Table 5.5 · Rich wrapper classes
Byte
Short
Int
Char
String
Float
Double
Boolean
und Objekte
scala.runtime.RichByte
scala.runtime.RichShort
scala.runtime.RichInt
scala.runtime.RichChar
scala.runtime.RichString
scala.runtime.RichFloat
scala.runtime.RichDouble
scala.runtime.RichBoolean
24
Zusammenfassung
●
Erstellen von Methoden, Klassen und Objekte
●
Basis Typen
●
Prefixes
●
Java's == vs. Scala's ==
●
Assozivität und ":"
●
Rich Wrapper
30.03.10
Klassen, Methoden und Objekte
25
Ende
Quellen: „Programming in Scala“
von Martin Odersky
30.03.10
Klassen, Methoden und Objekte
26
Herunterladen