Schreiben wir eine Funktion zum Berechnen von Fakultäten. Die mathematische Definition einer Fakultät von * n * lautet wie folgt:
n! = 1 (когда n==0) = n * (n-1)! (иначе)
In Ruby kann es so geschrieben werden:
def fact(n) if n == 0 1 else n * fact(n-1) end end
Möglicherweise stellen Sie fest, dass die Anweisung * end * hier wiederholt wird. Aus diesem Grund wird Ruby als Alogolo-like bezeichnet. (Eigentlich ähnelt die Ruby-Syntax eher der Eiffel-Syntax.) Möglicherweise stellen Sie auch fest, dass die Anweisung * return * fehlt. Es ist nicht erforderlich, da Ruby den letzten Wert zurückgibt, mit dem es die Funktion verlassen hat. Die Verwendung des Operators * return * ist möglich, aber nicht erforderlich.
Probieren wir die Herleitung unserer Fakultät aus. Fügen wir eine Codezeile hinzu, die uns ein funktionierendes Programm mit Ausgabe liefert:
# Программа находит факториал от числа # Сохраните этот файл как fact.rb def fact(n) if n == 0 1 else n * fact(n-1) end end print fact(ARGV[0].to_i), "\n"
Es gibt ein Array * ARGV, *, das die Befehlsargumente enthält, und die Umwandlung von String-Zeichen in eine Integer-Variable.
% ruby fact.rb 1 1 % ruby fact.rb 5 120
Lassen Sie uns das Programm mit Argument 40 ausführen. Dies könnte Ihren Taschenrechner überlaufen ...
% ruby fact.rb 40 815915283247897734345611269596115894272000000000
Aber es funktioniert. Tatsächlich kann Ruby mit jeder Ganzzahl arbeiten, die der Speicher Ihres Computers verarbeiten kann. Die Zahl ist also 400! Wir können auch die Fakultät dafür berechnen:
% ruby fact.rb 400 64034522846623895262347970319503005850702583026002959458684 44594280239716918683143627847864746326467629435057503585681 08482981628835174352289619886468029979373416541508381624264 61942352307046244325015114448670890662773914918117331955996 44070954967134529047702032243491121079759328079510154537266 72516278778900093497637657103263503315339653498683868313393 52024373788157786791506311858702618270169819740062983025308 59129834616227230455833952075961150530223608681043329725519 48526744322324386699484224042325998055516106359423769613992 31917134063858996537970147827206606320217379472010321356624 61380907794230459736069956759583609615871512991382228657857 95493616176544804532220078258184008484364155912294542753848 03558374518022675900061399560145595206127211192918105032491 00800000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000
Wir können die Richtigkeit dieser Schlussfolgerung nicht schnell genug überprüfen, aber sie muss richtig sein.
Eingabe- und Rechenzyklus
Wenn Sie Ruby ohne Argumente aufrufen, liest es Befehle aus der Standardeingabe und führt sie am Ende der Eingabe aus:
% ruby print "hello world\n" print "good-bye world\n" ^D hello world good-bye world
Ruby wird auch mit einem Programm namens eval.rb geliefert, mit dem Sie Ruby-Code über die Tastatur in einer interaktiven Schleife eingeben können, die Ihnen das Ergebnis im Verlauf anzeigt. Dies wird in diesem Tutorial verwendet.
Wenn Sie ein ANSI-kompatibles Terminal haben (dies ist korrekt, wenn Sie Programme unter UNIX ausführen; unter DOS müssen Sie ANSI.SYS oder ANSI.COM installieren (zum Zeitpunkt der Übersetzung mussten diese Dienstprogramme nicht installiert werden)) . Suchen Sie alternativ nach dem Unterverzeichnis * Beispiel * in der Ruby-Distribution für eine Nicht-ANSI-Version, die in jedem Terminal funktioniert. Unten ist eine kurze * eval.rb-Sitzung: *
% ruby eval.rb ruby> print "Hello, world.\n" Hello, world. nil ruby> exit
- hello world * wird von * print output bereitgestellt * Die nächste Zeile, in diesem Fall * nil *, meldet den zuletzt empfangenen Wert; Ruby unterscheidet nicht zwischen Operatoren und Ausdrücken, daher bedeutet das Ergebnis eines Codestücks im Grunde dasselbe wie das Ergebnis einer Funktion. * nil * bedeutet hier, dass * print * keinen Wert zurückgibt. Beachten Sie, dass wir die Interpreter-Schleife beenden können, indem Sie ihr exit mitteilen, obwohl * Strg + D * auch funktioniert.
In diesem Tutorial markiert * "ruby>" * die Eingabe für unser nützliches kleines Programm * eval.rb. *