[ruby-de] Klasse redefinieren?

Jörg W Mittag ruby-de at joergwmittag.de
Di Jun 13 08:29:20 JST 2017


Hallo,

> Kann man einen Klassennamen wieder löschen?

Klassen haben keine Namen in Ruby, zumindest nicht in dem Sinne
wie z.B. in Java oder C♯. 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).

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

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

Das ist leider zu wenig und zu unpräzise Information, um dir
helfen zu können. Was *genau* ist der Fehler? Wird eine Ausnahme
aufgeworfen? Wenn ja, welche? In welcher Zeile? Wie sieht der
Aufrufstapel aus? Was ist die Nachricht? Gibt es eine
Fehlermeldung? Wenn ja, welche? Wie lautet sie genau? Stimmt das
tatsächliche Ergebnis nicht mit dem erwarteten Ergebnis überein?
Wenn ja, was ist das erwartete Ergebnis (und warum), was ist das
tatsächliche Ergebnis und wie genau unterscheiden sie sich (und
warum und in welcher Form ist dieser Unterschied relevant)? Stimmt
das beobachtete Verhalten nicht mit dem erwarteten Verhalten
überein? Wenn ja, was ist das erwartete Verhalten (und warum), was
ist das beobachtete Verhalten und wie genau unterscheiden sie sich
(und warum und in welcher Form ist dieser Unterschied relevant)?

Es ist auch unklar, was du mit „das“ meinst. Was genau ist das
„das“, welches du erreichen möchtest? Kannst du eine *präzise*
Spezifikation liefern, was genau du erreichen möchtest, inklusive
aller Regeln, Ausnahmen, Grenzfälle und Spezialfälle? Kannst du
Beispiele für Eingaben und die erwünschten Ausgaben / Ergebnisse
geben, die sowohl das normale Verhalten als auch die Ausnahmen,
Grenzfälle und Spezialfälle demonstrieren?

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

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*.

Falls es darum geht, die Konstante `A` zu entfernen, dafür gibt
es die Methode `Module#remove_const`:

```ruby
Object.send(:remove_const, :A)
class A < S; end
```

> Brauchen könnte man das, um die Klassenhierarchie zur Laufzeit zu ändern

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

Beste Grüße,
    Jörg.


Mehr Informationen über die Mailingliste ruby-de