was bedeutet genau die Symbolik < und :: in einem Ausdruck wie:
class CreateVehicles << ActiveRecord::Migration
dass es "Vererbung" bedeutet, ist mir mehr oder weniger klar, nur was
ist der Unterschied von < und ::
?
Danke
Joachim
> Hallo,
>
> 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 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.
mfg, simon .... l
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
^
>> 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.
Ciao
robert
--
remember.guy do |as, often| as.you_can - without end
http://blog.rubybestpractices.com/
> On 15.07.2011 23:07, Simon Krahnke wrote:
>> * Joachim Hofmann<joachim...@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.
mfg, simon .... l
module M
def self.Test; 'Method' end
Test = 'Constant'
end
M::Test # => 'Constant'
M.Test # => 'Method'
M::Test() # => 'Method'
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.
jwm
> Simon Krahnke wrote:
>> * Robert Klemme <short...@googlemail.com> (14:41) schrieb:
>>> On 15.07.2011 23:07, Simon Krahnke wrote:
>>>> * Joachim Hofmann<joachim...@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 "::".
> Ob das ein *sinnvoller* Unterschied ist, das ist eine ganz andere
> Frage ;-)
Das es von dem was man haben will abhängt, ist wohl eine Konsequenz
davon, überhaupt zwei Listen von Elementen zu haben.
mfg, simon .... l
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:
module M
def self.Test; 'Method' end
end
M.Test # => 'Method'
M::Test() # => 'Method'
aber:
M::Test # NameError: uninitialized constant M::Test
jwm
>>
>> 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?
Gru� Joachim
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.
mfg, simon .... l