Was macht der Befehl "self" genau?
Übersicht

mpreuBetreff: Was macht der Befehl "self" genau? |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Wozu ist der genau da?
Zugriff innerhalb funktionen eines types auf variablen soweit ich weiß. Wie kann man das in bb umschreiben? ist self eigentlich nur eine vereinfachung um zeit zu sparen? wie sähe dies in bb aus? |
||
![]() |
Tennisball |
![]() Antworten mit Zitat ![]() |
---|---|---|
Hi,
Zitat: Zugriff innerhalb funktionen eines types auf variablen soweit ich weiß.
Ich würde sagen: Zugriff innerhalb Methoden eines Objektes (eines Types) auf dessen individuelle Eigenschaften. In BB gibt es so etwas nicht. BB-Types haben keine Methoden und somit hat ein Objekt auch nicht mal eine Gelegenheit auf seine eigenen Eigenschaften zu referenzieren. Zitat: Ist self eigentlich nur eine vereinfachung um zeit zu sparen?
Nein. Man kann es dazuschreiben, wenn man möchte, je nach Geschmack. Hat man z.B. jedoch (in BMax) eine Eigenschaft und einen Parameter einer Methode, die beide gleich heißen, so ist (innerhalb der Methode) das Self nötig, um auf die Eigenschaft statt den Parameter zu verweisen. Gruß, Tennisball Edit: Ein Workaround für BB sähe dann wohl ca. so aus (Pseudocode): BlitzBasic: [AUSKLAPPEN] Type TDing Das ist natürlich unschön, aber in BB bleibt einem nicht wirklich was anderes übrig soweit ich weiß. |
||
mpreu |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Methoden meinte ich ja.
Da ich mich auf BB bezog nannte ich natürlich Funktion. Danke für die schnelle Antwort. |
||
![]() |
DAK |
![]() Antworten mit Zitat ![]() |
---|---|---|
Methoden und Funktionen sind etwas deutlich anderes und müssen unterschieden werden.
Eine Methode hat ein Objekt, dem sie zugeordnet ist. Eine Funktion nicht. Eine Funktion hat also kein Self. Echtwelt-Beispiel: Hund.füttern() ist eine Methode. Füttern gehört fix zu einem Objekt Hund. Du kannst nicht einen Hund füttern, wenn kein Hund da ist. Self ist dann der Hund, über den aufgerufen wird. Hund muss dann immer ein konkretes Objekt sein. Man kann also nicht den Typ Hund füttern, ohne einen konkreten Hund da zu haben. Aufrufen würde man diese Methode dann über das konkrete Objekt, also z.B.: Hasso.füttern(). Hund.füttern() würde nicht funktionieren. Arbeitsstelle.suchen() ist eine Funktion. Diese Funktion lässt sich aufrufen, ohne dass es dazu eine konkrete Arbeitsstelle gibt. Dabei gibt es kein Self, da es keine bestimme Arbeisstelle gibt, auf die das dann aufgerufen wird. Aufgerufen wird diese Funktion dann über den Typnamen: Arbeitsstelle.suchen(). |
||
Gewinner der 6. und der 68. BlitzCodeCompo |
mpreu |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Ich weiß, ich weiß...nur Funktionen sind mir halt noch so geläufig....
Macht der Gewohnheit eben...hihi |
||
PhillipK |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Mein rat:
Schmeiß das wissen über BB Types über board und lern die blitzmax Types einfach neu *g* Keine vergleiche, kein nostalgisches schwelgen. Um dir self noch ein wenig zu verdeutlichen, mal ein kleines beispiel. Du hast in deinem Programm 2 Types, Type Mann und Type Bier. Man(n) hat eine trunkenheitsanzeige und Bier einen füllstand. BlitzMax: [AUSKLAPPEN] Type Mann Achtung, schwachsinnscode. Aber zur erklärung: 3 Männer gehen in die Bar. Jeder hat sein eigenes geld, sein eigenes getränk und seine eigene trunkenheit. Obwohl sie alle vom Type Mann sind, sind sie doch unterschiedlich. Ich habe überall, obwohl nicht grade notwendig, self verwendet. Das ist übrigends grade zu anfang ein sehr guter stil zum lernen. Mir ist es zb schon oft passiert, das ich eine Methode ala "SetPositionX(x:int)" hatte, und dazu ein field x im objekt selber. Was habe ich also getan? genau. x = x. Dh ich habe die lokale variable sich selber zugewiesen und ewig den fehler gesucht, warum mein objekt nicht an position x gesetzt wird. Schreibt man Self.X wird allerdings direkt im objektscope das feld angesprochen, nicht die lokale. BlitzMax: [AUSKLAPPEN] Method Pseudo:Int(x:Int) |
||
![]() |
XeresModerator |
![]() Antworten mit Zitat ![]() |
---|---|---|
Nichts gegen eure Beispiele, aber es geht auch ganz kurz:
BlitzMax: [AUSKLAPPEN] Rem Innerhalb der Methode ist der Parameter die neuste Variable und wird normal angesprochen. Wäre sie nicht vorhanden, könnte man so auch auf das Field zugreifen, das hier Eindeutig mit Self referenziert wird. Und zu guter Letzt kann man mit einem einfachen Punkt zurück auf den Globalen Namensraum verweisen. Ich würde wenn möglich nicht auf Self verzichten - aber das kommt auf dein Benennungsschema an. |
||
Win10 Prof.(x64)/Ubuntu 16.04|CPU 4x3Ghz (Intel i5-4590S)|RAM 8 GB|GeForce GTX 960
Wie man Fragen richtig stellt || "Es geht nicht" || Video-Tutorial: Sinus & Cosinus THERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld) |
PhillipK |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Hoi xeres,
danke für das beispiel. Ich hab schon öfters gerätselt, wie ich in einem solchen falle an Globale rankomme. o.O |
||
![]() |
BladeRunnerModerator |
![]() Antworten mit Zitat ![]() |
---|---|---|
anstelle nurden Punkt geht es auch mit super![]() |
||
Zu Diensten, Bürger.
Intel T2300, 2.5GB DDR 533, Mobility Radeon X1600 Win XP Home SP3 Intel T8400, 4GB DDR3, Nvidia GF9700M GTS Win 7/64 B3D BMax MaxGUI Stolzer Gewinner des BAC#48, #52 & #92 |
![]() |
DAK |
![]() Antworten mit Zitat ![]() |
---|---|---|
@BladeRunner:
Nö, tut es nicht. Super erlaubt es, geerbte Methoden aufzurufen, die durch lokale Methoden überschrieben werden. Siehe folgendes Beispiel: BlitzMax: [AUSKLAPPEN] SuperStrict Würde man hier Super.test verwenden wollen, dann sagt einem der Compiler, dass das nicht geht. |
||
Gewinner der 6. und der 68. BlitzCodeCompo |
![]() |
BladeRunnerModerator |
![]() Antworten mit Zitat ![]() |
---|---|---|
Oops, man verzeihe. da war der Blade irr. Ich sollte nicht aus dem Dienst heraus solche Dinge klären. Da ist die Birne zu Brei. | ||
Zu Diensten, Bürger.
Intel T2300, 2.5GB DDR 533, Mobility Radeon X1600 Win XP Home SP3 Intel T8400, 4GB DDR3, Nvidia GF9700M GTS Win 7/64 B3D BMax MaxGUI Stolzer Gewinner des BAC#48, #52 & #92 |
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group