Ruby/Integer

Aus Scientia
Version vom 24. März 2007, 23:35 Uhr von Kai (Diskussion | Beiträge)

(Unterschied) ← Nächstältere Version | Aktuelle Version (Unterschied) | Nächstjüngere Version → (Unterschied)
Wechseln zu: Navigation, Suche

Vorlage:Rubyklasse

Die Integer Klasse umfasst alle Ganzstelligen Zahlen in Ruby. Subklassen von Integer sind Fixnum, für kleine Zahlen, und Bignum, für große Zahlen. Integer und ihre Subklassen besitzt keine Konstruktormethode new. Aus diesem Grund kann man diese Objekte nur auf folgende Weise erzeugen: [ruby]objekt = 12 #objekt = zahl Ruby entscheidet selbstständig, ob das Objekt ein Fixnum oder ein Bignum wird. Auch bei Rechenoperationen wird ein Objekt automatisch in Bignum oder Fixnum umgewandelt, falls es seinen jeweiligen Zahlenbereich überschreitet.

Für große Zahlen kennt Ruby außerdem einige Kniffe, welche die Lesbarkeit der Zahlen erhöhen. So trennt man größere Zahlen für gewöhnlich mit Punkten, beispielsweise: 1.000.000 Ruby beherrscht diese Schreibweise auch, jedoch muss man statt Punkte _ verwenden. [ruby]x = 1_000_000 + 5_030 print(x) An welchen Stellen die _ platziert werden, ist völlig egal. Ruby ignoriert sie praktisch. Sie sind nur für den Benutzer zur Übersicht nützlich.

Integerwerte sind zudem stets konstant. Man kann ein Integerobjekt nicht ändern. Es ist allerdings möglich einer Variable einen neuen Integerwert zuzuweisen, der aus dem vorherigen errechnet wurde. [ruby]a = 5 a += 1 print a #=>6

  1. a=5 und a=6 sind unterschiedliche Objekte!

a = 5 b = a

  1. a und b sind die gleichen Objekte

a += 1 print a #=>6 print b #=>5

  1. durch die Methode +=(1) wurde nicht das Objekt umgeschrieben, sondern der Variable a wurde ein neues Objekt 6 zugewiesen.
  2. Deshalb wird b durch die +=(1) Methode nicht beeinflusst, da die Variable, nicht das Objekt umgeschrieben wurde.

Hieraus ergibt sich die Konsequenz, dass Integerobjekte nicht dupliziert/geklont werden können. Die Methoden Object#dup und Object#clone geben bei Integerobjekten eine Fehlermeldung aus.


Rechnen mit Integer

Obwohl die Integer-Klasse selbst keine der üblichen Rechenoperationen besitzt, haben ihre Subklassen so ziemlich die gleichen Methoden (auch wenn sie intern unterschiedlich behandelt werden). Im Folgenden also ein kurzer Überblick über die wichtigsten Rechenoperationen in Ruby:

Syntax Operation
a+b Addition aus a plus b.
a-b Subtraktion aus a minus b.
a*b Multiplikation aus a mal b.
a/b Division aus a durch b.
a%b Modulo, also teilen mit Rest.
a**b Potenz aus a hoch b.

Die Modulo-Operation dürfte jenen, die sich mit dem Maker auskennen ja bereits bekannt sein. Vollständigkeitshalber sei sie noch einmal kurz erklärt. Modulo ist Teilen mit Rest. Das Ergebnis aus 13%3 ist beispielsweise 1, da die 3 vier Mal in die 13 reinpasst, wonach nur noch ein Rest von 1 übrig bleibt.

In Ruby gibt es desweiteren kein Radizieren, also keine Wurzel. Dies liegt daran, dass eine Wurzel nur eine Potenz mit gebrochenen Exponenten ist. Die dritte Wurzel aus 2 ist gleich 2 hoch 1/3. Genauso kann man also für die Wurzel aus 36 schreiben: 36**(1/2).

Beim Dividieren und Radizieren sollte man sich immer vergegenwärtigen, dass man mit Integer-Werten, also ganzstelligen Zahlen arbeiten. Aus diesem Grund ist das Ergebnis aus 3/2 nicht etwa 1.5, sondern 1. Da ganzstellige Zahlen keine Dezimalstellen haben, rundet Ruby den Wert einfach ab.

Ebenfalls zu beachten ist, dass Ruby eure mathematischen Formeln genauso betrachtet wie ein pingeliger Mathelehrer - zumindest was die Klammersetzung angeht. Auch bei Ruby gilt: Punkt- vor Strichrechung! Als Beispiel: [ruby]a = 3+2*5 b = (3+2)*5 print(a) print(b) Man sollte also lieber zu viele Klammern, statt zu wenige setzen.

Wichtige Methoden der Integer-Klasse

next/succ

Diese Methode gibt den Integerwert um 1 erhöht zurück. Sie ist äquivalent zu der +(1) Methode. [ruby]print 5.succ #=> 6 print 8.next #=> 9 print 15 + 1 #16 x = 0 while x < 10 do

 print(x = x.next)

end

  1. => 1, 2, 3, 4, 5, 6, 7, 8, 9, 10

times

Ein Iterator, der einen Block so oft ausführt, wie dem Integerwert entspricht. Dem Block wird dabei eine Zahl von 0 beginnend bis zum Integerwert - 1 als Parameter übergeben. [ruby]5.times {|zaehler| print zaehler}

  1. => 0, 1, 2, 3, 4, 5

3.times {print ("Hallo!")}

  1. => "Hallo", "Hallo", "Hallo"

downto und upto

Ebenfalls Iteratoren. Er führt einen Block vom Integerwert bis zum Parameter aus. Bei downto muss allerdings der Parameter kleiner als das ausführende Integerobjekt sein, während bei upto das Integerobjekt kleiner als der Parameter sein muss. [ruby]5.downto(3) {|zaehler| print zaehler} #=> 5, 4, 3 1.upto(5) {|zaehler| print zaehler} #=> 1, 2, 3, 4, 5