Ich verstehe das Konzept von, some_instance.send
aber ich versuche herauszufinden, warum Sie dies in beide Richtungen nennen können. Die Ruby Koans implizieren, dass es einen Grund gibt, der nicht nur viele verschiedene Möglichkeiten bietet, dasselbe zu tun. Hier sind die beiden Anwendungsbeispiele:
class Foo
def bar?
true
end
end
foo = Foo.new
foo.send(:bar?)
foo.__send__(:bar?)
Hat jemand eine Idee dazu?
__send__
, nichtsend
.public_send
, was oftsend
sowieso vorzuziehen ist.Wenn Sie sich wirklich
send
so verhalten müssen , wie es normalerweise der__send__
Fall ist , sollten Sie es verwenden , da es nicht überschrieben wird (sollte). Die Verwendung__send__
ist besonders nützlich bei der Metaprogrammierung, wenn Sie nicht wissen, welche Methoden die zu manipulierende Klasse definiert. Es hätte überschreiben könnensend
.Beobachten:
Wenn Sie überschreiben
__send__
, gibt Ruby eine Warnung aus:In einigen Fällen, in denen ein Überschreiben sinnvoll
send
wäre, ist dieser Name angemessen, z. B. Nachrichtenübergabe, Socket-Klassen usw.quelle
__send__
existiert, so dass es nicht versehentlich überschrieben werden kann.Warum
send
gibt esobject.send(:method_name, *parameters)
das? Ich kann für niemanden sprechen, sieht aber besser aus alsobject.__send__(:method_name, *parameters)
, also benutze ich es, essend
sei denn, ich muss es benutzen__send__
.quelle
Abgesehen von dem, was andere Ihnen bereits gesagt haben und was darauf hinausläuft, dies zu sagen
send
und__send__
zwei Aliase derselben Methode sind, könnten Sie an der dritten, etwas anderen Möglichkeit interessiert sein, nämlichpublic_send
. Beispiel:Update: Da Ruby 2.1
Module#include
undModule#extend
Methoden öffentlich werden, würde das obige Beispiel nicht mehr funktionieren.quelle
Der Hauptunterschied zwischen send
__send__
,, und public_send ist folgender.__send__
sind technisch identisch mit dem Aufruf der Object-Methode. Der Hauptunterschied besteht jedoch darin, dass Sie die send-Methode ohne Warnung überschreiben können. Wenn Sie sie überschreiben,__send__
wird eine Warnmeldung angezeigtDies liegt daran, dass zur Vermeidung von Konflikten, insbesondere in Edelsteinen oder Bibliotheken, wenn der Kontext, in dem sie verwendet werden, unbekannt ist, immer
__send__
anstelle von Senden verwendet wird.__send__
) und public_send besteht darin, dass send /__send__
die privaten Methoden eines Objekts aufrufen kann und public_send nicht.Versuchen Sie am Ende, public_send zu verwenden, um einen direkten Aufruf der privaten Methode zu vermeiden, anstatt __send__ oder send zu verwenden.
quelle