Zeichenkettenfunktionen
Texte gibt es überall auf Emmas Hof: Namen von Pflanzen, Schilder am Marktstand, Notizen von Opa Josef. In der Programmierung heißt ein Text Zeichenkette (englisch string), weil er aus Zeichen besteht, die wie an einer Schnur hintereinanderstehen. In dieser Lektion lernst du, mit Zeichenketten zu arbeiten: sie zu verändern, in Teile zu zerlegen, zu durchsuchen und ordentlich zusammenzusetzen.
Lua legt seine Funktionen für Zeichenketten in einer Tabelle namens string ab. string.upper gibt einen Text in Großbuchstaben zurück, string.lower in Kleinbuchstaben, und string.len liefert seine Länge, dieselbe Zahl wie #:
local ware = "Zucchini"
print(string.upper(ware))
print(string.lower(ware))
print(string.len(ware), #ware)Das gibt Folgendes aus:
ZUCCHINI
zucchini
8 8Es gibt eine kürzere Schreibweise für dasselbe: ware:upper(). Der Doppelpunkt bedeutet: „Nimm die Funktion upper aus string und gib ihr ware als erstes Argument“. ware:upper() ist also eine Kurzform von string.upper(ware). Eine Funktion, die mit einem Doppelpunkt aufgerufen wird, heißt Methode. Die meisten Lua-Programmierer rufen Zeichenkettenfunktionen so auf, und das tut auch dieser Kurs. (Wie der Doppelpunkt genau funktioniert und wie du Methoden für eigene Tabellen schreibst, lernst du in der nächsten Lektion.)
local ware = "Zucchini"
print(ware:upper(), ware:lower(), ware:len())Das gibt Folgendes aus:
ZUCCHINI zucchini 8Eine Methode funktioniert auch bei einem Text, den du direkt in den Code schreibst, aber der Text muss in Klammern stehen: ("zucchini"):upper(). Ohne Klammern ist es ein Syntaxfehler:
print("zucchini":upper())main.lua:1: ')' expected near ':'Zwei weitere typische Fehler:
- Ein Punkt statt des Doppelpunkts.
ware.upper()ruftupperauf, ohne ihr den Text zu geben, und das Programm endet mitbad argument #1 to 'upper' (string expected, got no value): Das erste Argument, der Text, fehlt. Der Doppelpunkt hätte es übergeben. - Vergessene Klammern.
print(ware:upper)ist der Syntaxfehlerfunction arguments expected near ')'.
Zeichenkettenfunktionen verändern den Text, den du ihnen gibst, niemals. Tatsächlich kann eine Zeichenkette in Lua gar nicht verändert werden: Die Funktionen geben dir einen neuen Text zurück. Eine Zeile mit nur ware:upper() erzeugt den neuen Text und wirft ihn gleich weg. Um ihn zu behalten, speichere ihn:
local ware = "zucchini"
ware:upper()
print(ware)
ware = ware:upper()
print(ware)Das gibt Folgendes aus:
zucchini
ZUCCHINIZwei weitere Funktionen: rep wiederholt einen Text mehrmals und setzt, wenn du ein zweites Argument angibst, dieses zwischen die Kopien. reverse dreht einen Text um:
local eier = 7
print("Eier: " .. ("#"):rep(eier))
print(("ha"):rep(3, " "))
print(("lager"):reverse())Das gibt Folgendes aus:
Eier: #######
ha ha ha
regalEine Warnung vorab: Buchstaben mit Umlaut, wie ä oder ü, brauchen besondere Aufmerksamkeit. ("Käse"):upper() ergibt KäSE, und #"Käse" ist 5, nicht 4. Warum das so ist und was du dagegen tun kannst, lernst du später in dieser Lektion. Bis dahin zählen und verändern die Übungen nur Wörter ohne Umlaute.
So schreibst du es:
Anweisungen
- 1
Emma möchte, dass man das Schild schon von weitem lesen kann. Ändere das erste
printso, dass es das Schild in Großbuchstaben ausgibt, mit der Methodeupper:ERDBEEREN KOSTET 4 TALER - 2
Setze das Schild in einen Rahmen: Gib über dem Schild eine Zeile aus
=-Zeichen aus und eine weitere darunter, genau so lang wie das Schild. Erzeuge die Zeile mitrepund der Länge des Schilds, tippe die Zeichen nicht ab. Die Ausgabe beginnt dann so:======================== ERDBEEREN KOSTET 4 TALER ======================== - 3
Opa Josef liebt Rätsel: Er hat das Schild für seine Eier rückwärts geschrieben. Gib sein Rätsel unter seiner Zeile umgedreht mit
reverseaus:Frische Eier.