Evgenii Legotckoi
Evgenii Legotckoi23. Juni 2016 02:01

Benutzerhandbuch #07 - Ruby - Zurück zu den einfachen Beispielen

Lassen Sie uns nun den Code einiger unserer vorherigen Beispielprogramme aufschlüsseln.

Das folgende Beispiel erschien zum ersten Mal in diesem Kapitel .

def fact(n)
  if n == 0
    1
  else
    n * fact(n-1)
  end
end
print fact(ARGV[0].to_i), "\n"

Da dies die erste Erklärung ist, betrachten wir jede Zeile separat.


Fakultät

def fact(n)

In der ersten Zeile deklariert die def -Anweisung eine Funktion (oder besser gesagt eine Methode , wir werden in einem anderen Kapitel über Methoden sprechen). Hier spezifiziert es eine fact, Funktion, die ein Argument akzeptiert, beschrieben als n .

if n == 0

Überprüfen Sie als Nächstes den Zustand. Wenn die Bedingung wahr ist, wird der Code nach der Bedingung ausgeführt, andernfalls wird der Code nach else ausgeführt.

1

Rückgabewert, wenn die Bedingung erfüllt wurde.

else

Wenn die Bedingung nicht erfüllt ist, wird dieser Codeabschnitt vor dem Operator end. ausgeführt.

n * fact(n-1)

Wenn die Bedingung nicht erfüllt ist, dann ist das Ergebnis n mal die Fakultätsfunktion fakt(n-1).

end

Die erste end, -Anweisung, die die if. -Anweisung schließt

end

Die zweite Anweisung end, schließt den Hauptteil der Funktion, also die def -Anweisung.

print fact(ARGV[0].to_i), "\n"

Wir rufen die Fakultätsfunktion fact() mit dem an die Befehlszeile übergebenen Wert auf und geben das Ergebnis aus.

ARGV ist ein Array, das Befehlszeilenargumente enthält. ARGV -Elemente sind Strings, also müssen wir sie mit der *to_i-Methode in einen Integer-Typ umwandeln. Ruby konvertiert Strings nicht automatisch in Integer-Typen, wie es Perl tut.

Zeichenfolgen

Das folgende Beispiel wurde im Kapitel über Strings gezeigt.

words = ['foobar', 'baz', 'quux']
secret = words[rand(3)]

print "guess? "
while guess = STDIN.gets
  guess.chop!
  if guess == secret
    print "you win\n"
    break
  else
    print "you lose.\n"
  end
  print "guess? "
end
print "the word is ", secret, ".\n"

Dieses Programm hat eine neue Struktur mit einer Bedingung, es ist eine while-Schleife. Der Code zwischen while und seiner entsprechenden end -Anweisung wird ausgeführt, solange die Schleifenbedingung wahr ist.

rand(3) in Zeile 2 gibt eine Zufallszahl zwischen 0 und 2 zurück. Diese Zufallszahl wird verwendet, um eines der drei Wörter im Array words zu extrahieren.

Zeile 5 liest eine Zeile aus der Standardeingabe STDIN.gets. Wenn EOF (end of file) empfangen wird, gibt gets nil zurück. Daher wird der Code wiederholt, bis er die Terminierungskombination D* (oder * Z unter DOS) erhält.

guess.chop! in Zeile 6 entfernt die letzten Zeichen aus der guess -Variablen. In diesem Fall bedeutet es immer eine neue Zeile.

Zeile 15 zeigt das geheime Wort an. Wir haben eine print -Anweisung mit drei Argumenten (die nacheinander ausgegeben werden), aber genauso effektiv, als ob Sie mit einem einzigen Argument arbeiten würden, indem Sie geheim als #{geheim} schreiben, um das deutlich zu machen Dies ist eine Variable und kein auszugebender String:

print "the word is #{secret}.\n"

Reguläre Ausdrücke

Und schließlich schauen wir uns das Programm aus dem Kapitel über reguläre Ausdrücke an.

st = "\033[7m"
en = "\033[m"

while TRUE
  print "str> "
  STDOUT.flush
  str = gets
  break if not str
  str.chop!
  print "pat> "
  STDOUT.flush
  re = gets
  break if not re
  re.chop!
  str.gsub! re, "#{st}\\&#{en}"
  print str, "\n"
end
print "\n"

In Zeile 4 wird die Schleifenbedingung while auf true gesetzt. So entsteht eine Endlosschleife. Die Zeilen 8 und 13 fügten jedoch eine break -Anweisung hinzu, um die Schleife zu verlassen. Diese beiden break -Anweisungen sind auch ein Beispiel für if -Änderungen. Die if -Modifikation führt die Anweisung auf der linken Seite nur aus, wenn die Bedingung wahr ist.

Es gibt ein paar Worte zur chop! -Methode (siehe Zeilen 9 und 14). In Ruby fügen wir '!' oder '?' am Ende von Methodennamen. Ein Ausrufezeichen (!, manchmal „bang!“ ausgesprochen) weist darauf hin, dass die Methode potenziell destruktiv ist und den berührten Wert ändern kann. hacken! wirkt sich direkt auf die Zeichenfolge aus, aber nur hacken ohne das Ausrufezeichen funktioniert wie eine Kopie. Das ist der Unterschied.

ruby> s1 = "forth"
  "forth"
ruby> s1.chop!       # This changes s1.
  "fort"
ruby> s2 = s1.chop   # This puts a changed copy in s2,
  "for"
ruby> s1             # ... without disturbing s1.
  "fort"

Sie werden später auf eine Methode stoßen, die mit einem Fragezeichen endet (?, manchmal ausgesprochen "huh?"); was anzeigt, dass die Methode ein Prädikat ist, das heißt, sie gibt Werte zwischen true und false zurück.

Zeile 15 verdient besondere Aufmerksamkeit. Die erste ist die gsub!, Methode, die eine destruktive Methode ist. Es ändert die Variable str, , indem es alle Zeichen ersetzt, die dem Muster re entsprechen ( sub bedeutet Ersetzen, und g davor bedeutet globale Wirkung, d. h. Ersetzen aller übereinstimmenden Teile in der Zeichenfolge, nicht nur des ersten gefundenen Teil). Also, alles läuft gut, aber was ersetzen wir in diesem Text? st und en sind in den Zeilen 1 und 2 als ANSI-Sequenzen definiert, die den Text normal und invertiert machen. In Zeile 15 werden sie in #{} eingeschlossen, um sicherzustellen, dass sie tatsächlich so interpretiert werden, wie sie sollten, und nicht als Ausgabestrings. Dazwischen sehen wir die Sequenz "\&" . Es ist ein kleiner Trick. Da die Ersetzung in doppelten Anführungszeichen erfolgt, wird ein Backslash-Paar als "\&". interpretiert. Dadurch wird eine neue Zeile ähnlich der alten ausgegeben, außer dass die Teile, die dem Muster entsprechen, hervorgehoben werden.

Рекомендуємо хостинг TIMEWEB
Рекомендуємо хостинг TIMEWEB
Stabiles Hosting des sozialen Netzwerks EVILEG. Wir empfehlen VDS-Hosting für Django-Projekte.

Magst du es? In sozialen Netzwerken teilen!

Kommentare

Nur autorisierte Benutzer können Kommentare posten.
Bitte Anmelden oder Registrieren
Letzte Kommentare
ИМ
Игорь Максимов5. Oktober 2024 07:51
Django – Lektion 064. So schreiben Sie eine Python-Markdown-Erweiterung Приветствую Евгений! У меня вопрос. Можно ли вставлять свои классы в разметку редактора markdown? Допустим имея стандартную разметку: <ul> <li></li> <li></l…
d
dblas55. Juli 2024 11:02
QML - Lektion 016. SQLite-Datenbank und das Arbeiten damit in QML Qt Здравствуйте, возникает такая проблема (я новичок): ApplicationWindow неизвестный элемент. (М300) для TextField и Button аналогично. Могу предположить, что из-за более новой верси…
k
kmssr8. Februar 2024 18:43
Qt Linux - Lektion 001. Autorun Qt-Anwendung unter Linux как сделать автозапуск для флэтпака, который не даёт создавать файлы в ~/.config - вот это вопрос ))
Qt WinAPI - Lektion 007. Arbeiten mit ICMP-Ping in Qt Без строки #include <QRegularExpressionValidator> в заголовочном файле не работает валидатор.
EVA
EVA25. Dezember 2023 10:30
Boost - statisches Verknüpfen im CMake-Projekt unter Windows Ошибка LNK1104 часто возникает, когда компоновщик не может найти или открыть файл библиотеки. В вашем случае, это файл libboost_locale-vc142-mt-gd-x64-1_74.lib из библиотеки Boost для C+…
Jetzt im Forum diskutieren
J
JacobFib17. Oktober 2024 03:27
добавить qlineseries в функции Пользователь может получить любые разъяснения по интересующим вопросам, касающимся обработки его персональных данных, обратившись к Оператору с помощью электронной почты https://topdecorpro.ru…
JW
Jhon Wick1. Oktober 2024 15:52
Indian Food Restaurant In Columbus OH| Layla’s Kitchen Indian Restaurant If you're looking for a truly authentic https://www.laylaskitchenrestaurantohio.com/ , Layla’s Kitchen Indian Restaurant is your go-to destination. Located at 6152 Cleveland Ave, Colu…
КГ
Кирилл Гусарев27. September 2024 09:09
Не запускается программа на Qt: точка входа в процедуру не найдена в библиотеке DLL Написал программу на C++ Qt в Qt Creator, сбилдил Release с помощью MinGW 64-bit, бинарнику напихал dll-ки с помощью windeployqt.exe. При попытке запуска моей сбилженной программы выдаёт три оши…
F
Fynjy22. Juli 2024 04:15
при создании qml проекта Kits есть но недоступны для выбора Поставил Qt Creator 11.0.2. Qt 6.4.3 При создании проекта Qml не могу выбрать Kits, они все недоступны, хотя настроены и при создании обычного Qt Widget приложения их можно выбрать. В чем может …

Folgen Sie uns in sozialen Netzwerken