3 Stimmen

Wie kann man in Ruby ein Aufrufer-Kontextobjekt abrufen?

Ist ein Teil meines Codes, den ich vereinfachen möchte, um die Übergabe eines zusätzlichen Arguments bei jedem Aufruf zu vermeiden. In der Tat ist mein Anwendungsfall, dass M ist eine Benutzerbibliothek ohne die Definition von context Argument bei jeder Methode. check ist eine Methode, die nicht vom Benutzer definiert wird.

# User code
module M
  def do_something(context)
    puts "Called from #{context}"
    context.check
  end
  module_function :do_something
end

# Application code
class Bar
  def check
    puts "Checking from #{self}..."
  end
end

class Foo < Bar
  def do_stuff(scope, method)
    scope.send method, self
  end
end

# Executed by user
Foo.new.do_stuff M, :do_something

Gibt es eine Möglichkeit, dasselbe zu tun, ohne die self als Eingangsargument für do_something Methode zum Abrufen von check Verfahren ?

# User code
module M
  def do_something
    called_from_object = ???
    puts "Called from #{called_from_object}"
    called_from_object.check
  end
  module_function :do_something
end

# Application code
class Bar
  def check
    puts "Checking from #{self}..."
  end
end

class Foo < Bar
  def do_stuff(scope, method)
    scope.send methood
  end
end

# Executed by user
Foo.new.do_stuff M, :do_something

Vielen Dank für Ihre Unterstützung!

6voto

Asher Punkte 1189

Ich bin auf diesen Beitrag gestoßen, als ich nach einer Antwort für meine eigenen Zwecke suchte.

Ich habe keine passende gefunden, also habe ich mich durch den Ruby-Quelltext gewühlt und eine Erweiterung zusammengestellt. Ich habe es als ein Gem gebündelt- sollte ohne Probleme installieren, solange Sie Ruby 1.9.1 verwenden:

sudo gem install sender

Este wird nicht funktionieren mit Ruby 1.8, da 1.8 ein anderes Modell für die Verfolgung von Frames hat.

http://rubygems.org/gems/sender

1voto

mikej Punkte 63496

Das ist nicht das, worum Sie gebeten haben, aber wenn Foo sollten umfassen M Würden Sie damit erreichen, was Sie wollen?

module M
  def do_something
    puts "I am going to use the test method from the including class"
    test
  end
end

class Foo
  include M
  def test
    puts "In Foo's test method"
  end

  def do_stuff
    do_something
  end
end

und dann können Sie tun:

irb(main):019:0> Foo.new.do_stuff
I am going to use the test method from the including class
In Foo's test method

Wenn die Idee ist, dass ein Modul eine allgemeine Funktionalität bereitstellt und die Besonderheiten in einer Klasse, dann ist dies ein ziemlich häufiges Muster in Ruby, z.B. die Vergleichbar Modul, das die einschließende Klasse zur Implementierung <=> .

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X