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..
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.