En Ruby, puedo definir un método foo = (bar):
irb(main):001:0> def foo=(bar)
irb(main):002:1> p "foo=#{bar}"
irb(main):003:1> end
=> nil
Ahora me gustaría comprobar si se ha definido
irb(main):004:0> defined?(foo=)
SyntaxError: compile error
(irb):4: syntax error, unexpected ')'
from (irb):4
from :0
¿Cuál es la sintaxis adecuada para usar aquí? Supongo que debe haber una forma de escapar "foo =" de modo que se analice y pase correctamente al definido. operador.
ruby
syntax-error
Alex Boisvert
fuente
fuente
foo=
siempre se usa en las asignaciones, por lo que Ruby regresará"assignment"
si realiza la pruebadefined? foo()
(consulte la respuesta actualizada).Puede comprobar si existe un método utilizando el
respond_to?
método y pasarle un símbolo, por ejemplo,bar.respond_to?(:foo=)
para ver si el objetobar
tiene un métodofoo=
. Si desea saber si las instancias de una clase responden a un método que puede usarmethod_defined?
en la clase (o módulo), por ejemploFoo.method_defined?(:bar=)
.defined?
no es un método, sino un operador que devuelve una descripción del operando (o nulo si no está definido, razón por la cual se puede usar en una declaración if). El operando puede ser cualquier expresión, es decir, una constante, una variable, una asignación, un método, una llamada a un método, etc. La razón por la que no funciona cuando lo hacesdefined?(foo=)
es por los paréntesis, omítelos y debería funcionar más o menos de lo esperado. Dicho esto,defined?
es un operador bastante extraño y nadie lo usa para probar la existencia de métodos.fuente
respond_to?
,start_with?
,end_with?
.you.knock if you.respond_to?(:knock)