检查是否在类上定义了方法

saw*_*awa 27 ruby

如何检查方法是否直接在某个类上定义,而不是通过继承或包含/扩展?我想要'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

返回一个数组,其中包含接收器中公共和受保护实例方法的名称.

  • 还要注意,类*是*对象,所以`respond_to?`也适用于它们. (4认同)
  • 旁注:“respond_to?”将包含“method_missing”定义的任何内容,而“#instance_methods”则不会。 (2认同)