Dabei handelt es sich nicht um eine Fehlermeldung sondern um das Ergebniss deines print-Aufrufes. Ruby zeigt dir hier die interne ID/Speicheradresse (weiß nicht mehr genau was) deines Objektes, sowie die entsprechende Klasse (Bitmap).Zitat
print benutzt, soweit ich mich richtig entsinne die methode .to_s um aus einem Objekt einen anzeigbaren String zu machen. Die meisten gängigen Klassen wie Integer oder Float überschreiben die to_s-Methode, die jedes Objekt von der Klasse "Object" erbt, mit etwas sinnigem. Das Ergebnis da oben dürfte die Anzeige von to_s sein, wie sie in Object definiert ist.
Anmerkung:
Ich persönlich nutze zum Debuggen nicht print sondern "p". Das ist nicht nur kürzer zu schreiben, p benutzt auch eine andere Methode als print um einen anzeigbaren String zu erhalten, namentlich "inspect", sofern ich mich richtig erinnere. Ist deutlich besser zu lesen (Vergleiche einfach mal print([1,2,3]) und p([1,2,3]))
Ich kann nur spekulieren warum die Meldung zweimal kommt, vermutlich weil deine Methode von irgendwo zweimal aufgerufen wird.
Du speicherst dein Sprite in einer lokalen Variable (keinerlei Sonderzeichen am Anfang des Namens). Der Gültigkeitsbereich einer lokalen Variable, die innerhalb einer Methode auftaucht ist nur der entsprechende Methodenaufruf selber. Sobald die Methode durchlaufen wurde, verschwindet deine Variable wieder aus dem Speicher. Allerdings sind alle Variablen, die auf komplexere Objekte verweisen Pointer, und somit verschwindet nur die Variable, nicht aber das Objekt (hier dein Sprite).Zitat
In Ruby gibt es einen sog. Garbage Collector der sich merkt wieviele gültige, Verweise es auf ein im Speicher liegendes Objekt gibt. Du erstellst ein komplett neues Sprite mit einem Verweis (deine lokale Variable), sobald die Methode durchlaufen wurde verschwindet selbige wieder, wodurch auf dein Objekt kein gültiger Verweis mehr existiert. Hier tritt nun der GC in Aktion und "räumt" hinter dem Programmierer auf und löscht das Objekt aus dem Speicher. Aufgrund der Art wie der GC intern funktioniert (markieren und löschen) gibt es immer eine gewisse Zeitspanne zwischen dem Verschwinden des letzten Verweis und dem tatsächlichen Löschen des Objektes.
Wie du das Problem löst? Eine einfache, aber mMn sehr unschöne Version ist die Verwendung einer globalen Variable. Globale Variablen beginnen mit dem Symbol $ vor dem Variablennamen. Viel schöner aber auch etwas aufwendiger ist es, wenn du deine Daten in Module und Klassen kapselst.