Ich möchte ein Objekt in Ruby erstellen, die etwas Code ausführen kann, wenn darauf zugegriffen wird, z. wenn es inspiziert oder verglichen wird. Es ist einfach genug, Nachrichten mit method_missing
abzufangen (was object > 5
behandelt), aber dies deckt nicht alle Versuche ab, auf das Objekt zuzugreifen.Wie erkennt man, wenn ein Ruby-Objekt die rechte Seite eines Vergleichs ist?
Zur Veranschaulichung:
class Proxy
def initialize(obj)
@object = obj
end
def do_something
self
end
def do_something_else
self
end
def method_missing(msg, *args)
puts "I'm here #{msg}"
# Do something here
@object.send(msg, *args)
end
end
Verbrauch:
proxy = Proxy.new(5)
proxy.do_something.do_something_else
proxy > 2
# I'm here >
# true
2 > proxy
# ArgumentError: comparison of Fixnum with Proxy failed
Ich frage mich, ob es 5
tatsächlich eine Implementierung von Proxy
so dass 2
ist anstelle des Objekts sieht.
Der Titel und der erste Satz Ihrer Frage stimmen nicht mit dem letzten Satz Ihrer Frage überein. Fragen Sie, wie Sie "etwas Code ausführen können, wenn auf [ein Objekt] zugegriffen wird", oder fragen Sie, wie man ein Proxy-Objekt auf der rechten Seite eines Vergleichsausdrucks mit einem Fixnum verwendet? Ich habe Probleme zu verstehen, wie diese beiden sehr unterschiedlichen Probleme zusammenhängen. –
Sind sie sehr unterschiedlich? Ist Letzteres nicht nur ein Beispiel für Ersteres? – c4am95
Nicht in irgendeiner Weise, die ich sehen kann. Dies scheint ein [XY-Problem] (http://xyproblem.info/) zu sein. Welches Problem versuchen Sie eigentlich zu lösen? Wenn ein Objekt "beim Zugriff auf einen Code" nur mühsam ausgeführt wird, ist dies nicht Teil der Lösung, das Objekt auf der rechten Seite eines Vergleichs mit einem Fixnum zu verwenden. –