Re: [ruby-de] Problem Klassenvariable überschreiben
Winfried Mueller <[email protected]>
| Newsgroups | gmane.comp.lang.ruby.german |
|---|---|
| Message-ID | <[email protected]> |
Hallo Oliver,
mein Beispiel ist schlecht gewählt und verleitet natürlich sofort
dazu, ein Instanzvariable zu benutzen anstatt einer
Klassenvariable. Das ursprüngliche Problem ging aber in die
Richtung, wo eine Klassenvariable angebracht war:
- snip --
# Code nicht getestet, nur gerade eingehackt, um das Problem
# verständlich zu machen
class Word
@@pattern = Regexp( "" )
def Word.isIt( line )
if line =~ @@pattern
return TRUE
else
return FALSE
end
end
end
class Section < Word
@@pattern = Regexp( "^Section(.*)$" )
end
class Type < Word
@@pattern = Regexp( "^type(.*)$" )
end
puts Section::IsIt( "Section hardware.isdn" ) >> TRUE
puts Type::IsIt( "type yesno" ) >> TRUE
- snip --
>verwenden, denn eine Klassenvariable ist auch fuer die Unterklassen global,
>deshalb kommt zwei mal der zuletzt zugewiesene Wert heraus.
Ja, das ist mittlerweile auch meine Erklärung für das Phänomen.
Das ist jedoch nicht gerade erwartungskonform. Dazu in einer
weiteren Mail mehr.
>Oder verwende eine Klassen-Konstante (wenn sich der Wert, also der Name, nicht
>mehr aendert), etwas so:
>
>class Person
> def Person.name
> type::NAME
> end
>end
>
>class Vater < Person
> NAME = "Heribert"
>end
>
>class Sohn < Person
> NAME = "Thomas"
>end
>
>puts Vater::NAME -> Heribert
>puts Sohn::NAME -> Thomas
Das Beispiel funktioniert zwar so, aber nicht, wenn ich
Person.name benutze:
puts Vater::name -> "unitialized constant NAME..."
Genau das bräuchte ich aber für mein Beispiel. Der Grund, warum
das nicht geht, scheint zu sein, das man Konstanten in Klassen
immer vollqualifiziert angeben muß. Dann müßte man also in
Person.name schreiben "Person::NAME", was dann aber nicht korrekt
wäre, weil ja in der abgeleiteten Klasse "Vater::NAME" und
"Sohn::NAME" gefragt ist.
Meine jetzige Lösung für das Problem sieht in etwa so aus:
class Word
def pattern
#abstrakte Methode, sollte niemals aufgerufen werden
assert
end
def Word.isIt( line )
if line =~ pattern
#...weiterer Code...
return TRUE
else
return FALSE
end
end
end
class Section < Word
def pattern
/^Section(.*)$/
end
end
class Type < Word
def pattern
/^type(.*)$/
end
end
puts Section::IsIt( "Section hardware.isdn" ) >> TRUE
puts Type::IsIt( "type yesno" ) >> TRUE
Im Grunde ist das eine Emulation einer echten Klassenvariable, in
der Form, wie sie mir aus der OO-Programmierung anderer Sprachen
bekannt ist.
Ach ja, noch was: was bedeutet eigentlich "type::" in deinem
Beispiel? Das habe ich nicht verstanden.
..Winfried..