[ruby-de] Klasse redefinieren?

Robert Klemme shortcutter at googlemail.com
Di Jun 13 15:46:59 JST 2017


2017-06-13 1:29 GMT+02:00 Jörg W Mittag <ruby-de at joergwmittag.de>:

>> Kann man einen Klassennamen wieder löschen?

Jein.

> Klassen haben keine Namen in Ruby, zumindest nicht in dem Sinne
> wie z.B. in Java oder C♯.

Nun ja, es gibt eine Konstant, die "Namensgeber" ist und einen Namen,
der bleibt, selbst, wenn man die Konstante auf etwas anderes zeigen
lässt:

$ ruby -e 'class X; end;c=X;p X;X=nil;p c, c.name'
X
-e:1: warning: already initialized constant X
-e:1: warning: previous definition of X was here
X
"X"

Du siehst, der Name bleibt erhalten.

> Klassen sind Objekte wie jedes andere
> Objekt auch. Man kann Bezug auf sie nehmen, wenn sie einer
> Variable oder Konstanten zugewiesen sind oder wenn sie von einer
> Methode zurückgegeben werden (wie jedes andere Objekt auch).

Ja.

> Es gibt eine Methode `Module#name`, diese hat aber nichts mit
> einem Klassennamen im Sinne von Java oder C♯ zu tun.

Warum nicht? In Java ist die Situation doch sehr ähnlich: es gibt
einen Bezeichner für den Klassennamen im Quelltext und den kann man
zur Laufzeit mit getName() und getSimpleName() abfragen.

>> Problem:
>> class R; end
>> class S; end
>>
>> class A < R; end
>> # A=nil
>> class A < S; end    # error! ## wie erreicht man das?

> Es ist auch unklar, was du mit „das“ meinst.

Ich finde, es ist ganz deutlich: es geht darum, die
Vererbungshierarchie zu ändern.

> Was ist der größere Kontext dieses Quelltextes? Was soll er als
> Teil eines größeren Systemes bezwecken?

Ja, was das soll, ist allerdings schleierhaft. Der Kollege kommt ja
immer mit Fragen um die Ecke, die ganz offensichtlich nichts mit
konkreten Programmierproblemen zu tun haben. Ich glaube, er versucht,
alle Aspekte von Ruby zu verstehen, aber das wird ihm so nicht
gelingen.

> Das Problem ist, dass dein „Problem“ kein Problem ist. Es ist ein
> hingeworfenes Schnipsel Quelltext ohne Erklärung, was der Sinn und
> Zweck dieses Schnipsels ist, wovon es ein Teil ist, was es tut,
> was es tun *soll*.

Genau.

> Das hat aber nichts damit zu tun, die Klassenhierarchie zur
> Laufzeit zu ändern.

Doch, genau das versucht er doch.

Ciao

robert

-- 
[guy, jim, charlie].each {|him| remember.him do |as, often| as.you_can
- without end}
http://blog.rubybestpractices.com/


Mehr Informationen über die Mailingliste ruby-de