Si está verificando si un objeto puede responder a una serie de métodos, podría hacer algo como:
methods = [:valid?, :chase, :test]
def has_methods?(something, methods)
methods & something.methods == methods
end
Se methods & something.methods
unirán las dos matrices en sus elementos comunes / coincidentes. something.methods incluye todos los métodos que está buscando, será igual a los métodos. Por ejemplo:
[1,2] & [1,2,3,4,5]
==> [1,2]
entonces
[1,2] & [1,2,3,4,5] == [1,2]
==> true
En esta situación, querrá usar símbolos, porque cuando llama a .methods, devuelve una matriz de símbolos y, si lo usa ["my", "methods"]
, devolvería false.
String.instance_methods(false).include? :freeze
, el argumento falso puede decir exactamente si elfreeze
método está definido en la clase String o no. En este caso, devolverá falso porquefreeze
String hereda el método del módulo Kernel, peroString.method_defined? :freeze
siempre devolverá verdadero, lo que no puede ayudar mucho con tal propósito.method_defined?
debe usarse en la clase (pArray
. ej. ), pero está intentando usarlo en instancias (p[]
. ej. )