In Ruby kann ich eine Methode foo = (bar) definieren:
irb(main):001:0> def foo=(bar)
irb(main):002:1> p "foo=#{bar}"
irb(main):003:1> end
=> nil
Jetzt möchte ich überprüfen, ob es definiert wurde,
irb(main):004:0> defined?(foo=)
SyntaxError: compile error
(irb):4: syntax error, unexpected ')'
from (irb):4
from :0
Was ist die richtige Syntax, um hier zu verwenden? Ich gehe davon aus, dass es einen Weg geben muss, "foo =" so zu entkommen, dass es analysiert und korrekt an das definierte übergeben wird. Operator.
ruby
syntax-error
Alex Boisvert
quelle
quelle
foo=
es immer in Aufgaben verwendet wird, sodass Ruby zurückkehrt,"assignment"
wenn Sie testendefined? foo()
(siehe aktualisierte Antwort).Sie können mithilfe der
respond_to?
Methode überprüfen, ob eine Methode vorhanden ist , und Sie übergeben ihr ein Symbol, z. B.bar.respond_to?(:foo=)
um festzustellen, ob das Objektbar
über eine Methode verfügtfoo=
. Wenn Sie wissen möchten, ob Instanzen einer Klasse auf eine Methode reagieren, die Siemethod_defined?
für die Klasse (oder das Modul) verwenden können, zFoo.method_defined?(:bar=)
.defined?
ist keine Methode, sondern ein Operator, der eine Beschreibung des Operanden zurückgibt (oder null, wenn er nicht definiert ist, weshalb er in einer if-Anweisung verwendet werden kann). Der Operand kann ein beliebiger Ausdruck sein, dh eine Konstante, eine Variable, eine Zuweisung, eine Methode, ein Methodenaufruf usw. Der Grund, warum er in diesem Fall nicht funktioniert,defined?(foo=)
liegt in den Klammern. Überspringen Sie sie und es sollte mehr funktionieren oder weniger wie erwartet. That being said,defined?
ist ein ziemlich komisch Operator, und niemand nutzt sie , um Test für die Existenz von Methoden.quelle
respond_to?
,start_with?
,end_with?
.you.knock if you.respond_to?(:knock)