Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

Vererbung

6 views
Skip to first unread message

Joachim Hofmann

unread,
Jul 15, 2011, 6:58:57 AM7/15/11
to
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, nur was
ist der Unterschied von < und ::
?

Danke

Joachim

Simon Krahnke

unread,
Jul 15, 2011, 5:07:19 PM7/15/11
to
* Joachim Hofmann <joachim...@toptarif.de> (12:58) schrieb:

> 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

Robert Klemme

unread,
Jul 16, 2011, 8:41:18 AM7/16/11
to
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
^

>> 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/

Simon Krahnke

unread,
Jul 16, 2011, 5:19:36 PM7/16/11
to
* 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:
>>
>>> 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

Jörg W Mittag

unread,
Jul 17, 2011, 7:47:28 AM7/17/11
to
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'

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

unread,
Jul 17, 2011, 2:19:47 PM7/17/11
to
* Jörg W Mittag <JoergWMi...@GoogleMail.Com> (13:47) schrieb:

> 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

Jörg W Mittag

unread,
Jul 18, 2011, 11:55:08 AM7/18/11
to
Simon Krahnke wrote:
> * Jörg W Mittag <JoergWMi...@GoogleMail.Com> (13:47) schrieb:
>> 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 "::".

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

Joachim Hofmann

unread,
Jul 19, 2011, 4:34:25 AM7/19/11
to
On 15.07.2011 23:07, Simon Krahnke wrote:
> * Joachim Hofmann<joachim...@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?

Gru� Joachim

Simon Krahnke

unread,
Jul 19, 2011, 6:16:15 AM7/19/11
to
* Joachim Hofmann <joachim...@toptarif.de> (10:34) schrieb:

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

0 new messages