• »Monkey Guardian« ist der Autor dieses Themas

Motto: So lasset uns kein Trübsal sinnieren und gar königlich dinieren!

  • Nachricht senden

1

Montag, 29. September 2014, 15:37

module Input und Problem mit Methode update

Hallo,
ich mache es mal kurz und schmerzlos.

Ich habe ein module Input (muss so heißen), in welchem sich unter anderem folgendes befindet:

Quellcode

1
2
3
  def self.update
    (irgendein Code)
  end


Das, was dort drinsteht überschreibt doch das Original-Modul Input, oder?
Was ich nun jetzt schon seit längerem probiere ist, dass diese Methode update nur durchgeführt/überschrieben wird, wenn eine bestimmte Bedingung gegeben ist.
Mit alias geht das ja irgendwie nicht.
Wie stellt man so etwas an? Geht das überhaupt?
Ich kenne nicht den Original-Code der überschrieben wird, denn wenn ich eine Bedingung einsetze, aber nicht weiß, was passieren soll, wenn diese nicht erfüllt ist, wird die Methode wohl mit null überschrieben.
  • :cake: So lasset uns beginnen! :new:

    • Ein Abenteuer, wie du es noch nie erlebt hast!
      Tauche ein in die wunderbare Welt des Königs und erlebe auf deiner Reise die verrücktesten Dinge!
      NICHT MEHR LANGE! :navigation-right: Hier gibt es weitere Informationen! :navigation-left:
    • Jetzt die Demo herunterladen!
      Bild
      Euch erwartet eine Welt, wie sie nur ein exzentrischer König veralbern könnte...
    • Titelbild
      Bild
  • :fires: XBOX 360 Bild

    Bild
  • :new: Avatar im Großformat

    Bild

2

Montag, 29. September 2014, 16:11

Wenn es nicht das selbe Input-Modul seien soll, würde ich dir vorschlagen das nochmal in einen Namespace zu legen, zum Beispiel:

Ruby Quellcode

1
2
3
4
5
module Game
  module Input
    #...
  end
end

Und Du dann Game::Input.update schreibst.

Was meinst Du mit "nur unter bestimmtne Bedingungen überschreiben"?
Du kannst ja bei Programmstart die Definition in einen if-Block schreiben:

Ruby Quellcode

1
2
3
4
5
6
7
module Input
  if $TEST
    def self.update
      #...
     end
  end
end

Aber ich vermute Du meinst das anders. Ein Alias ist übrigens auch bei Modulen möglich.

Modulmethode also

Ruby Quellcode

1
2
3
4
5
module A
  def A.foo( p = "" )
    print 'Foo', p
  end
end

oder anders geschrieben

Ruby Quellcode

1
2
3
4
5
module A
  def self.foo( p = "" )
    print 'Foo', p
  end
end
Werden in der sogenannten Singletonklasse definiert (ein Artikel der dazu alles erklärt findest Du hier), es ist also das Selbe als würdest Du schreiben:

Ruby Quellcode

1
2
3
4
5
6
7
8
module A
  # Singleton-Block
  class << A
    def foo( p = "" )
      print 'Foo', p
    end
  end
end
und im Singleton-Block kannst Du aliasen:

Ruby Quellcode

1
2
3
4
5
6
7
8
9
module A
  # Singleton-Block
  class << A
    alias_method( :altes_foo, :foo ) # Alternativ geht auch "alias altes_foo foo"
    def foo( p = "" )
      altes_foo( p + '!' ) # Irgendeine Änderung an der Methode, ist ja egal
    end
  end
end

Das jetzt nur ganz kurz, lies am besten den oben verlinkten Wiki Artikel. :)

Das waren jetzt 3 Herangehensweisen, ich hoffe ich habe in etwa deine Frage verstanden, ansonsten frag nochmal.

  • »Monkey Guardian« ist der Autor dieses Themas

Motto: So lasset uns kein Trübsal sinnieren und gar königlich dinieren!

  • Nachricht senden

3

Montag, 29. September 2014, 23:17

Vielen Dank für die Antwort!
Es ist tatsächlich das erste von den Möglichkeiten, die das erreicht, was ich wollte.
Eine einfach if-Abfrage erfüllte allerdings für mich nicht ganz das, was ich wollte.
Ich musste es wie folgt aufbauen:

Quellcode

1
2
3
4
5
6
7
if bla == true
  def dingens
    ...
  end
else
  es passiert gar nichts
end


Einfach nur if ohne else funktionierte seltsamerweise nicht und da dachte ich es geht nur mit alias, was aber auch nicht funktionierte.

Der Singleton-Block könnte zwar das Problem lösen, würde das ganze aber komplizierter machen, denke ich. :D
Jedenfalls weiß ich jetzt, wie man das korrekt macht.
  • :cake: So lasset uns beginnen! :new:

    • Ein Abenteuer, wie du es noch nie erlebt hast!
      Tauche ein in die wunderbare Welt des Königs und erlebe auf deiner Reise die verrücktesten Dinge!
      NICHT MEHR LANGE! :navigation-right: Hier gibt es weitere Informationen! :navigation-left:
    • Jetzt die Demo herunterladen!
      Bild
      Euch erwartet eine Welt, wie sie nur ein exzentrischer König veralbern könnte...
    • Titelbild
      Bild
  • :fires: XBOX 360 Bild

    Bild
  • :new: Avatar im Großformat

    Bild

4

Montag, 29. September 2014, 23:58

Zitat

Der Singleton-Block könnte zwar das Problem lösen, würde das ganze aber komplizierter machen, denke ich. :D
Eigentlich ist

Ruby Quellcode

1
2
def self.foo
end
Ja nur eine Kurzschreibweise, also komplizierter wird das ganze auf der technischen Ebene dadurch nicht.

Dann viel Spaß mit deinem Projekt, hoffe man hört bald mal etwas davon. ;)

Ähnliche Themen

Social Bookmarks