Tut mir leid aber ich scheine wohl beim Versuch das zu verstehen an meine Grenzen zu stoßen.
Also, du sagst ich brauche eine neue Klasse "Methode" ist das korrekt?
Und diese ist nicht vorgefertigt oder ist sie es doch?
und über folgenden Befehl:
m = example_method.method(:to_s)
könnte ich die Methode 'example_method' in der lokalen Variable m speichern und über m.call abrufen?
Wobei 'm' dann eine Instanz dieser neuen Methoden Klasse wäre?
Falls dies falsch ist bitte ich um Verbesserung, es ist mir noch einiges unklar. Vielen Dank aber schoneinmal für diesen Beitrag.
Cornix
Nein. Die Klasse heißt Method und nicht Methode (also Englisch, und nicht Deutsch).
Eine Instanz von dieser Klasse bekommst du wenn du von einem beliebigen Objekt, die methode method aufrufst. Als Parameter erwartet diese Methode den Namen der Methode die du haben möchtest.
Hast du jetzt z.B. eine Instanz vom Typ Numeric kannst du dir von dieser Instanz aus quasi eine Referenz auf jede ihrer Methoden holen.
Okay, nun verstehe ich soweit, vielen Dank.
Allerdings muss ich sagen, dass mein erster Versuch damit kläglich gescheitert ist.
Hier ein simpler Test-Code:
Die Nachricht "hi" wird korrekt angezeigt wenn ich diesen Script starte, allerdings folgt direkt darauf folgende Fehlermeldung:
Zitat
Script '' line 6: TypeError occured.
nil is not a symbol
...
Welche ich nicht recht zu verstehen in der Lage bin. Besonders nicht in dem Zusammenhang mit meinem Script.
Die method Methode erwartet entweder ein Symbol oder einen String mit dem namen der Methode die du haben willst.
Also entweder xample_method (der : ist erforderlich) oder "example_method".
Außerdem kriegst du beim Aufruf der method Methode für eine Klasse keine Instanz von Method sondern von UnboundMethod. Diese musst du erst an einen Empfänger binden bevor du sie verwenden kannst.
Tut mir leid, ich scheine wohl einfach kein glückliches Händchen dafür zu haben. Meine Klasse sieht nun wie folgt aus:
Soweit nichts sonderlich kompliziertes (ich hoffe ich darf die Methode @m an die eigene Klasse binden) allerdings erhalte ich nun bei jedem Versuch folgenden Fehler:
Zitat
Script '' line 4: NameError occured
undefinde Method 'example_method' for class 'Class'
...
Diese Fehlernachricht ergibt soweit Sinn, allerdings nicht im Kontext.
Einmal wieder bitte ich um Aufklärung, vielen Dank für die ganze Mühe und Zeit.
Wenn du schon im vorhinein den Empfänger kennst (in deinem Fall also self) wäre es sinnvoller, die Methode direkt vom Emfänger abzufragen, also self.method(:example_method). Dann kannst du dir den bind aufruf sparen.
Der Code wie du ihn geschrieben hast, funktioniert wenn du Example_Class.instance_method aufrufst. Hab ich in meinem letzten Post übersehen.