> On 15.07.2011 23:07, Simon Krahnke wrote: >> * Joachim Hofmann<joachim.hofm...@toptarif.de> (12:58) schrieb:
>>> was bedeutet genau die Symbolik< und :: in einem Ausdruck wie:
>>> class CreateVehicles<< ActiveRecord::Migration
>>> dass es "Vererbung" bedeutet, ist mir mehr oder weniger klar,
>> Das "<<" in der Klassendefinition bedeutet, das der Name der Superklasse folgt.
> Nur, dass es nicht "<<" sondern "<" ist.
> $ ruby19 -ce 'class X << String;end' > -e:1: syntax error, unexpected tLSHFT, expecting '<' or ';' or '\n' > class X << String;end
Tja, "<<" machte aber auch irgendwas. Lua, wieder C, nun D, da soll ich noch Ruby können? Außerdem, Vererbung, bäh! Obwohl, hab ich in meinem Raytracer glaube ich benutzt. Warum auch immer, braucht man wegen Ducktyping eh nicht.
>>> nur was ist der Unterschied von< und :: ?
>> "::" hat damit nichts zu tun. In dem Modul "Activerecord" findet sich eine >> Konstante "Migration", die eine Klasse als Wert hat.
> Ich würde es "Scope-" oder "Namespace Operator" nennen.
Mir war sowieso nie klar, wo der Unterschied zu "." liegt.
Simon Krahnke wrote: > * Robert Klemme <shortcut...@googlemail.com> (14:41) schrieb: >> On 15.07.2011 23:07, Simon Krahnke wrote: >>> * Joachim Hofmann<joachim.hofm...@toptarif.de> (12:58) schrieb: >>>> nur was ist der Unterschied von< und :: ? >>> "::" hat damit nichts zu tun. In dem Modul "Activerecord" findet sich eine >>> Konstante "Migration", die eine Klasse als Wert hat. >> Ich würde es "Scope-" oder "Namespace Operator" nennen. > Mir war sowieso nie klar, wo der Unterschied zu "." liegt.
module M def self.Test; 'Method' end Test = 'Constant' end
Ob das ein *sinnvoller* Unterschied ist, das ist eine ganz andere Frage ;-)
Meiner Meinung nach haben Konstanten und Variablen in einer objekt-orientierten Sprache nichts zu suchen. Newspeak ist ein Beispiel, das schön zeigt, wie eine Sprache nicht nur massiv einfacher sondern gleichzeitig deutlich mächtiger und ausdrucksstärker wird, wenn man Konstanten, Variablen, Felder etc. abschafft.
Zum Beispiel gibt es Mixins quasi geschenkt, man braucht sie nicht als spezielles Sprachfeature wie in Ruby. Ebenso bekommt man ein Modulsystem, virtuelle Klassen, Klassenhierarchie-Vererbung und noch einiges anderes, alles ohne irgendeine Art von Sprachunterstützung einfach nur durch die Objektorientierung.
> Simon Krahnke wrote: >> * Robert Klemme <shortcut...@googlemail.com> (14:41) schrieb: >>> On 15.07.2011 23:07, Simon Krahnke wrote: >>>> * Joachim Hofmann<joachim.hofm...@toptarif.de> (12:58) schrieb: >>>>> nur was ist der Unterschied von< und :: ? >>>> "::" hat damit nichts zu tun. In dem Modul "Activerecord" findet sich eine >>>> Konstante "Migration", die eine Klasse als Wert hat. >>> Ich würde es "Scope-" oder "Namespace Operator" nennen. >> Mir war sowieso nie klar, wo der Unterschied zu "." liegt.
> module M > def self.Test; 'Method' end > Test = 'Constant' > end
Simon Krahnke wrote: > * Jörg W Mittag <JoergWMittag+R...@GoogleMail.Com> (13:47) schrieb: >> Simon Krahnke wrote: >>> * Robert Klemme <shortcut...@googlemail.com> (14:41) schrieb: >>>> On 15.07.2011 23:07, Simon Krahnke wrote: >>>>> * Joachim Hofmann<joachim.hofm...@toptarif.de> (12:58) schrieb: >>>>>> nur was ist der Unterschied von< und :: ? >>>>> "::" hat damit nichts zu tun. In dem Modul "Activerecord" findet sich eine >>>>> Konstante "Migration", die eine Klasse als Wert hat. >>>> Ich würde es "Scope-" oder "Namespace Operator" nennen. >>> Mir war sowieso nie klar, wo der Unterschied zu "." liegt. >> module M >> def self.Test; 'Method' end >> Test = 'Constant' >> end
>> M::Test # => 'Constant' >> M.Test # => 'Method' >> M::Test() # => 'Method' > Ah ja, für eine Methode nimmt also ".", für eine Konstante (wie ein > Modul oder eine Klasse) nimmt man "::".
Ja, das ist die Konvention. Muss man aber nicht:
def (o = Object.new).test; 'Did somebody call me?' end o::test # => 'Did somebody call me?'
Der Namensraum-Operator '::' lässt sich praktisch überall anstatt des Nachrichtensendungsoperators '.' verwenden (aber natürlich nicht umgekehrt), *außer* für argumentlose Nachrichten, die mit einem Großbuchstaben anfangen:
> * Joachim Hofmann<joachim.hofm...@toptarif.de> (12:58) schrieb:
>> class CreateVehicles<< ActiveRecord::Migration
> Das "<<" in der Klassendefinition bedeutet, das der Name der Superklasse folgt.
>> nur was ist der Unterschied von< und :: ?
> "::" hat damit nichts zu tun. In dem Modul "Activerecord" findet sich eine > Konstante "Migration", die eine Klasse als Wert hat.
Ich nehme mal an, dass ich das verstehe, so wie ich OOP fr her gelernt habe, dann aber: Warum gebe ich also so eine Konstante hier explizit an? Habe ich doch durch die Vererbung sowieso auch in der Unterklasse Zugriff auf diese Klassenkonstante?
> On 15.07.2011 23:07, Simon Krahnke wrote: >> * Joachim Hofmann<joachim.hofm...@toptarif.de> (12:58) schrieb:
>>> class CreateVehicles<< ActiveRecord::Migration
>> Das "<<" in der Klassendefinition bedeutet, das der Name der Superklasse folgt.
>>> nur was ist der Unterschied von< und :: ?
>> "::" hat damit nichts zu tun. In dem Modul "Activerecord" findet sich eine >> Konstante "Migration", die eine Klasse als Wert hat.
> Ich nehme mal an, dass ich das verstehe, so wie ich OOP fr her gelernt > habe, dann aber: Warum gebe ich also so eine Konstante hier explizit an? > Habe ich doch durch die Vererbung sowieso auch in der Unterklasse > Zugriff auf diese Klassenkonstante?
Wie bitte? Klassen sind Ruby Objekte. Um sie wiederzufinden speichert man sie in Konstanten.
Nat rlich kennt jede Klasse ihre Superklasse, aber wenn das eine andere als Object sein soll, muss man das Ruby schon mitteilen, in dem man bei der Definition mit "<" auf sie verweist.
Dabei wei die generierte Klasse doch nicht, das die Superklasse der Wert einer Konstante ist.