如何检查方法是否直接在某个类上定义,而不是通过继承或包含/扩展?我想要'foo'之类的东西?在下面的:
class A
def a; end
end
module B
def b; end
end
class C < A
include B
def c; end
end
C.foo?(:a) #=> false
C.foo?(:b) #=> false
C.foo?(:c) #=> true
Run Code Online (Sandbox Code Playgroud)
Arn*_*anc 44
用这个:
C.instance_methods(false).include?(:a)
C.instance_methods(false).include?(:b)
C.instance_methods(false).include?(:c)
Run Code Online (Sandbox Code Playgroud)
该方法instance_methods返回此类的实例将具有的方法数组.false作为第一个参数传递仅返回此类的方法,而不返回超类的方法.
所以C.instance_methods(false)返回定义的方法列表C.
然后你只需要检查该方法是否在返回的数组中(这就是include?调用的作用).
mik*_*iku 27
对于对象,您可以使用Object.respond_to?.
如果obj响应给定方法,则返回true.
对于类,请查看Module.instance_methods
返回一个数组,其中包含接收器中公共和受保护实例方法的名称.