Menu
Coddy logo textTech

Strings formatieren

Teil des Abschnitts Object Oriented Programming der Lua-Journey von Coddy — Lektion 16 von 70.

Wenn du ein Objekt direkt ausgibst, zeigt Lua etwas wenig Hilfreiches wie table: 0x55a... – nur eine Speicheradresse. Die Metamethode __tostring lässt dich genau definieren, welche Zeichenfolge dein Objekt repräsentiert, wenn es ausgegeben oder in Text umgewandelt wird.

Im Klassen-Pattern fügen Sie __tostring als Funktion in Ihrer Klassentabelle hinzu. Da die Klasse selbst als Metatabelle für Instanzen dient, findet und verwendet Lua diese Funktion automatisch:

local Player = {}
Player.__index = Player

function Player:new(name, level)
    local instance = {}
    setmetatable(instance, self)
    instance.name = name
    instance.level = level
    return instance
end

function Player:__tostring()
    return "Player: " .. self.name .. " (Level " .. self.level .. ")"
end

Wenn Sie nun eine Player-Instanz ausgeben, ruft Lua automatisch Ihre __tostring-Methode auf:

local hero = Player:new("Luna", 5)
print(hero)  -- Ausgabe: Player: Luna (Level 5)

Beachten Sie, dass __tostring die Doppelpunkt-Syntax verwendet und self empfängt, was Ihnen Zugriff auf alle Instanzdaten gibt. Die Funktion muss einen String zurückgeben – Sie können ihn so formatieren, wie es für Ihr Objekt sinnvoll ist, indem Sie beliebige Attribute zu einer lesbaren Darstellung kombinieren.

challenge icon

Aufgabe

Einfach

Lass uns eine Book-Klasse erstellen, die weiß, wie sie sich selbst vorstellt! Wenn du ein Buch direkt ausgibst, zeigt Lua dank der Metamethode __tostring eine schön formatierte Zeichenfolge anstelle einer kryptischen Speicheradresse an.

Du wirst deinen Code auf zwei Dateien aufteilen:

  • Book.lua: Definiere deine Book-Klasse mit dem Standard-Prototyp-Muster. Jedes Buch sollte einen title und einen author speichern. Implementiere einen :new(title, author)-Konstruktor und die Metamethode __tostring, damit das Drucken eines Buches seine Informationen in einem lesbaren Format anzeigt.
  • main.lua: Binde dein Book-Modul ein, erstelle Buch-Instanzen und gib sie direkt aus, um deine benutzerdefinierte String-Formatierung in Aktion zu sehen.

Deine __tostring-Methode sollte einen String in genau diesem Format zurückgeben:

"[title]" by [author]

Beachte, dass der Titel innerhalb des Ausgabe-Strings in doppelte Anführungszeichen gesetzt ist.

Du erhältst vier Eingaben:

  1. Titel des ersten Buches
  2. Autor des ersten Buches
  3. Titel des zweiten Buches
  4. Autor des zweiten Buches

Erstelle in deiner Hauptdatei zwei Bücher mit den bereitgestellten Eingaben und gib jedes Buch direkt aus (nicht durch Aufrufen einer Methode – einfach print(book)). Jedes Buch sollte in einer eigenen Zeile erscheinen.

Wenn die Eingaben beispielsweise The Hobbit, J.R.R. Tolkien, 1984 und George Orwell sind, sollte die Ausgabe wie folgt aussehen:

"The Hobbit" by J.R.R. Tolkien
"1984" by George Orwell

Denke daran, dass __tostring einen String zurückgeben muss. Da deine Klassentabelle als Metatabelle für Instanzen dient, wird Lua deine __tostring-Funktion automatisch finden und verwenden, wenn du ein Buch ausgibst.

Spickzettel

Die Metamethode __tostring definiert, wie ein Objekt als String dargestellt wird, wenn es ausgegeben oder in Text umgewandelt wird.

Ohne __tostring zeigt das Ausgeben eines Objekts nur dessen Speicheradresse an:

print(someObject)  -- Output: table: 0x55a...

Fügen Sie __tostring als Methode in Ihrer Klasse hinzu, um die String-Repräsentation anzupassen:

local Player = {}
Player.__index = Player

function Player:new(name, level)
    local instance = {}
    setmetatable(instance, self)
    instance.name = name
    instance.level = level
    return instance
end

function Player:__tostring()
    return "Player: " .. self.name .. " (Level " .. self.level .. ")"
end

Wenn Sie eine Instanz ausgeben, ruft Lua automatisch __tostring auf:

local hero = Player:new("Luna", 5)
print(hero)  -- Output: Player: Luna (Level 5)

Wichtige Punkte:

  • Verwenden Sie die Doppelpunkt-Syntax (:), damit die Methode self erhält
  • Muss einen String zurückgeben
  • Greifen Sie über self auf Instanzdaten zu
  • Da die Klassentabelle als Metatabelle dient, findet Lua __tostring automatisch

Probier es selbst

-- Das Book-Modul einbinden
local Book = require('Book')

-- Eingaben lesen
local title1 = io.read()
local author1 = io.read()
local title2 = io.read()
local author2 = io.read()

-- TODO: Zwei Buch-Instanzen mit Book:new() erstellen


-- TODO: Jedes Buch direkt ausgeben (einfach print(book) verwenden)

quiz iconTeste dich selbst

Diese Lektion enthält ein kurzes Quiz. Starte die Lektion, um es zu beantworten und deinen Fortschritt zu speichern.

Alle Lektionen in Object Oriented Programming