Antwort
send
sendet eine Nachricht an eine Objektinstanz und seine Vorfahren in der Klassenhierarchie, bis ein Verfahren reagiert (da der Name das erste Argument übereinstimmt).
Praktisch sind diese Linien äquivalent:
1.send '+', 2
1.+(2)
1 + 2
Beachten Sie, dass send
Sichtbarkeitsprüfungen umgeht, so dass Sie private Methoden aufrufen können, auch (nützlich für die Testeinheit).
Wenn es vor dem Senden wirklich keine Variable ist, bedeutet dies, dass das globale Objekt verwendet wird:
send :to_s # "main"
send :class # Object
Oh ich sehe, also könnte man senden, wenn man etwas wie 1.Monat in der Datenbank speichern möchte, anstatt statisch die Anzahl der Tage anzugeben. –
Wahr, Sie könnten es verwenden, um Methoden mit Namen aufzurufen, die berechnet werden, nicht statisch. (Sie sollten jedoch keine uneingeschränkte Benutzereingabe zulassen, um den Aufruf von privaten Methoden zu vermeiden ... Sie könnten ihnen jedoch ein eindeutiges Präfix geben: send 'user_method _' + Methodenname, * args) – giraff
Guter Anwendungsfall könnte es sein, den Sie wollen Um eine geschützte Klassenmethode zu testen, könnten Sie sie außerhalb einer Class-In-Testdatei aufrufen. –
senden ist eine Ruby (ohne Rails) -Methode, die es erlaubt, eine andere Methode namentlich aufzurufen.
Von Dokumentation
class Klass
def hello(*args)
"Hello " + args.join(' ')
end
end
k = Klass.new
k.send :hello, "gentle", "readers" #=> "Hello gentle readers"
Große Antwort, klarer als die ausführliche angenommene Antwort. –
Eines der nützlichsten Feature, das ich mit .send Methode denken, ist, dass es dynamisch aufrufen auf Methode. Dies kann Ihnen viel Tipparbeit ersparen. Eine der beliebtesten Anwendungen der .send-Methode ist die dynamische Zuweisung von Attributen. Zum Beispiel:
class Car
attr_accessor :make, :model, :year
end
Um Attribute zuweisen regelmäßig möchte man
brauchenc = Car.new
c.make="Honda"
c.model="CRV"
c.year="2014"
Oder mit .send Methode:
c.send("make=", "Honda")
c.send("model=", "CRV")
c.send("year=","2014")
Aber es kann alles mit folgenden Fassung:
Angenommen, Ihre Rails-App muss Ihrer Benutzerklasse Attribute aus Benutzereingaben zuweisen, yo u kann
c = Car.new()
params.each do |key, value|
c.send("#{key}=", value)
end
Vielen Dank für den tollen Link –
Die Verwendung von .send auf diese Weise fügt unnötige Komplexität hinzu und macht es einfacher, versehentlich einen Fehler in den Code einzuführen. Wenn Sie beispielsweise in Ihrem obigen Code einen neuen Eintrag zu Ihrem Parameter-Hash hinzufügen (z. B. "cylinders"), schlägt der Code mit einem nicht definierten Methodenfehler fehl. –
antwort_to? könnte verwendet werden, um solche Fehler zu verhindern, falls gewünscht. –
Ein weiteres Beispiel, ähnlich wie Antonio Jha das tun https://stackoverflow.com/a/26193804/1897857
ist, wenn Sie Attribute für ein Objekt lesen müssen.
Zum Beispiel, wenn Sie ein Array von Zeichenfolgen haben, wenn Sie versuchen, durch sie zu durchlaufen und sie auf Ihrem Objekt aufrufen, wird es nicht funktionieren.
atts = ['name', 'description']
@project = Project.first
atts.each do |a|
puts @project.a
end
# => NoMethodError: undefined method `a'
Sie können jedoch die Saiten zum Objekt send
:
atts = ['name', 'description']
@project = Project.first
atts.each do |a|
puts @project.send(a)
end
# => Vandalay Project
# => A very important project
Danke für die einfache und einfache Erklärung! –
Danke! Das ist genau die Antwort, nach der ich suche. Fragen Sie sich, ob das häufig verwendet wird? Ich bin im Legacy-Code auf etwas Ähnliches gestoßen, nicht sicher, dass ich dabei bleiben sollte. @ Mike Vallano –
@ b-liu Ich habe es von erfahrenen Entwicklern in neuem Code verwendet gesehen. Es kann auch hilfreich sein, wenn Sie 'define_method' verwenden: https://apidock.com/ruby/Module/define_method. –
Ein weiterer Anwendungsfall für Ansichten:
<%= link_to
send("first_part_of_path_{some_dynamic_parameters}_end_path",
attr1, attr2), ....
%>
zulassen. Sie schreiben skalierbare Ansicht, wer mit allen Arten von Objekten arbeiten mit:
- 1. Was macht == in Ruby?
- 2. Was ist der Unterschied zwischen ruby send und ruby public_send?
- 3. Was macht :: MyClass Ruby Scope-Operator?
- 4. Was macht Ruby zu einer eleganten Sprache?
- 5. Was macht der Operator% in Ruby in N% 2?
- 6. Was macht webform_DoPostBackWithOptions()?
- 7. Was macht map (&: name) in diesem Ruby-Code?
- 8. Was macht ein * vor einem String-Literal in Ruby?
- 9. Was macht die Klasse ClassName <:: OtherClassName in Ruby?
- 10. Was macht diese Kombination aus Chunk und Map in Ruby?
- 11. Was macht rb-fsevent?
- 12. Was macht/[\ []/in JavaScript?
- 13. Was macht === in PHP
- 14. Wie macht Ruby # initialisieren privat?
- 15. Was macht die Methode 'to_sym' von Ruby on Rails?
- 16. Was ist Boxen und was macht es?
- 17. Wie man XML-Signaturen in Ruby macht
- 18. Was macht Collections.unmodiableSet() in Java?
- 19. Was macht typedef in C++?
- 20. Was macht "$ (@: H)" in MakeFile?
- 21. Was macht "! Eol" in gitattributes?
- 22. Was macht ovly_debug_event in Chrome?
- 23. Was macht \ 1 in sed?
- 24. Was macht das in Javascript?
- 25. Was macht this.async() in JavaScript?
- 26. Was macht || meine in .screenrc?
- 27. Was macht @ in diesem php?
- 28. Was macht class_methods in Angelegenheiten?
- 29. Was macht Include() in LINQ?
- 30. Was macht Predef.identität in scala?
Ist das die ganze Linie des Codes? Ich meine, gibt es nichts vor dem Senden? – giraff